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,19 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def get_token(token_id)
6
+ get("/tokens/#{token_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def get_token(token_id)
12
+ token = lookup(:tokens, token_id)
13
+
14
+ response(status: 200, body: { 'token' => token })
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def get_token_permissions(token_id)
6
+ get("/tokens/#{token_id}/permissions")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def get_token_permission(token_id)
12
+ token = lookup(:tokens, token_id)
13
+
14
+ permissions = lookup(:token_permissions, token['id'])
15
+
16
+ response(status: 200, body: { 'permissions' => permissions })
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def get_user(user_id)
6
+ get("/users/#{user_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def get_user(user_id)
12
+ user = lookup(:users, user_id)
13
+
14
+ response(status: 200, body: { 'user' => user })
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def list_organizations
6
+ get('/organizations')
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def list_organizations
12
+ organizations = data[:organizations].values
13
+
14
+ response(status: 200, body: { 'organizations' => organizations })
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def list_tokens
6
+ get('/tokens')
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def list_tokens
12
+ tokens = data[:tokens].values
13
+
14
+ response(status: 200, body: { 'tokens' => tokens })
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def update_token(token_id, options = {})
6
+ request(method: :patch,
7
+ path: "/tokens/#{token_id}",
8
+ body: options,
9
+ expects: [200])
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def update_token(token_id, options = {})
15
+ options = jsonify(options)
16
+
17
+ token = lookup(:tokens, token_id)
18
+
19
+ token['description'] = options['description'] unless options['description'].nil?
20
+ token['expires'] = (Time.now + 30 * 60).utc.strftime(TIME_FORMAT)
21
+
22
+ response(status: 200, body: { 'token' => token })
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def update_user(user_id, options = {})
6
+ request(method: :patch,
7
+ path: "/users/#{user_id}",
8
+ body: options,
9
+ expects: [200])
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def update_user(user_id, options = {})
15
+ options = jsonify(options)
16
+
17
+ user = lookup(:users, user_id)
18
+
19
+ %w(phone_number firstname lastname).each do |attr|
20
+ user[attr] = options[attr] if options.key?(attr)
21
+ end
22
+
23
+ user['fullname'] = [user['firstname'], user['lastname']].compact.join(' ')
24
+
25
+ if (ssh_public_keys = options['ssh_public_keys'])
26
+ user['ssh_public_keys'] = ssh_public_keys.map do |key|
27
+ {
28
+ 'key' => key['key'],
29
+ 'fingerprint' => generate_fingerprint(key['key'])
30
+ }
31
+ end
32
+ end
33
+
34
+ response(status: 200, body: { 'user' => user })
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_image(name, arch, root_volume, options = {})
6
+ body = {
7
+ organization: @organization,
8
+ name: name,
9
+ arch: arch,
10
+ root_volume: root_volume
11
+ }
12
+
13
+ body.merge!(options)
14
+
15
+ create('/images', body)
16
+ end
17
+ end
18
+
19
+ class Mock
20
+ def create_image(name, arch, root_volume, options = {})
21
+ body = {
22
+ organization: @organization,
23
+ name: name,
24
+ arch: arch,
25
+ root_volume: root_volume
26
+ }
27
+
28
+ body.merge!(options)
29
+
30
+ body = jsonify(body)
31
+
32
+ creation_date = now
33
+
34
+ root_volume = lookup(:snapshots, body['root_volume'])
35
+
36
+ image = {
37
+ 'default_bootscript' => body['default_bootscript'],
38
+ 'creation_date' => creation_date,
39
+ 'name' => body['name'],
40
+ 'modification_date' => creation_date,
41
+ 'organization' => body['organization'],
42
+ 'extra_volumes' => '[]',
43
+ 'arch' => body['arch'],
44
+ 'id' => Fog::UUID.uuid,
45
+ 'root_volume' => {
46
+ 'size' => root_volume['size'],
47
+ 'id' => root_volume['id'],
48
+ 'volume_type' => root_volume['volume_type'],
49
+ 'name' => root_volume['name']
50
+ },
51
+ 'public' => false
52
+ }
53
+
54
+ data[:images][image['id']] = image
55
+
56
+ response(status: 201, body: { 'image' => image })
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,68 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_ip(options = {})
6
+ body = {
7
+ organization: @organization
8
+ }
9
+
10
+ body.merge!(options)
11
+
12
+ create('/ips', body)
13
+ end
14
+ end
15
+
16
+ class Mock
17
+ def create_ip(options = {})
18
+ body = {
19
+ organization: @organization
20
+ }
21
+
22
+ body.merge!(options)
23
+
24
+ body = jsonify(body)
25
+
26
+ server = lookup(:servers, body['server']) if body['server']
27
+
28
+ ip = {
29
+ 'organization' => body['organization'],
30
+ 'reverse' => nil,
31
+ 'id' => Fog::UUID.uuid,
32
+ 'server' => nil,
33
+ 'address' => Fog::Mock.random_ip
34
+ }
35
+
36
+ if server
37
+ ip['server'] = {
38
+ 'id' => server['id'],
39
+ 'name' => server['name']
40
+ }
41
+ end
42
+
43
+ if server && (public_ip = server['public_ip'])
44
+ if public_ip['dynamic']
45
+ ip['id'] = public_ip['id']
46
+ ip['address'] = public_ip['address']
47
+ else
48
+ message = "Server '#{server['id']}' is already attached to an IP address"
49
+ raise_invalid_request_error(message)
50
+ end
51
+ end
52
+
53
+ data[:ips][ip['id']] = ip
54
+
55
+ if server
56
+ server['public_ip'] = {
57
+ 'dynamic' => false,
58
+ 'id' => ip['id'],
59
+ 'address' => ip['address']
60
+ }
61
+ end
62
+
63
+ response(status: 201, body: { 'ip' => ip })
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,49 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_security_group(name, options = {})
6
+ body = {
7
+ organization: @organization,
8
+ name: name
9
+ }
10
+
11
+ body.merge!(options)
12
+
13
+ create('/security_groups', body)
14
+ end
15
+ end
16
+
17
+ class Mock
18
+ def create_security_group(name, options = {})
19
+ body = {
20
+ organization: @organization,
21
+ name: name
22
+ }
23
+
24
+ body.merge!(options)
25
+
26
+ body = jsonify(body)
27
+
28
+ security_group = {
29
+ 'description' => body['description'],
30
+ 'enable_default_security' => body.fetch('enable_default_security', true),
31
+ 'servers' => [],
32
+ 'organization' => body['organization'],
33
+ 'organization_default' => body.fetch('organization_default', false),
34
+ 'id' => Fog::UUID.uuid,
35
+ 'name' => body['name']
36
+ }
37
+
38
+ if security_group['organization_default'] && default_security_group
39
+ raise_conflict('Cannot have more than one organization default group')
40
+ end
41
+
42
+ data[:security_groups][security_group['id']] = security_group
43
+
44
+ response(status: 201, body: { 'security_group' => security_group })
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_security_group_rule(security_group_id, action, direction, ip_range, protocol, dest_port_from = nil)
6
+ create("/security_groups/#{security_group_id}/rules", action: action,
7
+ direction: direction,
8
+ ip_range: ip_range,
9
+ protocol: protocol,
10
+ dest_port_from: dest_port_from)
11
+ end
12
+ end
13
+
14
+ class Mock
15
+ def create_security_group_rule(security_group_id, action, direction, ip_range, protocol, dest_port_from = nil)
16
+ body = {
17
+ action: action,
18
+ direction: direction,
19
+ ip_range: ip_range,
20
+ protocol: protocol,
21
+ dest_port_from: dest_port_from
22
+ }
23
+
24
+ body = jsonify(body)
25
+
26
+ rules = data[:security_group_rules][security_group_id].values
27
+
28
+ position = (rules.map { |r| r[:position] }.max || 0) + 1
29
+
30
+ rule = {
31
+ 'direction' => body['direction'],
32
+ 'protocol' => body['protocol'],
33
+ 'ip_range' => body['ip_range'],
34
+ 'dest_port_from' => body['dest_port_from'],
35
+ 'action' => body['action'],
36
+ 'position' => position,
37
+ 'dest_port_to' => nil,
38
+ 'editable' => nil,
39
+ 'id' => Fog::UUID.uuid
40
+ }
41
+
42
+ data[:security_group_rules][security_group_id][rule['id']] = rule
43
+
44
+ response(status: 201, body: { 'rule' => rule })
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,129 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Real
5
+ def create_server(name, image, volumes, options = {})
6
+ body = {
7
+ organization: @organization,
8
+ name: name,
9
+ image: image,
10
+ volumes: volumes
11
+ }
12
+
13
+ body.merge!(options)
14
+
15
+ create('/servers', body)
16
+ end
17
+ end
18
+
19
+ class Mock
20
+ def create_server(name, image, volumes, options = {})
21
+ body = {
22
+ organization: @organization,
23
+ name: name,
24
+ image: image,
25
+ volumes: volumes
26
+ }
27
+
28
+ body.merge!(options)
29
+
30
+ body = jsonify(body)
31
+
32
+ image = lookup(:images, body['image'])
33
+
34
+ creation_date = now
35
+
36
+ volumes = {}
37
+ body['volumes'].each do |index, volume|
38
+ volume = lookup(:volumes, volume['id'])
39
+
40
+ if volume['server']
41
+ message = "volume #{volume['id']} is already attached to a server"
42
+ raise_invalid_request_error(message)
43
+ end
44
+
45
+ volumes[index] = volume
46
+ end
47
+
48
+ root_volume = image['root_volume']
49
+ volumes['0'] = {
50
+ 'size' => root_volume['size'],
51
+ 'name' => root_volume['name'],
52
+ 'modification_date' => creation_date,
53
+ 'organization' => body['organization'],
54
+ 'export_uri' => nil,
55
+ 'creation_date' => creation_date,
56
+ 'id' => Fog::UUID.uuid,
57
+ 'volume_type' => root_volume['volume_type'],
58
+ 'server' => nil
59
+ }
60
+
61
+ public_ip = nil
62
+ if body['public_ip']
63
+ public_ip = lookup(:ips, body['public_ip'])
64
+
65
+ public_ip = {
66
+ 'dynamic' => false,
67
+ 'id' => public_ip['id'],
68
+ 'address' => public_ip['address']
69
+ }
70
+ end
71
+
72
+ dynamic_ip_required = !public_ip && body.fetch('dynamic_ip_required', true)
73
+
74
+ default_bootscript_id = image['default_bootscript']['id']
75
+ bootscript_id = body.fetch('bootscript', default_bootscript_id)
76
+ bootscript = lookup(:bootscripts, bootscript_id)
77
+
78
+ if body['security_group']
79
+ security_group = lookup(:security_groups, body['security_group'])
80
+ else
81
+ security_group = default_security_group
82
+ security_group ||= create_default_security_group
83
+ end
84
+
85
+ server = {
86
+ 'arch' => image['arch'],
87
+ 'bootscript' => bootscript,
88
+ 'commercial_type' => body.fetch('commercial_type', 'C1'),
89
+ 'creation_date' => creation_date,
90
+ 'dynamic_ip_required' => dynamic_ip_required,
91
+ 'enable_ipv6' => body.fetch('enable_ipv6', false),
92
+ 'extra_networks' => [],
93
+ 'hostname' => body['name'],
94
+ 'id' => Fog::UUID.uuid,
95
+ 'image' => image,
96
+ 'ipv6' => nil,
97
+ 'location' => nil,
98
+ 'modification_date' => creation_date,
99
+ 'name' => body['name'],
100
+ 'organization' => body['organization'],
101
+ 'private_ip' => nil,
102
+ 'public_ip' => public_ip,
103
+ 'security_group' => {
104
+ 'id' => security_group['id'],
105
+ 'name' => security_group['name']
106
+ },
107
+ 'state' => 'stopped',
108
+ 'state_detail' => '',
109
+ 'tags' => body.fetch('tags', []),
110
+ 'volumes' => volumes
111
+ }
112
+
113
+ data[:servers][server['id']] = server
114
+
115
+ data[:volumes][server['volumes']['0']['id']] = server['volumes']['0']
116
+
117
+ server['volumes'].each do |_index, volume|
118
+ volume['server'] = {
119
+ 'id' => server['id'],
120
+ 'name' => server['name']
121
+ }
122
+ end
123
+
124
+ response(status: 201, body: { 'server' => server })
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end