ironic中的vendor_passthru用于实现基本框架之外各个厂商自己的接口,在power,management,console,deploy之外有一些特殊的function比如pxe的vendor_passthru中提到的heartbeat和lookup功能,要想添加自己的function,先来看vendor_passthru是怎么工作起来的:
无论是node还是driver的vendor_passthru包含methods和_default两个方法,举nodes/{uuid}/vendor_passthru为例子
methods: 该node支持的所有vendor_passthru方法,
ret = pecan.request.rpcapi.get_node_vendor_passthru_methods(
pecan.request.context, rpc_node.uuid, topic=topic)
通过rpc到具体conductor执行:
get_vendor_passthru_metadata( task.driver.vendor.vendor_routes)
看pxe_ipmitool driver:
self.vendor = pxe.VendorPassthru()其基类为:agent_base_vendor.BaseAgentVendor,继承自base.VendorInterface,在VendorInterface中:
for name, ref in inspect.getmembers(inst, predicate=inspect.ismethod):
vmeta = getattr(ref, '_vendor_metadata', None)
dmeta = getattr(ref, '_driver_metadata', None)
if vmeta is not None:
metadata = copy.deepcopy(vmeta.metadata)
metadata['func'] = ref
inst.vendor_routes.update({vmeta.method: metadata})
if dmeta is not None:
metadata = copy.deepcopy(dmeta.metadata)
metadata['func'] = ref
inst.driver_routes.update({dmeta.method: metadata})
而_vendor_metadata和_driver_metadata则来自decorator:
passthru 和 driver_passthru, 因此我们可以看到 类似“@base.passthru(['POST'], method='pass_deploy_info')”的东西
这两个decorator本质上调用的是_passthru:
metadata = VendorMetadata(api_method, {'http_methods': supported_,
'async': async,
'description': description_})
if driver_passthru:
func._driver_metadata = metadata
else:
func._vendor_metadata = metadata
因此只要在自己实现的vendor类中需要对外暴露的方法加上@base.passthru和@base.driver_passthru即可。
而_default的作用则是做了个动态的方法路由,传进来的方法如果在methods的列表里面就执行,不在列表里就raise error不执行此方法
既然是vendor_passthru,理论上一个方法到底是node passthru还是driver passthru并没有关系,遵循的基本原则是,如果passthru的方法和具体的node
无关就应该是driver的passthru,反之则是node的passthru