fog-brightbox 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/fog-brightbox.gemspec +28 -0
  3. data/lib/fog/brightbox/compute/image_selector.rb +45 -0
  4. data/lib/fog/brightbox/compute/shared.rb +230 -0
  5. data/lib/fog/brightbox/compute.rb +305 -0
  6. data/lib/fog/brightbox/core.rb +11 -0
  7. data/lib/fog/brightbox/models/compute/account.rb +69 -0
  8. data/lib/fog/brightbox/models/compute/accounts.rb +29 -0
  9. data/lib/fog/brightbox/models/compute/api_client.rb +37 -0
  10. data/lib/fog/brightbox/models/compute/api_clients.rb +24 -0
  11. data/lib/fog/brightbox/models/compute/application.rb +24 -0
  12. data/lib/fog/brightbox/models/compute/applications.rb +28 -0
  13. data/lib/fog/brightbox/models/compute/cloud_ip.rb +68 -0
  14. data/lib/fog/brightbox/models/compute/cloud_ips.rb +34 -0
  15. data/lib/fog/brightbox/models/compute/collaboration.rb +49 -0
  16. data/lib/fog/brightbox/models/compute/collaborations.rb +47 -0
  17. data/lib/fog/brightbox/models/compute/database_server.rb +97 -0
  18. data/lib/fog/brightbox/models/compute/database_servers.rb +28 -0
  19. data/lib/fog/brightbox/models/compute/database_snapshot.rb +52 -0
  20. data/lib/fog/brightbox/models/compute/database_snapshots.rb +24 -0
  21. data/lib/fog/brightbox/models/compute/database_type.rb +19 -0
  22. data/lib/fog/brightbox/models/compute/database_types.rb +26 -0
  23. data/lib/fog/brightbox/models/compute/firewall_policies.rb +29 -0
  24. data/lib/fog/brightbox/models/compute/firewall_policy.rb +63 -0
  25. data/lib/fog/brightbox/models/compute/firewall_rule.rb +54 -0
  26. data/lib/fog/brightbox/models/compute/firewall_rules.rb +24 -0
  27. data/lib/fog/brightbox/models/compute/flavor.rb +32 -0
  28. data/lib/fog/brightbox/models/compute/flavors.rb +28 -0
  29. data/lib/fog/brightbox/models/compute/image.rb +64 -0
  30. data/lib/fog/brightbox/models/compute/images.rb +28 -0
  31. data/lib/fog/brightbox/models/compute/load_balancer.rb +107 -0
  32. data/lib/fog/brightbox/models/compute/load_balancers.rb +28 -0
  33. data/lib/fog/brightbox/models/compute/server.rb +217 -0
  34. data/lib/fog/brightbox/models/compute/server_group.rb +94 -0
  35. data/lib/fog/brightbox/models/compute/server_groups.rb +29 -0
  36. data/lib/fog/brightbox/models/compute/servers.rb +61 -0
  37. data/lib/fog/brightbox/models/compute/user.rb +43 -0
  38. data/lib/fog/brightbox/models/compute/user_collaboration.rb +44 -0
  39. data/lib/fog/brightbox/models/compute/user_collaborations.rb +31 -0
  40. data/lib/fog/brightbox/models/compute/users.rb +27 -0
  41. data/lib/fog/brightbox/models/compute/zone.rb +22 -0
  42. data/lib/fog/brightbox/models/compute/zones.rb +29 -0
  43. data/lib/fog/brightbox/oauth2.rb +166 -0
  44. data/lib/fog/brightbox/requests/compute/accept_user_collaboration.rb +21 -0
  45. data/lib/fog/brightbox/requests/compute/activate_console_server.rb +21 -0
  46. data/lib/fog/brightbox/requests/compute/add_listeners_load_balancer.rb +24 -0
  47. data/lib/fog/brightbox/requests/compute/add_nodes_load_balancer.rb +24 -0
  48. data/lib/fog/brightbox/requests/compute/add_servers_server_group.rb +34 -0
  49. data/lib/fog/brightbox/requests/compute/apply_to_firewall_policy.rb +24 -0
  50. data/lib/fog/brightbox/requests/compute/create_api_client.rb +23 -0
  51. data/lib/fog/brightbox/requests/compute/create_application.rb +23 -0
  52. data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +24 -0
  53. data/lib/fog/brightbox/requests/compute/create_collaboration.rb +23 -0
  54. data/lib/fog/brightbox/requests/compute/create_database_server.rb +25 -0
  55. data/lib/fog/brightbox/requests/compute/create_firewall_policy.rb +26 -0
  56. data/lib/fog/brightbox/requests/compute/create_firewall_rule.rb +29 -0
  57. data/lib/fog/brightbox/requests/compute/create_image.rb +30 -0
  58. data/lib/fog/brightbox/requests/compute/create_load_balancer.rb +26 -0
  59. data/lib/fog/brightbox/requests/compute/create_server.rb +29 -0
  60. data/lib/fog/brightbox/requests/compute/create_server_group.rb +23 -0
  61. data/lib/fog/brightbox/requests/compute/delete_api_client.rb +28 -0
  62. data/lib/fog/brightbox/requests/compute/delete_application.rb +28 -0
  63. data/lib/fog/brightbox/requests/compute/delete_cloud_ip.rb +28 -0
  64. data/lib/fog/brightbox/requests/compute/delete_collaboration.rb +28 -0
  65. data/lib/fog/brightbox/requests/compute/delete_database_server.rb +26 -0
  66. data/lib/fog/brightbox/requests/compute/delete_database_snapshot.rb +26 -0
  67. data/lib/fog/brightbox/requests/compute/delete_firewall_policy.rb +28 -0
  68. data/lib/fog/brightbox/requests/compute/delete_firewall_rule.rb +28 -0
  69. data/lib/fog/brightbox/requests/compute/delete_image.rb +28 -0
  70. data/lib/fog/brightbox/requests/compute/delete_load_balancer.rb +28 -0
  71. data/lib/fog/brightbox/requests/compute/delete_server.rb +28 -0
  72. data/lib/fog/brightbox/requests/compute/delete_server_group.rb +28 -0
  73. data/lib/fog/brightbox/requests/compute/delete_user_collaboration.rb +28 -0
  74. data/lib/fog/brightbox/requests/compute/get_account.rb +29 -0
  75. data/lib/fog/brightbox/requests/compute/get_api_client.rb +21 -0
  76. data/lib/fog/brightbox/requests/compute/get_application.rb +21 -0
  77. data/lib/fog/brightbox/requests/compute/get_authenticated_user.rb +17 -0
  78. data/lib/fog/brightbox/requests/compute/get_cloud_ip.rb +21 -0
  79. data/lib/fog/brightbox/requests/compute/get_collaboration.rb +21 -0
  80. data/lib/fog/brightbox/requests/compute/get_database_server.rb +19 -0
  81. data/lib/fog/brightbox/requests/compute/get_database_snapshot.rb +19 -0
  82. data/lib/fog/brightbox/requests/compute/get_database_type.rb +21 -0
  83. data/lib/fog/brightbox/requests/compute/get_firewall_policy.rb +21 -0
  84. data/lib/fog/brightbox/requests/compute/get_firewall_rule.rb +21 -0
  85. data/lib/fog/brightbox/requests/compute/get_image.rb +21 -0
  86. data/lib/fog/brightbox/requests/compute/get_interface.rb +21 -0
  87. data/lib/fog/brightbox/requests/compute/get_load_balancer.rb +21 -0
  88. data/lib/fog/brightbox/requests/compute/get_scoped_account.rb +15 -0
  89. data/lib/fog/brightbox/requests/compute/get_server.rb +21 -0
  90. data/lib/fog/brightbox/requests/compute/get_server_group.rb +21 -0
  91. data/lib/fog/brightbox/requests/compute/get_server_type.rb +21 -0
  92. data/lib/fog/brightbox/requests/compute/get_user.rb +29 -0
  93. data/lib/fog/brightbox/requests/compute/get_user_collaboration.rb +21 -0
  94. data/lib/fog/brightbox/requests/compute/get_zone.rb +21 -0
  95. data/lib/fog/brightbox/requests/compute/list_accounts.rb +17 -0
  96. data/lib/fog/brightbox/requests/compute/list_api_clients.rb +19 -0
  97. data/lib/fog/brightbox/requests/compute/list_applications.rb +19 -0
  98. data/lib/fog/brightbox/requests/compute/list_cloud_ips.rb +19 -0
  99. data/lib/fog/brightbox/requests/compute/list_collaborations.rb +19 -0
  100. data/lib/fog/brightbox/requests/compute/list_database_servers.rb +17 -0
  101. data/lib/fog/brightbox/requests/compute/list_database_snapshots.rb +17 -0
  102. data/lib/fog/brightbox/requests/compute/list_database_types.rb +19 -0
  103. data/lib/fog/brightbox/requests/compute/list_firewall_policies.rb +19 -0
  104. data/lib/fog/brightbox/requests/compute/list_images.rb +19 -0
  105. data/lib/fog/brightbox/requests/compute/list_load_balancers.rb +19 -0
  106. data/lib/fog/brightbox/requests/compute/list_server_groups.rb +19 -0
  107. data/lib/fog/brightbox/requests/compute/list_server_types.rb +19 -0
  108. data/lib/fog/brightbox/requests/compute/list_servers.rb +19 -0
  109. data/lib/fog/brightbox/requests/compute/list_user_collaborations.rb +19 -0
  110. data/lib/fog/brightbox/requests/compute/list_users.rb +19 -0
  111. data/lib/fog/brightbox/requests/compute/list_zones.rb +19 -0
  112. data/lib/fog/brightbox/requests/compute/map_cloud_ip.rb +24 -0
  113. data/lib/fog/brightbox/requests/compute/move_servers_server_group.rb +36 -0
  114. data/lib/fog/brightbox/requests/compute/reject_user_collaboration.rb +21 -0
  115. data/lib/fog/brightbox/requests/compute/remove_firewall_policy.rb +24 -0
  116. data/lib/fog/brightbox/requests/compute/remove_listeners_load_balancer.rb +24 -0
  117. data/lib/fog/brightbox/requests/compute/remove_nodes_load_balancer.rb +24 -0
  118. data/lib/fog/brightbox/requests/compute/remove_servers_server_group.rb +34 -0
  119. data/lib/fog/brightbox/requests/compute/resend_collaboration.rb +21 -0
  120. data/lib/fog/brightbox/requests/compute/reset_ftp_password_account.rb +32 -0
  121. data/lib/fog/brightbox/requests/compute/reset_ftp_password_scoped_account.rb +18 -0
  122. data/lib/fog/brightbox/requests/compute/reset_password_database_server.rb +19 -0
  123. data/lib/fog/brightbox/requests/compute/reset_secret_api_client.rb +25 -0
  124. data/lib/fog/brightbox/requests/compute/reset_secret_application.rb +21 -0
  125. data/lib/fog/brightbox/requests/compute/shutdown_server.rb +21 -0
  126. data/lib/fog/brightbox/requests/compute/snapshot_database_server.rb +19 -0
  127. data/lib/fog/brightbox/requests/compute/snapshot_server.rb +21 -0
  128. data/lib/fog/brightbox/requests/compute/start_server.rb +21 -0
  129. data/lib/fog/brightbox/requests/compute/stop_server.rb +21 -0
  130. data/lib/fog/brightbox/requests/compute/unmap_cloud_ip.rb +21 -0
  131. data/lib/fog/brightbox/requests/compute/update_account.rb +61 -0
  132. data/lib/fog/brightbox/requests/compute/update_api_client.rb +26 -0
  133. data/lib/fog/brightbox/requests/compute/update_application.rb +26 -0
  134. data/lib/fog/brightbox/requests/compute/update_cloud_ip.rb +27 -0
  135. data/lib/fog/brightbox/requests/compute/update_database_server.rb +25 -0
  136. data/lib/fog/brightbox/requests/compute/update_database_snapshot.rb +26 -0
  137. data/lib/fog/brightbox/requests/compute/update_firewall_policy.rb +26 -0
  138. data/lib/fog/brightbox/requests/compute/update_firewall_rule.rb +31 -0
  139. data/lib/fog/brightbox/requests/compute/update_image.rb +31 -0
  140. data/lib/fog/brightbox/requests/compute/update_load_balancer.rb +29 -0
  141. data/lib/fog/brightbox/requests/compute/update_scoped_account.rb +31 -0
  142. data/lib/fog/brightbox/requests/compute/update_server.rb +28 -0
  143. data/lib/fog/brightbox/requests/compute/update_server_group.rb +26 -0
  144. data/lib/fog/brightbox/requests/compute/update_user.rb +29 -0
  145. data/lib/fog/brightbox/version.rb +5 -0
  146. data/lib/fog/brightbox.rb +1 -0
  147. metadata +261 -0
@@ -0,0 +1,28 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/brightbox/models/compute/image'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Brightbox
7
+
8
+ class Images < Fog::Collection
9
+
10
+ model Fog::Compute::Brightbox::Image
11
+
12
+ def all
13
+ data = service.list_images
14
+ load(data)
15
+ end
16
+
17
+ def get(identifier)
18
+ data = service.get_image(identifier)
19
+ new(data)
20
+ rescue Excon::Errors::NotFound
21
+ nil
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,107 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class Brightbox
6
+
7
+ class LoadBalancer < Fog::Model
8
+
9
+ identity :id
10
+ attribute :url
11
+ attribute :resource_type
12
+
13
+ attribute :name
14
+ attribute :status
15
+
16
+ attribute :policy
17
+ attribute :nodes
18
+ attribute :healthcheck
19
+ attribute :listeners
20
+
21
+ # These SSL attributes act only as setters. You can not read certs or keys via the API
22
+ attribute :certificate_pem
23
+ attribute :certificate_private_key
24
+
25
+ # These SSL attributes act only as getters for metadata
26
+ attribute :certificate_valid_from
27
+ attribute :certificate_expires_at
28
+ attribute :certificate_issuer
29
+ attribute :certificate_subject
30
+
31
+ # Times
32
+ attribute :created_at, :type => :time
33
+ attribute :deleted_at, :type => :time
34
+
35
+ # Links - to be replaced
36
+ attribute :account
37
+ attribute :server
38
+ attribute :cloud_ip
39
+
40
+ def ready?
41
+ status == 'active'
42
+ end
43
+
44
+ def save
45
+ raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
46
+ requires :nodes, :listeners, :healthcheck
47
+ options = {
48
+ :nodes => nodes,
49
+ :listeners => listeners,
50
+ :healthcheck => healthcheck,
51
+ :policy => policy,
52
+ :name => name,
53
+ :certificate_pem => certificate_pem,
54
+ :certificate_private_key => certificate_private_key
55
+ }.delete_if { |k, v| v.nil? || v == "" }
56
+ data = service.create_load_balancer(options)
57
+ merge_attributes(data)
58
+ true
59
+ end
60
+
61
+ def destroy
62
+ requires :identity
63
+ service.destroy_load_balancer(identity)
64
+ true
65
+ end
66
+
67
+ # SSL cert metadata for expiration of certificate
68
+ def certificate_expires_at
69
+ attributes[:certificate_expires_at]
70
+ end
71
+
72
+ # SSL cert metadata for subject
73
+ def certificate_subject
74
+ attributes[:certificate_subject]
75
+ end
76
+
77
+ # Sets the certificate metadata from the JSON object that contains it.
78
+ #
79
+ # It is used by fog's attribute setting and should not be used for attempting to set a
80
+ # certificate on a load balancer.
81
+ #
82
+ # @private
83
+ def certificate=(cert_metadata)
84
+ if cert_metadata
85
+ attributes[:certificate_valid_from] = time_or_original(cert_metadata["valid_from"])
86
+ attributes[:certificate_expires_at] = time_or_original(cert_metadata["expires_at"])
87
+ attributes[:certificate_issuer] = cert_metadata["issuer"]
88
+ attributes[:certificate_subject] = cert_metadata["subject"]
89
+ else
90
+ attributes[:certificate_valid_from] = nil
91
+ attributes[:certificate_expires_at] = nil
92
+ attributes[:certificate_issuer] = nil
93
+ attributes[:certificate_subject] = nil
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ def time_or_original(value)
100
+ Time.parse(value)
101
+ rescue TypeError, ArgumentError
102
+ value
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,28 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/brightbox/models/compute/load_balancer'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Brightbox
7
+
8
+ class LoadBalancers < Fog::Collection
9
+
10
+ model Fog::Compute::Brightbox::LoadBalancer
11
+
12
+ def all
13
+ data = service.list_load_balancers
14
+ load(data)
15
+ end
16
+
17
+ def get(identifier)
18
+ data = service.get_load_balancer(identifier)
19
+ new(data)
20
+ rescue Excon::Errors::NotFound
21
+ nil
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,217 @@
1
+ require 'fog/compute/models/server'
2
+
3
+ module Fog
4
+ module Compute
5
+ class Brightbox
6
+
7
+ class Server < Fog::Compute::Server
8
+
9
+ identity :id
10
+ attribute :resource_type
11
+ attribute :url
12
+
13
+ attribute :name
14
+ attribute :state, :aliases => 'status'
15
+
16
+ attribute :hostname
17
+ attribute :fqdn
18
+ attribute :user_data
19
+ attribute :console_url
20
+ attribute :fqdn
21
+ attribute :console_token
22
+
23
+ # Times
24
+ attribute :created_at, :type => :time
25
+ attribute :started_at, :type => :time
26
+ attribute :console_token_expires, :type => :time
27
+ attribute :deleted_at, :type => :time
28
+
29
+ # Links - to be replaced
30
+ attribute :account_id, :aliases => "account", :squash => "id"
31
+ attribute :image_id, :aliases => "image", :squash => "id"
32
+
33
+ attribute :snapshots
34
+ attribute :cloud_ips
35
+ attribute :interfaces
36
+ attribute :server_groups
37
+ attribute :zone
38
+ attribute :server_type
39
+
40
+ def initialize(attributes = {})
41
+ # Call super first to initialize the service object for our default image
42
+ super
43
+ self.image_id ||= service.default_image
44
+ end
45
+
46
+ def zone_id
47
+ if t_zone_id = attributes[:zone_id]
48
+ t_zone_id
49
+ elsif zone
50
+ zone[:id] || zone['id']
51
+ end
52
+ end
53
+
54
+ def flavor_id
55
+ if t_flavour_id = attributes[:flavor_id]
56
+ t_flavour_id
57
+ elsif server_type
58
+ server_type[:id] || server_type['id']
59
+ end
60
+ end
61
+
62
+ def zone_id=(incoming_zone_id)
63
+ attributes[:zone_id] = incoming_zone_id
64
+ end
65
+
66
+ def flavor_id=(incoming_flavour_id)
67
+ attributes[:flavor_id] = incoming_flavour_id
68
+ end
69
+
70
+ def snapshot
71
+ requires :identity
72
+ service.snapshot_server(identity)
73
+ end
74
+
75
+ # Directly requesting a server reboot is not supported in the API
76
+ # so needs to attempt a shutdown/stop, wait and start again.
77
+ #
78
+ # Default behaviour is a hard reboot because it is more reliable
79
+ # because the state of the server's OS is irrelevant.
80
+ #
81
+ # @param [Boolean] use_hard_reboot
82
+ # @return [Boolean]
83
+ def reboot(use_hard_reboot = true)
84
+ requires :identity
85
+ if ready?
86
+ if use_hard_reboot
87
+ hard_reboot
88
+ else
89
+ soft_reboot
90
+ end
91
+ else
92
+ # Not able to reboot if not ready in the first place
93
+ false
94
+ end
95
+ end
96
+
97
+ def start
98
+ requires :identity
99
+ service.start_server(identity)
100
+ true
101
+ end
102
+
103
+ def stop
104
+ requires :identity
105
+ service.stop_server(identity)
106
+ true
107
+ end
108
+
109
+ def shutdown
110
+ requires :identity
111
+ service.shutdown_server(identity)
112
+ true
113
+ end
114
+
115
+ def destroy
116
+ requires :identity
117
+ service.destroy_server(identity)
118
+ true
119
+ end
120
+
121
+ def flavor
122
+ requires :flavor_id
123
+ service.flavors.get(flavor_id)
124
+ end
125
+
126
+ def image
127
+ requires :image_id
128
+ service.images.get(image_id)
129
+ end
130
+
131
+ # Returns the public DNS name of the server
132
+ #
133
+ # @return [String]
134
+ #
135
+ def dns_name
136
+ ["public", fqdn].join(".")
137
+ end
138
+
139
+ def private_ip_address
140
+ if interfaces.empty?
141
+ nil
142
+ else
143
+ interfaces.first["ipv4_address"]
144
+ end
145
+ end
146
+
147
+ def public_ip_address
148
+ if cloud_ips.empty?
149
+ nil
150
+ else
151
+ cloud_ips.first["public_ip"]
152
+ end
153
+ end
154
+
155
+ def ready?
156
+ state == "active"
157
+ end
158
+
159
+ def activate_console
160
+ requires :identity
161
+ response = service.activate_console_server(identity)
162
+ [response["console_url"], response["console_token"], response["console_token_expires"]]
163
+ end
164
+
165
+ def save
166
+ raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
167
+ requires :image_id
168
+ options = {
169
+ :image => image_id,
170
+ :name => name,
171
+ :zone => zone_id,
172
+ :user_data => user_data,
173
+ :server_groups => server_groups
174
+ }.delete_if { |k, v| v.nil? || v == "" }
175
+
176
+ options.merge!(:server_type => flavor_id) unless flavor_id.nil? || flavor_id == ""
177
+
178
+ data = service.create_server(options)
179
+ merge_attributes(data)
180
+ true
181
+ end
182
+
183
+ # Replaces the server's identifier with it's interface's identifier for Cloud IP mapping
184
+ #
185
+ # @return [String] the identifier to pass to a Cloud IP mapping request
186
+ def mapping_identity
187
+ interfaces.first["id"]
188
+ end
189
+
190
+ private
191
+
192
+ # Hard reboots are fast, avoiding the OS by doing a "power off"
193
+ def hard_reboot
194
+ stop
195
+ wait_for { !ready? }
196
+ start
197
+ end
198
+
199
+ # Soft reboots often timeout if the OS missed the request so we do more
200
+ # error checking trying to detect the timeout
201
+ #
202
+ # @todo Needs cleaner error handling when the OS times out
203
+ def soft_reboot
204
+ shutdown
205
+ # FIXME: Using side effect of wait_for's (evaluated block) to detect timeouts
206
+ begin
207
+ wait_for(20) { !ready? }
208
+ start
209
+ rescue Fog::Errors::Timeout
210
+ false
211
+ end
212
+ end
213
+ end
214
+
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,94 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class Brightbox
6
+ # A server group is a collection of servers
7
+ #
8
+ # Certain actions can accept a server group and affect all members
9
+ class ServerGroup < Fog::Model
10
+
11
+ identity :id
12
+
13
+ attribute :url
14
+ attribute :resource_type
15
+ attribute :name
16
+ attribute :description
17
+ attribute :default
18
+ attribute :created_at, :type => :time
19
+
20
+ attribute :server_ids, :aliases => "servers"
21
+
22
+ def save
23
+ options = {
24
+ :name => name,
25
+ :description => description
26
+ }.delete_if { |k, v| v.nil? || v == "" }
27
+ data = service.create_server_group(options)
28
+ merge_attributes(data)
29
+ true
30
+ end
31
+
32
+ def servers
33
+ srv_ids = server_ids.map { |srv| srv["id"] }
34
+ srv_ids.map do |srv_id|
35
+ service.servers.get(srv_id)
36
+ end
37
+ end
38
+
39
+ # Adds specified servers to this server group
40
+ #
41
+ # @param [Array] identifiers array of server identifier strings to add
42
+ # @return [Fog::Compute::ServerGroup]
43
+ def add_servers(identifiers)
44
+ requires :identity
45
+ options = {
46
+ :servers => server_references(identifiers)
47
+ }
48
+ data = service.add_servers_server_group identity, options
49
+ merge_attributes data
50
+ end
51
+
52
+ # Removes specified servers from this server group
53
+ #
54
+ # @param [Array] identifiers array of server identifier strings to remove
55
+ # @return [Fog::Compute::ServerGroup]
56
+ def remove_servers(identifiers)
57
+ requires :identity
58
+ options = {
59
+ :servers => server_references(identifiers)
60
+ }
61
+ data = service.remove_servers_server_group identity, options
62
+ merge_attributes data
63
+ end
64
+
65
+ # Moves specified servers from this server group to the specified destination server group
66
+ #
67
+ # @param [Array] identifiers array of server identifier strings to move
68
+ # @param [String] destination_group_id destination server group identifier
69
+ # @return [Fog::Compute::ServerGroup]
70
+ def move_servers(identifiers, destination_group_id)
71
+ requires :identity
72
+ options = {
73
+ :servers => server_references(identifiers),
74
+ :destination => destination_group_id
75
+ }
76
+ data = service.move_servers_server_group identity, options
77
+ merge_attributes data
78
+ end
79
+
80
+ def destroy
81
+ requires :identity
82
+ service.destroy_server_group(identity)
83
+ true
84
+ end
85
+
86
+ protected
87
+
88
+ def server_references(identifiers)
89
+ identifiers.map { |id| { "server" => id } }
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end