X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetSliceSshKeys.py;fp=PLC%2FMethods%2FGetSliceSshKeys.py;h=60617c11c63bbb0ca33b534f20f5d8c7c6fd732c;hb=41b097a10c1ac6dcd493b030d33194003369bdf1;hp=0000000000000000000000000000000000000000;hpb=b3a391490764be17194820147b1cf47fff17b69a;p=plcapi.git diff --git a/PLC/Methods/GetSliceSshKeys.py b/PLC/Methods/GetSliceSshKeys.py new file mode 100644 index 0000000..60617c1 --- /dev/null +++ b/PLC/Methods/GetSliceSshKeys.py @@ -0,0 +1,53 @@ +from types import StringTypes + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.SliceTags import SliceTag, SliceTags +from PLC.Slices import Slice, Slices + +class GetSliceSshKeys(Method): + """ + This method exposes the public ssh keys for a slice's slivers. + It expects a slice name or id, and returns a dictionary on hostnames. + This method is designed to help third-party software authenticate + slivers (e.g. the OMF Experiment Controller). + For this reason it is accessible with anonymous authentication. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'anonymous' ] + + applicable_fields = { + 'slice_id' : Slice.fields['slice_id'], + 'name' : Slice.fields['name'], + } + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']) + ] + + returns = Parameter (dict, " ssh keys hashed on hostnames") + + def call(self, auth, slice_id_or_name): + filter={} + if isinstance(slice_id_or_name,int): + filter['slice_id']=slice_id_or_name + elif isinstance(slice_id_or_name,StringTypes): + filter['name']=slice_id_or_name + filter['tagname']='ssh_key' + # retrieve only sliver tags + filter['~node_id']=None + + # slice_tags don't expose hostname, sigh.. + slice_tags=SliceTags(self.api,filter,['node_id','tagname','value']) + node_ids = [st['node_id'] for st in slice_tags] + # fetch nodes + nodes=Nodes(self.api,node_ids,['node_id','hostname']) + # hash on node_id + nodes_hash=dict( [ (n['node_id'],n['hostname']) for n in nodes]) + # return values hashed on hostname + return dict([ (nodes_hash[st['node_id']],st['value']) for st in slice_tags])