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,54 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_snapshot(name, volume_id)
6
+ create('/snapshots', organization: @organization,
7
+ name: name,
8
+ volume_id: volume_id)
9
+ end
10
+ end
11
+
12
+ class Mock
13
+ def create_snapshot(name, volume_id)
14
+ body = {
15
+ organization: @organization,
16
+ name: name,
17
+ volume_id: volume_id
18
+ }
19
+
20
+ body = jsonify(body)
21
+
22
+ base_volume = lookup(:volumes, body['volume_id'])
23
+
24
+ server_id = base_volume['server'] && base_volume['server']['id']
25
+ server = lookup(:servers, server_id) if server_id
26
+ in_use = server && server['state'] != 'stopped'
27
+
28
+ raise_invalid_request_error('server must be stopped to snapshot') if in_use
29
+
30
+ creation_date = now
31
+
32
+ snapshot = {
33
+ 'state' => 'snapshotting',
34
+ 'base_volume' => {
35
+ 'id' => base_volume['id'],
36
+ 'name' => base_volume['name']
37
+ },
38
+ 'name' => body['name'],
39
+ 'modification_date' => creation_date,
40
+ 'organization' => body['organization'],
41
+ 'size' => base_volume['size'],
42
+ 'id' => Fog::UUID.uuid,
43
+ 'volume_type' => base_volume['volume_type'],
44
+ 'creation_date' => creation_date
45
+ }
46
+
47
+ data[:snapshots][snapshot['id']] = snapshot
48
+
49
+ response(status: 201, body: { 'snapshot' => snapshot })
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,88 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_volume(name, volume_type, options)
6
+ if options[:size].nil? && options[:base_volume].nil? && options[:base_snapshot].nil?
7
+ raise ArgumentError, 'size, base_volume or base_snapshot are required to create a volume'
8
+ end
9
+
10
+ body = {
11
+ organization: @organization,
12
+ name: name,
13
+ volume_type: volume_type
14
+ }
15
+
16
+ if !options[:size].nil?
17
+ body[:size] = options[:size]
18
+ elsif !options[:base_volume].nil?
19
+ body[:base_volume] = options[:base_volume]
20
+ else
21
+ body[:base_snapshot] = options[:base_snapshot]
22
+ end
23
+
24
+ create('/volumes', body)
25
+ end
26
+ end
27
+
28
+ class Mock
29
+ def create_volume(name, volume_type, options)
30
+ if options[:size].nil? && options[:base_volume].nil? && options[:base_snapshot].nil?
31
+ raise ArgumentError, 'size, base_volume or base_snapshot are required to create a volume'
32
+ end
33
+
34
+ body = {
35
+ organization: @organization,
36
+ name: name,
37
+ volume_type: volume_type
38
+ }
39
+
40
+ if !options[:size].nil?
41
+ body[:size] = options[:size]
42
+ elsif !options[:base_volume].nil?
43
+ body[:base_volume] = options[:base_volume]
44
+ else
45
+ body[:base_snapshot] = options[:base_snapshot]
46
+ end
47
+
48
+ body = jsonify(body)
49
+
50
+ creation_date = now
51
+
52
+ if body['size']
53
+ size = body['size']
54
+ elsif body['base_volume']
55
+ base_volume = lookup(:volumes, body['base_volume'])
56
+
57
+ server_id = base_volume['server'] && base_volume['server']['id']
58
+ server = lookup(:servers, server_id) if server_id
59
+ in_use = server && server['state'] != 'stopped'
60
+
61
+ raise_invalid_request_error('Base volume is in use') if in_use
62
+
63
+ size = base_volume['size']
64
+ elsif body['base_snapshot']
65
+ base_snapshot = lookup(:snapshots, body['base_snapshot'])
66
+ size = base_snapshot['size']
67
+ end
68
+
69
+ volume = {
70
+ 'size' => size,
71
+ 'name' => body['name'],
72
+ 'modification_date' => creation_date,
73
+ 'organization' => body['organization'],
74
+ 'export_uri' => nil,
75
+ 'creation_date' => creation_date,
76
+ 'id' => Fog::UUID.uuid,
77
+ 'volume_type' => body['volume_type'],
78
+ 'server' => nil
79
+ }
80
+
81
+ data[:volumes][volume['id']] = volume
82
+
83
+ response(status: 201, body: { 'volume' => volume })
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,27 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_image(image_id)
6
+ delete("/images/#{image_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_image(image_id)
12
+ image = lookup(:images, image_id)
13
+
14
+ data[:images].delete(image['id'])
15
+
16
+ data[:servers].each do |_id, server|
17
+ if server['image'] && server['image']['id'] == image['id']
18
+ server['image'] = nil
19
+ end
20
+ end
21
+
22
+ response(status: 204)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_ip(ip_id)
6
+ delete("/ips/#{ip_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_ip(ip_id)
12
+ ip = lookup(:ips, ip_id)
13
+
14
+ data[:ips].delete(ip['id'])
15
+
16
+ if ip['server']
17
+ server = lookup(:servers, ip['server']['id'])
18
+
19
+ server['public_ip'] = if server['dynamic_ip_required']
20
+ create_dynamic_ip
21
+ end
22
+ end
23
+
24
+ response(status: 204)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_security_group(security_group_id)
6
+ delete("/security_groups/#{security_group_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_security_group(security_group_id)
12
+ security_group = lookup(:security_groups, security_group_id)
13
+
14
+ unless security_group['servers'].empty?
15
+ raise_conflict('Group is in use. You cannot delete it.')
16
+ end
17
+
18
+ if security_group['organization_default']
19
+ raise_conflict('Group is default group. You cannot delete it.')
20
+ end
21
+
22
+ data[:security_groups].delete(security_group['id'])
23
+
24
+ data[:security_group_rules].delete(security_group['id'])
25
+
26
+ response(status: 204)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_security_group_rule(security_group_id, rule_id)
6
+ delete("/security_groups/#{security_group_id}/rules/#{rule_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_security_group_rule(security_group_id, rule_id)
12
+ security_group = lookup(:security_groups, security_group_id)
13
+
14
+ unless data[:security_group_rules][security_group_id].delete(rule_id)
15
+ raise_unknown_resource(rule_id)
16
+ end
17
+
18
+ response(status: 204)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_server(server_id)
6
+ delete("/servers/#{server_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_server(server_id)
12
+ server = lookup(:servers, server_id)
13
+
14
+ if server['state'] != 'stopped'
15
+ raise_invalid_request_error('server should be stopped')
16
+ end
17
+
18
+ data[:servers].delete(server['id'])
19
+
20
+ data[:user_data].delete(server['id'])
21
+
22
+ data[:server_actions].delete(server['id'])
23
+
24
+ if server['public_ip'] && !server['public_ip']['dynamic']
25
+ ip = lookup(:ips, server['public_ip']['id'])
26
+ ip['server'] = nil
27
+ end
28
+
29
+ security_group = lookup(:security_groups, server['security_group']['id'])
30
+ security_group['servers'].reject! { |s| s['id'] == server['id'] }
31
+
32
+ volumes = server['volumes'].values
33
+ volumes.each { |volume| volume['server'] = nil }
34
+
35
+ response(status: 204)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_snapshot(snapshot_id)
6
+ delete("/snapshots/#{snapshot_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_snapshot(snapshot_id)
12
+ snapshot = lookup(:snapshots, snapshot_id)
13
+
14
+ in_use = data[:images].any? do |_id, image|
15
+ image['root_volume']['id'] == snapshot['id']
16
+ end
17
+
18
+ if in_use
19
+ raise_invalid_request_error('one or more images are attached to this snapshot')
20
+ end
21
+
22
+ data[:snapshots].delete(snapshot['id'])
23
+
24
+ response(status: 204)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_task(task_id)
6
+ delete("/tasks/#{task_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_task(task_id)
12
+ task = lookup(:tasks, task_id)
13
+
14
+ data[:tasks].delete(task['id'])
15
+
16
+ response(status: 204)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_user_data(server_id, key)
6
+ delete("/servers/#{server_id}/user_data/#{key}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_user_data(server_id, key)
12
+ server = lookup(:servers, server_id)
13
+
14
+ data[:user_data][server['id']].delete(key)
15
+
16
+ response(status: 204)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def delete_volume(volume_id)
6
+ delete("/volumes/#{volume_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_volume(volume_id)
12
+ volume = lookup(:volumes, volume_id)
13
+
14
+ if volume['server']
15
+ raise_invalid_request_error('a server is attached to this volume')
16
+ end
17
+
18
+ data[:volumes].delete(volume_id)
19
+
20
+ data[:snapshots].each do |_id, snapshot|
21
+ if snapshot['base_volume'] && snapshot['base_volume']['id'] == volume_id
22
+ snapshot['base_volume'] = nil
23
+ end
24
+ end
25
+
26
+ response(status: 204)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,101 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def execute_server_action(server_id, action)
6
+ request(method: :post,
7
+ path: "/servers/#{server_id}/action",
8
+ body: {
9
+ action: action
10
+ },
11
+ expects: [202])
12
+ end
13
+ end
14
+
15
+ class Mock
16
+ def execute_server_action(server_id, action)
17
+ server = lookup(:servers, server_id)
18
+
19
+ started_at = now
20
+
21
+ task = {
22
+ 'status' => 'pending',
23
+ 'terminated_at' => nil,
24
+ 'href_from' => "/servers/#{server_id}/action",
25
+ 'progress' => 0,
26
+ 'started_at' => started_at,
27
+ 'id' => Fog::UUID.uuid
28
+ }
29
+
30
+ case action
31
+ when 'poweron'
32
+ unless server['state'] == 'stopped'
33
+ raise_invalid_request_error('server should be stopped')
34
+ end
35
+
36
+ task['description'] = 'server_batch_poweron'
37
+
38
+ server['ipv6'] = create_ipv6 if server['enable_ipv6']
39
+
40
+ server['location'] = {
41
+ 'platform_id' => Fog::Mock.random_numbers(2),
42
+ 'node_id' => Fog::Mock.random_numbers(2),
43
+ 'cluster_id' => Fog::Mock.random_numbers(2),
44
+ 'chassis_id' => Fog::Mock.random_numbers(2)
45
+ }
46
+
47
+ server['private_ip'] = Fog::Mock.random_ip
48
+
49
+ if server['dynamic_ip_required'] && server['public_ip'].nil?
50
+ server['public_ip'] = create_dynamic_ip
51
+ end
52
+
53
+ server['state'] = 'starting'
54
+ server['state_detail'] = 'provisioning node'
55
+ server['modification_date'] = started_at
56
+ when 'poweroff'
57
+ if server['state'] == 'stopping'
58
+ raise_invalid_request_error('server is being stopped or rebooted')
59
+ elsif server['state'] != 'running'
60
+ raise_invalid_request_error('server should be running')
61
+ end
62
+
63
+ task['description'] = 'server_poweroff'
64
+
65
+ server['state'] = 'stopping'
66
+ server['state_detail'] = 'stopping'
67
+ server['modification_date'] = started_at
68
+ when 'reboot'
69
+ if server['state'] == 'stopping'
70
+ raise_invalid_request_error('server is being stopped or rebooted')
71
+ elsif server['state'] != 'running'
72
+ raise_invalid_request_error('server should be running')
73
+ end
74
+
75
+ task['description'] = 'server_reboot'
76
+
77
+ server['state'] = 'stopping'
78
+ server['state_detail'] = 'rebooting'
79
+ server['modification_date'] = started_at
80
+ when 'terminate'
81
+ if server['state'] == 'stopping'
82
+ raise_invalid_request_error('server is being stopped or rebooted')
83
+ elsif server['state'] != 'running'
84
+ raise_invalid_request_error('server should be running')
85
+ end
86
+
87
+ task['description'] = 'server_terminate'
88
+
89
+ server['state'] = 'stopping'
90
+ server['state_detail'] = 'terminating'
91
+ server['modification_date'] = started_at
92
+ end
93
+
94
+ data[:tasks][task['id']] = task
95
+
96
+ response(status: 202, body: { 'task' => task })
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end