List input-type introduced

This commit is contained in:
Przemyslaw Kaminski
2015-04-20 14:04:16 +02:00
parent 374e8babd1
commit c9e17474b5
5 changed files with 45 additions and 14 deletions

View File

@@ -21,6 +21,7 @@ class Resource(object):
self.requires = metadata['input'].keys()
self._validate_args(args)
self.args = args
self.input_types = metadata.get('input-types', {})
self.changed = []
self.tags = tags or []
@@ -42,9 +43,14 @@ class Resource(object):
except ValueError:
pass
def update(self, args):
def update(self, args, emitter_name=None):
for key, value in args.iteritems():
self.args[key] = value
if self.input_types.get(key, '') == 'list':
if emitter_name is None:
raise Exception('I need to know then emitter when updating input of list type')
self.args[key][emitter_name] = value
else:
self.args[key] = value
self.changed.append(key)
signals.notify(self, key, value)

View File

@@ -2,4 +2,6 @@ id: haproxy
handler: ansible
version: 1.0.0
input:
servers:
configs:
input-types:
configs: list

View File

@@ -3,3 +3,5 @@ handler: ansible
version: 1.0.0
input:
servers:
input-types:
servers: list

View File

@@ -44,9 +44,10 @@ def connect(emitter, receiver, mapping=None):
guessed.update(mapping)
for src, dst in guessed.items():
# disconnect all receiver inputs
# TODO: check if receiver input is of list type first
disconnect_receiver_by_input(receiver, dst)
# Disconnect all receiver inputs
# Check if receiver input is of list type first
if receiver.input_types.get(dst, '') != 'list':
disconnect_receiver_by_input(receiver, dst)
CLIENTS.setdefault(emitter.name, {})
CLIENTS[emitter.name].setdefault(src, [])
@@ -57,11 +58,28 @@ def connect(emitter, receiver, mapping=None):
def disconnect(emitter, receiver):
for src, destinations in CLIENTS[emitter.name].items():
destinations = [
destination for destination in destinations
if destination[0] == receiver.name
]
for destination in destinations:
receiver_input = destination[1]
if receiver.input_types.get(receiver_input, '') == 'list':
print 'Removing input {} from {}'.format(receiver_input, receiver.name)
# TODO: update here? We're deleting an input...
receiver.args[receiver_input] = {
k: v for k, v in receiver.args.get(receiver_input, {}).items()
if k != emitter.name
}
CLIENTS[emitter.name][src] = [
destination for destination in destinations
if destination[0] != receiver.name
]
# Inputs might have changed
receiver.save()
utils.save_to_config_file(CLIENTS_CONFIG_KEY, CLIENTS)
@@ -88,7 +106,7 @@ def notify(source, key, value):
resource = db.get_resource(client)
print 'Resource found', client
if resource:
resource.update({r_key: value})
resource.update({r_key: value}, emitter_name=source.name)
else:
print 'Resource {} deleted?'.format(client)
pass