fog-scaleway 0.1.0

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 (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +58 -0
  8. data/Rakefile +21 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/fog-scaleway.gemspec +31 -0
  12. data/lib/fog/scaleway.rb +15 -0
  13. data/lib/fog/scaleway/account.rb +306 -0
  14. data/lib/fog/scaleway/client.rb +54 -0
  15. data/lib/fog/scaleway/compute.rb +350 -0
  16. data/lib/fog/scaleway/errors.rb +37 -0
  17. data/lib/fog/scaleway/models/account/organization.rb +42 -0
  18. data/lib/fog/scaleway/models/account/organizations.rb +22 -0
  19. data/lib/fog/scaleway/models/account/token.rb +60 -0
  20. data/lib/fog/scaleway/models/account/tokens.rb +22 -0
  21. data/lib/fog/scaleway/models/account/user.rb +69 -0
  22. data/lib/fog/scaleway/models/account/users.rb +23 -0
  23. data/lib/fog/scaleway/models/compute/bootscript.rb +19 -0
  24. data/lib/fog/scaleway/models/compute/bootscripts.rb +22 -0
  25. data/lib/fog/scaleway/models/compute/image.rb +83 -0
  26. data/lib/fog/scaleway/models/compute/images.rb +22 -0
  27. data/lib/fog/scaleway/models/compute/ip.rb +70 -0
  28. data/lib/fog/scaleway/models/compute/ips.rb +22 -0
  29. data/lib/fog/scaleway/models/compute/security_group.rb +77 -0
  30. data/lib/fog/scaleway/models/compute/security_group_rule.rb +59 -0
  31. data/lib/fog/scaleway/models/compute/security_group_rules.rb +34 -0
  32. data/lib/fog/scaleway/models/compute/security_groups.rb +22 -0
  33. data/lib/fog/scaleway/models/compute/server.rb +243 -0
  34. data/lib/fog/scaleway/models/compute/servers.rb +47 -0
  35. data/lib/fog/scaleway/models/compute/snapshot.rb +90 -0
  36. data/lib/fog/scaleway/models/compute/snapshots.rb +22 -0
  37. data/lib/fog/scaleway/models/compute/task.rb +31 -0
  38. data/lib/fog/scaleway/models/compute/tasks.rb +22 -0
  39. data/lib/fog/scaleway/models/compute/volume.rb +96 -0
  40. data/lib/fog/scaleway/models/compute/volumes.rb +22 -0
  41. data/lib/fog/scaleway/request_helper.rb +32 -0
  42. data/lib/fog/scaleway/requests/account/create_token.rb +62 -0
  43. data/lib/fog/scaleway/requests/account/delete_token.rb +21 -0
  44. data/lib/fog/scaleway/requests/account/get_organization.rb +19 -0
  45. data/lib/fog/scaleway/requests/account/get_organization_quotas.rb +21 -0
  46. data/lib/fog/scaleway/requests/account/get_token.rb +19 -0
  47. data/lib/fog/scaleway/requests/account/get_token_permissions.rb +21 -0
  48. data/lib/fog/scaleway/requests/account/get_user.rb +19 -0
  49. data/lib/fog/scaleway/requests/account/list_organizations.rb +19 -0
  50. data/lib/fog/scaleway/requests/account/list_tokens.rb +19 -0
  51. data/lib/fog/scaleway/requests/account/update_token.rb +27 -0
  52. data/lib/fog/scaleway/requests/account/update_user.rb +39 -0
  53. data/lib/fog/scaleway/requests/compute/create_image.rb +61 -0
  54. data/lib/fog/scaleway/requests/compute/create_ip.rb +68 -0
  55. data/lib/fog/scaleway/requests/compute/create_security_group.rb +49 -0
  56. data/lib/fog/scaleway/requests/compute/create_security_group_rule.rb +49 -0
  57. data/lib/fog/scaleway/requests/compute/create_server.rb +129 -0
  58. data/lib/fog/scaleway/requests/compute/create_snapshot.rb +54 -0
  59. data/lib/fog/scaleway/requests/compute/create_volume.rb +88 -0
  60. data/lib/fog/scaleway/requests/compute/delete_image.rb +27 -0
  61. data/lib/fog/scaleway/requests/compute/delete_ip.rb +29 -0
  62. data/lib/fog/scaleway/requests/compute/delete_security_group.rb +31 -0
  63. data/lib/fog/scaleway/requests/compute/delete_security_group_rule.rb +23 -0
  64. data/lib/fog/scaleway/requests/compute/delete_server.rb +40 -0
  65. data/lib/fog/scaleway/requests/compute/delete_snapshot.rb +29 -0
  66. data/lib/fog/scaleway/requests/compute/delete_task.rb +21 -0
  67. data/lib/fog/scaleway/requests/compute/delete_user_data.rb +21 -0
  68. data/lib/fog/scaleway/requests/compute/delete_volume.rb +31 -0
  69. data/lib/fog/scaleway/requests/compute/execute_server_action.rb +101 -0
  70. data/lib/fog/scaleway/requests/compute/get_bootscript.rb +19 -0
  71. data/lib/fog/scaleway/requests/compute/get_container.rb +19 -0
  72. data/lib/fog/scaleway/requests/compute/get_dashboard.rb +37 -0
  73. data/lib/fog/scaleway/requests/compute/get_image.rb +19 -0
  74. data/lib/fog/scaleway/requests/compute/get_ip.rb +19 -0
  75. data/lib/fog/scaleway/requests/compute/get_security_group.rb +19 -0
  76. data/lib/fog/scaleway/requests/compute/get_security_group_rule.rb +23 -0
  77. data/lib/fog/scaleway/requests/compute/get_server.rb +48 -0
  78. data/lib/fog/scaleway/requests/compute/get_snapshot.rb +19 -0
  79. data/lib/fog/scaleway/requests/compute/get_task.rb +25 -0
  80. data/lib/fog/scaleway/requests/compute/get_user_data.rb +25 -0
  81. data/lib/fog/scaleway/requests/compute/get_volume.rb +19 -0
  82. data/lib/fog/scaleway/requests/compute/list_bootscripts.rb +23 -0
  83. data/lib/fog/scaleway/requests/compute/list_containers.rb +19 -0
  84. data/lib/fog/scaleway/requests/compute/list_images.rb +27 -0
  85. data/lib/fog/scaleway/requests/compute/list_ips.rb +19 -0
  86. data/lib/fog/scaleway/requests/compute/list_security_group_rules.rb +21 -0
  87. data/lib/fog/scaleway/requests/compute/list_security_groups.rb +19 -0
  88. data/lib/fog/scaleway/requests/compute/list_server_actions.rb +21 -0
  89. data/lib/fog/scaleway/requests/compute/list_servers.rb +19 -0
  90. data/lib/fog/scaleway/requests/compute/list_snapshots.rb +19 -0
  91. data/lib/fog/scaleway/requests/compute/list_tasks.rb +19 -0
  92. data/lib/fog/scaleway/requests/compute/list_user_data.rb +21 -0
  93. data/lib/fog/scaleway/requests/compute/list_volumes.rb +19 -0
  94. data/lib/fog/scaleway/requests/compute/update_image.rb +31 -0
  95. data/lib/fog/scaleway/requests/compute/update_ip.rb +47 -0
  96. data/lib/fog/scaleway/requests/compute/update_security_group.rb +29 -0
  97. data/lib/fog/scaleway/requests/compute/update_security_group_rule.rb +31 -0
  98. data/lib/fog/scaleway/requests/compute/update_server.rb +71 -0
  99. data/lib/fog/scaleway/requests/compute/update_snapshot.rb +24 -0
  100. data/lib/fog/scaleway/requests/compute/update_user_data.rb +25 -0
  101. data/lib/fog/scaleway/requests/compute/update_volume.rb +24 -0
  102. data/lib/fog/scaleway/version.rb +5 -0
  103. metadata +285 -0
@@ -0,0 +1,77 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class SecurityGroup < Fog::Model
5
+ identity :id
6
+
7
+ attribute :description
8
+ attribute :enable_default_security
9
+ attribute :name
10
+ attribute :organization
11
+ attribute :organization_default
12
+ attribute :servers
13
+
14
+ def servers=(value)
15
+ attributes[:servers] = value.map do |v|
16
+ case v
17
+ when Hash
18
+ service.servers.new(v)
19
+ when String
20
+ service.servers.new(identity: v)
21
+ else
22
+ v
23
+ end
24
+ end
25
+ end
26
+
27
+ def rules
28
+ service.security_group_rules(security_group: self)
29
+ end
30
+
31
+ def save
32
+ if persisted?
33
+ update
34
+ else
35
+ create
36
+ end
37
+ end
38
+
39
+ def destroy
40
+ requires :identity
41
+
42
+ service.delete_security_group(identity)
43
+ true
44
+ end
45
+
46
+ private
47
+
48
+ def create
49
+ requires :name
50
+
51
+ options = {}
52
+ options[:description] = description unless description.nil?
53
+ options[:enable_default_security] = enable_default_security unless enable_default_security.nil?
54
+ options[:organization_default] = organization_default unless organization_default.nil?
55
+
56
+ if (security_group = service.create_security_group(name, options).body['security_group'])
57
+ merge_attributes(security_group)
58
+ true
59
+ else
60
+ false
61
+ end
62
+ end
63
+
64
+ def update
65
+ requires :identity
66
+
67
+ if (security_group = service.update_security_group(identity, self).body['security_group'])
68
+ merge_attributes(security_group)
69
+ true
70
+ else
71
+ false
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,59 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class SecurityGroupRule < Fog::Model
5
+ attr_accessor :security_group
6
+
7
+ identity :id
8
+
9
+ attribute :action
10
+ attribute :dest_port_from
11
+ attribute :dest_port_to
12
+ attribute :direction
13
+ attribute :editable
14
+ attribute :ip_range
15
+ attribute :position
16
+ attribute :protocol
17
+
18
+ def save
19
+ if persisted?
20
+ update
21
+ else
22
+ create
23
+ end
24
+ end
25
+
26
+ def destroy
27
+ requires :security_group, :identity
28
+
29
+ service.delete_security_group_rule(security_group.identity, identity)
30
+ true
31
+ end
32
+
33
+ private
34
+
35
+ def create
36
+ requires :security_group, :action, :direction, :ip_range, :protocol
37
+
38
+ if (rule = service.create_security_group_rule(security_group.identity, action, direction, ip_range, protocol, dest_port_from).body['rule'])
39
+ merge_attributes(rule)
40
+ true
41
+ else
42
+ false
43
+ end
44
+ end
45
+
46
+ def update
47
+ requires :security_group, :identity
48
+
49
+ if (rule = service.update_security_group_rule(security_group.identity, identity, self).body['rule'])
50
+ merge_attributes(rule)
51
+ true
52
+ else
53
+ false
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,34 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class SecurityGroupRules < Fog::Collection
5
+ model Fog::Scaleway::Compute::SecurityGroupRule
6
+
7
+ attribute :security_group
8
+
9
+ def all
10
+ requires :security_group
11
+
12
+ rules = service.list_security_group_rules(security_group.identity).body['rules'] || []
13
+ load(rules)
14
+ end
15
+
16
+ def get(identity)
17
+ requires :security_group
18
+
19
+ if (rule = service.get_security_group_rule(security_group.identity, identity).body['rule'])
20
+ new(rule)
21
+ end
22
+ rescue Fog::Scaleway::Compute::UnknownResource
23
+ nil
24
+ end
25
+
26
+ def new(attributes = {})
27
+ requires :security_group
28
+
29
+ super({ security_group: security_group }.merge(attributes))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class SecurityGroups < Fog::Collection
5
+ model Fog::Scaleway::Compute::SecurityGroup
6
+
7
+ def all
8
+ security_groups = service.list_security_groups.body['security_groups'] || []
9
+ load(security_groups)
10
+ end
11
+
12
+ def get(identity)
13
+ if (security_group = service.get_security_group(identity).body['security_group'])
14
+ new(security_group)
15
+ end
16
+ rescue Fog::Scaleway::Compute::UnknownResource
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,243 @@
1
+ require 'fog/compute/models/server'
2
+
3
+ module Fog
4
+ module Scaleway
5
+ class Compute
6
+ class Server < Fog::Compute::Server
7
+ identity :id
8
+
9
+ attribute :arch
10
+ attribute :bootscript
11
+ attribute :commercial_type
12
+ attribute :creation_date
13
+ attribute :dynamic_ip_required
14
+ attribute :enable_ipv6
15
+ attribute :extra_networks
16
+ attribute :hostname
17
+ attribute :image
18
+ attribute :ipv6
19
+ attribute :location
20
+ attribute :modification_date
21
+ attribute :name
22
+ attribute :organization
23
+ attribute :private_ip
24
+ attribute :public_ip
25
+ attribute :security_group
26
+ attribute :state
27
+ attribute :state_detail
28
+ attribute :tags
29
+ attribute :volumes, default: {}
30
+
31
+ def bootscript=(value)
32
+ attributes[:bootscript] = case value
33
+ when Hash
34
+ service.bootscripts.new(value)
35
+ when String
36
+ service.bootscripts.new(identity: value)
37
+ else
38
+ value
39
+ end
40
+ end
41
+
42
+ def image=(value)
43
+ attributes[:image] = case value
44
+ when Hash
45
+ service.images.new(value)
46
+ when String
47
+ service.images.new(identity: value)
48
+ else
49
+ value
50
+ end
51
+ end
52
+
53
+ def public_ip=(value)
54
+ attributes[:public_ip] = case value
55
+ when Hash
56
+ service.ips.new(value)
57
+ when String
58
+ service.ips.new(identity: value)
59
+ else
60
+ value
61
+ end
62
+ end
63
+
64
+ def security_group=(value)
65
+ attributes[:security_group] = case value
66
+ when Hash
67
+ service.security_groups.new(value)
68
+ when String
69
+ service.security_groups.new(identity: value)
70
+ else
71
+ value
72
+ end
73
+ end
74
+
75
+ def volumes=(value)
76
+ attributes[:volumes] = Hash[value.map { |i, v| [i, to_volume(v)] }]
77
+ end
78
+
79
+ def public_dns_name
80
+ "#{identity}.pub.cloud.scaleway.com"
81
+ end
82
+
83
+ def private_dns_name
84
+ "#{identity}.priv.cloud.scaleway.com"
85
+ end
86
+
87
+ def ready?
88
+ state == 'running'
89
+ end
90
+
91
+ def save
92
+ if persisted?
93
+ update
94
+ else
95
+ create
96
+ end
97
+ end
98
+
99
+ def destroy
100
+ requires :identity
101
+
102
+ service.delete_server(identity)
103
+ true
104
+ end
105
+
106
+ def poweron(async = true)
107
+ requires :identity
108
+
109
+ if (task = service.execute_server_action(identity, 'poweron').body['task'])
110
+ service.tasks.new(task).tap do |task|
111
+ unless async
112
+ task.wait_for { task.success? }
113
+ reload
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ def poweroff(async = true)
120
+ requires :identity
121
+
122
+ if (task = service.execute_server_action(identity, 'poweroff').body['task'])
123
+ service.tasks.new(task).tap do |task|
124
+ unless async
125
+ task.wait_for { task.success? }
126
+ reload
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ def reboot(async = true)
133
+ requires :identity
134
+
135
+ if (task = service.execute_server_action(identity, 'reboot').body['task'])
136
+ service.tasks.new(task).tap do |task|
137
+ unless async
138
+ task.wait_for { task.success? }
139
+ reload
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ def terminate(async = true)
146
+ requires :identity
147
+
148
+ if (task = service.execute_server_action(identity, 'terminate').body['task'])
149
+ service.tasks.new(task).tap do |task|
150
+ unless async
151
+ task.wait_for { task.success? }
152
+ reload
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ def attach_volume(volume)
159
+ volumes[next_volume_index] = to_volume(volume)
160
+
161
+ save if persisted?
162
+ end
163
+
164
+ def detach_volume(volume)
165
+ volumes.reject! { |_k, v| v == to_volume(volume) }
166
+
167
+ save if persisted?
168
+ end
169
+
170
+ def public_ip_address
171
+ public_ip.address if public_ip
172
+ end
173
+
174
+ def private_ip_address
175
+ private_ip
176
+ end
177
+
178
+ private
179
+
180
+ def create
181
+ requires :name, :image, :volumes
182
+
183
+ options = {}
184
+ options[:commercial_type] = commercial_type unless commercial_type.nil?
185
+ options[:enable_ipv6] = enable_ipv6 unless enable_ipv6.nil?
186
+ options[:dynamic_ip_required] = dynamic_ip_required unless dynamic_ip_required.nil?
187
+ options[:public_ip] = public_ip.identity unless public_ip.nil?
188
+ options[:tags] = tags unless tags.nil?
189
+
190
+ if (server = service.create_server(name, image.identity, volumes, options).body['server'])
191
+ merge_attributes(server)
192
+ true
193
+ else
194
+ false
195
+ end
196
+ end
197
+
198
+ def update
199
+ requires :identity
200
+
201
+ body = attributes.dup
202
+
203
+ unless public_ip.nil?
204
+ body[:public_ip] = {
205
+ id: public_ip.identity,
206
+ address: public_ip.address
207
+ }
208
+ end
209
+
210
+ unless security_group.nil?
211
+ body[:security_group] = {
212
+ id: security_group.identity,
213
+ name: security_group.name
214
+ }
215
+ end
216
+
217
+ if (server = service.update_server(identity, body).body['server'])
218
+ merge_attributes(server)
219
+ true
220
+ else
221
+ false
222
+ end
223
+ end
224
+
225
+ def to_volume(value)
226
+ case value
227
+ when Hash
228
+ service.volumes.new(value)
229
+ when String
230
+ service.volumes.new(identity: value)
231
+ else
232
+ value
233
+ end
234
+ end
235
+
236
+ def next_volume_index
237
+ used = volumes.keys.map(&:to_i)
238
+ (1..Float::INFINITY).find { |i| !used.include?(i) }.to_s
239
+ end
240
+ end
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,47 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Servers < Fog::Collection
5
+ model Fog::Scaleway::Compute::Server
6
+
7
+ def all
8
+ servers = service.list_servers.body['servers'] || []
9
+ load(servers)
10
+ end
11
+
12
+ def get(identity)
13
+ if (server = service.get_server(identity).body['server'])
14
+ new(server)
15
+ end
16
+ rescue Fog::Scaleway::Compute::UnknownResource
17
+ nil
18
+ end
19
+
20
+ def bootstrap(new_attributes = {})
21
+ require 'securerandom'
22
+ name = "scw-#{SecureRandom.hex(3)}"
23
+
24
+ public_ip = new_attributes[:public_ip]
25
+
26
+ public_ip = service.ips.create(new_attributes) if public_ip.nil?
27
+
28
+ defaults = {
29
+ name: name,
30
+ image: '75c28f52-6c64-40fc-bb31-f53ca9d02de9',
31
+ commercial_type: 'C2S',
32
+ dynamic_ip_required: false,
33
+ public_ip: public_ip
34
+ }
35
+
36
+ server = create(defaults.merge(new_attributes))
37
+
38
+ server.poweron(false)
39
+
40
+ server.wait_for { sshable? }
41
+
42
+ server
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end