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,90 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Snapshot < Fog::Model
5
+ identity :id
6
+
7
+ attribute :base_volume
8
+ attribute :creation_date
9
+ attribute :modification_date
10
+ attribute :name
11
+ attribute :organization
12
+ attribute :size
13
+ attribute :state
14
+ attribute :volume_type
15
+
16
+ def base_volume=(value)
17
+ attributes[:base_volume] = case value
18
+ when Hash
19
+ service.volumes.new(value)
20
+ when String
21
+ service.volumes.new(identity: value)
22
+ else
23
+ value
24
+ end
25
+ end
26
+
27
+ def save
28
+ if persisted?
29
+ update
30
+ else
31
+ create
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ requires :identity
37
+
38
+ service.delete_snapshot(identity)
39
+ true
40
+ end
41
+
42
+ def create_image(name, arch)
43
+ requires :identity
44
+
45
+ if (image = service.create_image(name, arch, identity).body['image'])
46
+ service.images.new(image)
47
+ end
48
+ end
49
+
50
+ def create_volume(name = nil)
51
+ requires :identity, :volume_type
52
+
53
+ if name.nil?
54
+ requires :name
55
+
56
+ name = "#{self.name} - (from snapshot)"
57
+ end
58
+
59
+ if (volume = service.create_volume(name, volume_type, base_snapshot: identity).body['volume'])
60
+ service.volumes.new(volume)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def create
67
+ requires :name, :base_volume
68
+
69
+ if (snapshot = service.create_snapshot(name, base_volume.identity).body['snapshot'])
70
+ merge_attributes(snapshot)
71
+ true
72
+ else
73
+ false
74
+ end
75
+ end
76
+
77
+ def update
78
+ requires :identity
79
+
80
+ if (snapshot = service.update_snapshot(identity, self).body['snapshot'])
81
+ merge_attributes(snapshot)
82
+ true
83
+ else
84
+ false
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Snapshots < Fog::Collection
5
+ model Fog::Scaleway::Compute::Snapshot
6
+
7
+ def all
8
+ snapshots = service.list_snapshots.body['snapshots'] || []
9
+ load(snapshots)
10
+ end
11
+
12
+ def get(identity)
13
+ if (snapshot = service.get_snapshot(identity).body['snapshot'])
14
+ new(snapshot)
15
+ end
16
+ rescue Fog::Scaleway::Compute::UnknownResource
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Task < Fog::Model
5
+ identity :id
6
+
7
+ attribute :status
8
+ attribute :description
9
+ attribute :terminated_at
10
+ attribute :href_from
11
+ attribute :progress
12
+ attribute :started_at
13
+
14
+ def pending?
15
+ status == 'pending'
16
+ end
17
+
18
+ def success?
19
+ status == 'success'
20
+ end
21
+
22
+ def destroy
23
+ requires :identity
24
+
25
+ service.delete_task(identity)
26
+ true
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Tasks < Fog::Collection
5
+ model Fog::Scaleway::Compute::Task
6
+
7
+ def all
8
+ tasks = service.list_tasks.body['tasks']
9
+ load(tasks)
10
+ end
11
+
12
+ def get(identity)
13
+ if (task = service.get_task(identity).body['task'])
14
+ new(task)
15
+ end
16
+ rescue Fog::Scaleway::Compute::UnknownResource
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,96 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Volume < Fog::Model
5
+ identity :id
6
+
7
+ attribute :creation_date
8
+ attribute :export_uri
9
+ attribute :modification_date
10
+ attribute :name
11
+ attribute :organization
12
+ attribute :server
13
+ attribute :size
14
+ attribute :volume_type
15
+
16
+ def server=(value)
17
+ attributes[:server] = case value
18
+ when Hash
19
+ service.servers.new(value)
20
+ when String
21
+ service.servers.new(identity: value)
22
+ else
23
+ value
24
+ end
25
+ end
26
+
27
+ def save
28
+ if persisted?
29
+ update
30
+ else
31
+ create
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ requires :identity
37
+
38
+ service.delete_volume(identity)
39
+ true
40
+ end
41
+
42
+ def create_snapshot(name = nil)
43
+ requires :identity
44
+
45
+ if name.nil?
46
+ requires :name
47
+
48
+ name = "#{self.name} snapshot"
49
+ end
50
+
51
+ if (snapshot = service.create_snapshot(name, identity).body['snapshot'])
52
+ service.snapshots.new(snapshot)
53
+ end
54
+ end
55
+
56
+ def clone(name = nil)
57
+ requires :identity, :volume_type
58
+
59
+ if name.nil?
60
+ requires :name
61
+
62
+ name = "#{self.name} - (Copy)"
63
+ end
64
+
65
+ if (volume = service.create_volume(name, volume_type, base_volume: identity).body['volume'])
66
+ service.volumes.new(volume)
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def create
73
+ requires :name, :volume_type, :size
74
+
75
+ if (volume = service.create_volume(name, volume_type, size: size).body['volume'])
76
+ merge_attributes(volume)
77
+ true
78
+ else
79
+ false
80
+ end
81
+ end
82
+
83
+ def update
84
+ requires :identity
85
+
86
+ if (volume = service.update_volume(identity, self).body['volume'])
87
+ merge_attributes(volume)
88
+ true
89
+ else
90
+ false
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Compute
4
+ class Volumes < Fog::Collection
5
+ model Fog::Scaleway::Compute::Volume
6
+
7
+ def all
8
+ volumes = service.list_volumes.body['volumes'] || []
9
+ load(volumes)
10
+ end
11
+
12
+ def get(identity)
13
+ if (volume = service.get_volume(identity).body['volume'])
14
+ new(volume)
15
+ end
16
+ rescue Fog::Scaleway::Compute::UnknownResource
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ module Fog
2
+ module Scaleway
3
+ module RequestHelper
4
+ def create(path, body)
5
+ request(method: :post,
6
+ path: path,
7
+ body: body,
8
+ expects: [201])
9
+ end
10
+
11
+ def get(path, query = {})
12
+ request(method: :get,
13
+ path: path,
14
+ query: query,
15
+ expects: [200])
16
+ end
17
+
18
+ def update(path, body)
19
+ request(method: :put,
20
+ path: path,
21
+ body: body,
22
+ expects: [200])
23
+ end
24
+
25
+ def delete(path)
26
+ request(method: :delete,
27
+ path: path,
28
+ expects: [204])
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,62 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def create_token(options = {})
6
+ if @email.nil?
7
+ raise ArgumentError, 'email is required to create a token'
8
+ end
9
+
10
+ body = {
11
+ email: @email
12
+ }
13
+
14
+ body.merge!(options)
15
+
16
+ create('/tokens', body)
17
+ end
18
+ end
19
+
20
+ class Mock
21
+ def create_token(options = {})
22
+ if @email.nil?
23
+ raise ArgumentError, 'email is required to create a token'
24
+ end
25
+
26
+ body = {
27
+ email: @email
28
+ }
29
+
30
+ body.merge!(options)
31
+
32
+ body = jsonify(body)
33
+
34
+ user = data[:users].values.find do |user|
35
+ user['email'] == body['email']
36
+ end
37
+
38
+ raise_invalid_auth('Invalid credentials') unless user
39
+
40
+ expires = nil
41
+ if body['expires'] != false
42
+ expires = (Time.now + 30 * 60).utc.strftime(TIME_FORMAT)
43
+ end
44
+
45
+ token = {
46
+ 'user_id' => user['id'],
47
+ 'description' => body['description'] || '',
48
+ 'roles' => { 'organization' => nil, 'role' => nil },
49
+ 'expires' => expires,
50
+ 'creation_date' => now,
51
+ 'inherits_user_perms' => true,
52
+ 'id' => Fog::UUID.uuid
53
+ }
54
+
55
+ data[:tokens][token['id']] = token
56
+
57
+ response(status: 201, body: { 'token' => token })
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,21 @@
1
+ module Fog
2
+ module Scaleway
3
+ class Account
4
+ class Real
5
+ def delete_token(token_id)
6
+ delete("/tokens/#{token_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_token(token_id)
12
+ token = lookup(:tokens, token_id)
13
+
14
+ data[:tokens].delete(token['id'])
15
+
16
+ response(status: 204)
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_organization(organization_id)
6
+ get("/organizations/#{organization_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def get_organization(organization_id)
12
+ organization = lookup(:organizations, organization_id)
13
+
14
+ response(status: 200, body: { 'organization' => organization })
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_organization_quotas(organization_id)
6
+ get("/organizations/#{organization_id}/quotas")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def get_organization_quotas(organization_id)
12
+ organization = lookup(:organizations, organization_id)
13
+
14
+ quotas = lookup(:organization_quotas, organization['id'])
15
+
16
+ response(status: 200, body: { 'quotas' => quotas })
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end