X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fnitos%2Fnitosdriver.py;h=8e3da348317c9b3f01d2c6126bb49e0757256852;hb=ecc85e0b923922cf7117d29b380f5284edb88f21;hp=228432832addc0664e22349db003d5e9af12a028;hpb=99c512a6ae02e96a3a241b48d6ba427d6e0fcbe5;p=sfa.git diff --git a/sfa/nitos/nitosdriver.py b/sfa/nitos/nitosdriver.py index 22843283..8e3da348 100644 --- a/sfa/nitos/nitosdriver.py +++ b/sfa/nitos/nitosdriver.py @@ -11,7 +11,6 @@ from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf, urn_to_hrn from sfa.util.cache import Cache # one would think the driver should not need to mess with the SFA db, but.. -from sfa.storage.alchemy import dbsession from sfa.storage.model import RegRecord # used to be used in get_ticket @@ -46,8 +45,9 @@ class NitosDriver (Driver): # the cache instance is a class member so it survives across incoming requests cache = None - def __init__ (self, config): - Driver.__init__ (self, config) + def __init__ (self, api): + Driver.__init__ (self, api) + config = api.config self.shell = NitosShell (config) self.cache=None self.testbedInfo = self.shell.getTestbedInfo() @@ -367,7 +367,7 @@ class NitosDriver (Driver): # get the registry records user_list, users = [], {} - user_list = dbsession.query(RegRecord).filter(RegRecord.pointer.in_(user_ids)).all() + user_list = self.api.dbsession().query(RegRecord).filter(RegRecord.pointer.in_(user_ids)).all() # create a hrns keyed on the sfa record's pointer. # Its possible for multiple records to have the same pointer so # the dict's value will be a list of hrns. @@ -477,7 +477,9 @@ class NitosDriver (Driver): cached_requested = options.get('cached', True) version_manager = VersionManager() # get the rspec's return format from options - rspec_version = version_manager.get_version(options.get('geni_rspec_version')) + #rspec_version = version_manager.get_version(options.get('geni_rspec_version')) + # rspec's return format for nitos aggregate is version NITOS 1 + rspec_version = version_manager.get_version('NITOS 1') version_string = "rspec_%s" % (rspec_version) #panos adding the info option to the caching key (can be improved) @@ -606,12 +608,21 @@ class NitosDriver (Driver): # ensure slice record exists slice = slices.verify_slice(slice_hrn, slice_record, sfa_peer, options=options) # ensure user records exists - #users = slices.verify_users(slice_hrn, slice, users, sfa_peer, options=options) + users = slices.verify_users(slice_hrn, slice, users, sfa_peer, options=options) # add/remove leases (nodes and channels) # a lease in Nitos RSpec case is a reservation of nodes and channels grouped by (slice,timeslot) - rspec_requested_nodes, rspec_requested_channels = rspec.version.get_leases() - + rspec_requested_leases = rspec.version.get_leases() + rspec_requested_nodes = [] + rspec_requested_channels = [] + for lease in rspec_requested_leases: + if lease['type'] == 'node': + lease.pop('type', None) + rspec_requested_nodes.append(lease) + else: + lease.pop('type', None) + rspec_requested_channels.append(lease) + nodes = slices.verify_slice_leases_nodes(slice, rspec_requested_nodes) channels = slices.verify_slice_leases_channels(slice, rspec_requested_channels) @@ -619,17 +630,23 @@ class NitosDriver (Driver): def delete_sliver (self, slice_urn, slice_hrn, creds, options): slicename = hrn_to_nitos_slicename(slice_hrn) - slices = self.shell.getSlices({'slice_name': slicename}) + slices = self.filter_nitos_results(self.shell.getSlices({}, []), {'slice_name': slicename}) if not slices: return 1 slice = slices[0] + slice_reserved_nodes = self.filter_nitos_results(self.shell.getReservedNodes({}, []), {'slice_id': slice['slice_id'] }) + slice_reserved_channels = self.filter_nitos_results(self.shell.getReservedChannels(), {'slice_id': slice['slice_id'] }) + + slice_reserved_nodes_ids = [node['reservation_id'] for node in slice_reserved_nodes] + slice_reserved_channels_ids = [channel['reservation_id'] for channel in slice_reserved_channels] + + # release all reserved nodes and channels for that slice try: + released_nodes = self.shell.releaseNodes({'reservation_ids': slice_reserved_nodes_ids}) + released_channels = self.shell.releaseChannels({'reservation_ids': slice_reserved_channels_ids}) + except: pass - #self.shell.DeleteSliceFromNodes({'slice_name': slicename, slice['node_ids']}) - finally: - if peer: - self.shell.BindObjectToPeer('slice', slice['slice_id'], peer, slice['peer_slice_id']) return 1 def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options): @@ -651,7 +668,7 @@ class NitosDriver (Driver): # 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,"NitosDriver.get_ticket needs a rewrite" + raise SfaNotImplemented("NitosDriver.get_ticket needs a rewrite") # please keep this code for future reference # slices = PlSlices(self) # peer = slices.get_peer(slice_hrn)