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.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +20 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +19 -0
- data/CONTRIBUTING.md +18 -0
- data/CONTRIBUTORS.md +5 -0
- data/Gemfile +4 -0
- data/LICENSE.md +20 -0
- data/README.md +34 -0
- data/Rakefile +18 -0
- data/fog-voxel.gemspec +35 -0
- data/gemfiles/Gemfile.1.9.2- +8 -0
- data/gemfiles/Gemfile.1.9.3+ +7 -0
- data/lib/fog/bin/voxel.rb +29 -0
- data/lib/fog/compute/voxel.rb +127 -0
- data/lib/fog/compute/voxel/image.rb +11 -0
- data/lib/fog/compute/voxel/images.rb +24 -0
- data/lib/fog/compute/voxel/real.rb +6 -0
- data/lib/fog/compute/voxel/real/devices_list.rb +22 -0
- data/lib/fog/compute/voxel/real/devices_power.rb +20 -0
- data/lib/fog/compute/voxel/real/images_list.rb +29 -0
- data/lib/fog/compute/voxel/real/voxcloud_create.rb +20 -0
- data/lib/fog/compute/voxel/real/voxcloud_delete.rb +18 -0
- data/lib/fog/compute/voxel/real/voxcloud_status.rb +22 -0
- data/lib/fog/compute/voxel/server.rb +71 -0
- data/lib/fog/compute/voxel/servers.rb +26 -0
- data/lib/fog/parsers/compute.rb +7 -0
- data/lib/fog/parsers/compute/voxel.rb +14 -0
- data/lib/fog/parsers/compute/voxel/basic.rb +27 -0
- data/lib/fog/parsers/compute/voxel/devices_list.rb +107 -0
- data/lib/fog/parsers/compute/voxel/images_list.rb +55 -0
- data/lib/fog/parsers/compute/voxel/voxcloud_create.rb +36 -0
- data/lib/fog/parsers/compute/voxel/voxcloud_delete.rb +27 -0
- data/lib/fog/parsers/compute/voxel/voxcloud_status.rb +42 -0
- data/lib/fog/voxel.rb +25 -0
- data/lib/fog/voxel/compute.rb +0 -0
- data/lib/fog/voxel/version.rb +5 -0
- data/spec/minitest_helper.rb +31 -0
- data/tests/helper.rb +37 -0
- data/tests/helpers/collection_helper.rb +97 -0
- data/tests/helpers/compute/flavors_helper.rb +32 -0
- data/tests/helpers/compute/server_helper.rb +25 -0
- data/tests/helpers/compute/servers_helper.rb +10 -0
- data/tests/helpers/formats_helper.rb +98 -0
- data/tests/helpers/formats_helper_tests.rb +110 -0
- data/tests/helpers/mock_helper.rb +117 -0
- data/tests/helpers/model_helper.rb +31 -0
- data/tests/helpers/responds_to_helper.rb +11 -0
- data/tests/helpers/schema_validator_tests.rb +107 -0
- data/tests/helpers/succeeds_helper.rb +9 -0
- data/tests/requests/compute/image_tests.rb +52 -0
- data/tests/requests/compute/server_tests.rb +123 -0
- 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,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
|