occi 1.2.1 → 2.0.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.
Files changed (99) hide show
  1. data/.gitignore +9 -0
  2. data/.project +32 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +1 -0
  6. data/AUTHORS +8 -0
  7. data/Gemfile +35 -14
  8. data/Gemfile.lock +89 -32
  9. data/LICENSE +13 -4
  10. data/README.md +70 -21
  11. data/Rakefile +25 -21
  12. data/lib/OpenNebula/Acl.rb +256 -0
  13. data/lib/OpenNebula/AclPool.rb +53 -0
  14. data/lib/OpenNebula/Group.rb +147 -0
  15. data/lib/OpenNebula/GroupPool.rb +54 -0
  16. data/lib/OpenNebula/Host.rb +143 -0
  17. data/lib/OpenNebula/HostPool.rb +55 -0
  18. data/lib/OpenNebula/Image.rb +256 -0
  19. data/lib/OpenNebula/ImagePool.rb +74 -0
  20. data/lib/OpenNebula/OpenNebula.rb +137 -0
  21. data/lib/OpenNebula/Pool.rb +285 -0
  22. data/lib/OpenNebula/Template.rb +173 -0
  23. data/lib/OpenNebula/TemplatePool.rb +74 -0
  24. data/lib/OpenNebula/User.rb +157 -0
  25. data/lib/OpenNebula/UserPool.rb +53 -0
  26. data/lib/OpenNebula/VirtualMachine.rb +319 -0
  27. data/lib/OpenNebula/VirtualMachinePool.rb +120 -0
  28. data/lib/OpenNebula/VirtualNetwork.rb +229 -0
  29. data/lib/OpenNebula/VirtualNetworkPool.rb +74 -0
  30. data/lib/OpenNebula/XMLUtils.rb +337 -0
  31. data/lib/occi/antlr/.gitignore +18 -0
  32. data/lib/occi/antlr/OCCI.g +164 -0
  33. data/lib/occi/antlr/OCCI.tokens +75 -0
  34. data/lib/occi/antlr/OCCILexer.rb +1532 -0
  35. data/lib/occi/antlr/OCCIParser.rb +2472 -0
  36. data/lib/occi/antlr/README.md +2 -0
  37. data/lib/occi/backend/dummy.rb +232 -0
  38. data/lib/occi/backend/ec2/Compute.rb +310 -0
  39. data/lib/occi/backend/ec2/compute.rb +310 -0
  40. data/lib/occi/backend/ec2/ec2.rb +215 -0
  41. data/lib/occi/backend/manager.rb +131 -0
  42. data/lib/occi/backend/opennebula/compute.rb +360 -0
  43. data/lib/occi/backend/opennebula/network.rb +143 -0
  44. data/lib/occi/backend/opennebula/opennebula.rb +188 -0
  45. data/lib/occi/backend/opennebula/storage.rb +175 -0
  46. data/lib/occi/configuration.rb +118 -0
  47. data/lib/occi/core/action.rb +29 -0
  48. data/lib/occi/core/attribute_properties.rb +54 -0
  49. data/lib/occi/core/attributes.rb +40 -0
  50. data/lib/occi/core/category.rb +62 -0
  51. data/lib/occi/core/collection.rb +27 -0
  52. data/lib/occi/core/entity.rb +135 -0
  53. data/lib/occi/core/kind.rb +55 -0
  54. data/lib/occi/core/link.rb +88 -0
  55. data/lib/occi/core/mixin.rb +43 -0
  56. data/lib/occi/core/resource.rb +73 -0
  57. data/lib/occi/exceptions.rb +59 -0
  58. data/lib/occi/extensions/monitoring/cpu.rb +51 -0
  59. data/lib/occi/extensions/monitoring/memory.rb +49 -0
  60. data/lib/occi/extensions/monitoring/metric.rb +54 -0
  61. data/lib/occi/extensions/monitoring/netrx.rb +49 -0
  62. data/lib/occi/extensions/monitoring/nettx.rb +55 -0
  63. data/lib/occi/extensions/one/VNC.rb +58 -0
  64. data/lib/occi/extensions/one/vnc.rb +58 -0
  65. data/lib/occi/log.rb +47 -0
  66. data/lib/occi/parse.rb +164 -0
  67. data/lib/occi/registry.rb +87 -0
  68. data/lib/occi/server.rb +594 -0
  69. data/lib/occi/version.rb +3 -0
  70. data/occi.gemspec +18 -96
  71. data/spec/occi/antlr/parser_spec.rb +82 -0
  72. data/spec/spec_helper.rb +6 -0
  73. metadata +100 -208
  74. data/.autotest +0 -21
  75. data/.rvmrc +0 -1
  76. data/VERSION +0 -1
  77. data/lib/occi.rb +0 -1
  78. data/lib/occi/client.rb +0 -36
  79. data/lib/occi/compute.rb +0 -4
  80. data/lib/occi/network.rb +0 -4
  81. data/lib/occi/resource.rb +0 -59
  82. data/lib/occi/storage.rb +0 -7
  83. data/test/fixtures/cassettes/compute_all.yml +0 -28
  84. data/test/fixtures/cassettes/compute_create.yml +0 -45
  85. data/test/fixtures/cassettes/compute_destroy.yml +0 -22
  86. data/test/fixtures/cassettes/compute_find.yml +0 -28
  87. data/test/fixtures/cassettes/compute_update.yml +0 -35
  88. data/test/fixtures/cassettes/network_all.yml +0 -28
  89. data/test/fixtures/cassettes/network_create.yml +0 -37
  90. data/test/fixtures/cassettes/network_destroy.yml +0 -22
  91. data/test/fixtures/cassettes/network_find.yml +0 -28
  92. data/test/fixtures/cassettes/storage_all.yml +0 -28
  93. data/test/fixtures/cassettes/storage_create.yml +0 -50
  94. data/test/fixtures/cassettes/storage_destroy.yml +0 -22
  95. data/test/fixtures/cassettes/storage_find.yml +0 -28
  96. data/test/lib/occi/compute_test.rb +0 -91
  97. data/test/lib/occi/network_test.rb +0 -57
  98. data/test/lib/occi/storage_test.rb +0 -67
  99. data/test/test_helper.rb +0 -48
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ .idea
2
+ .yardoc
3
+ .bundle
4
+ tmp
5
+ log
6
+ coverage
7
+ vendor
8
+ doc
9
+ collection
data/.project ADDED
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>OCCI</name>
4
+ <comment></comment>
5
+ <projects>
6
+ <project>one</project>
7
+ </projects>
8
+ <buildSpec>
9
+ <buildCommand>
10
+ <name>org.python.pydev.PyDevBuilder</name>
11
+ <arguments>
12
+ </arguments>
13
+ </buildCommand>
14
+ <buildCommand>
15
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
16
+ <arguments>
17
+ </arguments>
18
+ </buildCommand>
19
+ <buildCommand>
20
+ <name>com.aptana.ide.core.unifiedBuilder</name>
21
+ <arguments>
22
+ </arguments>
23
+ </buildCommand>
24
+ </buildSpec>
25
+ <natures>
26
+ <nature>org.eclipse.dltk.ruby.core.nature</nature>
27
+ <nature>com.aptana.ruby.core.rubynature</nature>
28
+ <nature>org.rubypeople.rdt.core.rubynature</nature>
29
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
30
+ <nature>org.python.pydev.pythonNature</nature>
31
+ </natures>
32
+ </projectDescription>
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper --color --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+
6
+ branches:
7
+ only:
8
+ - master
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --plugin yard-sinatra --markup markdown
data/AUTHORS ADDED
@@ -0,0 +1,8 @@
1
+ rOCCI was designed and is mainly developed by Florian Feldhaus (GWDG) and Piotr Kasprzak (GWDG) in Germany.
2
+
3
+ Special thanks to the following extraordinary individuals, who-out which rOCCI would not be possible:
4
+
5
+ * Hayati Bice - who wrote the initial version of an OCCI server rOCCI is based on
6
+ * Max Günther - who wrote the EC2 backend
7
+ * Andre Thevapalan - for his input regarding the JSON rendering
8
+ * the OCCI Working Group - for developing OCCI
data/Gemfile CHANGED
@@ -1,15 +1,36 @@
1
- source "http://rubygems.org"
2
-
3
- gem "hugs", "~> 2.3.0"
4
- #gem "hugs", :path => "~/git/hugs"
5
- gem "multipart-post", "~> 1.0.1"
6
- gem "nokogiri", "~> 1.4.4"
7
-
8
- group :development, :test do
9
- gem "rake"
10
- gem "jeweler", "~> 1.5.1"
11
- gem "webmock", "~> 1.6.2"
12
- gem "vcr", "~> 1.4.0"
13
- gem "minitest", "~> 2.0.0"
14
- gem "ZenTest", "~> 4.4.2"
1
+ source :rubygems
2
+
3
+ # external ruby libraries
4
+ gem "uuidtools"
5
+ gem "json"
6
+ gem "antlr3"
7
+ #gem "hashie", :git => 'git://github.com/ffeldhaus/hashie.git', :branch => "hash_deep_merge_with_array_concatenation"
8
+ gem "hashie"
9
+ gem "nokogiri", "<=1.5.0"
10
+ gem "builder"
11
+ gem "haml"
12
+ gem "erubis"
13
+
14
+ # sinatra and related
15
+ gem "sinatra"
16
+ gem "sinatra-contrib"
17
+ gem "sinatra-cross_origin"
18
+
19
+ # active gems
20
+ gem "activesupport"
21
+
22
+ # passenger
23
+ gem "passenger"
24
+
25
+ group :ec2 do
26
+ gem "aws-sdk"
27
+ gem "xml-simple"
15
28
  end
29
+
30
+ group :development do
31
+ gem "rspec"
32
+ gem "simplecov"
33
+ gem "yard"
34
+ gem "yard-sinatra"
35
+ gem "rspec-http"
36
+ end
data/Gemfile.lock CHANGED
@@ -1,40 +1,97 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- ZenTest (4.4.2)
5
- addressable (2.2.2)
6
- crack (0.1.8)
7
- git (1.2.5)
8
- hugs (2.3.0)
9
- multipart-post (~> 1.0.1)
10
- net-http-persistent (~> 1.4.1)
11
- nokogiri (~> 1.4.4)
12
- yajl-ruby (~> 0.7.8)
13
- jeweler (1.5.2)
14
- bundler (~> 1.0.0)
15
- git (>= 1.2.5)
16
- rake
17
- minitest (2.0.2)
18
- multipart-post (1.0.1)
19
- net-http-persistent (1.4.1)
20
- nokogiri (1.4.4)
21
- rake (0.8.7)
22
- vcr (1.4.0)
23
- webmock (1.6.2)
24
- addressable (>= 2.2.2)
25
- crack (>= 0.1.7)
26
- yajl-ruby (0.7.9)
4
+ activesupport (3.2.2)
5
+ i18n (~> 0.6)
6
+ multi_json (~> 1.0)
7
+ antlr3 (1.8.12)
8
+ aws-sdk (1.3.8)
9
+ httparty (~> 0.7)
10
+ json (~> 1.4)
11
+ nokogiri (<= 1.5.0)
12
+ uuidtools (~> 2.1)
13
+ backports (2.5.0)
14
+ builder (3.0.0)
15
+ daemon_controller (1.0.0)
16
+ diff-lcs (1.1.3)
17
+ erubis (2.7.0)
18
+ eventmachine (0.12.10)
19
+ fastthread (1.0.7)
20
+ haml (3.1.6)
21
+ hashie (1.2.0)
22
+ httparty (0.8.1)
23
+ multi_json
24
+ multi_xml
25
+ i18n (0.6.0)
26
+ json (1.6.6)
27
+ multi_json (1.2.0)
28
+ multi_xml (0.4.2)
29
+ nokogiri (1.5.0)
30
+ passenger (3.0.11)
31
+ daemon_controller (>= 0.2.5)
32
+ fastthread (>= 1.0.1)
33
+ rack
34
+ rake (>= 0.8.1)
35
+ rack (1.4.1)
36
+ rack-protection (1.2.0)
37
+ rack
38
+ rack-test (0.6.1)
39
+ rack (>= 1.0)
40
+ rake (0.9.2.2)
41
+ rspec (2.9.0)
42
+ rspec-core (~> 2.9.0)
43
+ rspec-expectations (~> 2.9.0)
44
+ rspec-mocks (~> 2.9.0)
45
+ rspec-core (2.9.0)
46
+ rspec-expectations (2.9.0)
47
+ diff-lcs (~> 1.1.3)
48
+ rspec-http (0.10.0)
49
+ rspec (~> 2.0)
50
+ rspec-mocks (2.9.0)
51
+ simplecov (0.6.1)
52
+ multi_json (~> 1.0)
53
+ simplecov-html (~> 0.5.3)
54
+ simplecov-html (0.5.3)
55
+ sinatra (1.3.2)
56
+ rack (~> 1.3, >= 1.3.6)
57
+ rack-protection (~> 1.2)
58
+ tilt (~> 1.3, >= 1.3.3)
59
+ sinatra-contrib (1.3.1)
60
+ backports (>= 2.0)
61
+ eventmachine
62
+ rack-protection
63
+ rack-test
64
+ sinatra (~> 1.3.0)
65
+ tilt (~> 1.3)
66
+ sinatra-cross_origin (0.1.0)
67
+ tilt (1.3.3)
68
+ uuidtools (2.1.2)
69
+ xml-simple (1.1.1)
70
+ yard (0.7.5)
71
+ yard-sinatra (1.0.0)
72
+ yard (~> 0.7)
27
73
 
28
74
  PLATFORMS
29
75
  ruby
30
76
 
31
77
  DEPENDENCIES
32
- ZenTest (~> 4.4.2)
33
- hugs (~> 2.3.0)
34
- jeweler (~> 1.5.1)
35
- minitest (~> 2.0.0)
36
- multipart-post (~> 1.0.1)
37
- nokogiri (~> 1.4.4)
38
- rake
39
- vcr (~> 1.4.0)
40
- webmock (~> 1.6.1)
78
+ activesupport
79
+ antlr3
80
+ aws-sdk
81
+ builder
82
+ erubis
83
+ haml
84
+ hashie
85
+ json
86
+ nokogiri (<= 1.5.0)
87
+ passenger
88
+ rspec
89
+ rspec-http
90
+ simplecov
91
+ sinatra
92
+ sinatra-contrib
93
+ sinatra-cross_origin
94
+ uuidtools
95
+ xml-simple
96
+ yard
97
+ yard-sinatra
data/LICENSE CHANGED
@@ -1,4 +1,13 @@
1
- "THE BEER-WARE LICENSE" (Revision 42):
2
- <john@dewey.ws> wrote this file. As long as you retain this notice you
3
- can do whatever you want with this stuff. If we meet some day, and you think
4
- this stuff is worth it, you can buy me a beer in return John-B Dewey Jr.
1
+ Copyright (c) 2012 GWDG
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md CHANGED
@@ -1,36 +1,85 @@
1
- # OCCI
1
+ rOCCI - A Ruby OCCI Framework
2
+ =============================
2
3
 
3
- [Ruby](http://www.ruby-lang.org/) bindings to [Open Cloud Computing Interface (OCCI)](http://www.opennebula.org/documentation:rel2.0:occidd).
4
+ [![Build Status](https://secure.travis-ci.org/gwdg/rOCCI.png)](http://travis-ci.org/gwdg/rOCCI)
4
5
 
5
- Integrated against [OpenNebula](http://opennebula.org) 2.0.1.
6
+ Requirements
7
+ ------------
6
8
 
7
- ## Usage
9
+ The following setup is recommended
8
10
 
9
- ### Bundler
11
+ * usage of the Ruby Version Manger
12
+ * Ruby 1.9.3
13
+ * Bundler gem installed (use ```gem install bundler```)
10
14
 
11
- gem "occi"
15
+ Installation
16
+ ------------
12
17
 
13
- ### Examples
18
+ ### Stable version
14
19
 
15
- See the examples section in the [wiki](http://github.com/retr0h/occi/wiki).
20
+ Download the latest version from http://dev.opennebula.org/projects/ogf-occi/files
16
21
 
17
- ## Compatability
22
+ Extract file
18
23
 
19
- ruby 1.9.2p0
24
+ tar xzf rOCCI-*.tar.bz
25
+ unzip rOCCI-*.zip
20
26
 
21
- OCCI API|OCCI Rubygem|OpenNebula
22
- --------|------------|----------
23
- 5 |1.0.1 |2.0.1
27
+ Install dependencies
24
28
 
25
- ## Testing
29
+ bundle install --deployment
26
30
 
27
- MiniTest will run the tests in a random order. When rebuilding the fixtures, the entity
28
- tests depend on the pool tests having already been run. Since the fixtures change infrequently,
29
- this should be acceptable.
31
+ ### Latest version
30
32
 
31
- Tests can run offline thanks to [VCR](https://github.com/myronmarston/vcr).
33
+ Checkout latest version from GIT:
32
34
 
33
- $ export ONE_USER=$user
34
- $ export ONE_PASSWORD=$password
35
+ git clone git://github.com/gwdg/rOCCI.git
35
36
 
36
- $ rake
37
+ Change to rOCCI folder
38
+
39
+ cd rOCCI
40
+
41
+ Install dependencies for deployment
42
+
43
+ bundle install --deployment
44
+
45
+ Configure
46
+ ---------
47
+
48
+ Edit etc/occi-server.conf and adapt to your setting.
49
+
50
+ The default templates for the OpenNebula template are located at etc/one_templates .
51
+
52
+ The default templates for EC2 are located at etc/ec2_templates .
53
+
54
+ Usage
55
+ -----
56
+
57
+ Run Passenger
58
+
59
+ passenger start
60
+
61
+ Testing
62
+ -------
63
+
64
+ Use curl to request all categories
65
+
66
+ curl -X GET http://localhost:3000/-/
67
+
68
+ Development
69
+ -----------
70
+
71
+ ### Code Documentation
72
+
73
+ [Code Documentation for rOCCI by YARD](http://rubydoc.info/github/gwdg/rOCCI/)
74
+
75
+ ### Continuous integration
76
+
77
+ [Continuous integration for rOCCI by Travis-CI](http://travis-ci.org/gwdg/rOCCI/)
78
+
79
+ ### Contribute
80
+
81
+ 1. Fork it.
82
+ 2. Create a branch (git checkout -b my_markup)
83
+ 3. Commit your changes (git commit -am "My changes")
84
+ 4. Push to the branch (git push origin my_markup)
85
+ 5. Create an Issue with a link to your branch
data/Rakefile CHANGED
@@ -1,25 +1,29 @@
1
- require "rubygems"
2
- require "rake"
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
3
 
4
- begin
5
- require "jeweler"
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "occi"
8
- gem.summary = %Q{Ruby bindings to Open Cloud Computing Interface (OCCI).}
9
- gem.email = "john@dewey.ws"
10
- gem.homepage = "http://github.com/retr0h/occi"
11
- gem.authors = ["retr0h"]
4
+ task :default => 'rcov:all'
5
+
6
+ require 'rspec/core/rake_task'
7
+ #require 'cucumber/rake/task'
8
+
9
+ namespace :rcov do
10
+
11
+ =begin
12
+ Cucumber::Rake::Task.new(:cucumber) do |t|
13
+ t.cucumber_opts = "--format pretty"
14
+
15
+ ENV['COVERAGE'] = "true"
12
16
  end
13
- Jeweler::GemcutterTasks.new
14
- rescue LoadError
15
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
16
- end
17
+ =end
17
18
 
18
- require "rake/testtask"
19
- Rake::TestTask.new(:test) do |test|
20
- test.libs << "lib" << "test"
21
- test.pattern = "test/**/*_test.rb"
22
- test.verbose = true
23
- end
19
+ RSpec::Core::RakeTask.new(:rspec) do |t|
20
+ ENV['COVERAGE'] = "true"
21
+ end
24
22
 
25
- task :default => :test
23
+ desc "Run cucumber & rspec to generate aggregated coverage"
24
+ task :all do |t|
25
+ rm "coverage/coverage.data" if File.exist?("coverage/coverage.data")
26
+ Rake::Task['rcov:rspec'].invoke
27
+ # Rake::Task["rcov:cucumber"].invoke
28
+ end
29
+ end
@@ -0,0 +1,256 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) #
3
+ # #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
+ # not use this file except in compliance with the License. You may obtain #
6
+ # a copy of the License at #
7
+ # #
8
+ # http://www.apache.org/licenses/LICENSE-2.0 #
9
+ # #
10
+ # Unless required by applicable law or agreed to in writing, software #
11
+ # distributed under the License is distributed on an "AS IS" BASIS, #
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
13
+ # See the License for the specific language governing permissions and #
14
+ # limitations under the License. #
15
+ #--------------------------------------------------------------------------- #
16
+
17
+
18
+ module OpenNebula
19
+
20
+ # Abstract rules of the type USER RESOURCE RIGHTS
21
+ # which are:
22
+ # USER -> #<num>
23
+ # @<num>
24
+ # ALL
25
+ # RESOURCE -> + separated list and "/{#,@}<num>|ALL"
26
+ # VM,
27
+ # HOST
28
+ # NET
29
+ # IMAGE
30
+ # USER
31
+ # TEMPLATE
32
+ # GROUP
33
+ # ACL
34
+ # RIGHTS -> + separated list
35
+ # USE
36
+ # MANAGE
37
+ # ADMIN
38
+ # CREATE
39
+ class Acl < PoolElement
40
+
41
+ USERS = {
42
+ "UID" => 0x100000000,
43
+ "GID" => 0x200000000,
44
+ "ALL" => 0x400000000
45
+ }
46
+
47
+ RESOURCES =
48
+ {
49
+ "VM" => 0x1000000000,
50
+ "HOST" => 0x2000000000,
51
+ "NET" => 0x4000000000,
52
+ "IMAGE" => 0x8000000000,
53
+ "USER" => 0x10000000000,
54
+ "TEMPLATE" => 0x20000000000,
55
+ "GROUP" => 0x40000000000
56
+ }
57
+
58
+ RIGHTS =
59
+ {
60
+ "USE" => 0x1, # Auth. to use an object
61
+ "MANAGE" => 0x2, # Auth. to perform management actions
62
+ "ADMIN" => 0x4, # Auth. to perform administrative actions
63
+ "CREATE" => 0x8 # Auth. to create an object
64
+ }
65
+
66
+ # Constructor
67
+ #
68
+ # @param xml [String] must be an xml built with {#build_xml}
69
+ # @param client [Client] represents an XML-RPC connection
70
+ def initialize(xml, client)
71
+ super(xml,client)
72
+ end
73
+
74
+ # Creates an empty XML representation. It contains the id, if it is
75
+ # specified.
76
+ #
77
+ # @param pe_id [Integer] rule ID
78
+ # @param client [Client] represents an XML-RPC connection
79
+ #
80
+ # @return [String] an empty XML representation
81
+ def self.build_xml(pe_id=nil)
82
+ if pe_id
83
+ acl_xml = "<ACL><ID>#{pe_id}</ID></ACL>"
84
+ else
85
+ acl_xml = "<ACL></ACL>"
86
+ end
87
+
88
+ XMLElement.build_xml(acl_xml,'ACL')
89
+ end
90
+
91
+ # Creates a new ACL rule.
92
+ #
93
+ # @param user [String]
94
+ # A string containing a hex number, e.g. 0x100000001
95
+ # @param resource [String]
96
+ # A string containing a hex number, e.g. 0x2100000001
97
+ # @param rights [String]
98
+ # A string containing a hex number, e.g. 0x10
99
+ #
100
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
101
+ # otherwise
102
+ def allocate(user, resource, rights)
103
+ return super( AclPool::ACL_POOL_METHODS[:addrule],
104
+ user,
105
+ resource,
106
+ rights )
107
+ end
108
+
109
+ # Deletes the Acl rule
110
+ #
111
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
112
+ # otherwise
113
+ def delete()
114
+ super(AclPool::ACL_POOL_METHODS[:delrule])
115
+ end
116
+
117
+ # Does nothing, individual ACL rules info can't be retrieved from
118
+ # OpenNebula
119
+ #
120
+ # @return [nil] nil
121
+ def info()
122
+ return nil
123
+ end
124
+
125
+ # Parses a rule string, e.g. "#5 HOST+VM/@12 INFO+CREATE+DELETE"
126
+ #
127
+ # @param rule_str [String] an ACL rule in string format
128
+ #
129
+ # @return [Array] an Array containing 3 strings (hex 64b numbers),
130
+ # or OpenNebula::Error objects
131
+ def self.parse_rule(rule_str)
132
+ ret = Array.new
133
+
134
+ rule_str = rule_str.split(" ")
135
+
136
+ if rule_str.length != 3
137
+ return OpenNebula::Error.new(
138
+ "String needs three components: User, Resource, Rights")
139
+ end
140
+
141
+ ret << parse_users(rule_str[0])
142
+ ret << parse_resources(rule_str[1])
143
+ ret << parse_rights(rule_str[2])
144
+
145
+ errors=ret.map do |arg|
146
+ if OpenNebula.is_error?(arg)
147
+ arg.message
148
+ else
149
+ nil
150
+ end
151
+ end
152
+
153
+ errors.compact!
154
+
155
+ if errors.length>0
156
+ return OpenNebula::Error.new(errors.join(', '))
157
+ end
158
+
159
+ return ret
160
+ end
161
+
162
+ private
163
+
164
+ # Converts a string in the form [#<id>, @<id>, *] to a hex. number
165
+ #
166
+ # @param users [String] Users component string
167
+ #
168
+ # @return [String] A string containing a hex number
169
+ def self.parse_users(users)
170
+ begin
171
+ return calculate_ids(users).to_i.to_s(16)
172
+ rescue Exception => e
173
+ return OpenNebula::Error.new(e.message)
174
+ end
175
+ end
176
+
177
+ # Converts a resources string to a hex. number
178
+ #
179
+ # @param resources [String] Resources component string
180
+ #
181
+ # @return [String] A string containing a hex number
182
+ def self.parse_resources(resources)
183
+ begin
184
+ ret = 0
185
+ resources = resources.split("/")
186
+
187
+ if resources.size != 2
188
+ raise "Resource '#{resources}' malformed"
189
+ end
190
+
191
+ resources[0].split("+").each{ |resource|
192
+ if !RESOURCES[resource.upcase]
193
+ raise "Resource '#{resource}' does not exist"
194
+ end
195
+ ret += RESOURCES[resource.upcase]
196
+ }
197
+
198
+ ret += calculate_ids(resources[1])
199
+
200
+ return ret.to_i.to_s(16)
201
+ rescue Exception => e
202
+ return OpenNebula::Error.new(e.message)
203
+ end
204
+ end
205
+
206
+ # Converts a rights string to a hex. number
207
+ #
208
+ # @param rights [String] Rights component string
209
+ #
210
+ # @return [String] A string containing a hex number
211
+ def self.parse_rights(rights)
212
+ begin
213
+ ret = 0
214
+ rights = rights.split("+")
215
+
216
+ rights.each{ |right|
217
+ raise "Right '#{right}' does not exist" if !RIGHTS[right.upcase]
218
+
219
+ ret += RIGHTS[right.upcase]
220
+ }
221
+
222
+ return ret.to_i.to_s(16)
223
+ rescue Exception => e
224
+ return OpenNebula::Error.new(e.message)
225
+ end
226
+ end
227
+
228
+ # Calculates the numeric value for a String containing an individual
229
+ # (#<id>), group (@<id>) or all (*) ID component
230
+ #
231
+ # @param id_str [String] Rule Id string
232
+ #
233
+ # @return [Integer] the numeric value for the given id_str
234
+ def self.calculate_ids(id_str)
235
+ raise "ID string '#{id_str}' malformed" if
236
+ !id_str.match(/^([\#@]\d+|\*)$/)
237
+
238
+ value = 0
239
+
240
+ case id_str[0..0]
241
+ when "#"
242
+ value = USERS["UID"]
243
+ users_value = id_str[1..-1].to_i + value
244
+
245
+ when "@"
246
+ value = USERS["GID"]
247
+ users_value = id_str[1..-1].to_i + value
248
+
249
+ when "*"
250
+ users_value = USERS["ALL"]
251
+ end
252
+
253
+ return users_value
254
+ end
255
+ end
256
+ end