provide_data не отправляет данные, когда required_keys не удовлетворены (очарование juju с использованием сервисных рамок)

Я не уверен, правильно ли я это использую. У меня есть один класс, определяющий required_keys и provide_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
задан 28 March 2015 в 23:02

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()

класс Отношения в основном закорачивает 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)
3
ответ дан 28 March 2015 в 23:02

Другие вопросы по тегам:

Похожие вопросы: