upcloud_api 1.2.0 → 1.3.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: bb3b2df1271d58f51517885fe64c24496d44f3ec
4
- data.tar.gz: 8c80aef63b87be03e27bbddae0fa7022d8ac14c5
3
+ metadata.gz: 1b145630b5a65cce82856ed253d85e59a598814a
4
+ data.tar.gz: c125d9477ddb35c16744cc2dbf87ea8c3efc61c5
5
5
  SHA512:
6
- metadata.gz: 3d11d618d88d8cba71e133f68a514cfab892883b18a7f4c8f29ff7af070023320c122b229c1fb72ba50fc9310c8cf2c374610b7f130f988fc4dbe4898c85aece
7
- data.tar.gz: 9a7d37fc71234bad9c02992e3f5c901b5add323267102d0ece786306fa2b79592dadaf0f41246c5db0589acb82db973f5f371f7a2df11fb533ea0c6b8d31d5bc
6
+ metadata.gz: 4a09082fd8700233b8b14479d86c210b76b075549ddb955fb6f57f4efdb2af95530935607644dd990dc6e7663bea74986a78892fdd1bc8bbe4466ec837752ca9
7
+ data.tar.gz: dbe49e4b6dc737786fb35217cb894e72375d3c17f7a1f9f5ecf9a63c4498771336d95b1755de68a672a465057930ff084eb50254e4bc5283e670af9ce7c67b74
@@ -1,3 +1,3 @@
1
1
  class UpcloudApi
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/upcloud_api.rb CHANGED
@@ -1,4 +1,6 @@
1
1
 
2
+ require "timeout"
3
+
2
4
  require "httparty"
3
5
 
4
6
  class UpcloudApi
@@ -169,7 +171,7 @@ class UpcloudApi
169
171
 
170
172
  return response if asynchronous
171
173
 
172
- Timeout 300 do
174
+ Timeout::timeout 300 do
173
175
  loop do
174
176
  details = server_details server_uuid
175
177
  return response if details["server"]["state"] == "stopped"
@@ -205,6 +207,221 @@ class UpcloudApi
205
207
  response
206
208
  end
207
209
 
210
+ # Lists all storages or storages matching to given type.
211
+ #
212
+ # Calls GET /1.2/storage or /1.2/storage/#{type}
213
+ #
214
+ # Available types:
215
+ # - public
216
+ # - private
217
+ # - normal
218
+ # - backup
219
+ # - cdrom
220
+ # - template
221
+ # - favorite
222
+ #
223
+ # @param type Type of the storages to be returned on nil
224
+ def storages type: nil
225
+ response = get(type && "storage/#{type}" || "storage")
226
+ data = JSON.parse response.body
227
+ data
228
+ end
229
+
230
+ # Shows detailed information of single storage.
231
+ #
232
+ # Calls GET /1.2/storage/#{uuid}
233
+ #
234
+ # @param storage_uuid UUID of the storage
235
+ def storage_details storage_uuid
236
+ response = get "storage/#{storage_uuid}"
237
+ data = JSON.parse response.body
238
+ data
239
+ end
240
+
241
+ # Creates new storage.
242
+ #
243
+ # Calls POST /1.2/storage
244
+ #
245
+ # backup_rule should be hash with following attributes:
246
+ # - interval # allowed values: daily / mon / tue / wed / thu / fri / sat / sun
247
+ # - time # allowed values: 0000-2359
248
+ # - retention # How many days backup will be kept. Allowed values: 1-1095
249
+ #
250
+ # @param size Size of the storage in gigabytes
251
+ # @param tier Type of the disk. maxiops is SSD powered disk, other allowed value is "hdd"
252
+ # @param title Name of the disk
253
+ # @param zone Where the disk will reside. Needs to be within same zone with the server
254
+ # @param backup_rule Hash of backup information. If not given, no backups will be automatically created.
255
+ def create_storage size:, tier: "maxiops", title:, zone: "fi-hel1", backup_rule: nil
256
+ data = {
257
+ "storage" => {
258
+ "size" => size,
259
+ "tier" => tier,
260
+ "title" => title,
261
+ "zone" => zone,
262
+ "backup_rule" => backup_rule
263
+ }
264
+ }
265
+
266
+ json = JSON.generate data
267
+
268
+ response = post "storage", json
269
+
270
+ response
271
+ end
272
+
273
+ # Modifies existing storage.
274
+ #
275
+ # Calls PUT /1.2/storage/#{uuid}
276
+ #
277
+ # backup_rule should be hash with following attributes:
278
+ # - interval # allowed values: daily / mon / tue / wed / thu / fri / sat / sun
279
+ # - time # allowed values: 0000-2359
280
+ # - retention # How many days backup will be kept. Allowed values: 1-1095
281
+ #
282
+ # @param storage_uuid UUID of the storage that will be modified
283
+ # @param size Size of the storage in gigabytes
284
+ # @param title Name of the disk
285
+ # @param backup_rule Hash of backup information. If not given, no backups will be automatically created.
286
+ def modify_storage storage_uuid, size:, title:, backup_rule: nil
287
+ data = {
288
+ "storage" => {
289
+ "size" => size,
290
+ "title" => title,
291
+ "backup_rule" => backup_rule
292
+ }
293
+ }
294
+
295
+ json = JSON.generate data
296
+
297
+ response = put "storage/#{storage_uuid}", json
298
+
299
+ response
300
+ end
301
+
302
+ # Clones existing storage.
303
+ #
304
+ # This operation is asynchronous.
305
+ #
306
+ # Calls POST /1.2/storage/#{uuid}/clone
307
+ #
308
+ # backup_rule should be hash with following attributes:
309
+ # - interval # allowed values: daily / mon / tue / wed / thu / fri / sat / sun
310
+ # - time # allowed values: 0000-2359
311
+ # - retention # How many days backup will be kept. Allowed values: 1-1095
312
+ #
313
+ # @param storage_uuid UUID of the storage that will be modified
314
+ # @param tier Type of the disk. maxiops is SSD powered disk, other allowed value is "hdd"
315
+ # @param title Name of the disk
316
+ # @param zone Where the disk will reside. Needs to be within same zone with the server
317
+ def clone_storage storage_uuid, zone: "fi-hel1", title:, tier: "maxiops"
318
+ data = {
319
+ "storage" => {
320
+ "zone" => zone,
321
+ "title" => title,
322
+ "tier" => tier
323
+ }
324
+ }
325
+
326
+ json = JSON.generate data
327
+
328
+ response = post "storage/#{storage_uuid}/clone", json
329
+
330
+ response
331
+ end
332
+
333
+ # Attaches a storage to a server. Server must be stopped before the storage can be attached.
334
+ #
335
+ # Calls POST /1.2/server/#{server_uuid}/storage/attach
336
+ #
337
+ # Valid values for address are: ide[01]:[01] / scsi:0:[0-7] / virtio:[0-7]
338
+ #
339
+ # @param type Type of the disk. Valid values are "disk" and "cdrom".
340
+ # @param address Address where the disk will be attached to. Defaults to next available address.
341
+ # @param server_uuid UUID of the server where the disk will be attached to.
342
+ # @param storage_uuid UUID of the storage that will be attached.
343
+ def attach_storage type: "disk", address: nil, server_uuid:, storage_uuid:
344
+ data = {
345
+ "storage_device" => {
346
+ "type" => type,
347
+ "address" => address,
348
+ "storage" => storage_uuid
349
+ }
350
+ }
351
+
352
+ json = JSON.generate data
353
+
354
+ response = post "server/#{server_uuid}/storage/attach", json
355
+
356
+ response
357
+ end
358
+
359
+ # Detaches storage from a server. Server must be stopped before the storage can be detached.
360
+ #
361
+ # Calls POST /1.2/server/#{server_uuid}/storage/detach
362
+ #
363
+ # @param address Address where the storage that will be detached resides.
364
+ def detach_storage address
365
+ data = {
366
+ "storage_device" => {
367
+ "address" => address
368
+ }
369
+ }
370
+
371
+ json = JSON.generate data
372
+
373
+ response = post "server/#{server_uuid}/storage/detach", json
374
+
375
+ response
376
+ end
377
+
378
+ # Creates backup from a storage.
379
+ #
380
+ # This operation is asynchronous.
381
+ #
382
+ # Calls /1.2/storage/#{uuid}/backup
383
+ #
384
+ # @param storage_uuid UUID of the storage to be cloned
385
+ # @param title Name of the backup
386
+ def create_backup storage_uuid, title:
387
+ data = {
388
+ "storage" => {
389
+ "title" => title
390
+ }
391
+ }
392
+
393
+ json = JSON.generate data
394
+
395
+ response = post "storage/#{storage_uuid}/backup", json
396
+
397
+ response
398
+ end
399
+
400
+ # Restores a backup.
401
+ #
402
+ # If the storage is attached to server, the server must first be stopped.
403
+ #
404
+ # Calls /1.2/storage/#{uuid}/restore.
405
+ #
406
+ # @param storage_uuid TODO: is this supposed to be UUID of the storage or the backup?
407
+ def create_backup storage_uuid
408
+ response = post "storage/#{storage_uuid}/restore"
409
+
410
+ response
411
+ end
412
+
413
+ # Deletes a storage.
414
+ #
415
+ # The storage must be in "online" state and it must not be attached to any server.
416
+ # Backups will not be deleted.
417
+ #
418
+ # @param storage_uuid UUID of the storage that will be deleted.
419
+ def delete_storage storage_uuid
420
+ response = delete "storage/#{storage_uuid}"
421
+
422
+ response
423
+ end
424
+
208
425
  private
209
426
 
210
427
  def get action
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upcloud_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samu Voutilainen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-12 00:00:00.000000000 Z
11
+ date: 2015-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty