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
# 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()
# 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.
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)
# get login info
user = {}
keys = []
- if slice['user_id']:
+ if slice['user_ids']:
users = self.shell.getUsers()
# filter users on slice['user_ids']
for usr in users:
- if usr['user_id'] in slice['user_id']:
+ if usr['user_id'] in slice['user_ids']:
keys.extend(usr['keys'])
# 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 slice from nodes
- #requested_slivers = []
- #for node in rspec.version.get_nodes_with_slivers():
- # hostname = None
- # if node.get('component_name'):
- # hostname = node.get('component_name').strip()
- # elif node.get('component_id'):
- # hostname = xrn_to_hostname(node.get('component_id').strip())
- # if hostname:
- # requested_slivers.append(hostname)
- #nodes = slices.verify_slice_nodes(slice, requested_slivers, peer)
-
- # add/remove channels
-
-
- # add/remove leases
+ # 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()
- print rspec_requested_nodes, rspec_requested_channels
-
+ 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)
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):
slicename = hrn_to_nitos_slicename(slice_hrn)
slices = self.shell.GetSlices({'slicename': slicename}, ['slice_id'])