scaleway 0.2.1 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17eaafe4fbff0675f6f549a688564fd44a158942
4
- data.tar.gz: 4d1ad581a69b3f19ad0e9f6e3c4e499cf6e175df
3
+ metadata.gz: 24bc58f3cf0038fb5cf63a6d9de5dbe3b1eee4a3
4
+ data.tar.gz: 61c3fcbf49df0ae41a4113600113b0b30cfc81d2
5
5
  SHA512:
6
- metadata.gz: 04263f1c48e43c50cb883451d520c1a1e225e3ad60defb836501f19e3b4cd60bdae7f42991e26a2a529c068a1a36cd01ed997186c9d13ba2635a03f89be34410
7
- data.tar.gz: e590b54ea412e5df6f2ccfcf12686e352b65773671c1dcb6ff27e4780e80cd5d5642656ad42d2a548eab01940581dd71a779b789d7835d4d59cc133f5f1c47cc
6
+ metadata.gz: 6fd8343dace6d35e24bd6afdd7c8a9fb6cffe5896deeca8ece2263332b4e695df4fbb82b2d05dc8ddfd93defdefa8cb449feade37a6ca7986bd7a5a91a63e170
7
+ data.tar.gz: 920b2215110df212c56b47f01b282ef5099ce1499fed489efa23dbbac937dff2a9559080a58d136161a7f4dcc8902c69eb0dc5dd914363e27392cd13739c68d5
data/CHANGES.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # ChangeLog
2
2
 
3
+ ## 1.0.0 (2016-10-31)
4
+
5
+ - Add explicit error on missing authentication.
6
+ - Add zone option.
7
+ - Update default commercial type to VC1S.
8
+ - Add marketplace API.
9
+
3
10
  ## 0.2.1 (2015-04-32)
4
11
 
5
12
  - Fix unittests.
data/README.md CHANGED
@@ -9,171 +9,206 @@ Easy to use Scaleway api client.
9
9
 
10
10
  Manual instalation:
11
11
 
12
- gem install scaleway
12
+ ```bash
13
+ gem install scaleway
14
+ ```
13
15
 
14
16
  add this to your gemfile:
15
17
 
16
- gem 'scaleway'
17
-
18
+ ```bash
19
+ gem 'scaleway'
20
+ ```
18
21
 
19
22
  ## Usage
20
23
 
21
24
  ### Configure the client
22
25
 
23
- require 'scaleway'
26
+ ```ruby
27
+ require 'scaleway'
28
+
29
+ Scaleway.organization = <organization_key>
30
+ Scaleway.token = <token>
24
31
 
25
- Scaleway.organization = <organization_key>
26
- Scaleway.token = <token>
32
+ # You can specify the zone, the default zone is 'par1'
33
+ Scaleway.zone = 'ams1'
34
+ ```
27
35
 
28
36
  ### Servers
29
37
 
30
- # list all servers
31
- Scaleway::Server.all
38
+ ```ruby
39
+ # list all servers
40
+ Scaleway::Server.all
32
41
 
33
- # list with filter
34
- Scaleway::Server.all state: :running
42
+ # list with filter
43
+ Scaleway::Server.all state: :running
35
44
 
36
- # create a new server with default values
37
- Scaleway::Server.create
45
+ # create a new server with default values
46
+ Scaleway::Server.create
38
47
 
39
- # create a new server with name and tags
40
- Scaleway::Server.create :name => 'my_new_server', tags: ['prod']
48
+ # create a new server with name and tags
49
+ Scaleway::Server.create :name => 'my_new_server', tags: ['prod']
41
50
 
42
- # get a server by id
43
- server = Scaleway::Server.find <server_id>
51
+ # get a server by id
52
+ server = Scaleway::Server.find <server_id>
44
53
 
45
- # edit a server
46
- server = Scaleway::Server.find <server_id>
47
- server.name = 'new_name'
48
- Scaleway::Server.edit server.id, server
54
+ # edit a server
55
+ server = Scaleway::Server.find <server_id>
56
+ server.name = 'new_name'
57
+ Scaleway::Server.edit server.id, server
49
58
 
50
- # actions on a server
51
- Scaleway::Server.power_on server.id
59
+ # actions on a server
60
+ Scaleway::Server.power_on server.id
52
61
 
53
- Scaleway::Server.power_off server.id
62
+ Scaleway::Server.power_off server.id
54
63
 
55
- Scaleway::Server.terminate server.id
64
+ Scaleway::Server.terminate server.id
56
65
 
57
- # destroy a server
58
- Scaleway::Server.destroy server.id
66
+ # destroy a server
67
+ Scaleway::Server.destroy server.id
68
+ ```
59
69
 
60
- ### Images
70
+ ### Marketplace
61
71
 
62
- # list all images
63
- Scaleway::Image.all
72
+ ```ruby
73
+ # list all marketplace images
74
+ Scaleway::Marketplace.all
64
75
 
65
- # list marketplace images
66
- Scaleway::Image.marketplace
76
+ # get local image by id
77
+ image = Scaleway::Marketplace.find_local_image <marketplace_image_id>
67
78
 
68
- # get image by id
69
- image = Scaleway::Image.find <image_id>
79
+ # get local image by marketplace image id for arch arm
80
+ image = Scaleway::Marketplace.find_local_image <marketplace_image_id>, arch: 'arm'
70
81
 
71
- # get image by name
72
- image = Scaleway::Image.find_by_name('Ubuntu')
82
+ # get local image by name
83
+ image = Scaleway::Marketplace.find_local_image_by_name("Docker")
84
+ ```
85
+
86
+ ### Images
73
87
 
74
- # create an image
75
- image = Scaleway::Image.create root_volume: snapshot
88
+ ```ruby
89
+ # list all images
90
+ Scaleway::Image.all
76
91
 
77
- # edit an image
78
- image = Scaleway::Image.edit id, image
92
+ # get image by id
93
+ image = Scaleway::Image.find <image_id>
79
94
 
80
- # destroy an image
81
- image = Scaleway::Image.destroy id
95
+ # get image by name
96
+ image = Scaleway::Image.find_by_name('Ubuntu')
97
+
98
+ # create an image
99
+ image = Scaleway::Image.create root_volume: snapshot
100
+
101
+ # edit an image
102
+ image = Scaleway::Image.edit id, image
103
+
104
+ # destroy an image
105
+ image = Scaleway::Image.destroy id
106
+ ```
82
107
 
83
108
  ### Volumes
84
109
 
85
- # list all volumes
86
- Scaleway::Volume.all
110
+ ```ruby
111
+ # list all volumes
112
+ Scaleway::Volume.all
87
113
 
88
- # get volume by id
89
- volume = Scaleway::Volume.find <volume_id>
114
+ # get volume by id
115
+ volume = Scaleway::Volume.find <volume_id>
90
116
 
91
- # create an volume
92
- volume = Scaleway::Volume.create
93
- volume = Scaleway::Volume.create size: 100 * 10 ** 9, volume_type: 'l_ssd'
117
+ # create an volume
118
+ volume = Scaleway::Volume.create
119
+ volume = Scaleway::Volume.create size: 100 * 10 ** 9, volume_type: 'l_ssd'
94
120
 
95
- # edit an volume
96
- volume = Scaleway::Volume.edit id, volume
121
+ # edit an volume
122
+ volume = Scaleway::Volume.edit id, volume
97
123
 
98
- # destroy an volume
99
- volume = Scaleway::Volume.destroy id
124
+ # destroy an volume
125
+ volume = Scaleway::Volume.destroy id
126
+ ```
100
127
 
101
128
  ### Snapshots
102
129
 
103
- # list all snapshots
104
- Scaleway::Volume.all
130
+ ```ruby
131
+ # list all snapshots
132
+ Scaleway::Volume.all
105
133
 
106
- # get snapshot by id
107
- snapshot = Scaleway::Snapshot.find <snapshot_id>
134
+ # get snapshot by id
135
+ snapshot = Scaleway::Snapshot.find <snapshot_id>
108
136
 
109
- # create an snapshot
110
- snapshot = Scaleway::Snapshot.create volume_id: id
137
+ # create an snapshot
138
+ snapshot = Scaleway::Snapshot.create volume_id: id
111
139
 
112
- # edit an snapshot
113
- snapshot = Scaleway::Snapshot.edit id, snapshot
140
+ # edit an snapshot
141
+ snapshot = Scaleway::Snapshot.edit id, snapshot
114
142
 
115
- # destroy an snapshot
116
- snapshot = Scaleway::Snapshot.destroy id
143
+ # destroy an snapshot
144
+ snapshot = Scaleway::Snapshot.destroy id
145
+ ```
117
146
 
118
147
  ### Ip addresses
119
148
 
120
- # list all ip addresses
121
- Scaleway::Ip.all
149
+ ```ruby
150
+ # list all ip addresses
151
+ Scaleway::Ip.all
122
152
 
123
- # get Ip
124
- ip = Scaleway::Ip.find <ip_id>
125
- ip = Scaleway::Ip.find 127.0.0.1
153
+ # get Ip
154
+ ip = Scaleway::Ip.find <ip_id>
155
+ ip = Scaleway::Ip.find 127.0.0.1
126
156
 
127
- # reserve an ip
128
- ip = Scaleway::Ip.reserve
129
- # or
130
- ip = Scaleway::Ip.create
157
+ # reserve an ip
158
+ ip = Scaleway::Ip.reserve
159
+ # or
160
+ ip = Scaleway::Ip.create
131
161
 
132
- # edit an ip
133
- ip = Scaleway::Ip.edit id, ip
162
+ # edit an ip
163
+ ip = Scaleway::Ip.edit id, ip
134
164
 
135
- # release an ip
136
- ip = Scaleway::Ip.destroy id
165
+ # release an ip
166
+ ip = Scaleway::Ip.destroy id
167
+ ```
137
168
 
138
169
  ### Handle exceptions
139
170
 
140
- # Not found
141
- begin
142
- puts Scaleway::Server.find <invalid_id>
143
- rescue Scaleway::NotFound => e
144
- # handle error here
145
- end
146
-
147
- # Other
148
- begin
149
- puts Scaleway::Server.create extra_field: ['nope']
150
- rescue Scaleway::APIError => e
151
- # handle error here
152
- end
171
+ ```ruby
172
+ # Not found
173
+ begin
174
+ puts Scaleway::Server.find <invalid_id>
175
+ rescue Scaleway::NotFound => e
176
+ # handle error here
177
+ end
178
+
179
+ # Other
180
+ begin
181
+ puts Scaleway::Server.create extra_field: ['nope']
182
+ rescue Scaleway::APIError => e
183
+ # handle error here
184
+ end
185
+ ```
153
186
 
154
187
  ## Example
155
188
 
156
- require 'scaleway'
189
+ ```ruby
190
+ require 'scaleway'
157
191
 
158
- Scaleway.organization = <organization_key>
159
- Scaleway.token = <token>
192
+ Scaleway.organization = <organization_key>
193
+ Scaleway.token = <token>
160
194
 
161
- # get the docker image
162
- image = Scaleway::Image.find_by_name('Docker')
195
+ # get the docker image from the marketplace
196
+ image = Scaleway::Marketplace.find_local_image_by_name('Docker')
163
197
 
164
- # create 5 new servers
165
- 5.times do |x|
166
- Scaleway::Server.create name: "docker#{x}", image: image.id, tags: ['docker']
167
- end
198
+ # create 5 new servers
199
+ 5.times do |x|
200
+ Scaleway::Server.create name: "docker#{x}", image: image.id, tags: ['docker']
201
+ end
168
202
 
169
- # power on
170
- Scaleway::Server.all.each do |server|
171
- Scaleway::Server.power_on(server.id)
172
- end
203
+ # power on
204
+ Scaleway::Server.all.each do |server|
205
+ Scaleway::Server.power_on(server.id)
206
+ end
173
207
 
174
- # do something ...
208
+ # do something ...
175
209
 
176
- # terminate
177
- Scaleway::Server.all.each do |server|
178
- Scaleway::Server.terminate(server.id)
179
- end
210
+ # terminate
211
+ Scaleway::Server.all.each do |server|
212
+ Scaleway::Server.terminate(server.id)
213
+ end
214
+ ```
@@ -8,13 +8,26 @@ module Scaleway
8
8
  extend self
9
9
 
10
10
  def compute_endpoint
11
- "https://api.scaleway.com"
11
+ "https://cp-#{Scaleway.zone}.scaleway.com"
12
12
  end
13
13
 
14
14
  def account_endpoint
15
15
  "https://account.scaleway.com"
16
16
  end
17
17
 
18
+ def marketplace_endpoint
19
+ "https://api-marketplace.scaleway.com"
20
+ end
21
+
22
+ def zone=(zone)
23
+ @zone = zone
24
+ @zone
25
+ end
26
+
27
+ def zone
28
+ return @zone || 'par1'
29
+ end
30
+
18
31
  def token=(token)
19
32
  @token = token
20
33
  setup!
@@ -38,36 +51,67 @@ module Scaleway
38
51
  end
39
52
 
40
53
  DEFINITIONS = {
41
- "Image" => {
54
+ "Marketplace" => {
42
55
  :all => {
43
56
  :method => :get,
44
- :endpoint => "#{Scaleway.compute_endpoint}/images",
57
+ :endpoint => "#{Scaleway.marketplace_endpoint}/images",
58
+ },
59
+ :find_local_image_by_name => {
60
+ :method => :get,
61
+ :endpoint => "#{Scaleway.marketplace_endpoint}/images",
45
62
  :default_params => {
46
- :organization => Proc.new { Scaleway.organization }
47
- }
63
+ arch: 'x86_64',
64
+ },
65
+ :filters => [
66
+ Proc.new { |params, body, item|
67
+ item.name.include? params.first }
68
+ ],
69
+ :transform => Proc.new { |params, body, item|
70
+ item[0].versions[0].local_images.keep_if do |local_image|
71
+ if local_image.zone == Scaleway.zone and local_image.arch == body[:arch]
72
+ true
73
+ end
74
+ end.first
75
+ },
48
76
  },
49
- :marketplace => {
77
+ :find_local_image => {
50
78
  :method => :get,
51
- :endpoint => "#{Scaleway.compute_endpoint}/images",
79
+ :endpoint => "#{Scaleway.marketplace_endpoint}/images/%s/versions/current",
80
+ :default_params => {
81
+ arch: 'x86_64',
82
+ },
83
+ :transform => Proc.new { |params, body, item|
84
+ item.local_images.keep_if do |local_image|
85
+ if local_image.zone == Scaleway.zone and local_image.arch == body[:arch]
86
+ true
87
+ end
88
+ end.first
89
+ },
90
+ },
91
+ },
92
+ "Image" => {
93
+ :all => {
94
+ :method => :get,
95
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images" },
52
96
  :default_params => {
53
97
  :public => true
54
98
  }
55
99
  },
56
100
  :find => {
57
101
  :method => :get,
58
- :endpoint => "#{Scaleway.compute_endpoint}/images/%s",
102
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images/%s" },
59
103
  },
60
104
  :find_by_name => {
61
105
  :method => :get,
62
- :endpoint => "#{Scaleway.compute_endpoint}/images",
106
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images" },
63
107
  :filters => [
64
- Proc.new { |item, params| item.name.include? params.first }
108
+ Proc.new { |params, body, item| item.name.include? params.first }
65
109
  ],
66
- :transform => Proc.new { |item, params| item.first },
110
+ :transform => Proc.new { |params, body, item| item.first },
67
111
  },
68
112
  :create => {
69
113
  :method => :post,
70
- :endpoint => "#{Scaleway.compute_endpoint}/images",
114
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images" },
71
115
  :default_params => {
72
116
  :name => 'default',
73
117
  :root_volume => 'required',
@@ -76,33 +120,33 @@ module Scaleway
76
120
  },
77
121
  :edit => {
78
122
  :method => :put,
79
- :endpoint => "#{Scaleway.compute_endpoint}/images/%s",
123
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images/%s" },
80
124
  },
81
125
  :destroy => {
82
126
  :method => :delete,
83
- :endpoint => "#{Scaleway.compute_endpoint}/images/%s",
127
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/images/%s" },
84
128
  },
85
129
  },
86
130
  "Volume" => {
87
131
  :all => {
88
132
  :method => :get,
89
- :endpoint => "#{Scaleway.compute_endpoint}/volumes",
133
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/volumes" },
90
134
  },
91
135
  :find => {
92
136
  :method => :get,
93
- :endpoint => "#{Scaleway.compute_endpoint}/volumes/%s",
137
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/volumes/%s" },
94
138
  },
95
139
  :edit => {
96
140
  :method => :put,
97
- :endpoint => "#{Scaleway.compute_endpoint}/volumes/%s",
141
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/volumes/%s" },
98
142
  },
99
143
  :destroy => {
100
144
  :method => :delete,
101
- :endpoint => "#{Scaleway.compute_endpoint}/volumes/%s",
145
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/volumes/%s" },
102
146
  },
103
147
  :create => {
104
148
  :method => :post,
105
- :endpoint => "#{Scaleway.compute_endpoint}/volumes",
149
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/volumes" },
106
150
  :default_params => {
107
151
  :name => 'default',
108
152
  :size => 20 * 10**9,
@@ -114,30 +158,30 @@ module Scaleway
114
158
  "Ip" => {
115
159
  :all => {
116
160
  :method => :get,
117
- :endpoint => "#{Scaleway.compute_endpoint}/ips",
161
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips" },
118
162
  },
119
163
  :find => {
120
164
  :method => :get,
121
- :endpoint => "#{Scaleway.compute_endpoint}/ips/%s",
165
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips/%s" },
122
166
  },
123
167
  :edit => {
124
168
  :method => :put,
125
- :endpoint => "#{Scaleway.compute_endpoint}/ips/%s",
169
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips/%s" },
126
170
  },
127
171
  :destroy => {
128
172
  :method => :delete,
129
- :endpoint => "#{Scaleway.compute_endpoint}/ips/%s",
173
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips/%s" },
130
174
  },
131
175
  :reserve => {
132
176
  :method => :post,
133
- :endpoint => "#{Scaleway.compute_endpoint}/ips",
177
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips" },
134
178
  :default_params => {
135
179
  :organization => Proc.new { Scaleway.organization },
136
180
  }
137
181
  },
138
182
  :create => {
139
183
  :method => :post,
140
- :endpoint => "#{Scaleway.compute_endpoint}/ips",
184
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/ips" },
141
185
  :default_params => {
142
186
  :organization => Proc.new { Scaleway.organization },
143
187
  }
@@ -146,23 +190,23 @@ module Scaleway
146
190
  "Snapshot" => {
147
191
  :all => {
148
192
  :method => :get,
149
- :endpoint => "#{Scaleway.compute_endpoint}/snapshots",
193
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/snapshots" },
150
194
  },
151
195
  :find => {
152
196
  :method => :get,
153
- :endpoint => "#{Scaleway.compute_endpoint}/snapshots/%s",
197
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/snapshots/%s" },
154
198
  },
155
199
  :edit => {
156
200
  :method => :put,
157
- :endpoint => "#{Scaleway.compute_endpoint}/snapshots/%s",
201
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/snapshots/%s" },
158
202
  },
159
203
  :destroy => {
160
204
  :method => :delete,
161
- :endpoint => "#{Scaleway.compute_endpoint}/snapshots/%s",
205
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/snapshots/%s" },
162
206
  },
163
207
  :create => {
164
208
  :method => :post,
165
- :endpoint => "#{Scaleway.compute_endpoint}/snapshots",
209
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/snapshots" },
166
210
  :default_params => {
167
211
  :name => 'default',
168
212
  :volume_id => 'required',
@@ -173,54 +217,63 @@ module Scaleway
173
217
  "Server" => {
174
218
  :all => {
175
219
  :method => :get,
176
- :endpoint => "#{Scaleway.compute_endpoint}/servers",
220
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers" },
177
221
  },
178
222
  :power_on => {
179
223
  :method => :post,
180
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s/action",
224
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s/action" },
181
225
  :default_params => {
182
226
  :action => :poweron
183
227
  }
184
228
  },
185
229
  :reboot => {
186
230
  :method => :post,
187
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s/action",
231
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s/action" },
188
232
  :default_params => {
189
233
  :action => :reboot
190
234
  }
191
235
  },
192
236
  :power_off => {
193
237
  :method => :post,
194
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s/action",
238
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s/action" },
195
239
  :default_params => {
196
240
  :action => :poweroff
197
241
  }
198
242
  },
199
243
  :terminate => {
200
244
  :method => :post,
201
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s/action",
245
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s/action" },
202
246
  :default_params => {
203
247
  :action => :terminate
204
248
  }
205
249
  },
206
250
  :find => {
207
251
  :method => :get,
208
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s",
252
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s" },
209
253
  },
210
254
  :edit => {
211
255
  :method => :put,
212
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s",
256
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s" },
213
257
  },
214
258
  :destroy => {
215
259
  :method => :delete,
216
- :endpoint => "#{Scaleway.compute_endpoint}/servers/%s",
260
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers/%s" },
217
261
  },
218
262
  :create => {
219
263
  :method => :post,
220
- :endpoint => "#{Scaleway.compute_endpoint}/servers",
264
+ :endpoint => Proc.new { "#{Scaleway.compute_endpoint}/servers" },
221
265
  :default_params => {
222
266
  :name => 'default',
223
- :image => Proc.new { Scaleway::Image.find_by_name('Ubuntu').id },
267
+ :commercial_type => 'VC1S',
268
+ :image => Proc.new { |params, body|
269
+ if body[:commercial_type] == 'C1'
270
+ arch = 'arm'
271
+ else
272
+ arch = 'x86_64'
273
+ end
274
+ Scaleway::Marketplace.find_local_image_by_name(
275
+ 'Ubuntu Xenial', arch: arch).id
276
+ },
224
277
  :volumes => {},
225
278
  :organization => Proc.new { Scaleway.organization },
226
279
  }
@@ -257,6 +310,10 @@ module Scaleway
257
310
  body.merge! query[:default_params] || {}
258
311
  endpoint = query[:endpoint]
259
312
 
313
+ if endpoint.respond_to? :call
314
+ endpoint = endpoint.call()
315
+ end
316
+
260
317
  params.each do |param|
261
318
  if param.is_a? Hash or param.is_a? RecursiveOpenStruct
262
319
  body.merge! param
@@ -266,11 +323,15 @@ module Scaleway
266
323
  end
267
324
 
268
325
  body = Hash[body.map { |k, v|
269
- if v.respond_to? :call then [k, v.call()] else [k, v] end
326
+ if v.respond_to? :call then [k, v.call(params, body)] else [k, v] end
270
327
  }]
271
328
 
329
+ if Scaleway.request.nil?
330
+ raise ::RuntimeError.new("Authentication is missing")
331
+ end
332
+
272
333
  resp = Scaleway.request.send(query[:method], endpoint, body)
273
- body = resp.body
334
+ response_body = resp.body
274
335
  if resp.status == 204
275
336
  return
276
337
  end
@@ -281,23 +342,23 @@ module Scaleway
281
342
  raise Scaleway::APIError, resp
282
343
  end
283
344
 
284
- hash = RecursiveOpenStruct.new(body, :recurse_over_arrays => true)
345
+ hash = RecursiveOpenStruct.new(response_body, :recurse_over_arrays => true)
285
346
 
286
- if body.length == 1
287
- hash = hash.send(body.keys.first)
347
+ if response_body.length == 1
348
+ hash = hash.send(response_body.keys.first)
288
349
  end
289
350
 
290
351
  if query[:filters]
291
352
  filters = query[:filters]
292
353
  hash = hash.find_all do |item|
293
354
  filters.all? do |filter|
294
- filter.call(item, params)
355
+ filter.call(params, body, item)
295
356
  end
296
357
  end
297
358
  end
298
359
 
299
360
  if query[:transform]
300
- hash = query[:transform].call(hash, params)
361
+ hash = query[:transform].call(params, body, hash)
301
362
  end
302
363
 
303
364
  hash
@@ -1,3 +1,3 @@
1
1
  module Scaleway
2
- VERSION = '0.2.1'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -8,23 +8,34 @@ describe Scaleway do
8
8
  before do
9
9
  Scaleway.organization = organization
10
10
  Scaleway.token = token
11
+ Scaleway.zone = zone
11
12
  end
12
13
 
13
14
  describe "defaults" do
14
15
  let(:organization) { nil }
15
16
  let(:token) { nil }
17
+ let(:zone) { nil }
16
18
 
17
- its(:compute_endpoint) { should eq "https://api.scaleway.com" }
19
+ its(:compute_endpoint) { should eq "https://cp-par1.scaleway.com" }
18
20
  its(:account_endpoint) { should eq "https://account.scaleway.com" }
19
21
  its(:token) { should eq "token_required" }
20
22
  its(:organization) { should eq "organization_required" }
21
23
 
22
- it { expect(Scaleway::VERSION).to eq "0.2.1" }
24
+ it { expect(Scaleway::VERSION).to eq "1.0.0" }
25
+ end
26
+
27
+ describe "test ams1" do
28
+ let(:organization) { nil }
29
+ let(:token) { nil }
30
+ let(:zone) { "ams1" }
31
+
32
+ its(:compute_endpoint) { should eq "https://cp-ams1.scaleway.com" }
23
33
  end
24
34
 
25
35
  describe "test token and organization" do
26
36
  let(:organization) { "organization_id" }
27
37
  let(:token) { "token_id" }
38
+ let(:zone) { nil }
28
39
 
29
40
  its(:organization) { should eq "organization_id" }
30
41
  its(:token) { should eq "token_id" }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scaleway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bchatelard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-23 00:00:00.000000000 Z
11
+ date: 2016-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday