added getCredentialFromReistry() method
[sfa.git] / geni / aggregate.py
index da26cf6..343f1eb 100644 (file)
@@ -4,6 +4,7 @@ import datetime
 import time
 import xmlrpclib
 
 import time
 import xmlrpclib
 
+from types import StringTypes, ListType
 from geni.util.geniserver import GeniServer
 from geni.util.geniclient import *
 from geni.util.cert import Keypair, Certificate
 from geni.util.geniserver import GeniServer
 from geni.util.geniclient import *
 from geni.util.cert import Keypair, Certificate
@@ -68,7 +69,7 @@ class Aggregate(GeniServer):
 
         self.connectPLC()
         self.connectRegistry()
 
         self.connectPLC()
         self.connectRegistry()
-        #self.loadCredential()
+        self.loadCredential()
 
     def connectRegistry(self):
         """
 
     def connectRegistry(self):
         """
@@ -77,7 +78,7 @@ class Aggregate(GeniServer):
         # connect to registry using GeniClient
         address = self.config.GENI_REGISTRY_HOSTNAME
         port = self.config.GENI_REGISTRY_PORT
         # connect to registry using GeniClient
         address = self.config.GENI_REGISTRY_HOSTNAME
         port = self.config.GENI_REGISTRY_PORT
-        url = 'https://%(address)s:%(port)s' % locals()
+        url = 'http://%(address)s:%(port)s' % locals()
         self.registry = GeniClient(url, self.key_file, self.cert_file)
 
     
         self.registry = GeniClient(url, self.key_file, self.cert_file)
 
     
@@ -114,25 +115,29 @@ class Aggregate(GeniServer):
         Attempt to load credential from file if it exists. If it doesnt get 
         credential from registry.
         """ 
         Attempt to load credential from file if it exists. If it doesnt get 
         credential from registry.
         """ 
-
-        self_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".cred"
-        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         
         # see if this file exists
         
         # see if this file exists
+        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         try:
         try:
-            cred = Credential(filename = ma_cred_filename, subject=self.hrn)
-            self.credential = cred.save_to_string()
+            self.credential = Credential(filename = ma_cred_filename)
         except IOError:
             # get self credential
         except IOError:
             # get self credential
-            self_cred = self.registry.get_credential(None, 'ma', self.hrn)
-            self_credential = Credential(string = self_cred)
-            self_credential.save_to_file(self_cred_filename)
+            self.credential = self.getCredentialFromRegistry()
+
+    def getCredentialFromRegistry(self):
+        """
+        Get our current credential from the registry
+        """
+        # get self credential
+        self_cred_filename = self.server_basedir + os.sep + "agg." + 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)
-            ma_credential = Credential(string = ma_cred)
-            ma_credential.save_to_file(ma_cred_filename)
-            self.credential = ma_cred
+        # get ma credential
+        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
+        ma_cred = self.registry.get_credential(self_cred, 'ma', self.hrn)
+        ma_cred.save_to_file(ma_cred_filename, save_parents=True)
+        return ma_cred
 
     def hostname_to_hrn(self, login_base, hostname):
         """
 
     def hostname_to_hrn(self, login_base, hostname):
         """
@@ -151,54 +156,35 @@ class Aggregate(GeniServer):
     def refresh_components(self):
         """
         Update the cached list of nodes and save in 4 differnt formats
     def refresh_components(self):
         """
         Update the cached list of nodes and save in 4 differnt formats
-        (rspec, dns, ip, hrn)
+        (rspec, dns, ip)
         """
 
         """
 
-        node_details = {}
         # get node list in rspec format
         rspec = Rspec()
         rspec.parseString(self.get_rspec(self.hrn, 'aggregate'))
         # get node list in rspec format
         rspec = Rspec()
         rspec.parseString(self.get_rspec(self.hrn, 'aggregate'))
+        
         # filter nodes according to policy
         rspec.filter('NodeSpec', 'name', blacklist=self.policy['blacklist'], whitelist=self.policy['whitelist'])
         # filter nodes according to policy
         rspec.filter('NodeSpec', 'name', blacklist=self.policy['blacklist'], whitelist=self.policy['whitelist'])
-        # extract ifspec info to get ip's
+        
+        # extract ifspecs from rspec to get ip's
         ips = []
         ifspecs = rspec.getDictsByTagName('IfSpec')
         for ifspec in ifspecs:
             if ifspec.has_key('addr') and ifspec['addr']:
                 ips.append(ifspec['addr']) 
 
         ips = []
         ifspecs = rspec.getDictsByTagName('IfSpec')
         for ifspec in ifspecs:
             if ifspec.has_key('addr') and ifspec['addr']:
                 ips.append(ifspec['addr']) 
 
-        # resolve component hostnames 
-        nodes = self.shell.GetNodes(self.auth, {}, ['hostname', 'site_id', 'slice_ids_whitelist'])
-    
-        # resolve site login_bases
-        site_ids = [node['site_id'] for node in nodes]
-        sites = self.shell.GetSites(self.auth, site_ids, ['site_id', 'login_base'])
-        site_dict = {}
-        for site in sites:
-            site_dict[site['site_id']] = site['login_base']
-
-        # filter nodes according to policy policy
-        # filter nodes with whitelist
-        # convert plc names to geni hrn
-        nodedict = {}
-        for node in nodes:
-            node_hrn = self.hostname_to_hrn(site_dict[node['site_id']], node['hostname'])
-            # filter nodes with a whitelist
-            if node.has_key('slice_ids_whitelist') and node['slice_ids_whitelist']:
-                continue
-            # Do not allow nodes not found in whitelist policy
-            if self.policy['whitelist'] and node_hrn not in self.polciy['whitelist']:
-                continue
-            # Do not allow nodes found in blacklist policy
-            if self.policy['blacklist'] and node_hrn in self.policy['blacklist']:
-                continue
-            nodedict[node_hrn] = node['hostname']
+        # extract nodespecs from rspec to get dns names
+        hostnames = []
+        nodespecs = rspec.getDictsByTagName('NodeSpec')
+        for nodespec in nodespecs:
+            if nodespec.has_key('name') and nodespec['name']:
+                hostnames.append(nodespec['name'])
 
         
 
         
+        node_details = {}
         node_details['rspec'] = rspec.toxml()
         node_details['rspec'] = rspec.toxml()
-        node_details['hrn'] = nodedict.keys()
-        node_details['dns'] = nodedict.values()
         node_details['ip'] = ips
         node_details['ip'] = ips
+        node_details['dns'] = hostnames
         # save state 
         self.nodes = SimpleStorage(self.nodes.db_filename, node_details)
         self.nodes.write()
         # save state 
         self.nodes = SimpleStorage(self.nodes.db_filename, node_details)
         self.nodes.write()
@@ -268,6 +254,8 @@ class Aggregate(GeniServer):
         # Get the required nodes
         if type in ['aggregate']:
             nodes = self.shell.GetNodes(self.auth)
         # Get the required nodes
         if type in ['aggregate']:
             nodes = self.shell.GetNodes(self.auth)
+            try:  linkspecs = self.shell.GetLinkSpecs() # if call is supported
+            except:  linkspecs = []
         elif type in ['slice']:
             slicename = hrn_to_pl_slicename(hrn)
             slices = self.shell.GetSlices(self.auth, [slicename])
         elif type in ['slice']:
             slicename = hrn_to_pl_slicename(hrn)
             slices = self.shell.GetSlices(self.auth, [slicename])
@@ -308,7 +296,11 @@ class Aggregate(GeniServer):
         duration = end_time - start_time
 
         # create the plc dict
         duration = end_time - start_time
 
         # create the plc dict
-        networks = [{'nodes': nodes, 'name': self.hrn, 'start_time': start_time, 'duration': duration}] 
+        networks = [{'nodes': nodes, 
+                        'name': self.hrn, 
+                        'start_time': start_time, 
+                        'duration': duration, 
+                        'links': linkspecs}] 
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
 
         # convert the plc dict to an rspec dict
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
 
         # convert the plc dict to an rspec dict
@@ -355,20 +347,50 @@ class Aggregate(GeniServer):
         self.slices.write()
         
         # Get slice info
         self.slices.write()
         
         # Get slice info
+        # if slice doesnt exist add it
         slicename = hrn_to_pl_slicename(slice_hrn)
         slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids'])
         if not slices:
         slicename = hrn_to_pl_slicename(slice_hrn)
         slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids'])
         if not slices:
-            raise RecordNotFound(slice_hrn)
-        slice = slices[0]
+            parts = slicename.split("_")
+            login_base = parts[0]
+            slice_record = self.registry.resolve(self.cred, slice_hrn)
+            slice_info = slice_record.as_dict()
+            slice = slice_info['pl_info']
+            
+            # if site doesnt exist add it
+            sites = self.shell.GetSites(self.auth, [login_base])
+            if not sites:
+                authority = get_authority(slice_hrn)
+                site_record = self.registry.reolve(self.cred, authority) 
+                site_info = site_record.as_dict()
+                site = site_info['pl_info']
+
+                # add the site
+                site.pop('site_id')
+                site_id = self.shell.AddSite(self.auth, site)
+
+            # add the slice
+            self.shell.AddSlice(self.auth, slice_info)
+            
+            # add the slice users
+            
+        else:    
+            slice = slices[0]
+
 
         # find out where this slice is currently running
 
         # find out where this slice is currently running
-        nodes = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname'])
-        hostnames = [node['hostname'] for node in nodes]
+        nodelist = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname'])
+        hostnames = [node['hostname'] for node in nodelist]
 
         # get netspec details
         nodespecs = spec.getDictsByTagName('NodeSpec')
 
         # get netspec details
         nodespecs = spec.getDictsByTagName('NodeSpec')
-        nodes = [nodespec['name'] for nodespec in nodespecs]    
-       
+        nodes = []
+        for nodespec in nodespecs:
+            if isinstance(nodespec['name'], list):
+                nodes.extend(nodespec['name'])
+            elif isinstance(nodespec['name'], StringTypes):
+                nodes.append(nodespec['name'])
+                
         # save slice state locally
         # we can assume that spec object has been validated so its safer to 
         # save this instead of the unvalidated rspec the user gave us
         # save slice state locally
         # we can assume that spec object has been validated so its safer to 
         # save this instead of the unvalidated rspec the user gave us
@@ -383,15 +405,10 @@ class Aggregate(GeniServer):
         self.shell.AddSliceToNodes(self.auth, slicename, added_nodes)
         self.shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes)
 
         self.shell.AddSliceToNodes(self.auth, slicename, added_nodes)
         self.shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes)
 
-        for attribute in attributes:
-            type, value, node, nodegroup = attribute['type'], attribute['value'], attribute['node'], attribute['nodegroup']
-            self.shell.AddSliceAttribute(self.auth, slicename, type, value, node, nodegroup)
-    
         # contact registry to get slice users and add them to the slice
         #slice_record = self.registry.resolve(self.credential, slice_hrn)
         # persons = slice_record['users']
         # contact registry to get slice users and add them to the slice
         #slice_record = self.registry.resolve(self.credential, slice_hrn)
         # persons = slice_record['users']
-        
-        #for person in persons:
+        # for perosn in persons:
         #    shell.AddPersonToSlice(person['email'], slice_name)
         return 1
 
         #    shell.AddPersonToSlice(person['email'], slice_name)
         return 1