From 5c5160de04ce99d940b5b6bfef94ab3d3060a601 Mon Sep 17 00:00:00 2001 From: Mohamed Larabi Date: Wed, 26 Sep 2012 15:43:02 +0200 Subject: [PATCH] Update PlanetLab reservation oriented Rspecs: the leases were expressed an atomic way (ie. 1 Lease = 1 Slice = 1 TimeSlot = 1 node) but now they are grouped by slice and timeslot (ie. 1 Lease = 1 Slice = 1 TimeSlot = N node) --- sfa/planetlab/plaggregate.py | 2 +- sfa/planetlab/pldriver.py | 30 ++++---- sfa/planetlab/plslices.py | 52 +++++++++++--- sfa/rspecs/elements/versions/sfav1Lease.py | 79 ++++++++++++++++++---- 4 files changed, 124 insertions(+), 39 deletions(-) diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index b22a94bc..c4f2db81 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -278,7 +278,7 @@ class PlAggregate: site_id=lease['site_id'] site=sites_dict[site_id] - rspec_lease['lease_id'] = lease['lease_id'] + #rspec_lease['lease_id'] = lease['lease_id'] rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname']) slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name']) slice_urn = hrn_to_urn(slice_hrn, 'slice') diff --git a/sfa/planetlab/pldriver.py b/sfa/planetlab/pldriver.py index 49a325dc..abfcb929 100644 --- a/sfa/planetlab/pldriver.py +++ b/sfa/planetlab/pldriver.py @@ -742,20 +742,22 @@ class PlDriver (Driver): slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes) # add/remove leases - requested_leases = [] - kept_leases = [] - for lease in rspec.version.get_leases(): - requested_lease = {} - if not lease.get('lease_id'): - requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip()) - requested_lease['start_time'] = lease.get('start_time') - requested_lease['duration'] = lease.get('duration') - else: - kept_leases.append(int(lease['lease_id'])) - if requested_lease.get('hostname'): - requested_leases.append(requested_lease) - - leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer) + rspec_requested_leases = rspec.version.get_leases() + leases = slices.verify_slice_leases(slice, rspec_requested_leases, peer) + #requested_leases = [] + #kept_leases = [] + #for lease in rspec.version.get_leases(): + # requested_lease = {} + # if not lease.get('lease_id'): + # requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip()) + # requested_lease['start_time'] = lease.get('start_time') + # requested_lease['duration'] = lease.get('duration') + # else: + # kept_leases.append(int(lease['lease_id'])) + # if requested_lease.get('hostname'): + # requested_leases.append(requested_lease) + + #leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer) # handle MyPLC peer association. # only used by plc and ple. diff --git a/sfa/planetlab/plslices.py b/sfa/planetlab/plslices.py index be540bb6..30e97979 100644 --- a/sfa/planetlab/plslices.py +++ b/sfa/planetlab/plslices.py @@ -8,7 +8,9 @@ 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 +from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname + +import time MAXINT = 2L**31-1 @@ -159,19 +161,51 @@ class PlSlices: return sfa_peer - def verify_slice_leases(self, slice, requested_leases, kept_leases, peer): - - leases = self.driver.shell.GetLeases({'name':slice['name']}, ['lease_id']) + def verify_slice_leases(self, slice, rspec_requested_leases, peer): + + 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() - current_leases = [lease['lease_id'] for lease in leases] - deleted_leases = list(set(current_leases).difference(kept_leases)) + + requested_leases = [] + for lease in rspec_requested_leases: + requested_lease = {} + slice_name = hrn_to_pl_slicename(lease['slice_id']) + if slice_name != slice['name']: + continue + hostname = xrn_to_hostname(lease['component_id']) + # fill the requested node with nitos ids + requested_lease['name'] = slice['name'] + requested_lease['hostname'] = hostname + requested_lease['t_from'] = int(lease['start_time']) + requested_lease['t_until'] = int(lease['duration']) * grain + int(lease['start_time']) + requested_leases.append(requested_lease) + + + + # prepare actual slice leases by lease_id + leases_by_id = {} + for lease in leases: + leases_by_id[lease['lease_id']] = {'name': lease['name'], 'hostname': lease['hostname'], \ + 't_from': lease['t_from'], 't_until': lease['t_until']} + + added_leases = [] + kept_leases_id = [] + deleted_leases_id = [] + for lease_id in leases_by_id: + if leases_by_id[lease_id] not in requested_leases: + deleted_leases_id.append(lease_id) + else: + kept_leases_id.append(lease_id) + requested_leases.remove(leases_by_id[lease_id]) + added_leases = requested_leases + try: if peer: self.driver.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname']) - deleted=self.driver.shell.DeleteLeases(deleted_leases) - for lease in requested_leases: - added=self.driver.shell.AddLeases(lease['hostname'], slice['name'], int(lease['start_time']), int(lease['duration']) * grain + int(lease['start_time'])) + 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']) except: logger.log_exc('Failed to add/remove slice leases') diff --git a/sfa/rspecs/elements/versions/sfav1Lease.py b/sfa/rspecs/elements/versions/sfav1Lease.py index 8dffdfde..03a43422 100644 --- a/sfa/rspecs/elements/versions/sfav1Lease.py +++ b/sfa/rspecs/elements/versions/sfav1Lease.py @@ -32,12 +32,43 @@ class SFAv1Lease: else: network_elem = xml - lease_elems = [] - for lease in leases: - lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration'] - lease_elem = network_elem.add_instance('lease', lease, lease_fields) + # group the leases by slice and timeslots + grouped_leases = [] + + while leases: + slice_id = leases[0]['slice_id'] + start_time = leases[0]['start_time'] + duration = leases[0]['duration'] + group = [] + + for lease in leases: + if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']: + group.append(lease) + + grouped_leases.append(group) + + for lease1 in group: + leases.remove(lease1) + + lease_elems = [] + for lease in grouped_leases: + #lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration'] + lease_fields = ['slice_id', 'start_time', 'duration'] + lease_elem = network_elem.add_instance('lease', lease[0], lease_fields) lease_elems.append(lease_elem) + # add nodes of this lease + for node in lease: + lease_elem.add_instance('node', node, ['component_id']) + + + +# lease_elems = [] +# for lease in leases: +# lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration'] +# lease_elem = network_elem.add_instance('lease', lease, lease_fields) +# lease_elems.append(lease_elem) + @staticmethod def get_leases(xml, filter={}): @@ -47,16 +78,34 @@ class SFAv1Lease: @staticmethod def get_lease_objs(lease_elems): - leases = [] + leases = [] for lease_elem in lease_elems: - lease = Lease(lease_elem.attrib, lease_elem) - if lease.get('lease_id'): - lease['lease_id'] = lease_elem.attrib['lease_id'] - lease['component_id'] = lease_elem.attrib['component_id'] - lease['slice_id'] = lease_elem.attrib['slice_id'] - lease['start_time'] = lease_elem.attrib['start_time'] - lease['duration'] = lease_elem.attrib['duration'] - - leases.append(lease) - return leases + #get nodes + node_elems = lease_elem.xpath('./default:node | ./node') + for node_elem in node_elems: + lease = Lease(lease_elem.attrib, lease_elem) + lease['slice_id'] = lease_elem.attrib['slice_id'] + lease['start_time'] = lease_elem.attrib['start_time'] + lease['duration'] = lease_elem.attrib['duration'] + lease['component_id'] = node_elem.attrib['component_id'] + leases.append(lease) + + return leases + + + + + +# leases = [] +# for lease_elem in lease_elems: +# lease = Lease(lease_elem.attrib, lease_elem) +# if lease.get('lease_id'): +# lease['lease_id'] = lease_elem.attrib['lease_id'] +# lease['component_id'] = lease_elem.attrib['component_id'] +# lease['slice_id'] = lease_elem.attrib['slice_id'] +# lease['start_time'] = lease_elem.attrib['start_time'] +# lease['duration'] = lease_elem.attrib['duration'] + +# leases.append(lease) +# return leases -- 2.47.0