occi 1.2.1 → 2.0.0

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