fog-voxel 0.0.1

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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rubocop.yml +20 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +19 -0
  7. data/CONTRIBUTING.md +18 -0
  8. data/CONTRIBUTORS.md +5 -0
  9. data/Gemfile +4 -0
  10. data/LICENSE.md +20 -0
  11. data/README.md +34 -0
  12. data/Rakefile +18 -0
  13. data/fog-voxel.gemspec +35 -0
  14. data/gemfiles/Gemfile.1.9.2- +8 -0
  15. data/gemfiles/Gemfile.1.9.3+ +7 -0
  16. data/lib/fog/bin/voxel.rb +29 -0
  17. data/lib/fog/compute/voxel.rb +127 -0
  18. data/lib/fog/compute/voxel/image.rb +11 -0
  19. data/lib/fog/compute/voxel/images.rb +24 -0
  20. data/lib/fog/compute/voxel/real.rb +6 -0
  21. data/lib/fog/compute/voxel/real/devices_list.rb +22 -0
  22. data/lib/fog/compute/voxel/real/devices_power.rb +20 -0
  23. data/lib/fog/compute/voxel/real/images_list.rb +29 -0
  24. data/lib/fog/compute/voxel/real/voxcloud_create.rb +20 -0
  25. data/lib/fog/compute/voxel/real/voxcloud_delete.rb +18 -0
  26. data/lib/fog/compute/voxel/real/voxcloud_status.rb +22 -0
  27. data/lib/fog/compute/voxel/server.rb +71 -0
  28. data/lib/fog/compute/voxel/servers.rb +26 -0
  29. data/lib/fog/parsers/compute.rb +7 -0
  30. data/lib/fog/parsers/compute/voxel.rb +14 -0
  31. data/lib/fog/parsers/compute/voxel/basic.rb +27 -0
  32. data/lib/fog/parsers/compute/voxel/devices_list.rb +107 -0
  33. data/lib/fog/parsers/compute/voxel/images_list.rb +55 -0
  34. data/lib/fog/parsers/compute/voxel/voxcloud_create.rb +36 -0
  35. data/lib/fog/parsers/compute/voxel/voxcloud_delete.rb +27 -0
  36. data/lib/fog/parsers/compute/voxel/voxcloud_status.rb +42 -0
  37. data/lib/fog/voxel.rb +25 -0
  38. data/lib/fog/voxel/compute.rb +0 -0
  39. data/lib/fog/voxel/version.rb +5 -0
  40. data/spec/minitest_helper.rb +31 -0
  41. data/tests/helper.rb +37 -0
  42. data/tests/helpers/collection_helper.rb +97 -0
  43. data/tests/helpers/compute/flavors_helper.rb +32 -0
  44. data/tests/helpers/compute/server_helper.rb +25 -0
  45. data/tests/helpers/compute/servers_helper.rb +10 -0
  46. data/tests/helpers/formats_helper.rb +98 -0
  47. data/tests/helpers/formats_helper_tests.rb +110 -0
  48. data/tests/helpers/mock_helper.rb +117 -0
  49. data/tests/helpers/model_helper.rb +31 -0
  50. data/tests/helpers/responds_to_helper.rb +11 -0
  51. data/tests/helpers/schema_validator_tests.rb +107 -0
  52. data/tests/helpers/succeeds_helper.rb +9 -0
  53. data/tests/requests/compute/image_tests.rb +52 -0
  54. data/tests/requests/compute/server_tests.rb +123 -0
  55. metadata +225 -0
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/devices_list'
6
+
7
+ def devices_list(device_id = nil)
8
+ options = {
9
+ :parser => Fog::Parsers::Compute::Voxel::DevicesList.new,
10
+ :verbosity => 'normal'
11
+ }
12
+
13
+ unless device_id.nil?
14
+ options[:device_id] = device_id
15
+ end
16
+
17
+ request("voxel.devices.list", options)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/basic'
6
+
7
+ def devices_power(device_id, power_action)
8
+ options = {
9
+ :device_id => device_id,
10
+ :parser => Fog::Parsers::Compute::Voxel::Basic.new,
11
+ :power_action => power_action,
12
+ :verbosity => 'normal'
13
+ }
14
+
15
+ request("voxel.devices.power", options)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/images_list'
6
+
7
+ def images_list(image_id = nil)
8
+ options = {
9
+ :parser => Fog::Parsers::Compute::Voxel::ImagesList.new,
10
+ :verbosity => 'compact'
11
+ }
12
+
13
+ unless image_id.nil?
14
+ options[:verbosity] = 'extended'
15
+ options[:image_id] = image_id
16
+ end
17
+
18
+ data = request("voxel.images.list", options)
19
+
20
+ if data.body['stat'] == "ok"
21
+ data
22
+ else
23
+ raise Fog::Compute::Voxel::NotFound
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/voxcloud_create'
6
+
7
+ def voxcloud_create(options)
8
+ options[:parser] = Fog::Parsers::Compute::Voxel::VoxcloudCreate.new
9
+
10
+ if options.key?(:password)
11
+ options[:admin_password] = options[:password]
12
+ options.delete(:password)
13
+ end
14
+
15
+ request("voxel.voxcloud.create", options)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/voxcloud_delete'
6
+
7
+ def voxcloud_delete(device_id)
8
+ options = {
9
+ :device_id => device_id,
10
+ :parser => Fog::Parsers::Compute::Voxel::VoxcloudDelete.new
11
+ }
12
+
13
+ request("voxel.voxcloud.delete", options)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Real
5
+ require 'fog/voxel/parsers/voxel/voxcloud_status'
6
+
7
+ def voxcloud_status(device_id = nil)
8
+ options = {
9
+ :parser => Fog::Parsers::Compute::Voxel::VoxcloudStatus.new,
10
+ :verbosity => 'compact'
11
+ }
12
+
13
+ unless device_id.nil?
14
+ options[:device_id] = device_id
15
+ end
16
+
17
+ request("voxel.voxcloud.status", options)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,71 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Server < Fog::Compute::Server
5
+ identity :id
6
+
7
+ attribute :name
8
+ attribute :processing_cores
9
+ attribute :image_id
10
+ attribute :facility
11
+ attribute :disk_size
12
+ attribute :ip_assignments, :aliases => 'ipassignments'
13
+
14
+ def initialize(attributes={})
15
+ self.image_id ||= '55' # Ubuntu 10.04 LTS 64bit
16
+ super
17
+ end
18
+
19
+ def destroy
20
+ requires :id
21
+ service.voxcloud_delete(id)
22
+ true
23
+ end
24
+
25
+ def image
26
+ requires :image_id
27
+ service.images.get(image_id)
28
+ end
29
+
30
+ def ready?
31
+ self.state == 'SUCCEEDED'
32
+ end
33
+
34
+ def private_ip_address
35
+ ip_assignments.select {|ip_assignment| ip_assignment['type'] == 'internal'}.first
36
+ end
37
+
38
+ def public_ip_address
39
+ ip_assignments.select {|ip_assignment| ip_assignment['type'] == 'external'}.first
40
+ end
41
+
42
+ def reboot
43
+ requires :id
44
+ service.devices_power(id, :reboot)
45
+ true
46
+ end
47
+
48
+ def state
49
+ @state ||= service.voxcloud_status(id).body['devices'].first['status']
50
+ end
51
+
52
+ def save
53
+ raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
54
+ requires :name, :image_id, :processing_cores, :facility, :disk_size
55
+
56
+ data = service.voxcloud_create({
57
+ :disk_size => disk_size,
58
+ :facility => facility,
59
+ :hostname => name,
60
+ :image_id => image_id,
61
+ :processing_cores => processing_cores
62
+ }).body
63
+
64
+ merge_attributes(data['device'])
65
+
66
+ true
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,26 @@
1
+ module Fog
2
+ module Compute
3
+ class Voxel
4
+ class Servers < Fog::Collection
5
+ model Fog::Compute::Voxel::Server
6
+
7
+ def all
8
+ data = service.devices_list.body['devices'].select {|device| device['type']['id'] == '3'}
9
+ load(data)
10
+ end
11
+
12
+ def get(device_id)
13
+ if device_id && server = service.devices_list(device_id).body['devices']
14
+ new(server.first)
15
+ end
16
+ rescue Fog::Service::Error => error
17
+ if error.message == "The device_id passed in can't be matched to a valid device."
18
+ nil
19
+ else
20
+ raise error
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ module Fog
2
+ module Parsers
3
+ module Compute
4
+ autoload :Voxel, 'fog/parsers/compute/voxel'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ module Fog
2
+ module Parsers
3
+ module Compute
4
+ module Voxel
5
+ autoload :Basic, 'fog/parsers/compute/voxel/basic'
6
+ autoload :DevicesList, 'fog/parsers/compute/voxel/devices_list'
7
+ autoload :ImagesList, 'fog/parsers/compute/voxel/images_list'
8
+ autoload :VoxcloudCreate, 'fog/parsers/compute/voxel/voxcloud_create'
9
+ autoload :VoxcloudDelete, 'fog/parsers/compute/voxel/voxcloud_delete'
10
+ autoload :Voxcloudstatus, 'fog/parsers/compute/voxel/voxcloud_status'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ module Fog
2
+ module Parsers
3
+ module Compute
4
+ module Voxel
5
+ class Basic < Fog::Parsers::Base
6
+ def reset
7
+ @response = {}
8
+ end
9
+
10
+ def start_element(name, attrs = [])
11
+ super
12
+
13
+ case name
14
+ when 'err'
15
+ @response['err'] = {
16
+ 'code' => attr_value('code', attrs),
17
+ 'msg' => attr_value('msg', attrs)
18
+ }
19
+ when 'rsp'
20
+ @response['stat'] = attr_value('stat', attrs)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,107 @@
1
+ module Fog
2
+ module Parsers
3
+ module Compute
4
+ module Voxel
5
+ class DevicesList < Fog::Parsers::Base
6
+ def reset
7
+ @device = {}
8
+ @response = { 'devices' => [] }
9
+ @in_storage = false
10
+ end
11
+
12
+ def start_element(name, attrs = [])
13
+ super
14
+
15
+ case name
16
+ when 'accessmethod'
17
+ @access_method = { 'type' => attr_value('type', attrs) }
18
+ when 'accessmethods'
19
+ @device['access_methods'] = []
20
+ when 'device'
21
+ @device = {
22
+ 'id' => attr_value('id', attrs),
23
+ 'label' => attr_value('label', attrs),
24
+ 'status' => attr_value('status', attrs)
25
+ }
26
+ when 'err'
27
+ @response['err'] = {
28
+ 'code' => attr_value('code', attrs),
29
+ 'msg' => attr_value('msg', attrs)
30
+ }
31
+ when 'cage', 'facility', 'rack', 'row', 'zone'
32
+ @device['location'][name] = { 'id' => attr_value('id', attrs) }
33
+ if code = attr_value('code', attrs)
34
+ @device['location'][name]['code'] = code
35
+ end
36
+ when 'drive'
37
+ @drive = { 'position' => attr_value('position', attrs) }
38
+ when 'ipassignment'
39
+ type = attr_value('type', attrs)
40
+ @device['ipassignments'] = []
41
+ @device['ipassignments'] << {
42
+ 'id' => attr_value('id', attrs),
43
+ 'type' => attr_value('type', attrs),
44
+ 'description' => attr_value('description', attrs),
45
+ }
46
+ when 'ipassignments'
47
+ @device['ipassignments'] = {}
48
+ when 'location'
49
+ @device['location'] = {}
50
+ when 'memory'
51
+ @device['memory'] = { 'size' => attr_value('size', attrs).to_i }
52
+ when 'model', 'type'
53
+ @device[name] = { 'id' => attr_value('id', attrs) }
54
+ when 'operating_system'
55
+ @device['operating_system'] = {}
56
+ when 'power_consumption'
57
+ @device[name] = attr_value('unit', attrs)
58
+ when 'processor'
59
+ @device['processor'] = {}
60
+ when 'rsp'
61
+ @response['stat'] = attr_value('stat', attrs)
62
+ when 'storage'
63
+ @device['drives'] = []
64
+ end
65
+ end
66
+
67
+ def end_element(name)
68
+ case name
69
+ when 'access_method'
70
+ @device['access_methods'] << @access_method
71
+ when 'architecture'
72
+ @device['operating_system'][name] = value.to_i
73
+ when 'cage', 'facility', 'rack', 'row', 'zone'
74
+ @device['location'][name]['value'] = value
75
+ when 'cores'
76
+ @device['processor'][name] = value.to_i
77
+ when 'description'
78
+ @device[name] = value
79
+ when 'device'
80
+ @response['devices'] << @device
81
+ @device = {}
82
+ when 'drive'
83
+ @device['drives'] << @drive
84
+ @drive = {}
85
+ when 'cores'
86
+ @device['processing_cores'] = value.to_i
87
+ when 'ipassignment'
88
+ @device['ipassignments'].last['value'] = value
89
+ when 'model', 'type'
90
+ @device[name]['value'] = value
91
+ when 'name'
92
+ @device['operating_system'][name] = value
93
+ when 'position'
94
+ @device['location'][name] = value
95
+ when 'power_consumption'
96
+ @device[name] = [value, @device[name]].join(' ')
97
+ when 'size'
98
+ @drive[name] = value.to_i
99
+ when 'host', 'password', 'protocol', 'username'
100
+ @access_method[name] = value
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,55 @@
1
+ module Fog
2
+ module Parsers
3
+ module Compute
4
+ module Voxel
5
+ class ImagesList < Fog::Parsers::Base
6
+ def reset
7
+ @image = {}
8
+ @response = { 'images' => [] }
9
+ end
10
+
11
+ def start_element(name, attrs = [])
12
+ super
13
+
14
+ case name
15
+ when 'err'
16
+ @response['err'] = {
17
+ 'code' => attr_value('code', attrs),
18
+ 'msg' => attr_value('msg', attrs)
19
+ }
20
+ when 'size'
21
+ @image['filesystem']['units'] = attr_value('units', attrs)
22
+ when 'image'
23
+ @image = {
24
+ 'id' => attr_value('id', attrs).to_i,
25
+ 'summary' => attr_value('summary', attrs)
26
+ }
27
+ when 'filesystem', 'operating_system'
28
+ @image[name] = {}
29
+ when 'rsp'
30
+ @response['stat'] = attr_value('stat', attrs)
31
+ end
32
+ end
33
+
34
+ def end_element(name)
35
+ case name
36
+ when 'architecture'
37
+ @image['operating_system'][name] = value.to_i
38
+ when 'admin_username', 'family', 'product_family', 'product_version', 'version'
39
+ @image['operating_system'][name] = value
40
+ when 'description'
41
+ @image[name] = value
42
+ when 'image'
43
+ @response['images'] << @image
44
+ @image = {}
45
+ when 'size'
46
+ @image['filesystem'][name] = value.to_i
47
+ when 'type'
48
+ @image['filesystem'][name] = value
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end