diff options
author | Marcel Enguehard <mengueha+fdio@cisco.com> | 2017-05-15 16:26:27 +0200 |
---|---|---|
committer | Marcel Enguehard <mengueha+fdio@cisco.com> | 2017-05-15 16:26:27 +0200 |
commit | 895a6328d6e64948ed213e8fbbb3ab15aca0df43 (patch) | |
tree | 2c85049fcf73c445ea25097b4753299568061538 /vicn/resource/channel.py | |
parent | 548479d60dafb24eddcec3762aa558f13581cdb2 (diff) |
IPv6 dataplane support + Decentralized IPv4 prefix attribution + Bug fix for attribute default values handling + Various fixes
Change-Id: I0a26eda064d9e22d9d55fd568748076148f49645
Signed-off-by: Marcel Enguehard <mengueha+fdio@cisco.com>
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() |