python3 - 2to3 + miscell obvious tweaks
[sfa.git] / sfa / rspecs / versions / sfav1.py
index 54e172c..9b77837 100644 (file)
@@ -1,33 +1,35 @@
+
+
 from copy import deepcopy
 from lxml import etree
 
 from sfa.util.sfalogging import logger
 from sfa.util.xrn import hrn_to_urn, urn_to_hrn
 from copy import deepcopy
 from lxml import etree
 
 from sfa.util.sfalogging import logger
 from sfa.util.xrn import hrn_to_urn, urn_to_hrn
-from sfa.util.plxrn import PlXrn
-from sfa.rspecs.baseversion import BaseVersion
+from sfa.rspecs.version import RSpecVersion
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
 from sfa.rspecs.elements.versions.sfav1Node import SFAv1Node
 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
 from sfa.rspecs.elements.versions.sfav1Node import SFAv1Node
 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
+from sfa.rspecs.elements.versions.sfav1Lease import SFAv1Lease
 
 
-class SFAv1(BaseVersion):
+
+class SFAv1(RSpecVersion):
     enabled = True
     type = 'SFA'
     content_type = '*'
     version = '1'
     enabled = True
     type = 'SFA'
     content_type = '*'
     version = '1'
-    schema = None
-    namespace = None
+    schema = ''
+    namespace = ''
     extensions = {}
     namespaces = None
     template = '<RSpec type="%s"></RSpec>' % type
 
     extensions = {}
     namespaces = None
     template = '<RSpec type="%s"></RSpec>' % type
 
-    # Network 
+    # Network
     def get_networks(self):
         network_elems = self.xml.xpath('//network')
     def get_networks(self):
         network_elems = self.xml.xpath('//network')
-        networks = [network_elem.get_instance(fields=['name', 'slice']) for \
+        networks = [network_elem.get_instance(fields=['name', 'slice']) for
                     network_elem in network_elems]
                     network_elem in network_elems]
-        return networks    
-
+        return networks
 
     def add_network(self, network):
         network_tags = self.xml.xpath('//network[@name="%s"]' % network)
 
     def add_network(self, network):
         network_tags = self.xml.xpath('//network[@name="%s"]' % network)
@@ -37,17 +39,16 @@ class SFAv1(BaseVersion):
             network_tag = network_tags[0]
         return network_tag
 
             network_tag = network_tags[0]
         return network_tag
 
-
     # Nodes
     # Nodes
-    
+
     def get_nodes(self, filter=None):
         return SFAv1Node.get_nodes(self.xml, filter)
 
     def get_nodes_with_slivers(self):
         return SFAv1Node.get_nodes_with_slivers(self.xml)
 
     def get_nodes(self, filter=None):
         return SFAv1Node.get_nodes(self.xml, filter)
 
     def get_nodes_with_slivers(self):
         return SFAv1Node.get_nodes_with_slivers(self.xml)
 
-    def add_nodes(self, nodes, network = None, no_dupes=False):
-        SFAv1Node.add_nodes(self.xml, nodes)
+    def add_nodes(self, nodes, network=None, no_dupes=False, rspec_content_type=None):
+        SFAv1Node.add_nodes(self.xml, nodes, rspec_content_type)
 
     def merge_node(self, source_node_tag, network, no_dupes=False):
         if no_dupes and self.get_node_element(node['hostname']):
 
     def merge_node(self, source_node_tag, network, no_dupes=False):
         if no_dupes and self.get_node_element(node['hostname']):
@@ -58,8 +59,10 @@ class SFAv1(BaseVersion):
         network_tag.append(deepcopy(source_node_tag))
 
     # Slivers
         network_tag.append(deepcopy(source_node_tag))
 
     # Slivers
-   
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None:
+            attributes = []
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
@@ -67,7 +70,7 @@ class SFAv1(BaseVersion):
             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
 
         # add slivers
             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
 
         # add slivers
-        sliver = {'name':sliver_urn,
+        sliver = {'name': sliver_urn,
                   'pl_tags': attributes}
         for hostname in hostnames:
             if sliver_urn:
                   'pl_tags': attributes}
         for hostname in hostnames:
             if sliver_urn:
@@ -85,83 +88,91 @@ class SFAv1(BaseVersion):
                     parent = node_elem.element.getparent()
                     parent.remove(node_elem.element)
 
                     parent = node_elem.element.getparent()
                     parent.remove(node_elem.element)
 
-
     def remove_slivers(self, slivers, network=None, no_dupes=False):
         SFAv1Node.remove_slivers(self.xml, slivers)
     def remove_slivers(self, slivers, network=None, no_dupes=False):
         SFAv1Node.remove_slivers(self.xml, slivers)
+
     def get_slice_attributes(self, network=None):
     def get_slice_attributes(self, network=None):
-        slice_attributes = []
-        """
+        attributes = []
         nodes_with_slivers = self.get_nodes_with_slivers()
         for default_attribute in self.get_default_sliver_attributes(network):
         nodes_with_slivers = self.get_nodes_with_slivers()
         for default_attribute in self.get_default_sliver_attributes(network):
-            attribute = {'name': str(default_attribute[0]), 
-                         'value': str(default_attribute[1]), 
-                         'node_id': None}
-            slice_attributes.append(attribute)
+            attribute = default_attribute.copy()
+            attribute['node_id'] = None
+            attributes.append(attribute)
         for node in nodes_with_slivers:
         for node in nodes_with_slivers:
-            nodename=node.get('component_name')
+            nodename = node['component_name']
             sliver_attributes = self.get_sliver_attributes(nodename, network)
             for sliver_attribute in sliver_attributes:
             sliver_attributes = self.get_sliver_attributes(nodename, network)
             for sliver_attribute in sliver_attributes:
-                attribute = {'name': str(sliver_attribute[0]), 'value': str(sliver_attribute[1]), 'node_id': node}
-                slice_attributes.append(attribute)
-        """
-        return slice_attributes
+                sliver_attribute['node_id'] = nodename
+                attributes.append(sliver_attribute)
+        return attributes
 
 
-
-    def add_sliver_attribute(self, hostname, name, value, network=None):
-        nodes = self.get_nodes({'component_id': '*%s*' % hostname})
-        if not nodes:
+    def add_sliver_attribute(self, component_id, name, value, network=None):
+        nodes = self.get_nodes({'component_id': '*%s*' % component_id})
+        if nodes is not None and isinstance(nodes, list) and len(nodes) > 0:
             node = nodes[0]
             slivers = SFAv1Sliver.get_slivers(node)
             if slivers:
                 sliver = slivers[0]
             node = nodes[0]
             slivers = SFAv1Sliver.get_slivers(node)
             if slivers:
                 sliver = slivers[0]
-                SFAv1Sliver.add_attribute(sliver, name, value)
+                SFAv1Sliver.add_sliver_attribute(sliver, name, value)
+        else:
+            # should this be an assert / raise an exception?
+            logger.error("WARNING: failed to find component_id %s" %
+                         component_id)
 
 
-    def get_sliver_attributes(self, hostname, network=None):
-        nodes = self.get_nodes({'component_id': '*%s*' %hostname})
+    def get_sliver_attributes(self, component_id, network=None):
+        nodes = self.get_nodes({'component_id': '*%s*' % component_id})
         attribs = []
         if nodes is not None and isinstance(nodes, list) and len(nodes) > 0:
             node = nodes[0]
         attribs = []
         if nodes is not None and isinstance(nodes, list) and len(nodes) > 0:
             node = nodes[0]
-            slivers = node.xpath('./default:sliver', namespaces=self.namespaces)
+            slivers = SFAv1Sliver.get_slivers(node.element)
             if slivers is not None and isinstance(slivers, list) and len(slivers) > 0:
                 sliver = slivers[0]
             if slivers is not None and isinstance(slivers, list) and len(slivers) > 0:
                 sliver = slivers[0]
-                attribs = SFAv1Sliver.get_sliver_attributes(sliver)
+                attribs = SFAv1Sliver.get_sliver_attributes(sliver.element)
         return attribs
 
         return attribs
 
-    def remove_sliver_attribute(self, hostname, name, value, network=None):
-        attribs = self.get_sliver_attributes(hostname)
+    def remove_sliver_attribute(self, component_id, name, value, network=None):
+        attribs = self.get_sliver_attributes(component_id)
         for attrib in attribs:
         for attrib in attribs:
-            if attrib['tagname'] == name and attrib['value'] == value:
-                attrib.element.delete()
+            if attrib['name'] == name and attrib['value'] == value:
+                # attrib.element.delete()
+                parent = attrib.element.getparent()
+                parent.remove(attrib.element)
 
     def add_default_sliver_attribute(self, name, value, network=None):
         if network:
 
     def add_default_sliver_attribute(self, name, value, network=None):
         if network:
-            defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
+            defaults = self.xml.xpath(
+                "//network[@name='%s']/sliver_defaults" % network)
         else:
         else:
-            defaults = self.xml.xpath("//sliver_defaults" % network)
-        if not defaults :
-            network_tag = self.xml.xpath("//network[@name='%s']" % network)
+            defaults = self.xml.xpath("//sliver_defaults")
+        if not defaults:
+            if network:
+                network_tag = self.xml.xpath("//network[@name='%s']" % network)
+            else:
+                network_tag = self.xml.xpath("//network")
             if isinstance(network_tag, list):
                 network_tag = network_tag[0]
             if isinstance(network_tag, list):
                 network_tag = network_tag[0]
-            defaults = self.xml.add_element('sliver_defaults', attrs={}, parent=network_tag)
+            defaults = network_tag.add_element('sliver_defaults')
         elif isinstance(defaults, list):
             defaults = defaults[0]
         elif isinstance(defaults, list):
             defaults = defaults[0]
-        self.xml.add_attribute(defaults, name, value)
+        SFAv1Sliver.add_sliver_attribute(defaults, name, value)
 
     def get_default_sliver_attributes(self, network=None):
         if network:
 
     def get_default_sliver_attributes(self, network=None):
         if network:
-            defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
+            defaults = self.xml.xpath(
+                "//network[@name='%s']/sliver_defaults" % network)
         else:
             defaults = self.xml.xpath("//sliver_defaults")
         else:
             defaults = self.xml.xpath("//sliver_defaults")
-        if not defaults: return []
-        return self.attributes_list_thierry(defaults)
-    
+        if not defaults:
+            return []
+        return SFAv1Sliver.get_sliver_attributes(defaults[0])
+
     def remove_default_sliver_attribute(self, name, value, network=None):
     def remove_default_sliver_attribute(self, name, value, network=None):
-        if network:
-            defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
-        else:
-            defaults = self.xml.xpath("//sliver_defaults" % network)
-        self.xml.remove_attribute(defaults, name, value)
+        attribs = self.get_default_sliver_attributes(network)
+        for attrib in attribs:
+            if attrib['name'] == name and attrib['value'] == value:
+                # attrib.element.delete()
+                parent = attrib.element.getparent()
+                parent.remove(attrib.element)
 
     # Links
 
 
     # Links
 
@@ -169,12 +180,12 @@ class SFAv1(BaseVersion):
         return PGv2Link.get_links(self.xml)
 
     def get_link_requests(self):
         return PGv2Link.get_links(self.xml)
 
     def get_link_requests(self):
-        return PGv2Link.get_link_requests(self.xml) 
+        return PGv2Link.get_link_requests(self.xml)
 
     def add_links(self, links):
         networks = self.get_networks()
         if len(networks) > 0:
 
     def add_links(self, links):
         networks = self.get_networks()
         if len(networks) > 0:
-            xml = networks[0]
+            xml = networks[0].element
         else:
             xml = self.xml
         PGv2Link.add_links(xml, links)
         else:
             xml = self.xml
         PGv2Link.add_links(xml, links)
@@ -189,6 +200,9 @@ class SFAv1(BaseVersion):
         Merge contents for specified rspec with current rspec
         """
 
         Merge contents for specified rspec with current rspec
         """
 
+        if not in_rspec:
+            return
+
         from sfa.rspecs.rspec import RSpec
         if isinstance(in_rspec, RSpec):
             rspec = in_rspec
         from sfa.rspecs.rspec import RSpec
         if isinstance(in_rspec, RSpec):
             rspec = in_rspec
@@ -208,9 +222,25 @@ class SFAv1(BaseVersion):
                 self.xml.append(network.element)
                 current_networks.append(current_network)
 
                 self.xml.append(network.element)
                 current_networks.append(current_network)
 
+    # Leases
+
+    def get_leases(self, filter=None):
+        return SFAv1Lease.get_leases(self.xml, filter)
+
+    def add_leases(self, leases, network=None, no_dupes=False):
+        SFAv1Lease.add_leases(self.xml, leases)
+
+    # Spectrum
+
+    def get_channels(self, filter=None):
+        return []
+
+    def add_channels(self, channels, network=None, no_dupes=False):
+        pass
+
 if __name__ == '__main__':
     from sfa.rspecs.rspec import RSpec
     from sfa.rspecs.rspec_elements import *
     r = RSpec('/tmp/resources.rspec')
     r.load_rspec_elements(SFAv1.elements)
 if __name__ == '__main__':
     from sfa.rspecs.rspec import RSpec
     from sfa.rspecs.rspec_elements import *
     r = RSpec('/tmp/resources.rspec')
     r.load_rspec_elements(SFAv1.elements)
-    print r.get(RSpecElements.NODE)
+    print(r.get(RSpecElements.NODE))