fog-scaleway 0.1.0

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