我不确定我是否以正确的方式使用它。我有一个类为相同的关系定义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
这确实是一个错误。本周,我在使用服务框架重写一个超级按钮时遇到了这个问题。我正在努力修复它,但与此同时,我确实有一个解决方法。
在 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)