diff --git a/install.sh b/install.sh index 267c08ad26..0b84043481 100755 --- a/install.sh +++ b/install.sh @@ -994,6 +994,8 @@ RUBY_OPENNEBULA_LIB_FILES="src/oca/ruby/OpenNebula/Host.rb \ src/oca/ruby/OpenNebula/ImagePool.rb \ src/oca/ruby/OpenNebula/Template.rb \ src/oca/ruby/OpenNebula/TemplatePool.rb \ + src/oca/ruby/OpenNebula/Document.rb \ + src/oca/ruby/OpenNebula/DocumentPool.rb \ src/oca/ruby/OpenNebula/Group.rb \ src/oca/ruby/OpenNebula/GroupPool.rb \ src/oca/ruby/OpenNebula/Acl.rb \ diff --git a/src/oca/ruby/OpenNebula/Document.rb b/src/oca/ruby/OpenNebula/Document.rb new file mode 100644 index 0000000000..54ef911d0f --- /dev/null +++ b/src/oca/ruby/OpenNebula/Document.rb @@ -0,0 +1,214 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +require 'OpenNebula/Pool' + +module OpenNebula + + # All subclasses must define the Document::TYPE constant. + # + # @example + # require 'OpenNebula/Document' + # + # module OpenNebula + # class CustomObject < Document + # + # Document::TYPE = 400 + # + # end + # end + class Document < PoolElement + + ####################################################################### + # Constants and Class Methods + ####################################################################### + + DOCUMENT_METHODS = { + :allocate => "document.allocate", + :delete => "document.delete", + :info => "document.info", + :update => "document.update", + :chown => "document.chown", + :chmod => "document.chmod", + :clone => "document.clone", + } + + # Creates a Document Object description with just its identifier + # this method should be used to create plain Document objects. + # @param [Integer] pe_id the id of the object + # + # @return [Nokogiri::XML::Node, REXML::Element] the empty xml + def Document.build_xml(pe_id=nil) + if pe_id + obj_xml = "#{pe_id}" + else + obj_xml = "" + end + + XMLElement.build_xml(obj_xml,'DOCUMENT') + end + + # Class constructor + # + # @param [Nokogiri::XML::Node, REXML::Element] xml string + # created by the build_xml() method + # @param [OpenNebula::Client] client the xml-rpc client + # + # @return [Document] the new object + # + # @example + # doc = Document.new(Document.build_xml(3),rpc_client) + def initialize(xml, client) + super(xml,client) + end + + ####################################################################### + # XML-RPC Methods for the Document Object + ####################################################################### + + # Retrieves the information of the given Document. + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def info() + super(DOCUMENT_METHODS[:info], 'DOCUMENT', TYPE) + end + + # Allocates a new Document in OpenNebula + # + # @param description [String] The contents of the Document. + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def allocate(description) + super(DOCUMENT_METHODS[:allocate], description, TYPE) + end + + # Deletes the Document + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def delete() + return call(DOCUMENT_METHODS[:delete], @pe_id, TYPE) + end + + # Replaces the template contents + # + # @param [String] new_template new template contents + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def update(new_template) + super(DOCUMENT_METHODS[:update], new_template, TYPE) + end + + # Publishes the Document, to be used by other users + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def publish + set_publish(true) + end + + # Unplubishes the Document + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def unpublish + set_publish(false) + end + + # Changes the owner/group + # + # @param [Integer] uid the new owner id. Set to -1 to leave the current one + # @param [Integer] gid the new group id. Set to -1 to leave the current one + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def chown(uid, gid) + super(DOCUMENT_METHODS[:chown], uid, gid, TYPE) + end + + # Changes the Document permissions. + # + # @param octet [String] Permissions octed , e.g. 640 + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def chmod_octet(octet) + super(DOCUMENT_METHODS[:chmod], octet, TYPE) + end + + # Changes the Document permissions. + # Each [Integer] argument must be 1 to allow, 0 deny, -1 do not change + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u, + other_m, other_a) + super(DOCUMENT_METHODS[:chmod], owner_u, owner_m, owner_a, group_u, + group_m, group_a, other_u, other_m, other_a, TYPE) + end + + # Clones this Document into a new one + # + # @param name [String] Name for the new Document. + # + # @return [Integer, OpenNebula::Error] The new Document ID in case + # of success, Error otherwise + def clone(name) + return Error.new('ID not defined') if !@pe_id + + rc = @client.call(DOCUMENT_METHODS[:clone], @pe_id, name, TYPE) + + return rc + end + + ####################################################################### + # Helpers to get Document information + ####################################################################### + + # Returns the group identifier + # @return [Integer] the element's group ID + def gid + self['GID'].to_i + end + + # Returns the owner user ID + # @return [Integer] the element's owner user ID + def owner_id + self['UID'].to_i + end + + # Returns true if the GROUP_U permission bit is set + # @return [true, false] true if the GROUP_U permission bit is set + def public? + if self['PERMISSIONS/GROUP_U'] == "1" || self['PERMISSIONS/OTHER_U'] == "1" + true + else + false + end + end + + private + + def set_publish(published) + group_u = published ? 1 : 0 + + chmod(-1, -1, -1, group_u, -1, -1, -1, -1, -1) + end + end +end diff --git a/src/oca/ruby/OpenNebula/DocumentPool.rb b/src/oca/ruby/OpenNebula/DocumentPool.rb new file mode 100644 index 0000000000..3654947ed6 --- /dev/null +++ b/src/oca/ruby/OpenNebula/DocumentPool.rb @@ -0,0 +1,93 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +require 'OpenNebula/Pool' + +module OpenNebula + + # All subclasses must define the DocumentPool::TYPE constant + # and the factory method. + # + # @example + # require 'OpenNebula/DocumentPool' + # + # module OpenNebula + # class CustomObjectPool < DocumentPool + # + # DocumentPool::TYPE = 400 + # + # def factory(element_xml) + # OpenNebula::CustomObject.new(element_xml, @client) + # end + # end + # end + class DocumentPool < Pool + + ####################################################################### + # Constants and Class attribute accessors + ####################################################################### + + DOCUMENT_POOL_METHODS = { + :info => "documentpool.info" + } + + ####################################################################### + # Class constructor & Pool Methods + ####################################################################### + + # Class constructor + # + # @param [OpenNebula::Client] client the xml-rpc client + # @param [Integer] user_id the filter flag, see + # http://opennebula.org/documentation:rel3.6:api + # + # @return [DocumentPool] the new object + def initialize(client, user_id=-1) + super('DOCUMENT_POOL','DOCUMENT',client) + + @user_id = user_id + end + + ####################################################################### + # XML-RPC Methods for the Document Object + ####################################################################### + + # Retrieves all or part of the Documents in the pool. + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def info(*args) + case args.size + when 0 + info_filter(DOCUMENT_POOL_METHODS[:info],@user_id,-1,-1, TYPE) + when 3 + info_filter(DOCUMENT_POOL_METHODS[:info],args[0],args[1],args[2], TYPE) + end + end + + def info_all() + return super(DOCUMENT_POOL_METHODS[:info], TYPE) + end + + def info_mine() + return super(DOCUMENT_POOL_METHODS[:info], TYPE) + end + + def info_group() + return super(DOCUMENT_POOL_METHODS[:info], TYPE) + end + end +end diff --git a/src/oca/ruby/OpenNebula/Pool.rb b/src/oca/ruby/OpenNebula/Pool.rb index 00cc30fb4e..0eaede4e3f 100644 --- a/src/oca/ruby/OpenNebula/Pool.rb +++ b/src/oca/ruby/OpenNebula/Pool.rb @@ -54,20 +54,20 @@ module OpenNebula return xmlrpc_info(xml_method) end - def info_all(xml_method) - return xmlrpc_info(xml_method,INFO_ALL,-1,-1) + def info_all(xml_method, *args) + return xmlrpc_info(xml_method,INFO_ALL,-1,-1, *args) end - def info_mine(xml_method) - return xmlrpc_info(xml_method,INFO_MINE,-1,-1) + def info_mine(xml_method, *args) + return xmlrpc_info(xml_method,INFO_MINE,-1,-1, *args) end - def info_group(xml_method) - return xmlrpc_info(xml_method,INFO_GROUP,-1,-1) + def info_group(xml_method, *args) + return xmlrpc_info(xml_method,INFO_GROUP,-1,-1, *args) end - def info_filter(xml_method, who, start_id, end_id) - return xmlrpc_info(xml_method,who, start_id, end_id) + def info_filter(xml_method, who, start_id, end_id, *args) + return xmlrpc_info(xml_method,who, start_id, end_id, *args) end # Retrieves the monitoring data for all the Objects in the pool @@ -199,13 +199,14 @@ module OpenNebula # # @param [String] xml_method the name of the XML-RPC method # @param [String] root_element Base XML element name + # @param [Array] args additional arguments # # @return [nil, OpenNebula::Error] nil in case of success, Error # otherwise - def info(xml_method, root_element) + def info(xml_method, root_element, *args) return Error.new('ID not defined') if !@pe_id - rc = @client.call(xml_method, @pe_id) + rc = @client.call(xml_method, @pe_id, *args) if !OpenNebula.is_error?(rc) initialize_xml(rc, root_element) @@ -220,10 +221,12 @@ module OpenNebula # Calls to the corresponding allocate method to create a new element # in the OpenNebula core - # xml_method:: _String_ the name of the XML-RPC method - # args:: _Array_ additional arguments including the template for the - # new element - # [return] nil in case of success or an Error object + # + # @param [String] xml_method the name of the XML-RPC method + # @param [Array] args any extra arguments for the xml-rpc method + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise def allocate(xml_method, *args) rc = @client.call(xml_method, *args) @@ -237,31 +240,42 @@ module OpenNebula # Calls to the corresponding update method to modify # the object's template - # xml_method:: _String_ the name of the XML-RPC method - # new_template:: _String_ the new template contents - # [return] nil in case of success or an Error object - def update(xml_method, new_template) + # + # @param [String] xml_method the name of the XML-RPC method + # @param [String] new_template the new template contents + # @param [Array] args any extra arguments for the xml-rpc method + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def update(xml_method, new_template, *args) new_template ||= template_xml - return call(xml_method, @pe_id, new_template) + return call(xml_method, @pe_id, new_template, *args) end # Calls to the corresponding delete method to remove this element # from the OpenNebula core - # xml_method:: _String_ the name of the XML-RPC method - # [return] nil in case of success or an Error object + # + # @param [String] xml_method the name of the XML-RPC method + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise def delete(xml_method) return call(xml_method,@pe_id) end # Calls to the corresponding chown method to modify # the object's owner and group - # xml_method:: _String_ the name of the XML-RPC method - # uid:: _Integer_ the new owner id. Set to -1 to leave the current one - # gid:: _Integer_ the new group id. Set to -1 to leave the current one - # [return] nil in case of success or an Error object - def chown(xml_method, uid, gid) - return call(xml_method, @pe_id, uid, gid) + # + # @param [String] xml_method the name of the XML-RPC method + # @param [Integer] uid the new owner id. Set to -1 to leave the current one + # @param [Integer] gid the new goup id. Set to -1 to leave the current one + # @param [Array] args any extra arguments for the xml-rpc method + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def chown(xml_method, uid, gid, *args) + return call(xml_method, @pe_id, uid, gid, *args) end # Calls to the corresponding chmod method to modify @@ -269,9 +283,10 @@ module OpenNebula # # @param xml_method [String] the name of the XML-RPC method # @param octet [String] Permissions octed , e.g. 640 + # # @return [nil, OpenNebula::Error] nil in case of success, Error # otherwise - def chmod_octet(xml_method, octet) + def chmod_octet(xml_method, octet, *args) owner_u = octet[0..0].to_i & 4 != 0 ? 1 : 0 owner_m = octet[0..0].to_i & 2 != 0 ? 1 : 0 owner_a = octet[0..0].to_i & 1 != 0 ? 1 : 0 @@ -283,7 +298,7 @@ module OpenNebula other_a = octet[2..2].to_i & 1 != 0 ? 1 : 0 chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u, - other_m, other_a) + other_m, other_a, *args) end # Calls to the corresponding chmod method to modify @@ -291,13 +306,14 @@ module OpenNebula # Each [Integer] parameter must be 1 to allow, 0 deny, -1 do not change # # @param xml_method [String] the name of the XML-RPC method + # # @return [nil, OpenNebula::Error] nil in case of success, Error # otherwise def chmod(xml_method, owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u, - other_m, other_a) + other_m, other_a, *args) return call(xml_method, @pe_id, owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u, - other_m, other_a) + other_m, other_a, *args) end