opennebula 3.9.80.beta

Sign up to get free protection for your applications and to get access to all the features.
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,131 @@
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 'json'
18
+
19
+ module OpenNebula
20
+ class DocumentJSON < Document
21
+
22
+ TEMPLATE_TAG = "BODY"
23
+
24
+ # Allocate a new Document containing the json inside the TEMPLATE
25
+ #
26
+ # @param [String] template_json json to be inserted in the TEMPLATE
27
+ # of the new resource
28
+ # @param [String, nil] name name of the object, this value will be
29
+ # processed by the OpenNebula core
30
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
31
+ # otherwise
32
+ #
33
+ def allocate(template_json, name=nil)
34
+ text = build_template_xml(template_json, name)
35
+
36
+ super(text)
37
+ end
38
+
39
+ # Retrieves the information of the Service and all its Nodes.
40
+ #
41
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
42
+ # otherwise
43
+ #
44
+ def info
45
+ rc = super
46
+ if OpenNebula.is_error?(rc)
47
+ return rc
48
+ end
49
+
50
+ load_body
51
+ end
52
+
53
+ alias_method :info!, :info
54
+
55
+ # Updates the current state of this Service in the OpenNebula DB
56
+ #
57
+ # @params [String, nil] template_json string to be inserted in the
58
+ # template. If nil @body will be used instead
59
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
60
+ # otherwise
61
+ #
62
+ def update(template_json=nil)
63
+ template_json ||= @body.to_json
64
+
65
+ text = build_template_xml(template_json)
66
+
67
+ super(text)
68
+ end
69
+
70
+ # Generates a json representing the object
71
+ #
72
+ # @param [true, false] pretty_generate
73
+ # @return [String] json representing the object
74
+ #
75
+ def to_json(pretty_generate=true)
76
+ hash = self.to_hash
77
+
78
+ body = hash['DOCUMENT']['TEMPLATE']["#{TEMPLATE_TAG}"]
79
+ if body
80
+ body_hash = JSON.parse(body)
81
+ hash['DOCUMENT']['TEMPLATE']["#{TEMPLATE_TAG}"] = body_hash
82
+ end
83
+
84
+ if pretty_generate
85
+ JSON.pretty_generate hash
86
+ else
87
+ hash.to_json
88
+ end
89
+ end
90
+
91
+
92
+ # Fill the @body hash with the values of the template
93
+ def load_body
94
+ body_str = self["TEMPLATE/#{TEMPLATE_TAG}"]
95
+
96
+ if body_str
97
+ begin
98
+ @body = JSON.parse(body_str)
99
+ rescue JSON::JSONError
100
+ return OpenNebula::Error.new($!)
101
+ end
102
+ end
103
+
104
+ return nil
105
+ end
106
+
107
+ private
108
+
109
+ # Build an xml string incluiding the provided json
110
+ #
111
+ # @param [String] template_json The template to be inserted
112
+ # @param [String, nil] name The string to be inserted as name
113
+ # @return [String] The xml containing the json
114
+ #
115
+ def build_template_xml(template_json, name=nil)
116
+ template_json ||= ""
117
+
118
+ text = "<TEMPLATE>"
119
+
120
+ text << "<NAME>#{name}</NAME>" if name
121
+
122
+ text << "<#{TEMPLATE_TAG}>"
123
+ text << "<![CDATA[#{template_json}]]>"
124
+ text << "</#{TEMPLATE_TAG}>"
125
+
126
+ text << "</TEMPLATE>"
127
+
128
+ text
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,102 @@
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
+
21
+ # All subclasses must define the DOCUMENT_TYPE constant
22
+ # and the factory method.
23
+ #
24
+ # @example
25
+ # require 'opennebuña/document_pool'
26
+ #
27
+ # module OpenNebula
28
+ # class CustomObjectPool < DocumentPool
29
+ #
30
+ # DOCUMENT_TYPE = 400
31
+ #
32
+ # def factory(element_xml)
33
+ # OpenNebula::CustomObject.new(element_xml, @client)
34
+ # end
35
+ # end
36
+ # end
37
+ class DocumentPool < Pool
38
+
39
+ #######################################################################
40
+ # Constants and Class attribute accessors
41
+ #######################################################################
42
+
43
+ DOCUMENT_POOL_METHODS = {
44
+ :info => "documentpool.info"
45
+ }
46
+
47
+ #######################################################################
48
+ # Class constructor & Pool Methods
49
+ #######################################################################
50
+
51
+ # Class constructor
52
+ #
53
+ # @param [OpenNebula::Client] client the xml-rpc client
54
+ # @param [Integer] user_id the filter flag, see
55
+ # http://opennebula.org/documentation:rel3.6:api
56
+ #
57
+ # @return [DocumentPool] the new object
58
+ def initialize(client, user_id=-1)
59
+ super('DOCUMENT_POOL','DOCUMENT',client)
60
+
61
+ @user_id = user_id
62
+ end
63
+
64
+ #######################################################################
65
+ # XML-RPC Methods for the Document Object
66
+ #######################################################################
67
+
68
+ # Retrieves all or part of the Documents in the pool.
69
+ #
70
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
71
+ # otherwise
72
+ def info(*args)
73
+ case args.size
74
+ when 0
75
+ info_filter(DOCUMENT_POOL_METHODS[:info],@user_id,-1,-1, document_type)
76
+ when 3
77
+ info_filter(DOCUMENT_POOL_METHODS[:info],args[0],args[1],args[2], document_type)
78
+ end
79
+ end
80
+
81
+ def info_all()
82
+ return super(DOCUMENT_POOL_METHODS[:info], document_type)
83
+ end
84
+
85
+ def info_mine()
86
+ return super(DOCUMENT_POOL_METHODS[:info], document_type)
87
+ end
88
+
89
+ def info_group()
90
+ return super(DOCUMENT_POOL_METHODS[:info], document_type)
91
+ end
92
+
93
+ alias_method :info!, :info
94
+ alias_method :info_all!, :info_all
95
+ alias_method :info_mine!, :info_mine
96
+ alias_method :info_group!, :info_group
97
+
98
+ def document_type
99
+ self.class::DOCUMENT_TYPE
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,58 @@
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
+ module OpenNebula
18
+ class DocumentPoolJSON < DocumentPool
19
+
20
+ TEMPLATE_TAG = "BODY"
21
+
22
+ def factory(element_xml)
23
+ doc = OpenNebula::DocumentJSON.new(element_xml, @client)
24
+ doc.load_body
25
+ doc
26
+ end
27
+
28
+ # Generates a json representing the object
29
+ #
30
+ # @param [true, false] pretty_generate
31
+ # @return [String] json representing the object
32
+ #
33
+ def to_json(pretty_generate=true)
34
+ hash = self.to_hash
35
+
36
+ if hash['DOCUMENT_POOL'] && hash['DOCUMENT_POOL']['DOCUMENT']
37
+ if !hash['DOCUMENT_POOL']['DOCUMENT'].instance_of?(Array)
38
+ array = [hash['DOCUMENT_POOL']['DOCUMENT']]
39
+ hash['DOCUMENT_POOL']['DOCUMENT'] = array.compact
40
+ end
41
+
42
+ hash['DOCUMENT_POOL']['DOCUMENT'].each { |doc|
43
+ body = doc['TEMPLATE']["#{TEMPLATE_TAG}"]
44
+ if body
45
+ b_hash = JSON.parse(body)
46
+ doc['TEMPLATE']["#{TEMPLATE_TAG}"] = b_hash
47
+ end
48
+ }
49
+ end
50
+
51
+ if pretty_generate
52
+ JSON.pretty_generate hash
53
+ else
54
+ hash.to_json
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,52 @@
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
+ module OpenNebula
19
+ # The Error Class represents a generic error in the OpenNebula
20
+ # library. It contains a readable representation of the error.
21
+ # Any function in the OpenNebula module will return an Error
22
+ # object in case of error.
23
+ class Error
24
+ ESUCCESS = 0x0000
25
+ EAUTHENTICATION = 0x0100
26
+ EAUTHORIZATION = 0x0200
27
+ ENO_EXISTS = 0x0400
28
+ EACTION = 0x0800
29
+ EXML_RPC_API = 0x1000
30
+ EINTERNAL = 0x2000
31
+ ENOTDEFINED = 0x1111
32
+
33
+ attr_reader :message, :errno
34
+
35
+ # +message+ Description of the error
36
+ # +errno+ OpenNebula code error
37
+ def initialize(message=nil, errno=0x1111)
38
+ @message = message
39
+ @errno = errno
40
+ end
41
+
42
+ def to_str()
43
+ @message
44
+ end
45
+ end
46
+
47
+ # Returns true if the object returned by a method of the OpenNebula
48
+ # library is an Error
49
+ def self.is_error?(value)
50
+ value.class==OpenNebula::Error
51
+ end
52
+ end
@@ -0,0 +1,163 @@
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_element'
19
+
20
+ module OpenNebula
21
+ class Group < PoolElement
22
+ #######################################################################
23
+ # Constants and Class Methods
24
+ #######################################################################
25
+
26
+ GROUP_METHODS = {
27
+ :info => "group.info",
28
+ :allocate => "group.allocate",
29
+ :delete => "group.delete",
30
+ :quota => "group.quota"
31
+ }
32
+
33
+ # Flag for requesting connected user's group info
34
+ SELF = -1
35
+
36
+ #Default location for group ACL's
37
+ if ENV['ONE_LOCATION']
38
+ GROUP_DEFAULT = ENV['ONE_LOCATION'] + "/etc/group.default"
39
+ else
40
+ GROUP_DEFAULT = "/etc/one/group.default"
41
+ end
42
+
43
+ # Creates a Group description with just its identifier
44
+ # this method should be used to create plain Group objects.
45
+ # +id+ the id of the user
46
+ #
47
+ # Example:
48
+ # group = Group.new(Group.build_xml(3),rpc_client)
49
+ #
50
+ def Group.build_xml(pe_id=nil)
51
+ if pe_id
52
+ group_xml = "<GROUP><ID>#{pe_id}</ID></GROUP>"
53
+ else
54
+ group_xml = "<GROUP></GROUP>"
55
+ end
56
+
57
+ XMLElement.build_xml(group_xml,'GROUP')
58
+ end
59
+
60
+ # Class constructor
61
+ def initialize(xml, client)
62
+ super(xml,client)
63
+ end
64
+
65
+ #######################################################################
66
+ # Group utils
67
+ #######################################################################
68
+
69
+ # Creates ACLs for the group. The ACL rules are described in a file
70
+ def create_acls(filename = GROUP_DEFAULT)
71
+ if !File.readable?(filename)
72
+ return -1, "Cannot read deafult ACL file for group"
73
+ end
74
+
75
+ msg = String.new
76
+
77
+ File.open(filename).each_line{ |l|
78
+ next if l.match(/^#/)
79
+
80
+ rule = "@#{@pe_id} #{l}"
81
+ parse = OpenNebula::Acl.parse_rule(rule)
82
+
83
+ if OpenNebula.is_error?(parse)
84
+ return -1, "Error parsing rule #{rule}: #{parse.message}"
85
+ end
86
+
87
+ xml = OpenNebula::Acl.build_xml
88
+ acl = OpenNebula::Acl.new(xml, @client)
89
+
90
+ rc = acl.allocate(*parse)
91
+
92
+ if OpenNebula.is_error?(rc)
93
+ return -1, "Error creating rule #{rule}: #{rc.message}"
94
+ else
95
+ msg << "ACL_ID: #{acl.id}\n"
96
+ end
97
+ }
98
+
99
+ return 0, msg
100
+ end
101
+
102
+ #######################################################################
103
+ # XML-RPC Methods for the Group Object
104
+ #######################################################################
105
+
106
+ # Retrieves the information of the given Group.
107
+ def info()
108
+ super(GROUP_METHODS[:info], 'GROUP')
109
+ end
110
+
111
+ alias_method :info!, :info
112
+
113
+ # Allocates a new Group in OpenNebula
114
+ #
115
+ # +groupname+ A string containing the name of the Group.
116
+ def allocate(groupname)
117
+ super(GROUP_METHODS[:allocate], groupname)
118
+ end
119
+
120
+ # Deletes the Group
121
+ def delete()
122
+ super(GROUP_METHODS[:delete])
123
+ end
124
+
125
+ # Sets the group quota limits
126
+ # @param quota [String] a template (XML or txt) with the new quota limits
127
+ #
128
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
129
+ # otherwise
130
+ def set_quota(quota)
131
+ return Error.new('ID not defined') if !@pe_id
132
+
133
+ rc = @client.call(GROUP_METHODS[:quota],@pe_id, quota)
134
+ rc = nil if !OpenNebula.is_error?(rc)
135
+
136
+ return rc
137
+ end
138
+
139
+ # ---------------------------------------------------------------------
140
+ # Helpers to get information
141
+ # ---------------------------------------------------------------------
142
+
143
+ # Returns whether or not the user with id 'uid' is part of this group
144
+ def contains(uid)
145
+ #This doesn't work in ruby 1.8.5
146
+ #return self["USERS/ID[.=#{uid}]"] != nil
147
+
148
+ id_array = retrieve_elements('USERS/ID')
149
+ return id_array != nil && id_array.include?(uid.to_s)
150
+ end
151
+
152
+ # Returns an array with the numeric user ids
153
+ def user_ids
154
+ array = Array.new
155
+
156
+ self.each("USERS/ID") do |id|
157
+ array << id.text.to_i
158
+ end
159
+
160
+ return array
161
+ end
162
+ end
163
+ end