provide_data não envia dados quando required_keys não está satisfeito (usando o framework de serviços)

1

Não tenho certeza se estou usando isso da maneira correta. Eu tenho uma classe que define o required_keys e o provide_data para o mesmo relacionamento. O código a seguir executa provide_data em uma relação join / change, mas não relaciona-set namenode_sshkey . Se eu remover a linha required_keys , o código funcionará de repente (mas não posso usar essa classe para especificar os dados necessários para o relacionamento).

[...]
    {
        '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() }

Esse comportamento é intencional ou é um bug?

    
por Galgalesh 28.03.2015 / 21:02

1 resposta

3

Isso é realmente um bug. Eu corri para esta semana enquanto reescrevia um charme usando o framework Services. Estou trabalhando em uma correção para isso, mas, enquanto isso, tenho uma solução alternativa.

Na configuração do ServiceManager, passe a chave = valor que deseja enviar pelo fio da relação e não passe nada para a relação 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()

A classe Relation basicamente faz um curto-circuito nas required_keys, definindo-as apenas se não houver dados fornecidos para manipular.

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)
    
por Adam Israel 29.03.2015 / 04:47

Tags