diff options
Diffstat (limited to 'vicn/resource/channel.py')
-rw-r--r-- | vicn/resource/channel.py | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/vicn/resource/channel.py b/vicn/resource/channel.py index cd64b641..d91bebcf 100644 --- a/vicn/resource/channel.py +++ b/vicn/resource/channel.py @@ -16,9 +16,13 @@ # limitations under the License. # -from netmodel.model.type import String -from vicn.core.resource import Resource -from vicn.core.attribute import Attribute +from netmodel.model.type import String +from vicn.core.resource import Resource +from vicn.core.attribute import Attribute +from vicn.core.task import EmptyTask +from vicn.resource.ip_assignment import Ipv6Assignment, Ipv4Assignment + +from math import log, ceil class Channel(Resource): """ @@ -29,6 +33,9 @@ class Channel(Resource): # Public API #-------------------------------------------------------------------------- + def __after_init__(self): + return ("IpAssignment",) + def get_remote_name(self, name): if len(self._interfaces) != 2: return None @@ -42,3 +49,26 @@ class Channel(Resource): ret = "{:03}".format(len(self.interfaces)) ret = ret + ''.join(sorted(map(lambda x : x.node.name, self.interfaces))) return ret + + def __create__(self): + interfaces = sorted(self.interfaces, key = lambda x : x.device_name) + if interfaces: + #IPv6 + central6 = self._state.manager.by_type(Ipv6Assignment)[0] + prefix6_size = min(64, 128 - ceil(log(len(self.interfaces), 2))) + prefix6 = iter(central6.get_prefix(self, prefix6_size)) + + #IPv4 + central4 = self._state.manager.by_type(Ipv4Assignment)[0] + prefix4_size = 32 - ceil(log(len(self.interfaces), 2)) + prefix4 = iter(central4.get_prefix(self, prefix4_size)) + + for interface in interfaces: + try: + interface.ip4_address = next(prefix4) + except StopIteration as e: + import pdb; pdb.set_trace() + interface.ip6_address = next(prefix6) + interface.ip6_prefix = prefix6_size + + return EmptyTask() |