From e3578cb23c8cd401dbc102f7d674c2dd2aaeaac8 Mon Sep 17 00:00:00 2001 From: Mohamed Larabi Date: Mon, 7 Oct 2013 11:37:03 +0200 Subject: [PATCH] Better mgt of external slices/users/sites + fixes --- sfa/planetlab/plaggregate.py | 8 +++---- sfa/planetlab/pldriver.py | 31 +++++++++++++++++++++----- sfa/planetlab/plslices.py | 43 ++++++++++++++---------------------- sfa/planetlab/plxrn.py | 18 ++++++++++++++- 4 files changed, 62 insertions(+), 38 deletions(-) diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index 369ff870..e147041e 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -17,7 +17,7 @@ from sfa.rspecs.elements.lease import Lease from sfa.rspecs.elements.granularity import Granularity from sfa.rspecs.version_manager import VersionManager -from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn +from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn, xrn_to_ext_slicename, top_auth from sfa.planetlab.vlink import get_tc_rate from sfa.planetlab.topology import Topology @@ -111,13 +111,11 @@ class PlAggregate: slice_urn = hrn_to_urn(slice_xrn, 'slice') slice_hrn, _ = urn_to_hrn(slice_xrn) - site_hrn = get_authority(slice_hrn) - top_auth_hrn = site_hrn.split('.')[0] + top_auth_hrn = top_auth(slice_hrn) 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)]) + slice_name = xrn_to_ext_slicename(slice_hrn) slices = self.driver.shell.GetSlices(slice_name) if not slices: diff --git a/sfa/planetlab/pldriver.py b/sfa/planetlab/pldriver.py index 6c88a14f..5215c57b 100644 --- a/sfa/planetlab/pldriver.py +++ b/sfa/planetlab/pldriver.py @@ -27,7 +27,7 @@ from sfa.planetlab.plshell import PlShell import sfa.planetlab.peers as peers from sfa.planetlab.plaggregate import PlAggregate from sfa.planetlab.plslices import PlSlices -from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname +from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname, xrn_to_ext_slicename, top_auth def list_to_dict(recs, key): @@ -773,7 +773,13 @@ class PlDriver (Driver): version=rspec.version) def delete_sliver (self, slice_urn, slice_hrn, creds, options): - slicename = hrn_to_pl_slicename(slice_hrn) + + top_auth_hrn = top_auth(slice_hrn) + if top_auth_hrn == self.hrn: + slicename = hrn_to_pl_slicename(slice_hrn) + else: + slicename = xrn_to_ext_slicename(slice_hrn) + slices = self.shell.GetSlices({'name': slicename}) if not slices: return True @@ -799,7 +805,12 @@ class PlDriver (Driver): return True def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options): - slicename = hrn_to_pl_slicename(slice_hrn) + top_auth_hrn = top_auth(slice_hrn) + if top_auth_hrn == self.hrn: + slicename = hrn_to_pl_slicename(slice_hrn) + else: + slicename = xrn_to_ext_slicename(slice_hrn) + slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) @@ -814,7 +825,12 @@ class PlDriver (Driver): # remove the 'enabled' tag def start_slice (self, slice_urn, slice_hrn, creds): - slicename = hrn_to_pl_slicename(slice_hrn) + top_auth_hrn = top_auth(slice_hrn) + if top_auth_hrn == self.hrn: + slicename = hrn_to_pl_slicename(slice_hrn) + else: + slicename = xrn_to_ext_slicename(slice_hrn) + slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) @@ -827,7 +843,12 @@ class PlDriver (Driver): # set the 'enabled' tag to 0 def stop_slice (self, slice_urn, slice_hrn, creds): - slicename = hrn_to_pl_slicename(slice_hrn) + top_auth_hrn = top_auth(slice_hrn) + if top_auth_hrn == self.hrn: + slicename = hrn_to_pl_slicename(slice_hrn) + else: + slicename = xrn_to_ext_slicename(slice_hrn) + slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) diff --git a/sfa/planetlab/plslices.py b/sfa/planetlab/plslices.py index a9500376..3b5f0fc9 100644 --- a/sfa/planetlab/plslices.py +++ b/sfa/planetlab/plslices.py @@ -8,7 +8,7 @@ from sfa.util.xrn import Xrn, get_leaf, get_authority, urn_to_hrn from sfa.rspecs.rspec import RSpec from sfa.planetlab.vlink import VLink -from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname +from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname, xrn_to_ext_slicename, hrn_to_ext_loginbase, top_auth import time @@ -169,7 +169,12 @@ class PlSlices: requested_leases = [] for lease in rspec_requested_leases: requested_lease = {} - slice_name = hrn_to_pl_slicename(lease['slice_id']) + slice_hrn, _ = urn_to_hrn(lease['slice_id']) + top_auth_hrn = top_auth(slice_hrn) + if top_auth_hrn == self.driver.hrn: + slice_name = hrn_to_pl_slicename(lease['slice_id']) + else: + slice_name = xrn_to_ext_slicename(lease['slice_id']) if slice_name != slice['name']: continue elif Xrn(lease['component_id']).get_authority_urn().split(':')[0] != self.driver.hrn: @@ -360,15 +365,14 @@ 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) - top_auth_hrn = site_hrn.split('.')[0] + top_auth_hrn = top_auth(slice_hrn) 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] + login_base = hrn_to_ext_loginbase(slice_hrn) authority_name = login_base sites = self.driver.shell.GetSites(login_base) @@ -402,15 +406,14 @@ class PlSlices: return site def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={}): - site_hrn = get_authority(slice_hrn) - top_auth_hrn = site_hrn.split('.')[0] + top_auth_hrn = top_auth(slice_hrn) if top_auth_hrn == self.driver.hrn: - slicename = hrn_to_pl_slicename(slice_hrn) - parts = slicename.split("_") + slice_name = hrn_to_pl_slicename(slice_hrn) + parts = slice_name.split("_") login_base = parts[0] else: - login_base = '8'.join(site_hrn.split('.')) - slice_name = '_'.join([login_base, slice_hrn.split('.')[-1]]) + login_base = hrn_to_ext_loginbase(slice_hrn) + slice_name = xrn_to_ext_slicename(slice_hrn) slices = self.driver.shell.GetSlices([slice_name]) if not slices: @@ -451,19 +454,6 @@ 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 = {} @@ -473,13 +463,12 @@ class PlSlices: username = get_leaf(hrn) user['username'] = username - site_hrn = get_authority(hrn) - top_auth_hrn = site_hrn.split('.')[0] + top_auth_hrn = top_auth(hrn) if top_auth_hrn == self.driver.hrn: login_base = PlXrn(xrn=user['urn']).pl_login_base() else: - login_base = '8'.join(site_hrn.split('.')) + login_base = hrn_to_ext_loginbase(hrn) user['site'] = login_base if 'email' in user: diff --git a/sfa/planetlab/plxrn.py b/sfa/planetlab/plxrn.py index 22e94181..a8461b53 100644 --- a/sfa/planetlab/plxrn.py +++ b/sfa/planetlab/plxrn.py @@ -1,6 +1,6 @@ # specialized Xrn class for PlanetLab import re -from sfa.util.xrn import Xrn +from sfa.util.xrn import Xrn, get_authority # temporary helper functions to use this module instead of namespace def hostname_to_hrn (auth, login_base, hostname): @@ -21,6 +21,22 @@ def hrn_to_pl_authname (hrn): def xrn_to_hostname(hrn): return Xrn.unescape(PlXrn(xrn=hrn, type='node').get_leaf()) +# helpers to handle external objects created via fedaration +def xrn_to_ext_slicename (xrn): + slice_hrn=PlXrn(xrn=xrn,type='slice').get_hrn() + site_hrn = get_authority(slice_hrn) + login_base = '8'.join(site_hrn.split('.')) + slice_name = '_'.join([login_base, slice_hrn.split('.')[-1]]) + return slice_name + +def hrn_to_ext_loginbase (hrn): + site_hrn = get_authority(hrn) + login_base = '8'.join(site_hrn.split('.'))[:20] + return login_base + +def top_auth (hrn): + return hrn.split('.')[0] + class PlXrn (Xrn): @staticmethod -- 2.43.0