roca 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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