PL driver: Fix verification of site, person and slice triggered by CreateSliver
authorMohamed Larabi <mohamed.larabi@inria.fr>
Fri, 4 Oct 2013 14:10:55 +0000 (16:10 +0200)
committerMohamed Larabi <mohamed.larabi@inria.fr>
Fri, 4 Oct 2013 14:10:55 +0000 (16:10 +0200)
PL driver: Get/Set the attribute HRN for Person, Node and Slice in MyPLC
PL driver: External PL site name starts with "sfa."
PL driver: Lease's slice_urn is built from HRN attribute of the slice in MyPLC

sfa/planetlab/plaggregate.py
sfa/planetlab/plshell.py
sfa/planetlab/plslices.py

index 09826f0..369ff87 100644 (file)
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn
+from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, get_authority, get_leaf
 from sfa.util.sfatime import utcparse, datetime_to_string
 from sfa.util.sfalogging import logger
 
@@ -108,9 +108,17 @@ class PlAggregate:
         slice = None
         if not slice_xrn:
             return (slice, slivers)
+
         slice_urn = hrn_to_urn(slice_xrn, 'slice')
         slice_hrn, _ = urn_to_hrn(slice_xrn)
-        slice_name = hrn_to_pl_slicename(slice_hrn)
+        site_hrn = get_authority(slice_hrn)
+        top_auth_hrn = site_hrn.split('.')[0]
+        if top_auth_hrn == self.driver.hrn:
+            slice_name = hrn_to_pl_slicename(slice_hrn)
+        else:
+            login_base = '8'.join(site_hrn.split('.'))
+            slice_name = '_'.join([login_base, get_leaf(slice_hrn)])
+
         slices = self.driver.shell.GetSlices(slice_name)
         if not slices:
             return (slice, slivers)
@@ -289,12 +297,16 @@ class PlAggregate:
             site=sites_dict[site_id]
 
             #rspec_lease['lease_id'] = lease['lease_id']
-            rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
+            rspec_lease['component_id'] = hrn_to_urn(self.driver.shell.GetNodeHrn(lease['hostname']), 'node')
+            #rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
             if slice_xrn:
                 slice_urn = slice_xrn
-                slice_hrn = urn_to_hrn(slice_urn)
+                slice_hrn, _ = urn_to_hrn(slice_urn)
+                # Check slice HRN
+                if slice_hrn != self.driver.shell.GetSliceHrn(lease['slice_id']):
+                    self.driver.shell.SetSliceHrn(lease['slice_id'], slice_hrn)
             else:
-                slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name'])
+                slice_hrn = self.driver.shell.GetSliceHrn(lease['slice_id'])
                 slice_urn = hrn_to_urn(slice_hrn, 'slice')
             rspec_lease['slice_id'] = slice_urn
             rspec_lease['start_time'] = lease['t_from']
index f42af88..15334db 100644 (file)
@@ -25,7 +25,10 @@ class PlShell:
                     'GetSites','GetNodes',
                     # Lease management methods
                     'GetLeases', 'GetLeaseGranularity', 'DeleteLeases','UpdateLeases',
-                    'AddLeases' 
+                    'AddLeases',
+                    # HRN management methods
+                    'SetPersonHrn', 'GetPersonHrn', 'SetSliceHrn', 'GetSliceHrn',
+                    'SetNodeHrn', 'GetNodeHrn' 
                     ]
     # support for other names - this is experimental
     alias_calls = { 'get_authorities':'GetSites',
index b16d5cf..a950037 100644 (file)
@@ -361,14 +361,20 @@ class PlSlices:
     def verify_site(self, slice_xrn, slice_record={}, peer=None, sfa_peer=None, options={}):
         (slice_hrn, type) = urn_to_hrn(slice_xrn)
         site_hrn = get_authority(slice_hrn)
-        # login base can't be longer than 20 characters
-        slicename = hrn_to_pl_slicename(slice_hrn)
-        authority_name = slicename.split('_')[0]
-        login_base = authority_name[:20]
+        top_auth_hrn = site_hrn.split('.')[0]
+        if top_auth_hrn == self.driver.hrn:
+            # login base can't be longer than 20 characters
+            slicename = hrn_to_pl_slicename(slice_hrn)
+            authority_name = slicename.split('_')[0]
+            login_base = authority_name[:20]
+        else:
+            login_base = '8'.join(site_hrn.split('.'))[:20]
+            authority_name = login_base
+
         sites = self.driver.shell.GetSites(login_base)
         if not sites:
             # create new site record
-            site = {'name': 'geni.%s' % authority_name,
+            site = {'name': 'sfa.%s' % authority_name,
                     'abbreviated_name': authority_name,
                     'login_base': login_base,
                     'max_slices': 100,
@@ -396,16 +402,26 @@ class PlSlices:
         return site        
 
     def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={}):
-        slicename = hrn_to_pl_slicename(slice_hrn)
-        parts = slicename.split("_")
-        login_base = parts[0]
-        slices = self.driver.shell.GetSlices([slicename]) 
+        site_hrn = get_authority(slice_hrn)
+        top_auth_hrn = site_hrn.split('.')[0]
+        if top_auth_hrn == self.driver.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+            parts = slicename.split("_")
+            login_base = parts[0]
+        else:
+            login_base = '8'.join(site_hrn.split('.'))
+            slice_name = '_'.join([login_base, slice_hrn.split('.')[-1]])
+            
+        slices = self.driver.shell.GetSlices([slice_name]) 
         if not slices:
-            slice = {'name': slicename,
+            slice = {'name': slice_name,
                      'url': slice_record.get('url', slice_hrn), 
                      'description': slice_record.get('description', slice_hrn)}
             # add the slice                          
             slice['slice_id'] = self.driver.shell.AddSlice(slice)
+            # set the slice HRN
+            self.driver.shell.SetSliceHrn(int(slice['slice_id']), slice_hrn)            
+
             slice['node_ids'] = []
             slice['person_ids'] = []
             if peer:
@@ -417,6 +433,10 @@ class PlSlices:
 #                self.registry.register_peer_object(self.credential, peer_dict)
         else:
             slice = slices[0]
+            # Check slice HRN
+            if self.driver.shell.GetSliceHrn(slice['slice_id']) != slice_hrn:
+                self.driver.shell.SetSliceHrn(slice['slice_id'], slice_hrn)
+
             if peer:
                 slice['peer_slice_id'] = slice_record.get('slice_id', None)
                 # unbind from peer so we can modify if necessary. Will bind back later
@@ -431,6 +451,19 @@ class PlSlices:
 
     #def get_existing_persons(self, users):
     def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, options={}):
+
+        site_hrn = get_authority(slice_hrn)
+        top_auth_hrn = site_hrn.split('.')[0]
+        if top_auth_hrn == self.driver.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+            parts = slicename.split("_")
+            login_base = parts[0]
+        else:
+            login_base = '8'.join(site_hrn.split('.'))
+            slice_name = '_'.join([login_base, slice_hrn.split('.')[-1]])
+
+
+
         users_by_email = {}
         users_by_site = defaultdict(list)
         users_dict = {} 
@@ -438,10 +471,17 @@ class PlSlices:
             user['urn'] = user['urn'].lower()
             hrn, type = urn_to_hrn(user['urn'])
             username = get_leaf(hrn)
-            login_base = PlXrn(xrn=user['urn']).pl_login_base()
             user['username'] = username
-            user['site'] = login_base
+             
+            site_hrn = get_authority(hrn)
+            top_auth_hrn = site_hrn.split('.')[0]            
 
+            if top_auth_hrn == self.driver.hrn:
+                login_base = PlXrn(xrn=user['urn']).pl_login_base()
+            else:
+                login_base = '8'.join(site_hrn.split('.'))
+
+            user['site'] = login_base
             if 'email' in user:
                 user['email'] = user['email'].lower() 
                 users_by_email[user['email']] = user
@@ -537,11 +577,16 @@ class PlSlices:
                 'first_name': added_user.get('first_name', hrn),
                 'last_name': added_user.get('last_name', hrn),
                 'email': added_user_id,
-                'peer_person_id': None,
-                'keys': [],
+                #'peer_person_id': None,
+                #'keys': [],
                 #'key_ids': added_user.get('key_ids', []),
             }
             person['person_id'] = self.driver.shell.AddPerson(person)
+            self.driver.shell.AddRoleToPerson('user', int(person['person_id']))
+            # check user HRN
+            if self.driver.shell.GetPersonHrn(int(person['person_id'])) != hrn:
+                self.driver.shell.SetPersonHrn(int(person['person_id']), hrn)
+
             if peer:
                 person['peer_person_id'] = added_user['person_id']
             added_persons.append(person)
@@ -555,6 +600,8 @@ class PlSlices:
             for key_string in added_user.get('keys', []):
                 key = {'key':key_string, 'key_type':'ssh'}
                 key['key_id'] = self.driver.shell.AddPersonKey(person['person_id'], key)
+                if 'keys' not in person:
+                    person['keys'] = []
                 person['keys'].append(key)
 
             # add the registry record