diff options
Diffstat (limited to 'vicn/core')
-rw-r--r-- | vicn/core/attribute.py | 13 | ||||
-rw-r--r-- | vicn/core/resource.py | 11 | ||||
-rw-r--r-- | vicn/core/resource_mgr.py | 62 | ||||
-rw-r--r-- | vicn/core/scheduling_algebra.py | 6 | ||||
-rw-r--r-- | vicn/core/state.py | 1 | ||||
-rw-r--r-- | vicn/core/task.py | 1 |
6 files changed, 51 insertions, 43 deletions
diff --git a/vicn/core/attribute.py b/vicn/core/attribute.py index 22f44487..3afe0d6e 100644 --- a/vicn/core/attribute.py +++ b/vicn/core/attribute.py @@ -267,3 +267,16 @@ class Reference: def __init__(self, resource, attribute=None): self._resource = resource self._attribute = attribute + + def get_proxy(self): + if self._resource is Self: + resource = getattr(self, self._attribute) + else: + resource = getattr(self._resource, self._attribute) + return resource + + def get(self, attribute_name): + return self.get_proxy().get(attribute_name) + + def __iter__(self): + return iter(self.get_proxy()) diff --git a/vicn/core/resource.py b/vicn/core/resource.py index ab96daa5..9044ec21 100644 --- a/vicn/core/resource.py +++ b/vicn/core/resource.py @@ -168,12 +168,6 @@ class BaseResource(BaseType, ABC, metaclass=ResourceMetaclass): log.warning(W_UNK_ATTR.format(key, self.get_type())) continue - if isinstance(value, Reference): - if value._resource is Self: - value = getattr(self, value._attribute) - else: - value = getattr(value._resource, value._attribute) - if value and issubclass(attribute.type, Resource): if attribute.is_collection: new_value = list() @@ -215,6 +209,9 @@ class BaseResource(BaseType, ABC, metaclass=ResourceMetaclass): # Check requirements and default values for attr in self.iter_attributes(): + # XXX fix for lambda attributes, since initialization makes no sense + if hasattr(attr, 'func') and attr.func: + continue if attr.name not in kwargs: default = self.get_default_collection(attr) if attr.is_collection else \ self.get_default(attr) @@ -311,7 +308,7 @@ class BaseResource(BaseType, ABC, metaclass=ResourceMetaclass): try: rv = task.execute_blocking() break - except LxdAPIException: + except LXDAPIException: log.warning("LxdAPIException, retrying to fetch value") continue except Exception as e: diff --git a/vicn/core/resource_mgr.py b/vicn/core/resource_mgr.py index 4ca8060c..e6029cd7 100644 --- a/vicn/core/resource_mgr.py +++ b/vicn/core/resource_mgr.py @@ -365,7 +365,6 @@ class ResourceManager(metaclass=Singleton): for resource in self.get_resources(): if resource.get_type() == 'lxccontainer': task = task | resource.__delete__() - print("RESOURCE", resource.name) self.schedule(task) ret = await wait_task(task) return ret @@ -613,18 +612,18 @@ class ResourceManager(metaclass=Singleton): """ self.log(resource, ' - Waiting for attribute dependencies...') for attr in resource.iter_attributes(): - if issubclass(attr.type, Resource): - deps = resource.get(attr.name) - if deps is None: - # Not really a dependency, we expect mandatory to prevent - # us to continue if we should not - continue - if not attr.is_collection: - deps = [deps] + if not issubclass(attr.type, Resource): + continue + + deps = resource.get(attr.name) + if not deps: + continue + if not attr.is_collection: + deps = [deps] - for dep in deps: - # XXX This could be done in parallel + for dep in deps: + if attr.key: if not dep.managed: continue dep_pfx = '{}:{}'.format(dep.get_type(), dep.get_uuid()) @@ -632,27 +631,27 @@ class ResourceManager(metaclass=Singleton): await wait_resource(dep) self.log(resource, S_WAIT_DEP_OK. format(dep_pfx)) - if not attr.requirements: - continue + if not attr.requirements: + continue - for req in attr.requirements: - dep_attr_name = req.requirement_type - dep_attr = dep.get_attribute(dep_attr_name) - assert issubclass(dep_attr.type, Resource) - dep_attr_value = dep.get(dep_attr_name) - - if not dep_attr_value: - dep_attr_value = dep.auto_instanciate(dep_attr) - setattr(dep, dep_attr_name, dep_attr_value) - - dep_attr_value_pfx = '{}:{}'.format( - dep_attr_value.get_type(), - dep_attr_value.get_uuid()) - self.log(resource, - S_WAIT_DEP.format(dep_attr_value_pfx)) - await wait_resource(dep_attr_value) - self.log(resource, - S_WAIT_DEP_OK .format(dep_attr_value_pfx)) + for req in attr.requirements: + dep_attr_name = req.requirement_type + dep_attr = dep.get_attribute(dep_attr_name) + assert issubclass(dep_attr.type, Resource) + dep_attr_value = dep.get(dep_attr_name) + + if not dep_attr_value: + dep_attr_value = dep.auto_instanciate(dep_attr) + setattr(dep, dep_attr_name, dep_attr_value) + + dep_attr_value_pfx = '{}:{}'.format( + dep_attr_value.get_type(), + dep_attr_value.get_uuid()) + self.log(resource, + S_WAIT_DEP.format(dep_attr_value_pfx)) + await wait_resource(dep_attr_value) + self.log(resource, + S_WAIT_DEP_OK .format(dep_attr_value_pfx)) async def _resource_wait_predecessors(self, resource): after = resource.__after__() @@ -981,7 +980,6 @@ class ResourceManager(metaclass=Singleton): ip = resource.node.management_interface.ip4_address if not ip: log.error('IP of monitored Node {} is None'.format(resource.node)) - #return # XXX import os; os._exit(1) ws = self._router.add_interface('websocketclient', address=ip, diff --git a/vicn/core/scheduling_algebra.py b/vicn/core/scheduling_algebra.py index 207856c0..368ac243 100644 --- a/vicn/core/scheduling_algebra.py +++ b/vicn/core/scheduling_algebra.py @@ -16,19 +16,19 @@ # limitations under the License. # -def SchedulingAlgebra(cls, concurrent_mixin=object, composition_mixin=object, +def SchedulingAlgebra(cls, concurrent_mixin=object, composition_mixin=object, sequential_mixin=object): # allow_none = True class BaseElement(cls): def __default__(cls, *elements): - elts = [e for e in elements + elts = [e for e in elements if e is not None and not isinstance(e, Empty)] if len(elts) == 0: # The first is always Empty assert len(elements) != 0 return elements[0] elif len(elts) == 1: - return elts[0] + return elts[0] return cls(*elts) def __concurrent__(*elements): diff --git a/vicn/core/state.py b/vicn/core/state.py index 81876790..a116ba82 100644 --- a/vicn/core/state.py +++ b/vicn/core/state.py @@ -100,6 +100,7 @@ class PendingValue: def trigger(self, action, value, cur_value = None): if self.value is NEVER_SET: + #XXX Shouldn't we set it to None if it is demanded? if cur_value is not None: self.value = cur_value diff --git a/vicn/core/task.py b/vicn/core/task.py index 8346c65e..49c34b1f 100644 --- a/vicn/core/task.py +++ b/vicn/core/task.py @@ -113,7 +113,6 @@ class CompositionMixin: ret = await t.get_future() self.get_future().set_result(ret) except Exception as e: - print('we need to cancel tasks not executed...') self.get_future().set_exception(e) Task, EmptyTask = SchedulingAlgebra(BaseTask, ConcurrentMixin, |