def imethodcall(self, methodname, namespace, **params): """Make an intrinsic method call. Returns a tupletree with a IRETURNVALUE element at the root. A CIMError exception is thrown if there was an error parsing the call response, or an ERROR element was returned. The parameters are automatically converted to the right CIM_XML objects. In general clients should call one of the method-specific methods of the connection, such as EnumerateInstanceNames, etc.""" # Create HTTP headers headers = ['CIMOperation: MethodCall', 'CIMMethod: %s' % methodname, cim_http.get_object_header(namespace)] # Create parameter list plist = map(lambda x: cim_xml.IPARAMVALUE(x[0], cim_obj.tocimxml(x[1])), params.items()) # Build XML request req_xml = cim_xml.CIM( cim_xml.MESSAGE( cim_xml.SIMPLEREQ( cim_xml.IMETHODCALL( methodname, cim_xml.LOCALNAMESPACEPATH( [cim_xml.NAMESPACE(ns) for ns in string.split(namespace, '/')]), plist)), '1001', '1.0'), '2.0', '2.0') if self.debug: self.last_raw_request = req_xml.toxml() self.last_request = req_xml.toprettyxml(indent=' ') self.last_reply = None self.last_raw_reply = None # Get XML response try: resp_xml = cim_http.wbem_request(self.url, req_xml.toxml(), self.creds, headers, x509 = self.x509, verify_callback = self.verify_callback) except cim_http.AuthError: raise except cim_http.Error, arg: # Convert cim_http exceptions to CIMError exceptions raise CIMError(0, str(arg))
def methodcall(self, methodname, localobject, **params): """Make an extrinsic method call. Returns a tupletree with a RETURNVALUE element at the root. A CIMError exception is thrown if there was an error parsing the call response, or an ERROR element was returned. The parameters are automatically converted to the right CIM_XML objects.""" # METHODCALL only takes a LOCALCLASSPATH or LOCALINSTANCEPATH if hasattr(localobject, 'host') and localobject.host is not None: localobject = localobject.copy() localobject.host = None # Create HTTP headers headers = ['CIMOperation: MethodCall', 'CIMMethod: %s' % methodname, cim_http.get_object_header(localobject)] # Create parameter list def paramtype(obj): """Return a string to be used as the CIMTYPE for a parameter.""" if isinstance(obj, cim_types.CIMType): return obj.cimtype elif type(obj) == bool: return 'boolean' elif isinstance(obj, StringTypes): return 'string' elif isinstance(obj, (datetime, timedelta)): return 'datetime' elif isinstance(obj, (CIMClassName, CIMInstanceName)): return 'reference' elif isinstance(obj, (CIMClass, CIMInstance)): return 'string' elif isinstance(obj, list): if obj: return paramtype(obj[0]) else: return None raise TypeError('Unsupported parameter type "%s"' % type(obj)) def paramvalue(obj): """Return a cim_xml node to be used as the value for a parameter.""" if isinstance(obj, (datetime, timedelta)): obj = cim_types.CIMDateTime(obj) if isinstance(obj, (cim_types.CIMType, bool, StringTypes)): return cim_xml.VALUE(cim_types.atomic_to_cim_xml(obj)) if isinstance(obj, (CIMClassName, CIMInstanceName)): return cim_xml.VALUE_REFERENCE(obj.tocimxml()) if isinstance(obj, (CIMClass, CIMInstance)): return cim_xml.VALUE(obj.tocimxml().toxml()) if isinstance(obj, list): if obj and isinstance(obj[0], (CIMClassName, CIMInstanceName)): return cim_xml.VALUE_REFARRAY([paramvalue(x) for x in obj]) return cim_xml.VALUE_ARRAY([paramvalue(x) for x in obj]) raise TypeError('Unsupported parameter type "%s"' % type(obj)) def is_embedded(obj): """Determine if an object requires an EmbeddedObject attribute""" if isinstance(obj,list) and obj: return is_embedded(obj[0]) elif isinstance(obj, CIMClass): return 'object' elif isinstance(obj, CIMInstance): return 'instance' return None plist = [cim_xml.PARAMVALUE(x[0], paramvalue(x[1]), paramtype(x[1]), embedded_object=is_embedded(x[1])) for x in params.items()] # Build XML request req_xml = cim_xml.CIM( cim_xml.MESSAGE( cim_xml.SIMPLEREQ( cim_xml.METHODCALL( methodname, localobject.tocimxml(), plist)), '1001', '1.0'), '2.0', '2.0') if self.debug: self.last_request = req_xml.toprettyxml(indent=' ') # Get XML response try: resp_xml = cim_http.wbem_request(self.url, req_xml.toxml(), self.creds, headers, x509 = self.x509, verify_callback = self.verify_callback) except cim_http.Error, arg: # Convert cim_http exceptions to CIMError exceptions raise CIMError(0, str(arg))