Update instructions
[sfa.git] / geni / slicemgr.py
index 0a8b1e6..87fcc0f 100644 (file)
@@ -39,7 +39,7 @@ class SliceMgr(GeniServer):
     # @param key_file private key filename of registry
     # @param cert_file certificate filename containing public key (could be a GID file)     
 
-    def __init__(self, ip, port, key_file, cert_file, config = "/usr/share/geniwrapper/geni/util/geni_config"):
+    def __init__(self, ip, port, key_file, cert_file, config = os.getcwd() + "/geni/util/geni_config"):
         GeniServer.__init__(self, ip, port, key_file, cert_file)
         self.key_file = key_file
         self.cert_file = cert_file
@@ -58,7 +58,7 @@ class SliceMgr(GeniServer):
         self.nodes = SimpleStorage(nodes_file)
         self.nodes.load()
         
-        slices_file = os.sep.join([self.server_basedir, 'smgr' + self.hrn + '.slices'])
+        slices_file = os.sep.join([self.server_basedir, 'smgr.' + self.hrn + '.slices'])
         self.slices = SimpleStorage(slices_file)
         self.slices.load()
 
@@ -79,22 +79,29 @@ class SliceMgr(GeniServer):
         Attempt to load credential from file if it exists. If it doesnt get
         credential from registry.
         """
-
-        self_cred_filename = self.server_basedir + os.sep + "smgr." + self.hrn + ".cred"
-        ma_cred_filename = self.server_basedir + os.sep + "smgr." + self.hrn + ".sa.cred"
         
         # see if this file exists
+        ma_cred_filename = self.server_basedir + os.sep + "smgr." + self.hrn + ".sa.cred"
         try:
             self.credential = Credential(filename = ma_cred_filename)
         except IOError:
-            # get self credential
-            self_cred = self.registry.get_credential(None, 'ma', self.hrn)
-            self_cred.save_to_file(self_cred_filename, save_parents=True)
+            self.credential = self.getCrednetialFromRegistry()
+            
+        
+    def getCredentialFromRegistry(self):
+        """
+        Get our current credential from the registry.
+        """
+        # get self credential
+        self_cred_filename = self.server_basedir + os.sep + "smgr." + self.hrn + ".cred"
+        self_cred = self.registry.get_credential(None, 'ma', self.hrn)
+        self_cred.save_to_file(self_cred_filename, save_parents=True)
 
-            # get ma credential
-            ma_cred = self.registry.get_credential(self_cred, 'sa', self.hrn)
-            ma_cred.save_to_file(ma_cred_filename, save_parents=True)
-            self.credential = ma_cred
+        # get ma credential
+        ma_cred_filename = self.server_basedir + os.sep + "smgr." + self.hrn + ".sa.cred"
+        ma_cred = self.registry.get_credential(self_cred, 'sa', self.hrn)
+        ma_cred.save_to_file(ma_cred_filename, save_parents=True)
+        return ma_cred        
 
     def connectRegistry(self):
         """
@@ -195,17 +202,15 @@ class SliceMgr(GeniServer):
         for aggregate in aggregates:
             try:
                 # get the rspec from the aggregate
-                agg_server = self.aggregates[aggregate]
                 agg_rspec = self.aggregates[aggregate].list_nodes(self.credential)
-                
                 # extract the netspec from each aggregates rspec
                 rspec.parseString(agg_rspec)
-                networks.extend(rspec.getDictsByTagName('NetSpec'))
+                networks.extend([{'NetSpec': rspec.getDictsByTagName('NetSpec')}])
             except:
                 # XX print out to some error log
                 print "Error calling list nodes at aggregate %s" % aggregate
                 raise    
-   
+  
         # create the rspec dict
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
         resourceDict = {'Rspec': resources} 
@@ -247,9 +252,13 @@ class SliceMgr(GeniServer):
         Return a list of components managed by this slice manager.
         """
         # Reload components list
-        now = datetime.datetime.now()
-        if not self.nodes.has_key('threshold') or not self.nodes['threshold'] or not self.nodes.has_key('timestamp') or not self.nodes['timestamp'] or now > self.nodes['threshold']:
+        if not self.nodes.has_key('threshold') or not self.nodes['threshold'] or not self.nodes.has_key('timestamp') or not self.nodes['timestamp']:
             self.refresh_components()
+        else:
+            now = datetime.datetime.now()
+            threshold = datetime.datetime.fromtimestamp(time.mktime(time.strptime(self.nodes['threshold'], self.time_format)))
+            if  now > threshold:
+                self.refresh_components()
         return self.nodes[format]
    
      
@@ -274,34 +283,30 @@ class SliceMgr(GeniServer):
         Return the current rspec for the specified slice.
         """
 
-        if slice_hrn in self.slices.keys():
-            # check if we alreay have this slices state saved
-            return  self.slices[slice_hrn]
-        else:
-            # request this slices state from all known aggregates
-            rspec = Rspec()
-            rspecdicts = []
-            networks = []
-            for hrn in self.aggregates.keys():
-                # check if the slice has resources at this hrn
-                slice_resources = self.aggregates[hrn].get_resources(self.credential, slice_hrn)
-                rspec.parseString(slice_resources)
-                networks.extend(rspec.getDictsByTagName('NetSpec'))
+        # request this slices state from all known aggregates
+        rspec = Rspec()
+        rspecdicts = []
+        networks = []
+        for hrn in self.aggregates.keys():
+            # check if the slice has resources at this hrn
+            slice_resources = self.aggregates[hrn].get_resources(self.credential, slice_hrn)
+            rspec.parseString(slice_resources)
+            networks.extend({'NetSpec': rspec.getDictsByTagName('NetSpec')})
             
-            # merge all these rspecs into one
-            start_time = int(datetime.datetime.now().strftime("%s"))
-            end_time = start_time
-            duration = end_time - start_time
+        # merge all these rspecs into one
+        start_time = int(datetime.datetime.now().strftime("%s"))
+        end_time = start_time
+        duration = end_time - start_time
     
-            resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
-            resourceDict = {'Rspec': resources}
-            # convert rspec dict to xml
-            rspec.parseDict(resourceDict)
-            # save this slices resources
-            self.slices[slice_hrn] = rspec.toxml()
-            self.slices.write()
+        resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
+        resourceDict = {'Rspec': resources}
+        # convert rspec dict to xml
+        rspec.parseDict(resourceDict)
+        # save this slices resources
+        #self.slices[slice_hrn] = rspec.toxml()
+        #self.slices.write()
          
-            return rspec.toxml()
+        return rspec.toxml()
  
     def createSlice(self, cred, slice_hrn, rspec):
         """