blob: 78d1faeaba21836fd1d4a5b863a83a4e8df81b97 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
import types
from OvmCommonModule import *
from xmlrpclib import Fault
from OVSCommons import *
import OvmFaultConstants
import OvmHostModule
import OvmStoragePoolModule
import OvmVmModule
import OvmNetworkModule
import OvmVolumeModule
import OvmSecurityGroupModule
from OvmHaHeartBeatModule import OvmHaHeartBeat
ExposedClass = {}
logger = OvmLogger('OvmDispatcher')
def InitOvmDispacther():
global ExposedClass
modules = [ eval(attr) for attr in globals() if isinstance(eval(attr), types.ModuleType) ]
for m in modules:
for name in dir(m):
clz = getattr(m, name)
if type(clz) is types.TypeType and issubclass(clz, OvmObject):
ExposedClass[name] = clz
logger.debug(InitOvmDispacther, "Discovered exposed class:\n\n%s"%"\n".join(ExposedClass))
@exposed
def OvmDispatch(methodName, *params):
global ExposedClass
p = methodName.split('.')
if len(p) != 2:
logger.error(OvmDispatch, "%s is not a vaild format, should be classname.methodname"%p)
raise Fault(dispatchErrCode('InvalidCallMethodFormat'), "%s is not a vaild format, should be classname.methodname"%p)
clzName = p[0]
funcName = p[1]
if clzName not in ExposedClass.keys():
logger.error(OvmDispatch, "class %s is not exposed by agent"%clzName)
raise Fault(dispatchErrCode('InvaildClass'), "class %s is not exposed by agent"%clzName)
clz = ExposedClass[clzName]
if not hasattr(clz, funcName):
logger.error(OvmDispatch, "class %s has no function %s"%(clzName, funcName))
raise Fault(dispatchErrCode('InvaildFunction'), "class %s has no function %s"%(clzName, funcName))
logger.debug(OvmDispatch, "Entering %s.%s ===>"%(clzName, funcName))
rs = getattr(clz, funcName)(*params)
logger.debug(OvmDispatch, "Exited %s.%s <==="%(clzName, funcName))
return rs