only add location if longitude and latitude are not null
[sfa.git] / sfa / plc / aggregate.py
index abd118f..18a5123 100644 (file)
@@ -1,17 +1,20 @@
 #!/usr/bin/python
-from sfa.util.xrn import hrn_to_urn, urn_to_hrn
-from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, urn_to_sliver_id
+from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id
+from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
 
 from sfa.rspecs.rspec import RSpec
 from sfa.rspecs.elements.hardware_type import HardwareType
+from sfa.rspecs.elements.node import Node
 from sfa.rspecs.elements.link import Link
 from sfa.rspecs.elements.login import Login
+from sfa.rspecs.elements.location import Location
 from sfa.rspecs.elements.interface import Interface
 from sfa.rspecs.elements.services import Services
 from sfa.rspecs.elements.pltag import PLTag
 from sfa.util.topology import Topology
 from sfa.rspecs.version_manager import VersionManager
 from sfa.plc.vlink import get_tc_rate
+from sfa.util.sfatime import epochparse
 
 class Aggregate:
 
@@ -36,14 +39,14 @@ class Aggregate:
             iface['interface_id'] = interface['interface_id']
             iface['node_id'] = interface['node_id']
             iface['ipv4'] = interface['ip']
-            iface['bwlimit'] = interface['bwlimit']
+            iface['bwlimit'] = str(int(interface['bwlimit'])/1000)
             interfaces[iface['interface_id']] = iface
         return interfaces
 
     def get_links(self, filter={}):
         
         if not self.api.config.SFA_AGGREGATE_TYPE.lower() == 'vini':
-            return
+            return []
 
         topology = Topology() 
         links = {}
@@ -114,7 +117,8 @@ class Aggregate:
         # sort slivers by node id    
         for node_id in slice['node_ids']:
             sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], node_id),
-                             'name': 'plab-vserver', 
+                             'name': slice['name'],
+                             'type': 'plab-vserver', 
                              'tags': []})
             slivers[node_id]= sliver
 
@@ -131,10 +135,12 @@ class Aggregate:
         
         return (slice, slivers)
 
-    def get_nodes(self, slice=None):
+    def get_nodes (self, slice=None,slivers=[]):
         filter = {}
+        tags_filter = {}
         if slice and 'node_ids' in slice and slice['node_ids']:
             filter['node_id'] = slice['node_ids']
+            tags_filter=filter.copy()
         
         filter.update({'peer_id': None})
         nodes = self.api.driver.GetNodes(filter)
@@ -151,10 +157,8 @@ class Aggregate:
         sites_dict  = self.get_sites({'site_id': site_ids}) 
         # get interfaces
         interfaces = self.get_interfaces({'interface_id':interface_ids}) 
-        # get slivers
-        slivers = self.get_slivers(slice)
         # get tags
-        node_tags = self.get_node_tags({'node_id': node_ids})
+        node_tags = self.get_node_tags(tags_filter)
         # get initscripts
         pl_initscripts = self.get_pl_initscripts()
 
@@ -165,6 +169,9 @@ class Aggregate:
                 if not slice or slice['slice_id'] not in node['slice_ids_whitelist']:
                     continue
             rspec_node = Node()
+            # xxx how to retrieve site['login_base']
+            site_id=node['site_id']
+            site=sites_dict[site_id]
             rspec_node['component_id'] = hostname_to_urn(self.api.hrn, site['login_base'], node['hostname'])
             rspec_node['component_name'] = node['hostname']
             rspec_node['component_manager_id'] = self.api.hrn
@@ -174,17 +181,22 @@ class Aggregate:
             rspec_node['hardware_types'].append(HardwareType({'name': 'plab-vserver'}))
             # only doing this because protogeni rspec needs
             # to advertise available initscripts 
-            rspec_node['pl_initscripts'] = pl_initscripts
+            rspec_node['pl_initscripts'] = pl_initscripts.values()
              # add site/interface info to nodes.
             # assumes that sites, interfaces and tags have already been prepared.
             site = sites_dict[node['site_id']]
-            location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
-            rspec_node['location'] = location
+            if site['longitude'] and site['latitude']:  
+                location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
+                rspec_node['location'] = location
             rspec_node['interfaces'] = []
+            if_count=0
             for if_id in node['interface_ids']:
                 interface = Interface(interfaces[if_id]) 
-                interface['ipv4'] = interface['ip']
+                interface['ipv4'] = interface['ipv4']
+                interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count))
                 rspec_node['interfaces'].append(interface)
+                if_count+=1
+
             tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
             rspec_node['tags'] = tags
             if node['node_id'] in slivers:
@@ -192,7 +204,7 @@ class Aggregate:
                 sliver = slivers[node['node_id']]
                 rspec_node['sliver_id'] = sliver['sliver_id']
                 rspec_node['client_id'] = node['hostname']
-                rspec_node['slivers'] = [slivers[node['node_id']]]
+                rspec_node['slivers'] = [sliver]
                 
                 # slivers always provide the ssh service
                 login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], port:'22'})
@@ -213,7 +225,9 @@ class Aggregate:
 
         slice, slivers = self.get_slice_and_slivers(slice_xrn)
         rspec = RSpec(version=rspec_version, user_options=self.user_options)
-        rspec.version.add_nodes(self.get_nodes(slice, slivers))
+        if slice and 'expiration_date' in slice:
+            rspec.set('expires',  epochparse(slice['expiration_date'])) 
+        rspec.version.add_nodes(self.get_nodes(slice), slivers)
         rspec.version.add_links(self.get_links(slice))
         
         # add sliver defaults