X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Faggregate_manager_pl.py;h=b6ac34dc7ed2fb030b9945ef5cce5b6c125abb3b;hb=623749ec5256507437ef644d33be10fbd185559d;hp=894823c1cfbd7cf582ad69b3652f6a2f30fa6abd;hpb=76bfe6722cc1b30cb3df805faa640f2d6a46be85;p=sfa.git diff --git a/sfa/managers/aggregate_manager_pl.py b/sfa/managers/aggregate_manager_pl.py index 894823c1..b6ac34dc 100644 --- a/sfa/managers/aggregate_manager_pl.py +++ b/sfa/managers/aggregate_manager_pl.py @@ -8,7 +8,7 @@ import re from types import StringTypes from sfa.util.faults import * -from sfa.util.xrn import get_authority, hrn_to_urn, urn_to_hrn, Xrn +from sfa.util.xrn import get_authority, hrn_to_urn, urn_to_hrn, Xrn, urn_to_sliver_id from sfa.util.plxrn import slicename_to_hrn, hrn_to_pl_slicename, hostname_to_urn from sfa.util.rspec import * from sfa.util.specdict import * @@ -79,6 +79,7 @@ def __get_registry_objects(slice_xrn, creds, users): slice = {} + # get_expiration always returns a normalized datetime - no need to utcparse extime = Credential(string=creds[0]).get_expiration() # If the expiration time is > 60 days from now, set the expiration time to 60 days from now if extime > datetime.datetime.utcnow() + datetime.timedelta(days=60): @@ -116,14 +117,14 @@ def SliverStatus(api, slice_xrn, creds, call_id): api.logger.info(hrn) slicename = hrn_to_pl_slicename(hrn) - slices = api.plshell.GetSlices(api.plauth, [slicename], ['node_ids','person_ids','name','expires']) + slices = api.plshell.GetSlices(api.plauth, [slicename], ['slice_id', 'node_ids','person_ids','name','expires']) if len(slices) == 0: - raise Exception("Slice %s not found (used %s as slicename internally)" % slice_xrn, slicename) + raise Exception("Slice %s not found (used %s as slicename internally)" % (slice_xrn, slicename)) slice = slices[0] # report about the local nodes only nodes = api.plshell.GetNodes(api.plauth, {'node_id':slice['node_ids'],'peer_id':None}, - ['hostname', 'site_id', 'boot_state', 'last_contact']) + ['node_id', 'hostname', 'site_id', 'boot_state', 'last_contact']) site_ids = [node['site_id'] for node in nodes] sites = api.plshell.GetSites(api.plauth, site_ids, ['site_id', 'login_base']) sites_dict = dict ( [ (site['site_id'],site['login_base'] ) for site in sites ] ) @@ -132,7 +133,8 @@ def SliverStatus(api, slice_xrn, creds, call_id): top_level_status = 'unknown' if nodes: top_level_status = 'ready' - result['geni_urn'] = Xrn(slice_xrn, 'slice').get_urn() + slice_urn = Xrn(slice_xrn, 'slice').get_urn() + result['geni_urn'] = slice_urn result['pl_login'] = slice['name'] result['pl_expires'] = datetime.datetime.fromtimestamp(slice['expires']).ctime() @@ -144,7 +146,8 @@ def SliverStatus(api, slice_xrn, creds, call_id): res['pl_last_contact'] = node['last_contact'] if node['last_contact'] is not None: res['pl_last_contact'] = datetime.datetime.fromtimestamp(node['last_contact']).ctime() - res['geni_urn'] = hostname_to_urn(api.hrn, sites_dict[node['site_id']], node['hostname']) + sliver_id = urn_to_sliver_id(slice_urn, slice['slice_id'], node['node_id']) + res['geni_urn'] = sliver_id if node['boot_state'] == 'boot': res['geni_status'] = 'ready' else: @@ -195,15 +198,44 @@ def CreateSliver(api, slice_xrn, creds, rspec_string, users, call_id): # add nodes from rspec added_nodes = list(set(requested_slivers).difference(current_slivers)) + # get sliver attributes + requested_slice_attributes = rspec.get_slice_attributes() + removed_slice_attributes = [] + existing_slice_attributes = [] + for slice_tag in api.plshell.GetSliceTags(api.plauth, {'slice_id': slice['slice_id']}): + attribute_found=False + for requested_attribute in requested_slice_attributes: + if requested_attribute['name'] == slice_tag['tagname'] and \ + requested_attribute['value'] == slice_tag['value']: + attribute_found=True + + if not attribute_found: + removed_slice_attributes.append(slice_tag) + else: + existing_slice_attributes.append(slice_tag) + try: if peer: api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer) api.plshell.AddSliceToNodes(api.plauth, slice['name'], added_nodes) api.plshell.DeleteSliceFromNodes(api.plauth, slice['name'], deleted_nodes) - - # TODO: update slice tags - #network.updateSliceTags() + # remove stale attributes + for attribute in removed_slice_attributes: + try: + api.plshell.DeleteSliceTag(api.plauth, attribute['slice_tag_id']) + except Exception, e: + api.logger.warn('Failed to remove sliver attribute. name: %s, value: %s, node_id: %s\nCause:%s'\ + % (name, value, node_id, str(e))) + + # add requested_attributes + for attribute in requested_slice_attributes: + try: + name, value, node_id = attribute['name'], attribute['value'], attribute.get('node_id', None) + api.plshell.AddSliceTag(api.plauth, slice['name'], name, value, node_id) + except Exception, e: + api.logger.warn('Failed to add sliver attribute. name: %s, value: %s, node_id: %s\nCause:%s'\ + % (name, value, node_id, str(e))) finally: if peer: