X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplanetlab%2Fpldriver.py;h=ab7846c48d038237110ebf4db3315e47221f343d;hb=b9c641407a2f799e5ac05378a77fcf91190eeb86;hp=8388ea2ad9184aa250b8538c19555be88a3b89a4;hpb=41c56baf85ff7b538d983b90d7c8222cdd5b7c3a;p=sfa.git diff --git a/sfa/planetlab/pldriver.py b/sfa/planetlab/pldriver.py index 8388ea2a..ab7846c4 100644 --- a/sfa/planetlab/pldriver.py +++ b/sfa/planetlab/pldriver.py @@ -1,12 +1,11 @@ -import time import datetime # from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \ - RecordNotFound, SfaNotImplemented, SliverDoesNotExist + RecordNotFound, SfaNotImplemented, SliverDoesNotExist, SearchFailed from sfa.util.sfalogging import logger from sfa.util.defaultdict import defaultdict from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch -from sfa.util.xrn import hrn_to_urn, get_leaf +from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf from sfa.util.cache import Cache # one would think the driver should not need to mess with the SFA db, but.. @@ -563,23 +562,21 @@ class PlDriver (Driver): def aggregate_version (self): return {} - def list_slices (self, creds, options): - # get data from db - slices = self.shell.GetSlices({'peer_id': None}, ['name']) - slice_hrns = [slicename_to_hrn(self.hrn, slice['name']) for slice in slices] - slice_urns = [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slice_hrns] - return slice_urns - # first 2 args are None in case of resource discovery - def list_resources (self, creds, options): + def list_resources (self, version=None, options={}): aggregate = PlAggregate(self) - rspec = aggregate.list_resources(version=rspec_version, options=options) + rspec = aggregate.list_resources(version=version, options=options) return rspec - def describe(self, creds, urns, options): - return {} + def describe(self, urns, version, options={}): + aggregate = PlAggregate(self) + return aggregate.describe(urns, version=version, options=options) - def status (self, slice_urn, slice_hrn): + def status (self, urns, options={}): + aggregate = PlAggregate(self) + desc = aggregate.describe(urns) + return desc['geni_slivers'] + # find out where this slice is currently running slicename = hrn_to_pl_slicename(slice_hrn) @@ -644,13 +641,14 @@ class PlDriver (Driver): result['geni_resources'] = resources return result - def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options): - + def allocate (self, urn, rspec_string, options={}): + xrn = Xrn(urn) aggregate = PlAggregate(self) slices = PlSlices(self) - peer = slices.get_peer(slice_hrn) - sfa_peer = slices.get_sfa_peer(slice_hrn) + peer = slices.get_peer(xrn.get_hrn()) + sfa_peer = slices.get_sfa_peer(xrn.get_hrn()) slice_record=None + users = options.get('geni_users', []) if users: slice_record = users[0].get('slice_record', {}) @@ -659,11 +657,11 @@ class PlDriver (Driver): requested_attributes = rspec.version.get_slice_attributes() # ensure site record exists - site = slices.verify_site(slice_hrn, slice_record, peer, sfa_peer, options=options) + site = slices.verify_site(xrn.hrn, slice_record, peer, sfa_peer, options=options) # ensure slice record exists - slice = slices.verify_slice(slice_hrn, slice_record, peer, sfa_peer, options=options) + slice = slices.verify_slice(xrn.hrn, slice_record, peer, sfa_peer, options=options) # ensure person records exists - persons = slices.verify_persons(slice_hrn, slice, users, peer, sfa_peer, options=options) + persons = slices.verify_persons(xrn.hrn, slice, users, peer, sfa_peer, options=options) # ensure slice attributes exists slices.verify_slice_attributes(slice, requested_attributes, options=options) @@ -702,15 +700,28 @@ class PlDriver (Driver): # only used by plc and ple. slices.handle_peer(site, slice, persons, peer) - return aggregate.describe_rspec(slice_xrn=slice_urn, version=rspec.version) - - def delete_sliver (self, slice_urn, slice_hrn, creds, options): - slicename = hrn_to_pl_slicename(slice_hrn) - slices = self.shell.GetSlices({'name': slicename}) + return aggregate.describe([xrn.get_urn()], version=rspec.version, allocation_status='allocated') + + def provision(self, urns, options={}): + return self.describe(urns, None, options=options, allocation_status='provisioned') + + def delete(self, urns, options={}): + names = [] + ids = [] + for urn in urns: + xrn = PlXrn(xrn=urn, type='slice') + names.append(xrn.pl_slicename()) + if xrn.id: + ids.append(xrn.id) + slices = self.shell.GetSlices({'name': names}) if not slices: - return 1 + raise SearchFailed(urns) slice = slices[0] - + if ids: + node_ids = ids + else: + node_ids = slice['node_ids'] + slice_hrn = PlXrn(auth=self.hrn, slicename=slice['name']).get_hrn() # determine if this is a peer slice # xxx I wonder if this would not need to use PlSlices.get_peer instead # in which case plc.peers could be deprecated as this here @@ -719,17 +730,22 @@ class PlDriver (Driver): try: if peer: self.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer) - self.shell.DeleteSliceFromNodes(slicename, slice['node_ids']) + self.shell.DeleteSliceFromNodes(slice['slice_id'], node_ids) finally: if peer: self.shell.BindObjectToPeer('slice', slice['slice_id'], peer, slice['peer_slice_id']) - return 1 + return True - def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options): - slicename = hrn_to_pl_slicename(slice_hrn) - slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) + def renew (self, urns, expiration_time, options={}): + # we can only renew slices, not individual slivers. ignore sliver + # ids in the urn + names = [] + for urn in urns: + xrn = PlXrn(xrn=urn, type='slice') + names.append(xrn.pl_slicename()) + slices = self.shell.GetSlices(names, ['slice_id']) if not slices: - raise RecordNotFound(slice_hrn) + raise SearchFailed(urns) slice = slices[0] requested_time = utcparse(expiration_time) record = {'expires': int(datetime_to_epoch(requested_time))} @@ -739,22 +755,21 @@ class PlDriver (Driver): except: return False - # remove the 'enabled' tag - def start_slice (self, slice_urn, slice_hrn, creds): - slicename = hrn_to_pl_slicename(slice_hrn) - slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(slice_hrn) - slice_id = slices[0]['slice_id'] - slice_tags = self.shell.GetSliceTags({'slice_id': slice_id, 'tagname': 'enabled'}, ['slice_tag_id']) - # just remove the tag if it exists - if slice_tags: - self.shell.DeleteSliceTag(slice_tags[0]['slice_tag_id']) - return 1 + def perform_operational_action (self, urns, action, options={}): + # MyPLC doesn't support operational actions. Lets pretend like it + # supports start, but reject everything else. + action = action.lower() + if action == 'geni_start': + pass + else: + raise UnsupportedOperation(action) + description = self.describe(urns, None, options) + return description['geni_slivers'] # set the 'enabled' tag to 0 - def stop_slice (self, slice_urn, slice_hrn, creds): - slicename = hrn_to_pl_slicename(slice_hrn) + def shutdown (self, xrn, options={}): + xrn = PlXrn(xrn=xrn, type='slice') + slicename = xrn.pl_slicename() slices = self.shell.GetSlices({'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) @@ -766,76 +781,3 @@ class PlDriver (Driver): tag_id = slice_tags[0]['slice_tag_id'] self.shell.UpdateSliceTag(tag_id, '0') return 1 - - def reset_slice (self, slice_urn, slice_hrn, creds): - raise SfaNotImplemented ("reset_slice not available at this interface") - - # xxx this code is quite old and has not run for ages - # it is obviously totally broken and needs a rewrite - def get_ticket (self, slice_urn, slice_hrn, creds, rspec_string, options): - raise SfaNotImplemented,"PlDriver.get_ticket needs a rewrite" -# please keep this code for future reference -# slices = PlSlices(self) -# peer = slices.get_peer(slice_hrn) -# sfa_peer = slices.get_sfa_peer(slice_hrn) -# -# # get the slice record -# credential = api.getCredential() -# interface = api.registries[api.hrn] -# registry = api.server_proxy(interface, credential) -# records = registry.Resolve(xrn, credential) -# -# # make sure we get a local slice record -# record = None -# for tmp_record in records: -# if tmp_record['type'] == 'slice' and \ -# not tmp_record['peer_authority']: -# #Error (E0602, GetTicket): Undefined variable 'SliceRecord' -# slice_record = SliceRecord(dict=tmp_record) -# if not record: -# raise RecordNotFound(slice_hrn) -# -# # similar to CreateSliver, we must verify that the required records exist -# # at this aggregate before we can issue a ticket -# # parse rspec -# rspec = RSpec(rspec_string) -# requested_attributes = rspec.version.get_slice_attributes() -# -# # ensure site record exists -# site = slices.verify_site(slice_hrn, slice_record, peer, sfa_peer) -# # ensure slice record exists -# slice = slices.verify_slice(slice_hrn, slice_record, peer, sfa_peer) -# # ensure person records exists -# # xxx users is undefined in this context -# persons = slices.verify_persons(slice_hrn, slice, users, peer, sfa_peer) -# # ensure slice attributes exists -# slices.verify_slice_attributes(slice, requested_attributes) -# -# # get sliver info -# slivers = slices.get_slivers(slice_hrn) -# -# if not slivers: -# raise SliverDoesNotExist(slice_hrn) -# -# # get initscripts -# initscripts = [] -# data = { -# 'timestamp': int(time.time()), -# 'initscripts': initscripts, -# 'slivers': slivers -# } -# -# # create the ticket -# object_gid = record.get_gid_object() -# new_ticket = SfaTicket(subject = object_gid.get_subject()) -# new_ticket.set_gid_caller(api.auth.client_gid) -# new_ticket.set_gid_object(object_gid) -# new_ticket.set_issuer(key=api.key, subject=self.hrn) -# new_ticket.set_pubkey(object_gid.get_pubkey()) -# new_ticket.set_attributes(data) -# new_ticket.set_rspec(rspec) -# #new_ticket.set_parent(api.auth.hierarchy.get_auth_ticket(auth_hrn)) -# new_ticket.encode() -# new_ticket.sign() -# -# return new_ticket.save_to_string(save_parents=True)