Merge branch 'master' into senslab2
[sfa.git] / sfa / plc / plaggregate.py
index 4cc2c55..55e6291 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, urn_to_sliver_id
-from sfa.util.sfatime import epochparse
+from sfa.util.sfatime import utcparse, datetime_to_string
 from sfa.util.sfalogging import logger
 
 from sfa.rspecs.rspec import RSpec
@@ -27,13 +27,13 @@ class PlAggregate:
  
     def get_sites(self, filter={}):
         sites = {}
-        for site in self.driver.GetSites(filter):
+        for site in self.driver.shell.GetSites(filter):
             sites[site['site_id']] = site
         return sites
 
     def get_interfaces(self, filter={}):
         interfaces = {}
-        for interface in self.driver.GetInterfaces(filter):
+        for interface in self.driver.shell.GetInterfaces(filter):
             iface = Interface()
             if interface['bwlimit']:
                 interface['bwlimit'] = str(int(interface['bwlimit'])/1000)
@@ -85,14 +85,14 @@ class PlAggregate:
 
     def get_node_tags(self, filter={}):
         node_tags = {}
-        for node_tag in self.driver.GetNodeTags(filter):
+        for node_tag in self.driver.shell.GetNodeTags(filter):
             node_tags[node_tag['node_tag_id']] = node_tag
         return node_tags
 
     def get_pl_initscripts(self, filter={}):
         pl_initscripts = {}
         filter.update({'enabled': True})
-        for initscript in self.driver.GetInitScripts(filter):
+        for initscript in self.driver.shell.GetInitScripts(filter):
             pl_initscripts[initscript['initscript_id']] = initscript
         return pl_initscripts
 
@@ -108,7 +108,7 @@ class PlAggregate:
         slice_urn = hrn_to_urn(slice_xrn, 'slice')
         slice_hrn, _ = urn_to_hrn(slice_xrn)
         slice_name = hrn_to_pl_slicename(slice_hrn)
-        slices = self.driver.GetSlices(slice_name)
+        slices = self.driver.shell.GetSlices(slice_name)
         if not slices:
             return (slice, slivers)
         slice = slices[0]
@@ -122,12 +122,13 @@ class PlAggregate:
             slivers[node_id]= sliver
 
         # sort sliver attributes by node id    
-        tags = self.driver.GetSliceTags({'slice_tag_id': slice['slice_tag_ids']})
+        tags = self.driver.shell.GetSliceTags({'slice_tag_id': slice['slice_tag_ids']})
         for tag in tags:
             # most likely a default/global sliver attribute (node_id == None)
             if tag['node_id'] not in slivers:
                 sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], ""),
-                                 'name': 'plab-vserver',
+                                 'name': slice['name'],
+                                 'type': 'plab-vserver',
                                  'tags': []})
                 slivers[tag['node_id']] = sliver
             slivers[tag['node_id']]['tags'].append(tag)
@@ -135,6 +136,11 @@ class PlAggregate:
         return (slice, slivers)
 
     def get_nodes_and_links(self, slice=None,slivers=[], options={}):
+        # if we are dealing with a slice that has no node just return 
+        # and empty list    
+        if slice is not None and not slice['node_ids']:
+            return ([],[])
+
         filter = {}
         tags_filter = {}
         if slice and 'node_ids' in slice and slice['node_ids']:
@@ -146,7 +152,7 @@ class PlAggregate:
             filter['boot_state'] = 'boot'     
         
         filter.update({'peer_id': None})
-        nodes = self.driver.GetNodes(filter)
+        nodes = self.driver.shell.GetNodes(filter)
        
         site_ids = []
         interface_ids = []
@@ -183,10 +189,12 @@ class PlAggregate:
             rspec_node['component_name'] = node['hostname']
             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
             rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.hrn, site['login_base']), 'authority+sa')
-            rspec_node['boot_state'] = node['boot_state']
-            rspec_node['exclusive'] = 'False'
-            rspec_node['hardware_types']= [HardwareType({'name': 'plab-pc'}),
-                                           HardwareType({'name': 'pc'})]
+            # do not include boot state (<available> element) in the manifest rspec
+            if not slice:     
+                rspec_node['boot_state'] = node['boot_state']
+            rspec_node['exclusive'] = 'false'
+            rspec_node['hardware_types'] = [HardwareType({'name': 'plab-pc'}),
+                                            HardwareType({'name': 'pc'})]
             # only doing this because protogeni rspec needs
             # to advertise available initscripts 
             rspec_node['pl_initscripts'] = pl_initscripts.values()
@@ -194,7 +202,7 @@ class PlAggregate:
             # assumes that sites, interfaces and tags have already been prepared.
             site = sites_dict[node['site_id']]
             if site['longitude'] and site['latitude']:  
-                location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
+                location = Location({'longitude': site['longitude'], 'latitude': site['latitude'], 'country': 'unknown'})
                 rspec_node['location'] = location
             rspec_node['interfaces'] = []
             if_count=0
@@ -219,7 +227,7 @@ class PlAggregate:
                 rspec_node['slivers'] = [sliver]
                 
                 # slivers always provide the ssh service
-                login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22'})
+                login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': sliver['name']})
                 service = Services({'login': login})
                 rspec_node['services'] = [service]
             rspec_nodes.append(rspec_node)
@@ -238,7 +246,7 @@ class PlAggregate:
         slice, slivers = self.get_slice_and_slivers(slice_xrn)
         rspec = RSpec(version=rspec_version, user_options=options)
         if slice and 'expires' in slice:
-            rspec.xml.set('expires',  epochparse(slice['expires']))
+            rspec.xml.set('expires',  datetime_to_string(utcparse(slice['expires'])))
 
         nodes, links = self.get_nodes_and_links(slice, slivers)
         rspec.version.add_nodes(nodes)