X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Fvini%2Fvini_network.py;h=fcade6c4c7ad5e09f935b91ddcfa1ba2af8ab959;hb=45783d105788cd2a834ffca14c5b788d40d32d3d;hp=6529ff19c52058c12d06ca975b9818246a5999b1;hpb=70304011964d2dc2277c1a9f09708718bb2cd37b;p=sfa.git diff --git a/sfa/managers/vini/vini_network.py b/sfa/managers/vini/vini_network.py index 6529ff19..fcade6c4 100644 --- a/sfa/managers/vini/vini_network.py +++ b/sfa/managers/vini/vini_network.py @@ -154,19 +154,19 @@ class ViniSite(Site): class ViniSlice(Slice): def assign_egre_key(self): - if not self.get_tag('egre_key'): + tag = self.get_tag('egre_key') + if not tag: try: - key = free_egre_key() - self.update_tag('egre_key', key) + key = self.network.free_egre_key() except: - # Should handle this case... - pass + raise InvalidRSpec("ran out of EGRE keys!") + tag = self.update_tag('egre_key', key, None, 'admin') return def turn_on_netns(self): tag = self.get_tag('netns') if (not tag) or (tag.value != '1'): - self.update_tag('netns', '1') + tag = self.update_tag('netns', '1', None, 'admin') return def turn_off_netns(self): @@ -181,12 +181,13 @@ class ViniSlice(Slice): caps = tag.value.split(',') for cap in caps: if cap == "CAP_NET_ADMIN": - return + newcaps = tag.value + break else: newcaps = "CAP_NET_ADMIN," + tag.value - self.update_tag('capabilities', newcaps) + self.update_tag('capabilities', newcaps, None, 'admin') else: - self.add_tag('capabilities', 'CAP_NET_ADMIN') + tag = self.add_tag('capabilities', 'CAP_NET_ADMIN', None, 'admin') return def remove_cap_net_admin(self): @@ -199,28 +200,11 @@ class ViniSlice(Slice): newcaps.append(cap) if newcaps: value = ','.join(newcaps) - self.update_tag('capabilities', value) + self.update_tag('capabilities', value, None, 'admin') else: tag.delete() return - # Update the vsys/setup-link and vsys/setup-nat slice tags. - def add_vsys_tags(self): - link = nat = False - for tag in self.network.getSliceTags(): - if tag.tagname == 'vsys': - if tag.value == 'setup-link': - link = True - elif tag.value == 'setup-nat': - nat = True - if not link: - self.add_tag('vsys', 'setup-link') - if not nat: - self.add_tag('vsys', 'setup-nat') - return - - - class Link: def __init__(self, end1, end2, bps = 1000 * 1000000, parent = None): self.end1 = end1 @@ -256,7 +240,7 @@ class Link: class ViniNetwork(Network): - def __init__(self, api, type = "VINI"): + def __init__(self, api, type = "SFA"): Network.__init__(self, api, type) self.sitelinks = [] self.nodelinks = [] @@ -387,32 +371,55 @@ class ViniNetwork(Network): def updateSliceTags(self): slice = self.slice - slice.update_tag('vini_topo', 'manual') + tag = slice.update_tag('vini_topo', 'manual', None, 'admin') slice.assign_egre_key() slice.turn_on_netns() slice.add_cap_net_admin() - for node in slice.get_nodes(): + for node in self.nodesWithSlivers(): linkdesc = [] for link in node.links: linkdesc.append(node.get_topo_rspec(link)) if linkdesc: topo_str = "%s" % linkdesc - slice.update_tag('topo_rspec', topo_str, node) + tag = slice.update_tag('topo_rspec', topo_str, node, 'admin') + + # Expire the un-updated topo_rspec tags + for tag in self.getSliceTags(): + if tag.tagname in ['topo_rspec']: + if not tag.was_updated(): + tag.delete() Network.updateSliceTags(self) + """ + Find a free EGRE key + """ + def free_egre_key(self): + used = set() + for tag in self.getSliceTags(): + if tag.tagname == 'egre_key': + used.add(int(tag.value)) + + for i in range(1, 256): + if i not in used: + key = i + break + else: + raise KeyError("No more EGRE keys available") + + return str(key) + """ Produce XML directly from the topology specification. """ def toxml(self): xml = XMLBuilder(format = True, tab_step = " ") with xml.RSpec(type=self.type): - name = "Public_" + self.type if self.slice: - element = xml.network(name=name, slice=self.slice.hrn) + element = xml.network(name=self.api.hrn, slice=self.slice.hrn) else: - element = xml.network(name=name) + element = xml.network(name=self.api.hrn) with element: if self.slice: