X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Faggregate_manager_vini.py;h=bcb272913f8fd61fe69d0a58c1af81f558b69228;hb=1e95f8a388325499564df5f8eb6eb1fd10ca2d42;hp=062a88a0a656e308884bb3a1a57c90e25a9956a9;hpb=8a0074fb54ed359961bc27d609ca9a065ed2cdb3;p=sfa.git diff --git a/sfa/managers/aggregate_manager_vini.py b/sfa/managers/aggregate_manager_vini.py index 062a88a0..bcb27291 100644 --- a/sfa/managers/aggregate_manager_vini.py +++ b/sfa/managers/aggregate_manager_vini.py @@ -1,58 +1,64 @@ -### $Id: slices.py 15842 2009-11-22 09:56:13Z anil $ -### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/slices.py $ - import datetime import time import traceback import sys from types import StringTypes -from sfa.util.namespace import * -from sfa.util.rspec import * +from sfa.util.xrn import urn_to_hrn, Xrn +from sfa.util.plxrn import hrn_to_pl_slicename from sfa.util.specdict import * from sfa.util.faults import * from sfa.util.record import SfaRecord from sfa.util.policy import Policy from sfa.util.record import * -from sfa.util.sfaticket import SfaTicket +from sfa.trust.sfaticket import SfaTicket from sfa.server.registry import Registries -from sfa.util.debug import log from sfa.plc.slices import Slices import sfa.plc.peers as peers from sfa.managers.vini.vini_network import * +from sfa.plc.vini_aggregate import ViniAggregate +from sfa.rspecs.version_manager import VersionManager from sfa.plc.api import SfaAPI from sfa.plc.slices import * - -def delete_slice(api, xrn): - hrn, type = urn_to_hrn(xrn) +from sfa.managers.aggregate_manager_pl import __get_registry_objects, __get_hostnames +from sfa.util.version import version_core +from sfa.util.callids import Callids + +# VINI aggregate is almost identical to PLC aggregate for many operations, +# so lets just import the methods form the PLC manager +from sfa.managers.aggregate_manager_pl import ( +start_slice, stop_slice, RenewSliver, reset_slice, ListSlices, get_ticket, SliverStatus) + + +def GetVersion(api): + xrn=Xrn(api.hrn) + return version_core({'interface':'aggregate', + 'testbed':'myplc.vini', + 'hrn':xrn.get_hrn(), + }) + +def DeleteSliver(api, xrn, creds, call_id): + if Callids().already_handled(call_id): return "" + (hrn, type) = urn_to_hrn(xrn) slicename = hrn_to_pl_slicename(hrn) slices = api.plshell.GetSlices(api.plauth, {'name': slicename}) if not slices: return 1 slice = slices[0] - # determine if this is a peer slice - peer = peers.get_peer(api, hrn) - if peer: - api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer) api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids']) - if peer: - api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) return 1 -def __get_hostnames(nodes): - hostnames = [] - for node in nodes: - hostnames.append(node.hostname) - return hostnames - -def create_slice(api, xrn, xml): - hrn, type = urn_to_hrn(xrn) - peer = None - +def CreateSliver(api, xrn, creds, xml, users, call_id): """ Verify HRN and initialize the slice record in PLC if necessary. """ + + if Callids().already_handled(call_id): return "" + + hrn, type = urn_to_hrn(xrn) + peer = None + reg_objects = __get_registry_objects(xrn, creds, users) slices = Slices(api) peer = slices.get_peer(hrn) sfa_peer = slices.get_sfa_peer(hrn) @@ -60,9 +66,9 @@ def create_slice(api, xrn, xml): registry = registries[api.hrn] credential = api.getCredential() site_id, remote_site_id = slices.verify_site(registry, credential, hrn, - peer, sfa_peer) + peer, sfa_peer, reg_objects) slice = slices.verify_slice(registry, credential, hrn, site_id, - remote_site_id, peer, sfa_peer) + remote_site_id, peer, sfa_peer, reg_objects) network = ViniNetwork(api) @@ -79,139 +85,51 @@ def create_slice(api, xrn, xml): # add nodes from rspec added_nodes = list(set(request).difference(current)) - if peer: - api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice.id, peer) - api.plshell.AddSliceToNodes(api.plauth, slice.name, added_nodes) api.plshell.DeleteSliceFromNodes(api.plauth, slice.name, deleted_nodes) - network.updateSliceTags() - if peer: - api.plshell.BindObjectToPeer(api.plauth, 'slice', slice.id, peer, - slice.peer_id) - - # print network.toxml() - - return True - - -def get_ticket(api, xrn, rspec, origin_hrn=None): - slice_hrn, type = urn_to_hrn(xrn) - # the the slice record - registries = Registries(api) - registry = registries[api.hrn] - credential = api.getCredential() - records = registry.resolve(credential, xrn) - - # 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']: - record = SliceRecord(dict=tmp_record) - if not record: - raise RecordNotFound(slice_hrn) - - # get sliver info - slivers = Slices(api).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=api.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) - -def start_slice(api, xrn): - hrn, type = urn_to_hrn(xrn) - slicename = hrn_to_pl_slicename(hrn) - slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(hrn) - slice_id = slices[0] - attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) - attribute_id = attreibutes[0]['slice_attribute_id'] - api.plshell.UpdateSliceTag(api.plauth, attribute_id, "1" ) - - return 1 - -def stop_slice(api, xrn): - hrn, type = urn_to_hrn(xrn) - slicename = hrn_to_pl_slicename(hrn) - slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(hrn) - slice_id = slices[0]['slice_id'] - attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) - attribute_id = attributes[0]['slice_attribute_id'] - api.plshell.UpdateSliceTag(api.plauth, attribute_id, "0") - return 1 - -def reset_slice(api, xrn): - # XX not implemented at this interface - return 1 + # xxx - check this holds enough data for the client to understand what's happened + return network.toxml() -def get_slices(api): - # XX just import the legacy module and excute that until - # we transition the code to this module - from sfa.plc.slices import Slices - slices = Slices(api) - slices.refresh() - return [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slices['hrn']] - - -def get_rspec(api, xrn=None, origin_hrn=None): +def ListResources(api, creds, options,call_id): + if Callids().already_handled(call_id): return "" + # get slice's hrn from options + xrn = options.get('geni_slice_urn', '') hrn, type = urn_to_hrn(xrn) - network = ViniNetwork(api) - if (hrn): - network.get_slice(api, hrn) - if slice: - network.addSlice() - return network.toxml() - -""" -Returns the request context required by sfatables. At some point, this -mechanism should be changed to refer to "contexts", which is the -information that sfatables is requesting. But for now, we just return -the basic information needed in a dict. -""" -def fetch_context(slice_xrn, user_xrn, contexts): - slice_hrn, type = urn_to_hrn(slice_xrn) - user_hrn, type = urn_to_hrn(user_xrn) - base_context = {'sfa':{'user':{'hrn':user_hrn}, 'slice':{'hrn':slice_hrn}}} - return base_context + version_manager = VersionManager() + # get the rspec's return format from options + rspec_version = version_manager.get_version(options.get('rspec_version')) + version_string = "rspec_%s" % (rspec_version.to_string()) + + # look in cache first + if api.cache and not xrn: + rspec = api.cache.get(version_string) + if rspec: + api.logger.info("aggregate.ListResources: returning cached value for hrn %s"%hrn) + return rspec + + aggregate = ViniAggregate(api, options) + rspec = aggregate.get_rspec(slice_xrn=xrn, version=rspec_version) + + # cache the result + if api.cache and not xrn: + api.cache.add('nodes', rspec) + + return rspec def main(): api = SfaAPI() """ - #rspec = get_rspec(api, None, None) - rspec = get_rspec(api, "plc.princeton.iias", None) + #rspec = ListResources(api, None, None,) + rspec = ListResources(api, "plc.princeton.iias", None, 'vini_test') print rspec """ f = open(sys.argv[1]) xml = f.read() f.close() - create_slice(api, "plc.princeton.iias", xml) + CreateSliver(api, "plc.princeton.iias", xml, 'call-id-iias') if __name__ == "__main__": main()