cleanup
[sfa.git] / sfa / planetlab / plslices.py
index 4d23ff2..9405af0 100644 (file)
@@ -10,7 +10,6 @@ from sfa.planetlab.vlink import VLink
 from sfa.planetlab.topology import Topology
 from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname, top_auth, hash_loginbase
 from sfa.storage.model import SliverAllocation
-from sfa.storage.alchemy import dbsession
 
 MAXINT =  2L**31-1
 
@@ -126,27 +125,6 @@ class PlSlices:
 
         return slivers
  
-    def get_peer(self, xrn):
-        hrn, type = urn_to_hrn(xrn)
-        # Becaues of myplc federation,  we first need to determine if this
-        # slice belongs to out local plc or a myplc peer. We will assume it 
-        # is a local site, unless we find out otherwise  
-        peer = None
-
-        # get this slice's authority (site)
-        slice_authority = get_authority(hrn)
-
-        # get this site's authority (sfa root authority or sub authority)
-        site_authority = get_authority(slice_authority).lower()
-
-        # check if we are already peered with this site_authority, if so
-        peers = self.driver.shell.GetPeers({}, ['peer_id', 'peername', 'shortname', 'hrn_root'])
-        for peer_record in peers:
-            names = [name.lower() for name in peer_record.values() if isinstance(name, StringTypes)]
-            if site_authority in names:
-                peer = peer_record
-
-        return peer
 
     def get_sfa_peer(self, xrn):
         hrn, type = urn_to_hrn(xrn)
@@ -161,7 +139,7 @@ class PlSlices:
 
         return sfa_peer
 
-    def verify_slice_leases(self, slice, rspec_requested_leases, peer):
+    def verify_slice_leases(self, slice, rspec_requested_leases):
 
         leases = self.driver.shell.GetLeases({'name':slice['name'], 'clip':int(time.time())}, ['lease_id','name', 'hostname', 't_from', 't_until'])
         grain = self.driver.shell.GetLeaseGranularity()
@@ -215,8 +193,6 @@ class PlSlices:
    
 
         try:
-            if peer:
-                self.driver.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname'])
             self.driver.shell.DeleteLeases(deleted_leases_id)
             for lease in added_leases:
                 self.driver.shell.AddLeases(lease['hostname'], slice['name'], lease['t_from'], lease['t_until'])
@@ -227,7 +203,7 @@ class PlSlices:
         return leases
 
 
-    def verify_slice_nodes(self, slice_urn, slice, rspec_nodes, peer):
+    def verify_slice_nodes(self, slice_urn, slice, rspec_nodes):
         
         slivers = {}
         for node in rspec_nodes:
@@ -251,8 +227,6 @@ class PlSlices:
         added_nodes = list(set(slivers.keys()).difference(current_slivers))        
 
         try:
-            if peer:
-                self.driver.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname'])
             self.driver.shell.AddSliceToNodes(slice['name'], added_nodes)
             self.driver.shell.DeleteSliceFromNodes(slice['name'], deleted_nodes)
             
@@ -272,7 +246,7 @@ class PlSlices:
                                       component_id=component_id,
                                       slice_urn = slice_urn, 
                                       allocation_state='geni_allocated')      
-            record.sync()
+            record.sync(self.driver.api.dbsession())
         return resulting_nodes
 
     def free_egre_key(self):
@@ -326,63 +300,31 @@ class PlSlices:
         for link in requested_links:
             # get the ip address of the first node in the link
             ifname1 = Xrn(link['interface1']['component_id']).get_leaf()
-            ifname_parts = ifname1.split(':')
-            node_raw = ifname_parts[0]
-            device = None
-            if len(ifname_parts) > 1:
-                device = ifname_parts[1] 
-            node_id = int(node_raw.replace('node', ''))
-            node = nodes_dict[node_id]
-            if1 = interfaces_dict[node['interface_ids'][0]]
-            ipaddr = if1['ip']
-            topo_rspec = VLink.get_topo_rspec(link, ipaddr)
-            # set topo_rspec tag
-            slice_tags.append({'name': 'topo_rspec', 'value': str([topo_rspec]), 'node_id': node_id})
-            # set vini_topo tag
-            slice_tags.append({'name': 'vini_topo', 'value': 'manual', 'node_id': node_id})
-            #self.driver.shell.AddSliceTag(slice['name'], 'topo_rspec', str([topo_rspec]), node_id) 
+
+            if ifname1:
+                ifname_parts = ifname1.split(':')
+                node_raw = ifname_parts[0]
+                device = None
+                if len(ifname_parts) > 1:
+                    device = ifname_parts[1] 
+                node_id = int(node_raw.replace('node', ''))
+                node = nodes_dict[node_id]
+                if1 = interfaces_dict[node['interface_ids'][0]]
+                ipaddr = if1['ip']
+                topo_rspec = VLink.get_topo_rspec(link, ipaddr)
+                # set topo_rspec tag
+                slice_tags.append({'name': 'topo_rspec', 'value': str([topo_rspec]), 'node_id': node_id})
+                # set vini_topo tag
+                slice_tags.append({'name': 'vini_topo', 'value': 'manual', 'node_id': node_id})
+                #self.driver.shell.AddSliceTag(slice['name'], 'topo_rspec', str([topo_rspec]), node_id) 
 
         self.verify_slice_attributes(slice, slice_tags, {'append': True}, admin=True)
                         
         
 
-    def handle_peer(self, site, slice, persons, peer):
-        if peer:
-            # bind site
-            try:
-                if site:
-                    self.driver.shell.BindObjectToPeer('site', site['site_id'], peer['shortname'], slice['site_id'])
-            except Exception,e:
-                self.driver.shell.DeleteSite(site['site_id'])
-                raise e
-            
-            # bind slice
-            try:
-                if slice:
-                    self.driver.shell.BindObjectToPeer('slice', slice['slice_id'], peer['shortname'], slice['slice_id'])
-            except Exception,e:
-                self.driver.shell.DeleteSlice(slice['slice_id'])
-                raise e 
-
-            # bind persons
-            for person in persons:
-                try:
-                    self.driver.shell.BindObjectToPeer('person', 
-                                                     person['person_id'], peer['shortname'], person['peer_person_id'])
-
-                    for (key, remote_key_id) in zip(person['keys'], person['key_ids']):
-                        try:
-                            self.driver.shell.BindObjectToPeer( 'key', key['key_id'], peer['shortname'], remote_key_id)
-                        except:
-                            self.driver.shell.DeleteKey(key['key_id'])
-                            logger("failed to bind key: %s to peer: %s " % (key['key_id'], peer['shortname']))
-                except Exception,e:
-                    self.driver.shell.DeletePerson(person['person_id'])
-                    raise e       
-
-        return slice
-
-    def verify_site(self, slice_xrn, slice_record={}, peer=None, sfa_peer=None, options={}):
+    def verify_site(self, slice_xrn, slice_record=None, sfa_peer=None, options=None):
+        if slice_record is None: slice_record={}
+        if options is None: options={}
         (slice_hrn, type) = urn_to_hrn(slice_xrn)
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
@@ -390,6 +332,13 @@ class PlSlices:
             login_base = slice_hrn.split('.')[-2][:12]
         else:
             login_base = hash_loginbase(site_hrn)
+        #plxrn = PlXrn(xrn=slice_xrn)
+        #slice_hrn = plxrn.get_hrn()
+        #type = plxrn.get_type()
+        #site_hrn = plxrn.get_authority_hrn()
+        #authority_name = plxrn.pl_authname()
+        #slicename = plxrn.pl_slicename()
+        #login_base = plxrn.pl_login_base()
 
         sites = self.driver.shell.GetSites({'peer_id': None},['site_id','name','abbreviated_name','login_base','hrn'])
 
@@ -420,7 +369,8 @@ class PlSlices:
         return site
 
 
-    def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, expiration, options={}):
+    def verify_slice(self, slice_hrn, slice_record, sfa_peer, expiration, options=None):
+        if options is None: options={}
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
@@ -428,18 +378,29 @@ class PlSlices:
             login_base = slice_hrn.split('.')[-2][:12]
         else:
             login_base = hash_loginbase(site_hrn)
-
-
         slice_name = '_'.join([login_base, slice_part])
+        #plxrn = PlXrn(xrn=slice_hrn)
+        #slice_hrn = plxrn.get_hrn()
+        #type = plxrn.get_type()
+        #site_hrn = plxrn.get_authority_hrn()
+        #authority_name = plxrn.pl_authname()
+        #slicename = plxrn.pl_slicename()
+        #login_base = plxrn.pl_login_base()
 
         slices = self.driver.shell.GetSlices({'peer_id': None},['slice_id','name','hrn'])
         # Filter slices by HRN
         slice_exists = [slice for slice in slices if slice['hrn'] == slice_hrn]
         expires = int(datetime_to_epoch(utcparse(expiration)))
         if not slice_exists:
+            if slice_record:
+                url = slice_record.get('url', slice_hrn)
+                description = slice_record.get('description', slice_hrn)
+            else:
+                url = slice_hrn
+                description = slice_hrn
             slice = {'name': slice_name,
-                     'url': slice_record.get('url', slice_hrn),
-                     'description': slice_record.get('description', slice_hrn)}
+                     'url': url,
+                     'description': description}
             # add the slice                          
             slice['slice_id'] = self.driver.shell.AddSlice(slice)
             # set the slice HRN
@@ -452,13 +413,14 @@ class PlSlices:
         else:
             slice = slice_exists[0]
             #Update expiration if necessary
-            if slice['expires'] != expires:
+            if slice.get('expires', None) != expires:
                 self.driver.shell.UpdateSlice( int(slice['slice_id']), {'expires' : expires})
 
         return self.driver.shell.GetSlices(int(slice['slice_id']))[0]
 
 
-    def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, options={}):
+    def verify_persons(self, slice_hrn, slice_record, users, sfa_peer, options=None):
+        if options is None: options={}
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
@@ -475,8 +437,10 @@ class PlSlices:
         slice_name = '_'.join([login_base, slice_part])
 
         persons = self.driver.shell.GetPersons({'peer_id': None},['person_id','email','hrn'])
-        site = self.driver.shell.GetSites({'peer_id': None, 'login_base': login_base})[0]
-        slice = self.driver.shell.GetSlices({'peer_id': None, 'name': slice_name})[0]
+        sites = self.driver.shell.GetSites({'peer_id': None}, ['node_ids', 'site_id', 'name', 'person_ids', 'slice_ids', 'login_base', 'hrn'])
+        site = [site for site in sites if site['hrn'] == site_hrn][0]
+        slices = self.driver.shell.GetSlices({'peer_id': None}, ['slice_id', 'node_ids', 'person_ids', 'expires', 'site_id', 'name', 'hrn'])
+        slice = [slice for slice in slices if slice['hrn'] == slice_hrn][0]
         slice_persons = self.driver.shell.GetPersons({'peer_id': None, 'person_id': slice['person_ids']},['person_id','email','hrn'])
 
         persons_by_hrn = {}
@@ -496,13 +460,15 @@ class PlSlices:
 
         persons_to_verify_keys = {}
 
+        slice_id = slice['slice_id']
+
         # Add persons or add persons to slice
         for person_hrn in persons_to_add:
-             person_email = users_by_hrn[person_hrn].get('email', None)
+             person_email = users_by_hrn[person_hrn].get('email', "%s@geni.net"%person_hrn.split('.')[-1])
              if person_email and person_email in persons_by_email.keys():
                  # check if the user already exist in PL
                  person_id = persons_by_email[person_email]['person_id']
-                 self.driver.shell.AddPersonToSlice(person_id, slice['slice_id'])
+                 self.driver.shell.AddPersonToSlice(person_id, slice_id)
                  persons_to_verify_keys[person_id] = users_by_hrn[person_hrn]
 
              else:
@@ -510,15 +476,16 @@ class PlSlices:
                            'first_name': person_hrn,
                            'last_name': person_hrn,
                            'email': users_by_hrn[person_hrn].get('email', "%s@geni.net"%person_hrn.split('.')[-1]),
-                           'enabled': True
                           }
 
                  person_id = self.driver.shell.AddPerson(person)
                  self.driver.shell.AddRoleToPerson('user', int(person_id))
-                 self.driver.shell.SetPersonHrn(int(person_id), person_hrn)
+                 # enable the account 
+                 self.driver.shell.UpdatePerson(int(person_id), {'enabled': True})
                  self.driver.shell.SetPersonSfaCreated(int(person_id), 'True')
                  self.driver.shell.AddPersonToSite(int(person_id), site['site_id'])
-                 self.driver.shell.AddPersonToSlice(int(person_id), slice['slice_id'])
+                 self.driver.shell.AddPersonToSlice(int(person_id), slice_id)
+                 self.driver.shell.SetPersonHrn(int(person_id), person_hrn)
 
                  # Add keys
                  for key in users_by_hrn[person_hrn].get('keys', []):
@@ -529,7 +496,6 @@ class PlSlices:
         # Delete persons from slice     
         for person_hrn in persons_to_delete:
              person_id = slice_persons_by_hrn[person_hrn].get('person_id')
-             slice_id = slice['slice_id']
              self.driver.shell.DeletePersonFromSlice(person_id, slice_id)
 
 
@@ -538,12 +504,13 @@ class PlSlices:
              person_id = slice_persons_by_hrn[person_hrn].get('person_id')
              persons_to_verify_keys[person_id] = users_by_hrn[person_hrn]
 
-        self.verify_keys(persons_to_verify_keys, peer, options)
+        self.verify_keys(persons_to_verify_keys, options)
 
         return persons_to_add
 
 
-    def verify_keys(self, persons_to_verify_keys, peer, options={}):
+    def verify_keys(self, persons_to_verify_keys, options=None):
+        if options is None: options={}
         # we only add keys that comes from sfa to persons in PL
         for person_id in persons_to_verify_keys:
              person_sfa_keys = persons_to_verify_keys[person_id].get('keys', [])
@@ -557,7 +524,8 @@ class PlSlices:
                   self.driver.shell.AddPersonKey(int(person_id), key)
 
 
-    def verify_slice_attributes(self, slice, requested_slice_attributes, options={}, admin=False):
+    def verify_slice_attributes(self, slice, requested_slice_attributes, options=None, admin=False):
+        if options is None: options={}
         append = options.get('append', True)
         # get list of attributes users ar able to manage
         filter = {'category': '*slice*'}