deb-python-pyvmomi/pyVmomi/ManagedMethodExecutorHelper.py

119 lines
4.3 KiB
Python
Raw Normal View History

# VMware vSphere Python SDK
# Copyright (c) 2008-2016 VMware, Inc. All Rights Reserved.
#
# 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.
"""
This module provides convinent fns related to ManagedMethodExecutor
"""
__author__ = "VMware, Inc."
from pyVmomi import VmomiSupport, SoapAdapter, vmodl
from .SoapAdapter import SoapStubAdapterBase, SerializeToUnicode, Deserialize
## ManagedMethodExecutor soap stub adapter
#
class MMESoapStubAdapter(SoapStubAdapterBase):
""" Managed method executor stub adapter """
## Constructor
#
# The endpoint can be specified individually as either a host/port
# combination, or with a URL (using a url= keyword).
#
# @param self self
# @param mme managed method executor
def __init__(self, mme):
stub = mme._stub
SoapStubAdapterBase.__init__(self, version=stub.version)
self.mme = mme
## Compute the version information for the specified namespace
#
# @param ns the namespace
def ComputeVersionInfo(self, version):
SoapStubAdapterBase.ComputeVersionInfo(self, version)
self.versionId = self.versionId[1:-1]
## Invoke a managed method, with _ExecuteSoap. Wohooo!
#
# @param self self
# @param mo the 'this'
# @param info method info
# @param args arguments
def InvokeMethod(self, mo, info, args):
# Serialize parameters to soap parameters
methodArgs = None
if info.params:
methodArgs = vmodl.Reflect.ManagedMethodExecutor.SoapArgument.Array()
for param, arg in zip(info.params, args):
if arg is not None:
# Serialize parameters to soap snippets
soapVal = SerializeToUnicode(val=arg, info=param, version=self.version)
# Insert argument
soapArg = vmodl.Reflect.ManagedMethodExecutor.SoapArgument(
name=param.name, val=soapVal)
methodArgs.append(soapArg)
moid = mo._GetMoId()
version = self.versionId
methodName = VmomiSupport.GetVmodlName(info.type) + "." + info.name
# Execute method
result = self.mme.ExecuteSoap(moid=moid,
version=version,
method=methodName,
argument=methodArgs)
return self._DeserializeExecutorResult(result, info.result)
## Invoke a managed property accessor
#
# @param self self
# @param mo the 'this'
# @param info property info
def InvokeAccessor(self, mo, info):
moid = mo._GetMoId()
version = self.versionId
prop = info.name
# Fetch property
result = self.mme.FetchSoap(moid=moid, version=version, prop=prop)
return self._DeserializeExecutorResult(result, info.type)
## Deserialize result from ExecuteSoap / FetchSoap
#
# @param self self
# @param result result from ExecuteSoap / FetchSoap
# @param resultType Expected result type
def _DeserializeExecutorResult(self, result, resultType):
obj = None
if result:
# Parse the return soap snippet. If fault, raise exception
if result.response:
# Deserialize back to result
obj = Deserialize(result.response, resultType, stub=self)
elif result.fault:
# Deserialize back to fault (or vmomi fault)
fault = Deserialize(result.fault.faultDetail,
object,
stub=self)
# Silent pylint
raise fault # pylint: disable-msg=E0702
else:
# Unexpected: result should have either response or fault
msg = "Unexpected execute/fetchSoap error"
reason = "execute/fetchSoap did not return response or fault"
raise vmodl.Fault.SystemError(msg=msg, reason=reason)
return obj