opennebula 3.9.80.beta

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 (42) hide show
  1. data/LICENSE +202 -0
  2. data/NOTICE +47 -0
  3. data/lib/opennebula.rb +58 -0
  4. data/lib/opennebula/acl.rb +266 -0
  5. data/lib/opennebula/acl_pool.rb +55 -0
  6. data/lib/opennebula/client.rb +119 -0
  7. data/lib/opennebula/cluster.rb +249 -0
  8. data/lib/opennebula/cluster_pool.rb +58 -0
  9. data/lib/opennebula/datastore.rb +171 -0
  10. data/lib/opennebula/datastore_pool.rb +55 -0
  11. data/lib/opennebula/document.rb +261 -0
  12. data/lib/opennebula/document_json.rb +131 -0
  13. data/lib/opennebula/document_pool.rb +102 -0
  14. data/lib/opennebula/document_pool_json.rb +58 -0
  15. data/lib/opennebula/error.rb +52 -0
  16. data/lib/opennebula/group.rb +163 -0
  17. data/lib/opennebula/group_pool.rb +56 -0
  18. data/lib/opennebula/host.rb +201 -0
  19. data/lib/opennebula/host_pool.rb +93 -0
  20. data/lib/opennebula/image.rb +297 -0
  21. data/lib/opennebula/image_pool.rb +79 -0
  22. data/lib/opennebula/ldap_auth.rb +99 -0
  23. data/lib/opennebula/ldap_auth_spec.rb +70 -0
  24. data/lib/opennebula/pool.rb +160 -0
  25. data/lib/opennebula/pool_element.rb +269 -0
  26. data/lib/opennebula/server_cipher_auth.rb +148 -0
  27. data/lib/opennebula/server_x509_auth.rb +104 -0
  28. data/lib/opennebula/ssh_auth.rb +139 -0
  29. data/lib/opennebula/system.rb +141 -0
  30. data/lib/opennebula/template.rb +213 -0
  31. data/lib/opennebula/template_pool.rb +79 -0
  32. data/lib/opennebula/user.rb +174 -0
  33. data/lib/opennebula/user_pool.rb +55 -0
  34. data/lib/opennebula/virtual_machine.rb +560 -0
  35. data/lib/opennebula/virtual_machine_pool.rb +323 -0
  36. data/lib/opennebula/virtual_network.rb +249 -0
  37. data/lib/opennebula/virtual_network_pool.rb +79 -0
  38. data/lib/opennebula/x509_auth.rb +288 -0
  39. data/lib/opennebula/xml_element.rb +427 -0
  40. data/lib/opennebula/xml_pool.rb +45 -0
  41. data/lib/opennebula/xml_utils.rb +34 -0
  42. metadata +118 -0
@@ -0,0 +1,79 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
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
+ require 'opennebula/pool'
19
+
20
+ module OpenNebula
21
+ class ImagePool < Pool
22
+ #######################################################################
23
+ # Constants and Class attribute accessors
24
+ #######################################################################
25
+
26
+
27
+ IMAGE_POOL_METHODS = {
28
+ :info => "imagepool.info"
29
+ }
30
+
31
+ #######################################################################
32
+ # Class constructor & Pool Methods
33
+ #######################################################################
34
+
35
+ # +client+ a Client object that represents a XML-RPC connection
36
+ # +user_id+ is to refer to a Pool with Images from that user
37
+ def initialize(client, user_id=-1)
38
+ super('IMAGE_POOL','IMAGE',client)
39
+
40
+ @user_id = user_id
41
+ end
42
+
43
+ # Default Factory Method for the Pools
44
+ def factory(element_xml)
45
+ OpenNebula::Image.new(element_xml,@client)
46
+ end
47
+
48
+ #######################################################################
49
+ # XML-RPC Methods for the Image Object
50
+ #######################################################################
51
+
52
+ # Retrieves all or part of the VirtualMachines in the pool.
53
+ def info(*args)
54
+ case args.size
55
+ when 0
56
+ info_filter(IMAGE_POOL_METHODS[:info],@user_id,-1,-1)
57
+ when 3
58
+ info_filter(IMAGE_POOL_METHODS[:info],args[0],args[1],args[2])
59
+ end
60
+ end
61
+
62
+ def info_all()
63
+ return super(IMAGE_POOL_METHODS[:info])
64
+ end
65
+
66
+ def info_mine()
67
+ return super(IMAGE_POOL_METHODS[:info])
68
+ end
69
+
70
+ def info_group()
71
+ return super(IMAGE_POOL_METHODS[:info])
72
+ end
73
+
74
+ alias_method :info!, :info
75
+ alias_method :info_all!, :info_all
76
+ alias_method :info_mine!, :info_mine
77
+ alias_method :info_group!, :info_group
78
+ end
79
+ end
@@ -0,0 +1,99 @@
1
+ # ---------------------------------------------------------------------------- #
2
+ # Copyright 2010-2013, C12G Labs S.L #
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
+ require 'rubygems'
18
+ require 'net/ldap'
19
+
20
+ module OpenNebula; end
21
+
22
+ class OpenNebula::LdapAuth
23
+ def initialize(options)
24
+ @options={
25
+ :host => 'localhost',
26
+ :port => 389,
27
+ :user => nil,
28
+ :password => nil,
29
+ :base => nil,
30
+ :auth_method => :simple,
31
+ :user_field => 'cn'
32
+ }.merge(options)
33
+
34
+ ops={}
35
+
36
+ if @options[:user]
37
+ ops[:auth] = {
38
+ :method => @options[:auth_method],
39
+ :username => @options[:user],
40
+ :password => @options[:password]
41
+ }
42
+ end
43
+
44
+ ops[:host]=@options[:host] if @options[:host]
45
+ ops[:port]=@options[:port].to_i if @options[:port]
46
+ ops[:encryption]=@options[:encryption] if @options[:encryption]
47
+
48
+ @ldap=Net::LDAP.new(ops)
49
+ end
50
+
51
+ def find_user(name)
52
+ begin
53
+ result=@ldap.search(
54
+ :base => @options[:base],
55
+ :filter => "#{@options[:user_field]}=#{name}")
56
+
57
+ if result && result.first
58
+ result.first.dn
59
+ else
60
+ result=@ldap.search(:base => name)
61
+
62
+ if result && result.first
63
+ name
64
+ else
65
+ nil
66
+ end
67
+ end
68
+ rescue
69
+ nil
70
+ end
71
+ end
72
+
73
+ def is_in_group?(user, group)
74
+ result=@ldap.search(:base => group, :filter => "(member=#{user})")
75
+
76
+ if result && result.first
77
+ true
78
+ else
79
+ false
80
+ end
81
+ end
82
+
83
+ def authenticate(user, password)
84
+ ldap=@ldap.clone
85
+
86
+ auth={
87
+ :method => @options[:auth_method],
88
+ :username => user,
89
+ :password => password
90
+ }
91
+
92
+ if ldap.bind(auth)
93
+ true
94
+ else
95
+ false
96
+ end
97
+ end
98
+ end
99
+
@@ -0,0 +1,70 @@
1
+ # ---------------------------------------------------------------------------- #
2
+ # Copyright 2010-2013, C12G Labs S.L #
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
+
19
+ require 'ldap_auth'
20
+
21
+ options={
22
+ :host => 'ubuntu-test',
23
+ :base => 'dc=localdomain'
24
+ }
25
+
26
+ describe LdapAuth do
27
+ before(:all) do
28
+ @ldap=LdapAuth.new(options)
29
+ end
30
+
31
+ it 'should find user dn' do
32
+ name=@ldap.find_user('user01')
33
+ name.should=='cn=user01,dc=localdomain'
34
+
35
+ name=@ldap.find_user('user02')
36
+ name.should=='cn=user02,dc=localdomain'
37
+
38
+ name=@ldap.find_user('user03')
39
+ name.should==nil
40
+
41
+ name=@ldap.find_user('cn=user01,dc=localdomain')
42
+ name.should=='cn=user01,dc=localdomain'
43
+ end
44
+
45
+ it 'should tell if a user is in a group' do
46
+ group='cn=cloud,ou=groups,dc=localdomain'
47
+
48
+ result=@ldap.is_in_group?('cn=user01,dc=localdomain', group)
49
+ result.should==true
50
+
51
+ result=@ldap.is_in_group?('cn=user02,dc=localdomain', group)
52
+ result.should==false
53
+ end
54
+
55
+ it 'should authenticate user' do
56
+ result=@ldap.authenticate('cn=user01,dc=localdomain', 'password01')
57
+ result.should==true
58
+
59
+ result=@ldap.authenticate('cn=user02,dc=localdomain', 'password02')
60
+ result.should==true
61
+
62
+ result=@ldap.authenticate('cn=user01,dc=localdomain', 'password02')
63
+ result.should==false
64
+
65
+ result=@ldap.authenticate('user01,dc=localdomain', 'password01')
66
+ result.should==false
67
+ end
68
+
69
+ end
70
+
@@ -0,0 +1,160 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
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
+ require 'opennebula/xml_utils'
18
+
19
+ module OpenNebula
20
+
21
+ # The Pool class represents a generic OpenNebula Pool in XML format
22
+ # and provides the basic functionality to handle the Pool elements
23
+ class Pool < XMLPool
24
+ include Enumerable
25
+ alias_method :each_with_xpath, :each
26
+
27
+ protected
28
+ #pool:: _String_ XML name of the root element
29
+ #element:: _String_ XML name of the Pool elements
30
+ #client:: _Client_ represents a XML-RPC connection
31
+ def initialize(pool,element,client)
32
+ super(nil)
33
+
34
+ @pool_name = pool.upcase
35
+ @element_name = element.upcase
36
+
37
+ @client = client
38
+ end
39
+
40
+ # Default Factory Method for the Pools. The factory method returns an
41
+ # suitable PoolElement object. Each Pool MUST implement the
42
+ # corresponding factory method
43
+ # element_xml:: _XML_ XML element describing the pool element
44
+ # [return] a PoolElement object
45
+ def factory(element_xml)
46
+ OpenNebula::PoolElement.new(element_xml,client)
47
+ end
48
+
49
+ #######################################################################
50
+ # Common XML-RPC Methods for all the Pool Types
51
+ #######################################################################
52
+
53
+ #Gets the pool without any filter. Host, Group and User Pools
54
+ # xml_method:: _String_ the name of the XML-RPC method
55
+ def info(xml_method)
56
+ return xmlrpc_info(xml_method)
57
+ end
58
+
59
+ alias_method :info!, :info
60
+
61
+ def info_all(xml_method, *args)
62
+ return xmlrpc_info(xml_method,INFO_ALL,-1,-1, *args)
63
+ end
64
+
65
+ def info_mine(xml_method, *args)
66
+ return xmlrpc_info(xml_method,INFO_MINE,-1,-1, *args)
67
+ end
68
+
69
+ def info_group(xml_method, *args)
70
+ return xmlrpc_info(xml_method,INFO_GROUP,-1,-1, *args)
71
+ end
72
+
73
+ def info_filter(xml_method, who, start_id, end_id, *args)
74
+ return xmlrpc_info(xml_method,who, start_id, end_id, *args)
75
+ end
76
+
77
+ # Retrieves the monitoring data for all the Objects in the pool
78
+ #
79
+ # @param [String] xml_method xml-rcp method
80
+ # @param [String] root_elem Root for each individual PoolElement
81
+ # @param [String] timestamp_elem Name of the XML element with the last
82
+ # monitorization timestamp
83
+ # @param [Array<String>] xpath_expressions Elements to retrieve.
84
+ # @param args arguemnts for the xml_method call
85
+ #
86
+ # @return [Hash<String, <Hash<String, Array<Array<int>>>>>,
87
+ # OpenNebula::Error] The first level hash uses the Object ID as keys,
88
+ # and as value a Hash with the requested xpath expressions,
89
+ # and an Array of 'timestamp, value'.
90
+ def monitoring(xml_method, root_elem, timestamp_elem, xpath_expressions,
91
+ *args)
92
+
93
+ rc = @client.call(xml_method, *args)
94
+
95
+ if ( OpenNebula.is_error?(rc) )
96
+ return rc
97
+ end
98
+
99
+ xmldoc = XMLElement.new
100
+ xmldoc.initialize_xml(rc, 'MONITORING_DATA')
101
+
102
+ hash = {}
103
+
104
+ # Get all existing Object IDs
105
+ ids = xmldoc.retrieve_elements("#{root_elem}/ID")
106
+
107
+ if ids.nil?
108
+ return hash
109
+ else
110
+ ids.uniq!
111
+ end
112
+
113
+ ids.each { |id|
114
+ hash[id] = OpenNebula.process_monitoring(
115
+ xmldoc, root_elem, timestamp_elem, id, xpath_expressions)
116
+
117
+ }
118
+
119
+ return hash
120
+ end
121
+
122
+ private
123
+ # Calls to the corresponding info method to retreive the pool
124
+ # representation in XML format
125
+ # xml_method:: _String_ the name of the XML-RPC method
126
+ # args:: _Array_ with additional arguments for the info call
127
+ # [return] nil in case of success or an Error object
128
+ def xmlrpc_info(xml_method,*args)
129
+ rc = @client.call(xml_method,*args)
130
+
131
+ if !OpenNebula.is_error?(rc)
132
+ initialize_xml(rc,@pool_name)
133
+ rc = nil
134
+ end
135
+
136
+ return rc
137
+ end
138
+
139
+ public
140
+ # Constants for info queries (include/RequestManagerPoolInfoFilter.h)
141
+ INFO_GROUP = -1
142
+ INFO_ALL = -2
143
+ INFO_MINE = -3
144
+
145
+ # Iterates over every PoolElement in the Pool and calls the block with a
146
+ # a PoolElement obtained calling the factory method
147
+ # block:: _Block_
148
+ def each(&block)
149
+ each_element(block) if @xml
150
+ end
151
+
152
+ # DO NOT USE - ONLY REXML BACKEND
153
+ def to_str
154
+ str = ""
155
+ REXML::Formatters::Pretty.new(1).write(@xml,str)
156
+
157
+ return str
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,269 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
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
+ require 'opennebula/pool'
18
+
19
+ module OpenNebula
20
+ # The PoolElement Class represents a generic element of a Pool in
21
+ # XML format
22
+ class PoolElement < XMLElement
23
+
24
+ protected
25
+ # node:: _XML_is a XML element that represents the Pool element
26
+ # client:: _Client_ represents a XML-RPC connection
27
+ def initialize(node, client)
28
+ @xml = node
29
+ @client = client
30
+
31
+ if self['ID']
32
+ @pe_id = self['ID'].to_i
33
+ else
34
+ @pe_id = nil
35
+ end
36
+ @name = self['NAME'] if self['NAME']
37
+ end
38
+
39
+ #######################################################################
40
+ # Common XML-RPC Methods for all the Pool Element Types
41
+ #######################################################################
42
+
43
+ # Common client call wrapper. Checks that @pe_id is defined, and
44
+ # returns nil instead of the response if it is successful
45
+ #
46
+ # @param [String] xml_method xml-rpc method
47
+ # @param [Array] args any arguments for the xml-rpc method
48
+ #
49
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
50
+ # otherwise
51
+ def call(xml_method, *args)
52
+ return Error.new('ID not defined') if !@pe_id
53
+
54
+ rc = @client.call(xml_method, *args)
55
+ rc = nil if !OpenNebula.is_error?(rc)
56
+
57
+ return rc
58
+ end
59
+
60
+ # Calls to the corresponding info method to retreive the element
61
+ # detailed information in XML format
62
+ #
63
+ # @param [String] xml_method the name of the XML-RPC method
64
+ # @param [String] root_element Base XML element name
65
+ # @param [Array] args additional arguments
66
+ #
67
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
68
+ # otherwise
69
+ def info(xml_method, root_element)
70
+ return Error.new('ID not defined') if !@pe_id
71
+
72
+ rc = @client.call(xml_method, @pe_id)
73
+
74
+ if !OpenNebula.is_error?(rc)
75
+ initialize_xml(rc, root_element)
76
+ rc = nil
77
+
78
+ @pe_id = self['ID'].to_i if self['ID']
79
+ @name = self['NAME'] if self['NAME']
80
+ end
81
+
82
+ return rc
83
+ end
84
+
85
+ # Calls to the corresponding allocate method to create a new element
86
+ # in the OpenNebula core
87
+ #
88
+ # @param [String] xml_method the name of the XML-RPC method
89
+ # @param [Array] args any extra arguments for the xml-rpc method
90
+ #
91
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
92
+ # otherwise
93
+ def allocate(xml_method, *args)
94
+ rc = @client.call(xml_method, *args)
95
+
96
+ if !OpenNebula.is_error?(rc)
97
+ @pe_id = rc
98
+ rc = nil
99
+ end
100
+
101
+ return rc
102
+ end
103
+
104
+ # Calls to the corresponding update method to modify
105
+ # the object's template
106
+ #
107
+ # @param [String] xml_method the name of the XML-RPC method
108
+ # @param [String] new_template the new template contents
109
+ # @param [Array] args any extra arguments for the xml-rpc method
110
+ #
111
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
112
+ # otherwise
113
+ def update(xml_method, new_template, *args)
114
+ new_template ||= template_xml
115
+
116
+ return call(xml_method, @pe_id, new_template, *args)
117
+ end
118
+
119
+ # Calls to the corresponding delete method to remove this element
120
+ # from the OpenNebula core
121
+ #
122
+ # @param [String] xml_method the name of the XML-RPC method
123
+ #
124
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
125
+ # otherwise
126
+ def delete(xml_method)
127
+ return call(xml_method,@pe_id)
128
+ end
129
+
130
+ # Calls to the corresponding chown method to modify
131
+ # the object's owner and group
132
+ #
133
+ # @param [String] xml_method the name of the XML-RPC method
134
+ # @param [Integer] uid the new owner id. Set to -1 to leave the current one
135
+ # @param [Integer] gid the new goup id. Set to -1 to leave the current one
136
+ #
137
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
138
+ # otherwise
139
+ def chown(xml_method, uid, gid)
140
+ return call(xml_method, @pe_id, uid, gid)
141
+ end
142
+
143
+ # Calls to the corresponding chmod method to modify
144
+ # the object's permission bits
145
+ #
146
+ # @param xml_method [String] the name of the XML-RPC method
147
+ # @param octet [String] Permissions octed , e.g. 640
148
+ #
149
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
150
+ # otherwise
151
+ def chmod_octet(xml_method, octet)
152
+ owner_u = octet[0..0].to_i & 4 != 0 ? 1 : 0
153
+ owner_m = octet[0..0].to_i & 2 != 0 ? 1 : 0
154
+ owner_a = octet[0..0].to_i & 1 != 0 ? 1 : 0
155
+ group_u = octet[1..1].to_i & 4 != 0 ? 1 : 0
156
+ group_m = octet[1..1].to_i & 2 != 0 ? 1 : 0
157
+ group_a = octet[1..1].to_i & 1 != 0 ? 1 : 0
158
+ other_u = octet[2..2].to_i & 4 != 0 ? 1 : 0
159
+ other_m = octet[2..2].to_i & 2 != 0 ? 1 : 0
160
+ other_a = octet[2..2].to_i & 1 != 0 ? 1 : 0
161
+
162
+ chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u,
163
+ other_m, other_a)
164
+ end
165
+
166
+ # Calls to the corresponding chmod method to modify
167
+ # the object's permission bits
168
+ # Each [Integer] parameter must be 1 to allow, 0 deny, -1 do not change
169
+ #
170
+ # @param xml_method [String] the name of the XML-RPC method
171
+ #
172
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
173
+ # otherwise
174
+ def chmod(xml_method, owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u,
175
+ other_m, other_a)
176
+ return call(xml_method, @pe_id, owner_u, owner_m,
177
+ owner_a, group_u, group_m, group_a, other_u,
178
+ other_m, other_a)
179
+ end
180
+
181
+
182
+ # Retrieves this Element's monitoring data from OpenNebula
183
+ #
184
+ # @param [String] xml_method the name of the XML-RPC method
185
+ # @param [String] root_elem Root for each individual PoolElement
186
+ # @param [String] timestamp_elem Name of the XML element with the last
187
+ # monitorization timestamp
188
+ # @param xpath_expressions [Array<String>] Xpath expressions for the
189
+ # elements to retrieve.
190
+ #
191
+ # @return [Hash<String, Array<Array<int>>, OpenNebula::Error] Hash with
192
+ # the requested xpath expressions, and an Array of [timestamp, value].
193
+ def monitoring(xml_method, root_elem, timestamp_elem, xpath_expressions)
194
+ return Error.new('ID not defined') if !@pe_id
195
+
196
+ rc = @client.call(xml_method, @pe_id)
197
+
198
+ if ( OpenNebula.is_error?(rc) )
199
+ return rc
200
+ end
201
+
202
+ xmldoc = XMLElement.new
203
+ xmldoc.initialize_xml(rc, 'MONITORING_DATA')
204
+
205
+
206
+ return OpenNebula.process_monitoring(
207
+ xmldoc, root_elem, timestamp_elem, @pe_id, xpath_expressions)
208
+ end
209
+
210
+ public
211
+
212
+ # Creates new element specifying its id
213
+ # id:: identifyier of the element
214
+ # client:: initialized OpenNebula::Client object
215
+ def self.new_with_id(id, client=nil)
216
+ self.new(self.build_xml(id), client)
217
+ end
218
+
219
+ # Returns element identifier
220
+ # [return] _Integer_ the PoolElement ID
221
+ def id
222
+ @pe_id
223
+ end
224
+
225
+ # Gets element name
226
+ # [return] _String_ the PoolElement name
227
+ def name
228
+ @name
229
+ end
230
+
231
+ # DO NOT USE - ONLY REXML BACKEND
232
+ def to_str
233
+ str = ""
234
+ REXML::Formatters::Pretty.new(1).write(@xml,str)
235
+
236
+ return str
237
+ end
238
+ end
239
+
240
+ # Processes the monitoring data in XML returned by OpenNebula
241
+ #
242
+ # @param [XMLElement] xmldoc monitoring data returned by OpenNebula
243
+ # @param [String] root_elem Root for each individual PoolElement
244
+ # @param [String] timestamp_elem Name of the XML element with the last
245
+ # monitorization timestamp
246
+ # @param [Integer] Id of the object to process
247
+ # @param [Array<String>] xpath_expressions Elements to retrieve.
248
+ # @param args arguemnts for the xml_method call
249
+ #
250
+ # @return [Hash<String, Array<Array<int>>, OpenNebula::Error] Hash with
251
+ # the requested xpath expressions, and an Array of [timestamp, value].
252
+ def self.process_monitoring(xmldoc, root_elem, timestamp_elem, oid, xpath_expressions)
253
+ hash = {}
254
+ timestamps = xmldoc.retrieve_elements(
255
+ "#{root_elem}[ID=#{oid}]/#{timestamp_elem}")
256
+
257
+ xpath_expressions.each { |xpath|
258
+ xpath_values = xmldoc.retrieve_elements("#{root_elem}[ID=#{oid}]/#{xpath}")
259
+
260
+ if ( xpath_values.nil? )
261
+ hash[xpath] = []
262
+ else
263
+ hash[xpath] = timestamps.zip(xpath_values)
264
+ end
265
+ }
266
+
267
+ return hash
268
+ end
269
+ end