roca 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.
data/.autotest ADDED
@@ -0,0 +1,5 @@
1
+ begin
2
+ require "autotest/fsevent"
3
+ require "autotest/growl"
4
+ rescue LoadError
5
+ end
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ coverage/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in roca.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,20 @@
1
+ module Roca
2
+ class Connector
3
+
4
+ def initialize(args = {})
5
+ @xmlrpc_client = args[:xmlrpc_client] || build_xmlrpc_client(args[:endpoint])
6
+ @session_string = args[:session_string]
7
+ end
8
+
9
+ def execute(method, *args)
10
+ args = args.unshift(@session_string)
11
+ @xmlrpc_client.call_async(method, *args)
12
+ end
13
+
14
+ private
15
+
16
+ def build_xmlrpc_client(endpoint)
17
+ XMLRPC::Client.new2(endpoint)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ module Roca
2
+ module ConnectorHelper
3
+ def connector
4
+ self.class.connector
5
+ end
6
+
7
+ def connector=(_connector)
8
+ self.class.connector = _connector
9
+ end
10
+
11
+ module ClassMethods
12
+ def connector
13
+ # todo: inject endpoint and session_string
14
+ @connector ||= Connector.new(endpoint: endpoint, session_string: session_string)
15
+ end
16
+
17
+ def connector=(_connector)
18
+ @connector = _connector
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/roca/group.rb ADDED
@@ -0,0 +1,42 @@
1
+ module Roca
2
+ class Group
3
+ include ConnectorHelper
4
+ extend ConnectorHelper::ClassMethods
5
+
6
+ attr_reader :group_id, :name
7
+
8
+ def self.create(attributes = {})
9
+ success_flag, group_id, error_code = connector.execute("one.group.allocate", attributes[:name])
10
+ attributes[:group_id] = group_id
11
+ success_flag ? Group.build_from_hash(attributes) : false
12
+ end
13
+
14
+ def self.find(group_id)
15
+ success_flag, xml_object_description, error_code = connector.execute("one.group.info", group_id)
16
+ success_flag ? Group.build_from_xml(xml_object_description) : false
17
+ end
18
+
19
+ def self.build_from_hash(attributes = {})
20
+ Group.new(attributes)
21
+ end
22
+
23
+ def self.build_from_xml(xml_description)
24
+ doc = Nokogiri::Slop(xml_description)
25
+
26
+ Group.build_from_hash(
27
+ group_id: doc.GROUP.ID.content.to_i,
28
+ name: doc.GROUP.NAME.content
29
+ )
30
+ end
31
+
32
+ def initialize(attributes = {})
33
+ @name = attributes[:name]
34
+ @group_id = attributes[:group_id]
35
+ end
36
+
37
+ def delete
38
+ success_flag, xml_object_description, error_code = connector.execute("one.group.delete", group_id)
39
+ success_flag
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,63 @@
1
+ module Roca
2
+ class Template
3
+ include ConnectorHelper
4
+ extend ConnectorHelper::ClassMethods
5
+
6
+ attr_reader :template_id, :user_id, :group_id, :user_name, :group_name, :name, :template
7
+
8
+ def self.find(template_id)
9
+ success_flag, xml_object_description, error_code = connector.execute("one.template.info", template_id)
10
+ success_flag ? Template.build_from_xml(xml_object_description) : false
11
+ end
12
+
13
+ def self.build_from_hash(attributes = {})
14
+ Template.new(attributes)
15
+ end
16
+
17
+ def self.build_from_xml(xml_description)
18
+ doc = Nokogiri::Slop(xml_description)
19
+
20
+ Template.build_from_hash(
21
+ template_id: doc.VMTEMPLATE.ID.content.to_i,
22
+ user_id: doc.VMTEMPLATE.UID.content.to_i,
23
+ group_id: doc.VMTEMPLATE.GID.content.to_i,
24
+ user_name: doc.VMTEMPLATE.UNAME.content,
25
+ group_name: doc.VMTEMPLATE.GNAME.content,
26
+ name: doc.VMTEMPLATE.NAME.content,
27
+ public: !doc.VMTEMPLATE.PUBLIC.content.to_i.zero?,
28
+ regtime: doc.VMTEMPLATE.REGTIME.content.to_i,
29
+ xml_template: doc.VMTEMPLATE.TEMPLATE.to_xml
30
+ )
31
+ end
32
+
33
+ def initialize(attributes = {})
34
+ @template_id = attributes[:template_id]
35
+ @user_id = attributes[:user_id]
36
+ @group_id = attributes[:group_id]
37
+ @user_name = attributes[:user_name]
38
+ @group_name = attributes[:group_name]
39
+ @name = attributes[:name]
40
+ @public = attributes[:public]
41
+ @regtime = attributes[:regtime]
42
+ @xml_template = attributes[:xml_template]
43
+ end
44
+
45
+ def instantiate(attributes = {})
46
+ virtual_machine_name = attributes[:virtual_machine_name] || ""
47
+ success_flag, virtual_machine_id, error_code = connector.execute("one.template.instantiate", template_id, virtual_machine_name)
48
+ success_flag ? virtual_machine_name : false
49
+ end
50
+
51
+ def public?
52
+ @public
53
+ end
54
+
55
+ def registration_time
56
+ @regtime_as_time_object ||= Time.at(@regtime)
57
+ end
58
+
59
+ def group
60
+ @group ||= Group.find(@group_id)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,18 @@
1
+ module Roca
2
+ class TemplatePool
3
+ include ConnectorHelper
4
+ extend ConnectorHelper::ClassMethods
5
+
6
+ def self.all
7
+ success_flag, xml_templates, error_code = connector.execute("one.templatepool.info", -2, -1, -1)
8
+ result = []
9
+ if success_flag then
10
+ doc = Nokogiri::Slop(xml_templates)
11
+ doc.VMTEMPLATE_POOL.children.each do |xml_template|
12
+ result << Template.build_from_xml(xml_template.to_s)
13
+ end
14
+ end
15
+ result
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Roca
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,42 @@
1
+ module Roca
2
+ class VirtualMachine
3
+ include ConnectorHelper
4
+ extend ConnectorHelper::ClassMethods
5
+
6
+ def self.build_from_hash(attributes = {})
7
+ VirtualMachine.new(attributes)
8
+ end
9
+
10
+ def self.build_from_xml(xml_description)
11
+ doc = Nokogiri::Slop(xml_description)
12
+
13
+ VirtualMachine.build_from_hash(
14
+ virtual_machine_id: doc.VM.ID.content.to_i,
15
+ user_id: doc.VM.UID.content.to_i,
16
+ group_id: doc.VM.GID.content.to_i,
17
+ user_name: doc.VM.UNAME.content,
18
+ group_name: doc.VM.GNAME.content,
19
+ name: doc.VM.NAME.content,
20
+ last_poll: doc.VM.LAST_POLL.content.to_i,
21
+ state: doc.VM.STATE.content.to_i,
22
+ lcm_state: doc.VM.LCM_STATE.content.to_i,
23
+ stime: doc.VM.STIME.content.to_i,
24
+ etime: doc.VM.ETIME.content.to_i
25
+ )
26
+ end
27
+
28
+ def initialize(attributes = {})
29
+ @virtual_machine_id = attributes[:virtual_machine_id],
30
+ @user_id = attributes[:user_id],
31
+ @group_id = attributes[:group_id],
32
+ @user_name = attributes[:user_name],
33
+ @group_name = attributes[:group_name],
34
+ @name = attributes[:name],
35
+ @last_poll = attributes[:last_poll],
36
+ @state = attributes[:state],
37
+ @lcm_state = attributes[:lcm_state],
38
+ @stime = attributes[:stime],
39
+ @etime = attributes[:etime]
40
+ end
41
+ end
42
+ end
data/lib/roca.rb ADDED
@@ -0,0 +1,16 @@
1
+ # require "roca/version"
2
+ require "nokogiri"
3
+ require "xmlrpc/client"
4
+
5
+ module Roca
6
+ autoload :Connector, "roca/connector"
7
+ autoload :ConnectorHelper, "roca/connector_helper"
8
+ autoload :Group, "roca/group"
9
+ autoload :Template, "roca/template"
10
+ autoload :TemplatePool, "roca/template_pool"
11
+ # autoload :Host, "roca/host"
12
+ # autoload :Image, "roca/image"
13
+ # autoload :User, "roca/user"
14
+ # autoload :VirtualMachine, "roca/virtual_machine"
15
+ # autoload :VirtualNetwork, "roca/virtual_network"
16
+ end
data/roca.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "roca/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "roca"
7
+ s.version = Roca::VERSION
8
+ s.authors = ["Nicolai Reuschling"]
9
+ s.email = ["gemdev@reuschling.name"]
10
+ s.homepage = ""
11
+ s.summary = %q{Ruby library for OpenNebula's XML-RPC API}
12
+ s.description = %q{This is a very experimental Ruby library for OpenNebula's XML-RPC API}
13
+
14
+ s.required_ruby_version = ">= 1.9.3"
15
+ # s.rubyforge_project = "roca"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ # specify any dependencies here; for example:
23
+ # s.add_development_dependency "rspec"
24
+ # s.add_runtime_dependency "rest-client"
25
+ s.add_development_dependency "rspec"
26
+ s.add_development_dependency "autotest"
27
+ s.add_development_dependency "autotest-fsevent"
28
+ s.add_development_dependency "autotest-growl"
29
+ s.add_development_dependency "simplecov"
30
+ s.add_runtime_dependency "activesupport"
31
+ s.add_runtime_dependency "nokogiri"
32
+ end
data/spec/.gitkeep ADDED
File without changes
@@ -0,0 +1,5 @@
1
+ require "spec_helper"
2
+
3
+ describe "ConnectorHelper" do
4
+ pending
5
+ end
@@ -0,0 +1,5 @@
1
+ require "spec_helper"
2
+
3
+ describe "Connector" do
4
+ pending
5
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe "Group" do
4
+ it "should keep a name and group_id" do
5
+ group = Group.new(name: "group name", group_id: 105)
6
+ group.name.should == "group name"
7
+ group.group_id.should == 105
8
+ end
9
+
10
+ it "should create a group" do
11
+ Group.connector = double(Connector, :execute => [true, 105, 0])
12
+
13
+ group = Group.create(name: "group name")
14
+ group.group_id.should == 105
15
+ group.name.should == "group name"
16
+ end
17
+
18
+ it "should find a specific group" do
19
+ Group.connector = double(Connector, :execute => [true, "<GROUP><ID>105</ID><NAME>group name</NAME><USERS/></GROUP>", 0])
20
+
21
+ group = Group.find(105)
22
+ group.group_id.should == 105
23
+ group.name.should == "group name"
24
+ end
25
+
26
+ it "can be deleted" do
27
+ fake_connector = double(Connector)
28
+ fake_connector.should_receive(:execute)
29
+ .with("one.group.delete", 105)
30
+ .and_return([true, "<GROUP><ID>105</ID><NAME>group name</NAME><USERS/></GROUP>", 0])
31
+ Group.connector = fake_connector
32
+
33
+ group = Group.new(name: "group name", group_id: 105)
34
+ group.delete
35
+ end
36
+
37
+ it "should parse an XML group description to a new Group instance" do
38
+ group = Group.build_from_xml "<GROUP><ID>105</ID><NAME>group name</NAME><USERS/></GROUP>"
39
+ group.group_id.should == 105
40
+ group.name.should == "group name"
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ Bundler.require(:default, :development)
5
+
6
+ include Roca
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe "Template" do
4
+ it "should parse an XML group description to a new Group instance" do
5
+ template = Template.build_from_xml("<VMTEMPLATE><ID>99</ID><UID>1</UID><GID>2</GID><UNAME>user name</UNAME><GNAME>group name</GNAME><NAME>template name</NAME><PUBLIC>0</PUBLIC><REGTIME>1326974817</REGTIME><TEMPLATE><CONTEXT><HOSTNAME><![CDATA[$NAME]]></HOSTNAME><PRIV_BC><![CDATA[192.168.2.255]]></PRIV_BC><PRIV_IP><![CDATA[$NIC[IP,NETWORK_ID=\"1\"]]]></PRIV_IP><PRIV_NM><![CDATA[255.255.255.0]]></PRIV_NM><PRIV_NW><![CDATA[192.168.2.0]]></PRIV_NW><PUB_BC><![CDATA[8.8.8.8]]></PUB_BC><PUB_GW><![CDATA[8.8.8.8]]></PUB_GW><PUB_IP><![CDATA[$NIC[IP,NETWORK_ID=\"1\"]]]></PUB_IP><PUB_NM><![CDATA[255.255.255.240]]></PUB_NM><PUB_NS><![CDATA[8.8.8.8]]></PUB_NS><PUB_NW><![CDATA[8.8.8.8]]></PUB_NW></CONTEXT><CPU><![CDATA[0.5]]></CPU><DISK><BUS><![CDATA[virtio]]></BUS><READONLY><![CDATA[no]]></READONLY><SOURCE><![CDATA[/var/lib/one/images/image.img]]></SOURCE><TARGET><![CDATA[blubber]]></TARGET></DISK><FEATURES><ACPI><![CDATA[no]]></ACPI></FEATURES><GRAPHICS><LISTEN><![CDATA[127.0.0.1]]></LISTEN><TYPE><![CDATA[vnc]]></TYPE></GRAPHICS><MEMORY><![CDATA[512]]></MEMORY><NAME><![CDATA[testvm4_vm]]></NAME><NIC><MODEL><![CDATA[virtio]]></MODEL><NETWORK_ID><![CDATA[1]]></NETWORK_ID></NIC><NIC><MODEL><![CDATA[virtio]]></MODEL><NETWORK_ID><![CDATA[1]]></NETWORK_ID></NIC><OS><ARCH><![CDATA[x86_64]]></ARCH><BOOT><![CDATA[hd]]></BOOT></OS><RAW><TYPE><![CDATA[kvm]]></TYPE></RAW><TEMPLATE_ID><![CDATA[10]]></TEMPLATE_ID><VCPU><![CDATA[1]]></VCPU></TEMPLATE></VMTEMPLATE>")
6
+ template.template_id.should == 99
7
+ template.user_id.should == 1
8
+ template.group_id.should == 2
9
+ template.user_name.should == "user name"
10
+ template.group_name.should == "group name"
11
+ template.name.should == "template name"
12
+ template.registration_time.should == Time.at(1326974817)
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe "Gem version" do
4
+ it "should be 0.0.1" do
5
+ Roca::VERSION.should == "0.0.1"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: roca
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nicolai Reuschling
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70295818659180 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70295818659180
25
+ - !ruby/object:Gem::Dependency
26
+ name: autotest
27
+ requirement: &70295818658400 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70295818658400
36
+ - !ruby/object:Gem::Dependency
37
+ name: autotest-fsevent
38
+ requirement: &70295818657700 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70295818657700
47
+ - !ruby/object:Gem::Dependency
48
+ name: autotest-growl
49
+ requirement: &70295818657000 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70295818657000
58
+ - !ruby/object:Gem::Dependency
59
+ name: simplecov
60
+ requirement: &70295818656100 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70295818656100
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: &70295818662560 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70295818662560
80
+ - !ruby/object:Gem::Dependency
81
+ name: nokogiri
82
+ requirement: &70295818661440 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70295818661440
91
+ description: This is a very experimental Ruby library for OpenNebula's XML-RPC API
92
+ email:
93
+ - gemdev@reuschling.name
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - .autotest
99
+ - .gitignore
100
+ - .rspec
101
+ - Gemfile
102
+ - Rakefile
103
+ - lib/roca.rb
104
+ - lib/roca/connector.rb
105
+ - lib/roca/connector_helper.rb
106
+ - lib/roca/group.rb
107
+ - lib/roca/template.rb
108
+ - lib/roca/template_pool.rb
109
+ - lib/roca/version.rb
110
+ - lib/roca/virtual_machine.rb
111
+ - roca.gemspec
112
+ - spec/.gitkeep
113
+ - spec/connector_helper_spec.rb
114
+ - spec/connector_spec.rb
115
+ - spec/group_spec.rb
116
+ - spec/spec_helper.rb
117
+ - spec/template_spec.rb
118
+ - spec/version_spec.rb
119
+ homepage: ''
120
+ licenses: []
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: 1.9.3
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 1.8.17
140
+ signing_key:
141
+ specification_version: 3
142
+ summary: Ruby library for OpenNebula's XML-RPC API
143
+ test_files:
144
+ - spec/connector_helper_spec.rb
145
+ - spec/connector_spec.rb
146
+ - spec/group_spec.rb
147
+ - spec/spec_helper.rb
148
+ - spec/template_spec.rb
149
+ - spec/version_spec.rb