From 2aac5ce7b4509b1856d78fd46709c7641f0f62ce Mon Sep 17 00:00:00 2001 From: Jedrzej Nowak Date: Mon, 4 Jan 2016 13:20:09 +0100 Subject: [PATCH] composer.create returns CreatedResources object This object has smart __getitem__ method it also has like method that simplifies filtering Change-Id: If5aa13e1ab3d2ecbfc3c6d5797868f64db315a8f Closes-bug: #1530808 --- examples/riak/riaks.py | 4 ++-- solar/core/resource/composer.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/examples/riak/riaks.py b/examples/riak/riaks.py index 40e890f4..7187a303 100755 --- a/examples/riak/riaks.py +++ b/examples/riak/riaks.py @@ -33,9 +33,9 @@ def setup_riak(): ModelMeta.remove_all() resources = cr.create('nodes', 'templates/nodes', {'count': 3}) nodes = [x for x in resources if x.name.startswith('node')] - hosts_services = [x for x in resources if x.name.startswith('hosts_file')] + nodes = resources.like('node') + hosts_services = resources.like('hosts_file') node1, node2, node3 = nodes - hosts_services = [x for x in resources if x.name.startswith('hosts_file')] riak_services = [] ips = '10.0.0.%d' diff --git a/solar/core/resource/composer.py b/solar/core/resource/composer.py index f68aa968..8b2f7aa2 100644 --- a/solar/core/resource/composer.py +++ b/solar/core/resource/composer.py @@ -14,12 +14,14 @@ # under the License. from collections import defaultdict +from collections import OrderedDict from StringIO import StringIO from jinja2 import Environment from jinja2 import meta import os +import re import yaml from solar.core.log import log @@ -42,6 +44,32 @@ VR_ENV = Environment(block_start_string="#%", lstrip_blocks=True) +class CreatedResources(object): + + def __init__(self, resources): + if isinstance(resources, (list, tuple)): + c = OrderedDict((r.name, r) for r in resources) + else: + c = resources + self.data = c + + def __getitem__(self, key): + if isinstance(key, int): + key = self.data.keys()[key] + return self.data[key] + + def __iter__(self): + return self.data.itervalues() + + def __len__(self): + return self.data.__len__() + + def like(self, regex): + keys = self.data.keys() + matched_keys = filter(lambda key: re.match(regex, key), keys) + return CreatedResources({rname: self[rname] for rname in matched_keys}) + + def create(name, spec, inputs=None, tags=None): inputs = inputs or {} if isinstance(spec, provider.BaseProvider): @@ -70,7 +98,7 @@ def create(name, spec, inputs=None, tags=None): r = create_resource(name, spec, inputs=inputs, tags=tags) rs = [r] - return rs + return CreatedResources(rs) def create_resource(name, spec, inputs=None, tags=None):