X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Faggregate_manager_pl.py;h=76c576bddc6827a2a681c517c6887ba7d01e4a02;hb=952322d76247f8991f3c2688ed7e1f5a22ca4572;hp=949d71e19205e5d7f05dab0a19bf911c77634fc4;hpb=657e8290ebbb4d6b6bcf337a3bc03aff9b42e62b;p=sfa.git diff --git a/sfa/managers/aggregate_manager_pl.py b/sfa/managers/aggregate_manager_pl.py index 949d71e1..76c576bd 100644 --- a/sfa/managers/aggregate_manager_pl.py +++ b/sfa/managers/aggregate_manager_pl.py @@ -11,16 +11,19 @@ from sfa.util.namespace import * from sfa.util.rspec import * from sfa.util.specdict import * from sfa.util.faults import * -from sfa.util.record import GeniRecord +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.server.registry import Registries from sfa.util.debug import log from sfa.plc.slices import Slices import sfa.plc.peers as peers +from sfa.plc.network import * +from sfa.plc.api import SfaAPI +from sfa.plc.slices import * -def delete_slice(api, hrn): +def delete_slice(api, xrn): + hrn, type = urn_to_hrn(xrn) slicename = hrn_to_pl_slicename(hrn) slices = api.plshell.GetSlices(api.plauth, {'name': slicename}) if not slices: @@ -36,19 +39,69 @@ def delete_slice(api, hrn): api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) return 1 -def create_slice(api, hrn, rspec): - # XX just import the legacy module and excute that until - # we transition the code to this module - from sfa.plc.slices import Slices +def __get_hostnames(nodes): + hostnames = [] + for node in nodes: + hostnames.append(node.hostname) + return hostnames + +def create_slice(api, xrn, xml, reg_objects=None): + """ + Verify HRN and initialize the slice record in PLC if necessary. + """ + + hrn, type = urn_to_hrn(xrn) + peer = None slices = Slices(api) - slices.create_slice_aggregate(hrn, rspec) + peer = slices.get_peer(hrn) + sfa_peer = slices.get_sfa_peer(hrn) + registry = api.registries[api.hrn] + credential = api.getCredential() + site_id, remote_site_id = slices.verify_site(registry, credential, hrn, + peer, sfa_peer, reg_objects) + + slice = slices.verify_slice(registry, credential, hrn, site_id, + remote_site_id, peer, sfa_peer, reg_objects) + + network = Network(api) + + slice = network.get_slice(api, hrn) + current = __get_hostnames(slice.get_nodes()) + + network.addRSpec(xml, api.config.SFA_AGGREGATE_RSPEC_SCHEMA) + request = __get_hostnames(network.nodesWithSlivers()) + + # remove nodes not in rspec + deleted_nodes = list(set(current).difference(request)) + + # 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) -def get_ticket(api, slice_hrn, rspec, origin_hrn=None): + 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] + registry = api.registries[api.hrn] credential = api.getCredential() - records = registry.resolve(credential, slice_hrn) + records = registry.resolve(credential, xrn) # make sure we get a local slice record record = None @@ -65,7 +118,7 @@ def get_ticket(api, slice_hrn, rspec, origin_hrn=None): raise SliverDoesNotExist(slice_hrn) # get initscripts - initscripts = None + initscripts = [] data = { 'timestamp': int(time.time()), 'initscripts': initscripts, @@ -87,19 +140,21 @@ def get_ticket(api, slice_hrn, rspec, origin_hrn=None): return new_ticket.save_to_string(save_parents=True) -def start_slice(api, hrn): +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'] + attribute_id = attributes[0]['slice_attribute_id'] api.plshell.UpdateSliceTag(api.plauth, attribute_id, "1" ) return 1 -def stop_slice(api, hrn): +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: @@ -110,44 +165,73 @@ def stop_slice(api, hrn): api.plshell.UpdateSliceTag(api.plauth, attribute_id, "0") return 1 -def reset_slice(api, hrn): +def reset_slice(api, xrn): # XX not implemented at this interface return 1 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 slices['hrn'] - - -def get_rspec(api, hrn=None, origin_hrn=None): - from sfa.plc.nodes import Nodes - nodes = Nodes(api, origin_hrn=origin_hrn) - if hrn: - rspec = nodes.get_rspec(hrn) - else: - nodes.refresh() - rspec = nodes['rspec'] + # look in cache first + if api.cache: + slices = api.cache.get('slices') + if slices: + return slices + + # get data from db + slices = api.plshell.GetSlices(api.plauth, {'peer_id': None}, ['name']) + slice_hrns = [slicename_to_hrn(api.hrn, slice['name']) for slice in slices] + slice_urns = [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slice_hrns] + + # cache the result + if api.cache: + api.cache.add('slices', slice_urns) + + return slice_urns + +def get_rspec(api, xrn=None, origin_hrn=None): + # look in cache first + if api.cache and not xrn: + rspec = api.cache.get('nodes') + if rspec: + return rspec + + hrn, type = urn_to_hrn(xrn) + network = Network(api) + if (hrn): + if network.get_slice(api, hrn): + network.addSlice() + + rspec = network.toxml() + + # cache the result + if api.cache and not xrn: + api.cache.add('nodes', rspec) return rspec """ -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. +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_hrn, user_hrn, contexts): - base_context = {'sfa':{'user':{'hrn':user_hrn}}} +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 def main(): - r = RSpec() - r.parseFile(sys.argv[1]) - rspec = r.toDict() - create_slice(None,'plc.princeton.tmacktestslice',rspec) + api = SfaAPI() + """ + rspec = get_rspec(api, "plc.princeton.sapan", None) + #rspec = get_rspec(api, "plc.princeton.coblitz", None) + #rspec = get_rspec(api, "plc.pl.sirius", None) + print rspec + """ + f = open(sys.argv[1]) + xml = f.read() + f.close() + create_slice(api, "plc.princeton.sapan", xml) if __name__ == "__main__": main()