From a836e5c16ea7df38646c46f2e9ffc6163ab05f06 Mon Sep 17 00:00:00 2001 From: Marcel Enguehard Date: Mon, 29 May 2017 13:13:32 +0200 Subject: Misc bug fixes *IP assignment *Node is a key attribute *Up-to-date packages *Trailing whitespaces ... Change-Id: Id8e2a5f7b2c4506f326b3c4bc991fa65f53fca5c Signed-off-by: Marcel Enguehard --- vicn/resource/ip_assignment.py | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'vicn/resource/ip_assignment.py') diff --git a/vicn/resource/ip_assignment.py b/vicn/resource/ip_assignment.py index 62a32389..55401ecd 100644 --- a/vicn/resource/ip_assignment.py +++ b/vicn/resource/ip_assignment.py @@ -17,17 +17,22 @@ # import math +import logging from vicn.core.resource import Resource from netmodel.model.type import String from vicn.core.attribute import Attribute from vicn.resource.ip.prefix_tree import Inet6Prefix, PrefixTree, Inet4Prefix -from vicn.core.task import inline_task +from vicn.core.task import inline_task, async_task, EmptyTask from vicn.core.exception import ResourceNotFound +log = logging.getLogger(__name__) + class IpAssignment(Resource): prefix = Attribute(String, mandatory=True) control_prefix = Attribute(String, description="prefix for control plane") + max_prefix_size = Attribute(String, + description="Maximum assigned prefix size for a link") PrefixClass = None @@ -36,6 +41,8 @@ class IpAssignment(Resource): self._prefix = self.PrefixClass(self.prefix) self._prefix_tree = PrefixTree(self._prefix) self._assigned_prefixes = {} + if not self.max_prefix_size: + self.max_prefix_size = self.PrefixClass.MAX_PREFIX_SIZE if self.control_prefix: self._ctrl_prefix = self.PrefixClass(self.control_prefix) self._ctrl_prefix_it = iter(self._ctrl_prefix) @@ -66,10 +73,11 @@ class IpAssignment(Resource): def __get__(self): raise ResourceNotFound - @inline_task + #@inline_task def __create__(self): # XXX code from Channel.__create__, until Events are properly implemented. # Iterate on channels for allocate IP addresses + task = EmptyTask() for group in self.groups: for channel in group.iter_by_type_str('channel'): interfaces = sorted(channel.interfaces, key = lambda x : x.device_name) @@ -77,27 +85,33 @@ class IpAssignment(Resource): continue min_prefix_size = math.ceil(math.log(len(channel.interfaces), 2)) - prefix_size = min(self.DEFAULT_PREFIX_SIZE, self.MAX_PREFIX_SIZE - min_prefix_size) - prefix = iter(self.get_prefix(channel, prefix_size)) + prefix_size = min(self.max_prefix_size, + self.PrefixClass.MAX_PREFIX_SIZE - min_prefix_size) + prefix = self.get_prefix(channel, prefix_size) + + it = prefix.get_iterator() for interface in interfaces: - ip = next(prefix) - print('attribute ip=', ip) - setattr(interface, self.ATTR_ADDRESS, ip) - setattr(interface, self.ATTR_PREFIX, prefix_size) + ip = next(it) + interface.set(self.ATTR_PREFIX, prefix_size) + #XXX Why do we need to create that async task? + #XXX Probably because the PendingValue is not created + #XXX in the main thread + @async_task + async def set_ip(interface, ip): + await interface.async_set(self.ATTR_ADDRESS, self.PrefixClass.ntoa(ip.ip_address)) + task = task | set_ip(interface, ip) + + return task __delete__ = None class Ipv6Assignment(IpAssignment): PrefixClass = Inet6Prefix - DEFAULT_PREFIX_SIZE = 64 - MAX_PREFIX_SIZE = 128 ATTR_ADDRESS = 'ip6_address' ATTR_PREFIX = 'ip6_prefix' class Ipv4Assignment(IpAssignment): PrefixClass = Inet4Prefix - DEFAULT_PREFIX_SIZE = 32 - MAX_PREFIX_SIZE = 32 ATTR_ADDRESS = 'ip4_address' ATTR_PREFIX = 'ip4_prefix' -- cgit 1.2.3-korg