remote_ip = remote.get_virt_ip(self)
net = self.get_virt_net(remote)
bw = format_tc_rate(link.bps)
- return (remote.id, remote.ipaddr, bw, my_ip, remote_ip, net)
+ ipaddr = remote.get_primary_iface().ipv4
+ return (remote.id, ipaddr, bw, my_ip, remote_ip, net)
def add_link(self, link):
self.links.add(link)
xml << self.hostname
with xml.bw_unallocated(units="kbps"):
xml << str(int(self.bps/1000))
- for iface in self.get_ifaces():
- iface.toxml(xml)
+ self.get_primary_iface().toxml(xml)
if self.sliver:
self.sliver.toxml(xml)
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):
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):
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
with xml.vlink(endpoints=end_ids):
with xml.description:
xml << "%s -- %s" % (self.end1.name, self.end2.name)
- with xml.bw(units="kbps"):
+ with xml.kbps:
xml << str(int(self.bps/1000))
else:
with xml.link(endpoints=end_ids):
class ViniNetwork(Network):
- def __init__(self, api, type = "VINI"):
+ def __init__(self, api, type = "SFA"):
Network.__init__(self, api, type)
self.sitelinks = []
self.nodelinks = []
# Find vlinks under link elements
for vlink in self.rspec.iterfind("./network/link/vlink"):
link = vlink.getparent()
- self.__add_vlink(vlink, slicenodes, link)
+ self.__add_vlink(vlink, link)
# Find vlinks that specify endpoints
- for vlink in rspec.iterfind("./request/vlink[@endpoints]"):
- self.__add_vlink(vlink, slicenodes)
+ for vlink in self.rspec.iterfind("./request/vlink[@endpoints]"):
+ self.__add_vlink(vlink)
def addSlice(self):
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: