openstack taskflow参数解析

taskflow在cinder应用中,有参数传递的问题,针对这些参数是如何传递的,这里做一些简要的记录。具体原理还带深究。

代码如下:

import taskflow.engines
from taskflow.patterns import linear_flow

from cinder import flow_utils


class Task1(flow_utils.CinderTask):
    """ test provider """

    default_provides = set(['arg2'])

    def __init__(self) -> None:
        super(Task1, self).__init__(addons=['test'])

    def execute(self,
                **kwargs):
        print("test Task1")
        return {'arg2':"Provider arg2 from Task1"}


class Task2(flow_utils.CinderTask):
    """test require"""

    def __init__(self) -> None:
        requires = ['raw_size','arg2']
        super(Task2, self).__init__(addons=['test'],
                                              requires=requires)

    def execute(self,
                **kwargs):
        print("test Task2")

        for key,value in kwargs.items():
            print(f"{key}:{value}")

class Task3(flow_utils.CinderTask):
    """test rebind"""

    def __init__(self,arg3, **kwargs) -> None:
        super(Task3, self).__init__(addons=['test'],
                                              **kwargs)
        self.arg3 = arg3
        print(self.arg3)

    def execute(self,size,
                **kwargs):
        print("test Task3")
        print("the size is", size)

        for key,value in kwargs.items():
            print(f"{key}:{value}")

def get_flow(store):
    flow_name = "test_api"
    api_flow = linear_flow.Flow(flow_name)

    arg3 = 123

    api_flow.add(Task1())
    api_flow.add(Task2())
    api_flow.add(Task3(arg3,rebind={'size': 'raw_size'}))

    return taskflow.engines.load(api_flow, store=store)


if __name__=='__main__':
    store={'raw_size': 10}
    engine = get_flow(store)
    engine.run()

代码运行结果:

123
test Task1
test Task2
raw_size:10
arg2:Provider arg2 from Task1
test Task3
the size is 10

解析:

store:是总的传参,供所有的执行体从中取出所需参数

default_provides:返回本执行体的结果,并更新到store中,供后面其他执行体取参;例如Task1

例如代码:

class VolumeCastTask(flow_utils.CinderTask):


    default_provides = set(['new_volume'])

    def execute(self, context: context.RequestContext, **kwargs) -> None:
        ......
        volume = self._call_create_volume(
            context, request_spec, filter_properties)
        return {'new_volume': volume}


这里得到new_volume,是返回结果。

vref = flow_engine.storage.fetch('new_volume')

然后从返回结果中取出该值

requires:代表本执行体所必须的参数,如果没有,则会报错;并且所需的参数会自动更新到**kwargs参数中,如果没有requires,也可以通过执行体中的execute函数通过显示调用具体的值来获取参数,如果执行,则不需要再显示获取,因为已经在**kwargs中了。例如Task2

rebind:重定向store中的参数名称,即和store中的参数做映射,例如Task3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值