当 required_keys 不满足时,provide_data 不会发送数据(juju charm 使用服务框架)

当 required_keys 不满足时,provide_data 不会发送数据(juju charm 使用服务框架)

我不确定我是否以正确的方式使用它。我有一个类为相同的关系定义required_keysprovide_data。以下代码provide_data在关系连接/更改上执行,但不执行关系设置namenode_sshkey。如果我删除该required_keys行,代码会立即起作用(但我无法使用此类来指定关系所需的数据)。

[...]
    {
        'service': 'namenode',
        'ports': [9000, 50070],  # ports to open after start
        'provided_data': [
            NamenodeRelation()
        ],
        'required_data': [
            NamenodeRelation(),
            {'role' : 'namenode', 'command' : 'hadoop-daemon.sh'}
        ],
        'data_ready': [
            configure_namenode,
            helpers.render_template(
                 source='upstart.conf',
                 target='/etc/init/namenode.conf')
        ],
    },
[...]


class NamenodeRelation(RelationContext):
    name = 'namenode'
    interface = 'dfs'

    def __init__(self, *args, **kwargs):
        self.required_keys = ['slave_IP', 'private-address']
        RelationContext.__init__(self,name=self.name, *args, **kwargs)

    def provide_data(self):
        return {'namenode_sshkey' : get_ssh_key() }

这是有意为之还是一个错误?

答案1

这确实是一个错误。本周,我在使用服务框架重写一个超级按钮时遇到了这个问题。我正在努力修复它,但与此同时,我确实有一个解决方法。

在 ServiceManager 设置中,传递您想要通过关系线发送的 key=value,并且不要为 required_data 关系传递任何内容。

def manage():
    manager = ServiceManager([
        {
            'service': 'example',
            'ports': [80],  # ports to after start
            'provided_data': [
                RabbitMQRelation(username='example', vhost='/')
            ],
            'required_data': [
               RabbitMQRelation(),
            ],
            'data_ready': [
                configure_rabbitmq,
            ],
            'data_lost': [
            ],
        },
    ])
    manager.manage()

Relation 类基本上通过仅在没有提供数据需要处理时设置它来短路 required_keys。

class RabbitMQRelation(helpers.RelationContext):
    name = 'amqp'
    interface = 'rabbitmq'

    vhost = None
    username = None
    required_keys = []

    def __init__(self, username=None, vhost=None):
        """
        This works around a bug with the RelationContext class that expects
        the required keys to be set before it will call provide_data.
        """
        if username and vhost:
            self.username = username
            self.vhost = vhost
        else:
            self.required_keys = ['private-address', 'hostname', 'password']

        super(RabbitMQRelation, self).__init__(self.name)

相关内容