X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=TestPeers.py;h=3112280e12e376a715942a8bcf8d3e3018b5364e;hb=3d2976e7e933c6f5e954dcebdf6476bbaf629920;hp=3576472f89d3897ec18e050e8ffd745709601178;hpb=7a1c3e7919f2a9c2ccdcfc9d693f60e12777e342;p=plcapi.git diff --git a/TestPeers.py b/TestPeers.py index 3576472..3112280 100755 --- a/TestPeers.py +++ b/TestPeers.py @@ -25,7 +25,7 @@ import getopt import sys import time -import Shell +from PLC.Shell import Shell import PLC.Methods # when running locally, we might wish to run only our local stuff @@ -43,16 +43,13 @@ class DummyShell: return 0 def __init__(self,index): self.index=index - def init(self): for method in PLC.Methods.methods: # ignore path-defined methods for now if "." not in method: setattr(self,method,DummyShell.Callable(method,self.index)) - def show_config(self,*args): - print 'DummyShell' #################### -import xmlrpclib +#import xmlrpclib import os ## try to support reload @@ -191,6 +188,8 @@ plc[1]={ 'plcname':'Thierry plc1', 'person-format' : 'user1-%d@plc1.org', 'key-format':'ssh-rsa 11key4plc11 user%d-key%d', 'person-password' : 'password1', + 'gpg-keyring':'gpg_plc2.pub', + 'api-cacert':'api_plc2.crt', } plc[2]={ 'plcname':'Thierry plc2', 'hostname':'lurch.cs.princeton.edu', @@ -205,6 +204,8 @@ plc[2]={ 'plcname':'Thierry plc2', 'person-format' : 'user2-%d@plc2.org', 'key-format':'ssh-rsa 22key4plc22 user%d-key%d', 'person-password' : 'password2', + 'gpg-keyring':'gpg_plc1.pub', + 'api-cacert':'api_plc1.crt', } #################### @@ -287,34 +288,52 @@ def timer_show (): last_time=now #################### -def test00_init (args=[1,2]): +errors=0 +def myassert (message,boolean): + if not boolean: + print 'ASSERTION FAILED',message + global errors + errors +=1 + +def epilogue (): + if errors != 0: + print 'TEST FAILED with %d errors'%errors + assert errors == 0 + +#################### +# init +def test00_init (args=[1,2],builtin_person=False): timer_start() - ## have you loaded this file already (support for reload) for i in args: url=plc[i]['url-format']%plc[i]['hostname'] plc[i]['url']=url if local_peer is None: # the regular remote mode - argv=[sys.argv[0], - '--url',url, - '--user',plc[i]['builtin-admin-id'], - '--password',plc[i]['builtin-admin-password']] - print 'initializing s[%d]=>%s'%(i,url) - s[i]=Shell.Shell(argv) - s[i].init() + print 'initializing s[%d]=>%s'%(i,url), + if builtin_person: + user=plc[i]['builtin-admin-id'] + password=plc[i]['builtin-admin-password'] + else: + user=plc[i]['peer-admin-name'] + password=plc[i]['peer-admin-password'] + s[i]=Shell(url=url, + user=user, + password=password) + print 'user=',user elif local_peer == i: # local mode - use Shell's Direct mode - use /etc/planetlab/plc_config - s[i]=Shell.Shell([sys.argv[0]]) - s[i].init() + s[i]=Shell() else: # remote peer in local mode : use dummy shell instead s[i]=DummyShell(i) - s[i].init() + +# use new person's account def test00_print (args=[1,2]): for i in args: print '==================== s[%d]'%i - s[i].show_config() +# s[i].show_config() + print 'show_config obsoleted' print '====================' def check_nodes (el,ef,args=[1,2]): @@ -325,8 +344,8 @@ def check_nodes (el,ef,args=[1,2]): n = len ([ x for x in all_nodes if x['peer_id'] is None]) f = len ([ x for x in all_nodes if x['peer_id'] is not None]) print '%02d: Checking nodes: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) - assert n==el - assert f==ef + myassert ('local nodes',n==el) + myassert ('foreign nodes',f==ef) def check_keys (el,ef,args=[1,2]): for i in args: @@ -336,8 +355,8 @@ def check_keys (el,ef,args=[1,2]): n = len ([ x for x in all_keys if x['peer_id'] is None]) f = len ([ x for x in all_keys if x['peer_id'] is not None]) print '%02d: Checking keys: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) - assert n==el - assert f==ef + myassert ('local keys',n==el) + myassert ('foreign_keys',f==ef) def check_persons (el,ef,args=[1,2]): for i in args: @@ -347,8 +366,8 @@ def check_persons (el,ef,args=[1,2]): n = len ([ x for x in all_persons if x['peer_id'] is None]) f = len ([ x for x in all_persons if x['peer_id'] is not None]) print '%02d: Checking persons: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) - assert n==el - assert f==ef + myassert ('local persons',n==el) + myassert ('foreign persons',f==ef) # expected : local slices, foreign slices def check_slices (els,efs,args=[1,2]): @@ -356,8 +375,8 @@ def check_slices (els,efs,args=[1,2]): ls=len(s[i].GetSlices({'peer_id':None})) fs=len(s[i].GetSlices({'~peer_id':None})) print '%02d: Checking slices: got %d local (e=%d) & %d foreign (e=%d)'%(i,ls,els,fs,efs) - assert els==ls - assert efs==fs + myassert ('local slices',els==ls) + myassert ('foreign slices',efs==fs) def show_nodes (i,node_ids): # same as above @@ -391,7 +410,7 @@ def check_slice_nodes_n (ns,expected_nodes, is_local_slice, args=[1,2]): slice_node_ids=slice['node_ids'] print 'on nodes ',slice_node_ids show_nodes (i,slice_node_ids) - assert len(slice_node_ids)>=expected_nodes + myassert ('slice nodes',len(slice_node_ids)>=expected_nodes) if len(slice_node_ids) != expected_nodes: print 'TEMPORARY' @@ -411,7 +430,7 @@ def check_conf_files_n (nn,args=[1,2]): for i in args: nodename=node_name(i,nn) ndict= s[i].GetSlivers([nodename])[0] - assert ndict['hostname'] == nodename + myassert ('conf files',ndict['hostname'] == nodename) conf_files = ndict['conf_files'] print '%02d: %d conf_files in GetSlivers for node %s'%(i,len(conf_files),nodename) for conf_file in conf_files: @@ -434,15 +453,15 @@ def check_slivers_1 (esn,args=[1,2]): def check_slivers_n (nn,esn,args=[1,2]): for i in args: nodename=node_name(i,nn) - ndict= s[i].GetSlivers([nodename])[0] - assert ndict['hostname'] == nodename + ndict= s[i].GetSlivers(nodename) + myassert ('slivers hostname',ndict['hostname'] == nodename) slivers = ndict['slivers'] print '%02d: %d slivers (exp. %d) in GetSlivers for node %s'\ %(i,len(slivers),esn,nodename) for sliver in slivers: print '>>slivername = ',sliver['name'] pretty_printer.pprint(sliver) - assert len(slivers) == esn + myassert ('slivers count',len(slivers) == esn) #################### @@ -470,22 +489,18 @@ def test00_admin_enable (args=[1,2]): s[i].AddRoleToPerson('admin',plc[i]['peer-admin-id']) print '%02d:== enabled+admin on account %d:%s'%(i,plc[i]['peer-admin-id'],plc[i]['peer-admin-name']) -def test00_peer_person (args=[1,2]): - global plc - for i in args: - peer=peer_index(i) - email=plc[peer]['peer-admin-name'] - try: - p=s[i].GetPersons([email])[0] - plc[i]['peer_person_id']=p['person_id'] - except: - person_id = s[i].AddPerson ( {'first_name':'Peering(plain passwd)', 'last_name':plc_name(peer), 'role_ids':[3000], - 'email':email,'password':plc[peer]['peer-admin-password']}) - if person_id: - print '%02d:== Created person %d as the auth peer person'%(i,person_id) - plc[i]['peer_person_id']=person_id - #################### +def locate_key (filename): + " tries to locate a key file, either in . or in /etc/planetlab" + try: + return file("./"+filename).read() + except: + try: + return file("/etc/planetlab/"+filename).read() + except: + raise Exception,"Could not locate key %s"%filename + + def test00_peer (args=[1,2]): global plc for i in args: @@ -493,28 +508,57 @@ def test00_peer (args=[1,2]): peername = plc_name(peer) try: p=s[i].GetPeers ( [peername])[0] - plc[i]['peer_id']=p['peer_id'] except: - peer_id=s[i].AddPeer ( {'peername':peername,'peer_url':plc[peer]['url'],'auth_person_id':plc[i]['peer_person_id']}) - # NOTE : need to manually reset the encrypted password through SQL at this point - if peer_id: + try: + keyringname=plc[i]['gpg-keyring'] + cacertname=plc[i]['api-cacert'] + print 'Trying to locate keys for peer on plc[%d]'%i, + print 'in %s and %s'%(keyringname,cacertname) + + keyring=locate_key(keyringname) + cacert=locate_key(cacertname) + peer_id=s[i].AddPeer ( {'peername':peername, + 'peer_url':plc[peer]['url'], + 'key':keyring, + 'cacert': cacert, + }) print '%02d:Created peer %d'%(i,peer_id) - print "PLEASE manually set password for person_id=%d in DB%d"%(plc[i]['peer_person_id'],i) - plc[i]['peer_id']=peer_id - -def test00_peer_passwd (args=[1,2]): - if local_peer is None: - for i in args: - # using an ad-hoc local command for now - never could get quotes to reach sql.... - print "Attempting to remotely set passwd for person_id=%d in DB%d"%(plc[i]['peer_person_id'],i), - retcod=os.system("ssh root@%s new_plc_api/person-password.sh %d"%(plc[i]['hostname'],plc[i]['peer_person_id'])) - print '-> system returns',retcod - else: - i=local_peer - print "Locally setting passwd for person_id=%d in DB%d"%(plc[i]['peer_person_id'],i), - retcod=os.system("./person-password.sh -l %d"%(plc[i]['peer_person_id'])) - print '-> system returns',retcod + except Exception,e: + print 'Could not create peer,',e +# push various stuff across hosts through external ssh/scp +# this is broken, use peers-test.mk instead +#def test00_push_public_peer_material (args=[1,2]): +# for i in args: +# peer=peer_index(i) +# +# ### the gpg keyring +# # refresh +# local_keyring="/etc/planetlab/gpg_keyring.pub" +# command="ssh root@%s gpg --homedir=/etc/planetlab --export --armor > %s"\ +# %(plc[i]['hostname'],local_keyring) +# retcod=os.system(command) +# print '#',command,'->',retcod +# +# for i in args: +# peer=peer_index(i) +# # push +# src_url='root@%s:%s'%(plc[i]['hostname'],local_keyring) +# dst_url='root@%s:%s'%(plc[peer]['hostname'], plc[i]['gpg-keyring']) +# command = 'scp %s %s'%(src_url,dst_url) +# retcod=os.system(command) +# print '#',command,'->',retcod +# +# for i in args: +# peer=peer_index(i) +# # push cacert +# local_cacert='/etc/planetlab/api_ca_ssl.crt' +# src_url='root@%s:%s'%(plc[i]['hostname'],local_cacert) +# dst_url='root@%s:%s'%(plc[peer]['hostname'], plc[i]['api-cacert']) +# command = 'scp %s %s'%(src_url,dst_url) +# retcod=os.system(command) +# print '#',command,'->',retcod + # this one gets cached def get_peer_id (i): try: @@ -540,7 +584,7 @@ def test00_refresh (message,args=[1,2]): print key,retcod[key], print "}" print "+++ ellapsed: {", - timers=retcod['timers'] + timers=retcod keys=timers.keys() keys.sort() for key in keys: @@ -782,8 +826,8 @@ def test05_sa (args=[1,2]): for i in args: test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/all nodes',None,i) test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/node1',node_name(i,1),i) - test05_sa_atom (slice_name(i,1),'net_max','predefined sat/all nodes',None,i) - test05_sa_atom (slice_name(i,1),'net_max','predefined sat/node1',node_name(i,1),i) + test05_sa_atom (slice_name(i,1),'vref','predefined sat/all nodes',None,i) + test05_sa_atom (slice_name(i,1),'vref','predefined sat/node1',node_name(i,1),i) ############################## # readable dumps @@ -801,16 +845,18 @@ def p_node(n): print n['node_id'],n['peer_id'],n['hostname'],'sls=',n['slice_ids'],'site=',n['site_id'] def p_slice(s): - print s['slice_id'],s['peer_id'],s['name'],'nodes=',s['node_ids'],'persons=',s['person_ids'] - print '---','sas=',s['slice_attribute_ids'],s['name'],'crp=',s['creator_person_id'] + print 'name: %-12s'%s['name'],'id: %02d'%s['slice_id'],'peer:',s['peer_id'],'nodes=',s['node_ids'],'persons=',s['person_ids'] + print '---','sa_ids=',s['slice_attribute_ids'],'creator: %03d'%s['creator_person_id'] print "--- 'expires':",s['expires'] def p_sat(sat): - print sat['attribute_type_id'],sat['peer_id'], sat['name'], sat['min_role_id'], sat['description'] + print 'sat_id: %02d'%sat['attribute_type_id'], 'min_role_id:',sat['min_role_id'], + print 'name:', sat['name'],'<',sat['description'],'>' def p_sa (sa): - print sa['slice_attribute_id'],sa['peer_id'],sa['name'],'AT_id:',sa['attribute_type_id'] - print '---','v=',sa['value'],'sl=',sa['slice_id'],'n=',sa['node_id'] + print 'name: %-12s'%sa['name'], + print 'sa_id: %02d'%sa['slice_attribute_id'],'sat_id: %02d'%sa['attribute_type_id'], + print 'sl=%02d'%sa['slice_id'],'v=',sa['value'],'n=',sa['node_id'] import pprint pretty_printer=pprint.PrettyPrinter(5) @@ -846,12 +892,12 @@ def dump (args=[1,2]): print '%02d: Slice Attributes'%i [p_sa(x) for x in s[i].GetSliceAttributes()] timer_show() - print '%02d: Gathering all slivers'%i - slivers = s[i].GetSlivers() - timer_show() snodes=min(3,number_nodes) print '%02d: SLIVERS for first %d nodes'%(i,snodes) - [p_sliver('%02d:'%i,x) for x in s[i].GetSlivers(myrange(snodes))] + print 'WARNING - GetSlivers needs fix' +# for id in myrange(snodes): +# p_sliver('%02d:'%i,s[i].GetSlivers(id)) + print '%02d:============================== END DUMP'%i @@ -910,13 +956,15 @@ def all(): #################### def test_all_init (): message ("INIT") - test00_init () + test00_init (builtin_person=True) test00_print () test00_admin_person () test00_admin_enable () - test00_peer_person () + test00_init (builtin_person=False) +# required before we can add peers +# use make -f peers-test.mk peers instead +# test00_push_public_peer_material() test00_peer () - test00_peer_passwd () def test_all_sites (): test01_site () @@ -1096,7 +1144,7 @@ def populate (): message("END") def populate_end(): - test00_init() + test00_init(builtin_person=False) test00_refresh ("Peer 1 for publishing foreign nodes from 2",[1]) timer_show() test04_slice_add_fnode([1]) @@ -1110,11 +1158,13 @@ def populate_end(): # temporary - scratch as needed def test_now (): - populate() - test00_refresh('peer 1 gets plc2 nodes',[1]) - test04_slice_add_fnode([1]) - test00_refresh('final',[1]) - + test_all_init() + +# populate() +# test00_refresh('peer 1 gets plc2 nodes',[1]) +# test04_slice_add_fnode([1]) +# test00_refresh('final',[1]) +# # test_all_sites () # clean_all_nodes() # clean_all_slices() @@ -1171,6 +1221,7 @@ def main (): show_test() func() timer_show() + epilogue if __name__ == '__main__': normal()