aboutsummaryrefslogtreecommitdiffstats
path: root/vicn/core
diff options
context:
space:
mode:
Diffstat (limited to 'vicn/core')
-rw-r--r--vicn/core/attribute.py13
-rw-r--r--vicn/core/resource.py11
-rw-r--r--vicn/core/resource_mgr.py62
-rw-r--r--vicn/core/scheduling_algebra.py6
-rw-r--r--vicn/core/state.py1
-rw-r--r--vicn/core/task.py1
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,