Я не уверен, правильно ли я это использую. У меня есть один класс, определяющий 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() }
Это поведение предназначено или это ошибка?
Это - действительно ошибка. Я столкнулся с ним на этой неделе при перезаписи очарования с помощью Сервисной платформы. Я работаю над фиксацией для него, но тем временем, у меня действительно есть обходное решение.
В установке 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)