aboutsummaryrefslogtreecommitdiffstats
path: root/vicn/resource/ip_assignment.py
diff options
context:
space:
mode:
Diffstat (limited to 'vicn/resource/ip_assignment.py')
-rw-r--r--vicn/resource/ip_assignment.py38
1 files changed, 26 insertions, 12 deletions
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'