from sfa.util.namespace import *
from sfa.util.faults import *
from xmlbuilder import XMLBuilder
-#from lxml import etree
+from lxml import etree
import sys
from StringIO import StringIO
else:
return "%.0fbit" % rate
+class Sliver:
+ def __init__(self, node):
+ self.node = node
+ self.network = node.network
+ self.slice = node.network.slice
+ self.vsys_tags = []
+
+ def read_from_tags(self):
+ self.vsys_tags = self.slice.get_tags("vsys", self.node)
+
+ def write_to_tags(self):
+ pass
+
+ def toxml(self, xml):
+ with xml.sliver:
+ for tag in self.vsys_tags:
+ with xml.vsys:
+ xml << tag.value
+
class Iface:
def __init__(self, network, iface):
self.network = network
"""
def toxml(self, xml):
if self.bwlimit:
- with xml.bwlimit:
+ with xml.bw_limit:
xml << format_tc_rate(self.bwlimit)
self.links = set()
self.iface_ids = node['interface_ids']
self.iface_ids.sort()
- self.sliver = False
+ self.sliver = None
self.whitelist = node['slice_ids_whitelist']
def get_link_id(self, remote):
return None
def add_sliver(self):
- self.sliver = True
+ self.sliver = Sliver(self)
def toxml(self, xml):
slice = self.network.slice
for iface in self.get_ifaces():
iface.toxml(xml)
if self.sliver:
- with xml.sliver:
- pass
+ self.sliver.toxml(xml)
class Link:
self.name = slice['name']
self.node_ids = set(slice['node_ids'])
self.slice_tag_ids = slice['slice_tag_ids']
+ self.peer_id = slice['peer_slice_id']
+ """
+ Use with tags that can have more than one instance
+ """
+ def get_tags(self, tagname, node = None):
+ tags = []
+ for i in self.slice_tag_ids:
+ tag = self.network.lookupSliceTag(i)
+ if tag.tagname == tagname:
+ if not (tag.node_id and node and node.id != tag.node_id):
+ tags.append(tag)
+ return tags
+
+ """
+ Use with tags that have only one instance
+ """
def get_tag(self, tagname, node = None):
for i in self.slice_tag_ids:
tag = self.network.lookupSliceTag(i)
if tag.tagname == tagname:
if (not node) or (node.id == tag.node_id):
return tag
- else:
- return None
+ return None
- def get_nodes(self, nodes):
+ def get_nodes(self):
n = []
for id in self.node_ids:
- n.append(nodes[id])
+ n.append(self.network.nodes[id])
return n
# Add a new slice tag
ifaces.append(self.ifaces[i])
return ifaces
- def nodesInNetwork(self):
+ def nodesWithSlivers(self):
nodes = []
for n in self.nodes:
node = self.nodes[n]
if self.nodelinks:
raise Error("virtual topology already present")
- for node in slice.get_nodes(self.nodes):
- node.sliver = True
+ for node in slice.get_nodes():
+ node.add_sliver()
+ node.sliver.read_from_tags()
+
linktag = slice.get_tag('topo_rspec', node)
if linktag:
l = eval(linktag.value)
def updateSliceTags(self, slice):
if not self.nodelinks:
return
-
+
+ """ Comment this out for right now
slice.update_tag('vini_topo', 'manual', self.tags)
slice.assign_egre_key(self.tags)
slice.turn_on_netns(self.tags)
if tag.tagname == 'topo_rspec' and not tag.updated:
tag.delete()
tag.write(self.api)
+ """
+
"""
Check the requested topology against the available topology and capacity