fog-brightbox 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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