From: Thierry Parmentelat Date: Fri, 1 Jun 2012 18:00:42 +0000 (+0200) Subject: now that we create an SFA auth to hold the sfa entities involved: X-Git-Tag: tests-5.1-5~5 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=649f388f61085663d060f100fa011fe81305053d;p=tests.git now that we create an SFA auth to hold the sfa entities involved: refactored tests to split TestAuthSfa and TestSliceSfa cleaned up the config side a lot as well as a bonus --- diff --git a/system/TestAuthSfa.py b/system/TestAuthSfa.py new file mode 100644 index 0000000..af713d6 --- /dev/null +++ b/system/TestAuthSfa.py @@ -0,0 +1,181 @@ +# Thierry Parmentelat +# Copyright (C) 2010 INRIA +# +import utils +import os, os.path +import datetime +import time + +from TestKey import TestKey +from TestNode import TestNode +from TestSsh import TestSsh +from TestUserSfa import TestUserSfa +from TestSliceSfa import TestSliceSfa + + +def slice_sfa_mapper (method): + def actual(self,*args, **kwds): + overall=True + slice_method = TestSliceSfa.__dict__[method.__name__] + for slice_spec in [ self.auth_sfa_spec['slice_spec'] ]: + test_slice_sfa = TestSliceSfa(self,slice_spec) + if not slice_method(test_slice_sfa, *args, **kwds): overall=False + return overall + # restore the doc text + actual.__doc__=TestSliceSfa.__dict__[method.__name__].__doc__ + return actual + + +def user_sfa_mapper (method): + def actual(self,*args, **kwds): + overall=True + user_method = TestUserSfa.__dict__[method.__name__] + for user_spec in [ self.auth_sfa_spec['user_spec'] ]: + test_user_sfa = TestUserSfa(self,user_spec) + if not user_method(test_user_sfa, *args, **kwds): overall=False + return overall + # restore the doc text + actual.__doc__=TestUserSfa.__dict__[method.__name__].__doc__ + return actual + + +class TestAuthSfa: + + def __init__ (self,test_plc,auth_sfa_spec): + self.test_plc=test_plc + self.auth_sfa_spec=auth_sfa_spec + self.test_ssh=TestSsh(self.test_plc.test_ssh) +# # shortcuts + self.login_base=self.auth_sfa_spec['login_base'] +# self.piuser=self.auth_sfa_spec['piuser'] +# self.regularuser=self.auth_sfa_spec['regularuser'] +# self.slicename=self.auth_sfa_spec['slicename'] +# +# def plc_name(self): +# return self.auth_sfa_spec['plc_slicename'] + + def rspec_style (self): return self.auth_sfa_spec['rspec_style'] + + def sfi_path (self): + return "/root/sfi/%s"%(self.rspec_style()) + + # the hrn for the root authority + def root_hrn (self): + return self.test_plc.plc_spec['sfa']['SFA_REGISTRY_ROOT_AUTH'] + + # the hrn for the auth/site + def hrn (self): + return "%s.%s"%(self.root_hrn(),self.login_base) + + # something in this site (users typically) + def qualified (self, name): +# return "%s.%s"%(self.auth_sfa_spec['hrn_prefix'],name) + return "%s.%s"%(self.hrn(),name) + + # xxx this needs tweaks with more recent versions of sfa that have pgv2 as the default ? + # dir_name is local and will be pushed later on by TestPlc + # by default set SFI_USER to the pi, we'll overload this + # on the command line when needed + def sfi_configure (self,dir_name): + plc_spec=self.test_plc.plc_spec + # cheat a bit: retrieve the global SFA spec from the plc obj + sfa_spec=self.test_plc.plc_spec['sfa'] + # fetch keys in config spec and expose to sfi + for spec_name in ['pi_spec','user_spec']: + user_spec=self.auth_sfa_spec[spec_name] + user_leaf=user_spec['name'] + key_name=user_spec['key_name'] + key_spec = self.test_plc.locate_key (key_name) + for (kind,ext) in [ ('private', 'pkey'), ('public', 'pub') ] : + contents=key_spec[kind] + file_name=os.path.join(dir_name,self.qualified(user_leaf))+"."+ext + fileconf=open(file_name,'w') + fileconf.write (contents) + fileconf.close() + utils.header ("(Over)wrote %s"%file_name) + # + file_name=dir_name + os.sep + 'sfi_config' + fileconf=open(file_name,'w') + SFI_AUTH=self.hrn() + fileconf.write ("SFI_AUTH='%s'"%SFI_AUTH) + fileconf.write('\n') + # default is to run as a PI + SFI_USER=self.qualified(self.auth_sfa_spec['pi_spec']['name']) + fileconf.write ("SFI_USER='%s'"%SFI_USER) + fileconf.write('\n') + SFI_REGISTRY='http://' + sfa_spec['SFA_REGISTRY_HOST'] + ':12345/' + fileconf.write ("SFI_REGISTRY='%s'"%SFI_REGISTRY) + fileconf.write('\n') + SFI_SM='http://' + sfa_spec['SFA_SM_HOST'] + ':12347/' + fileconf.write ("SFI_SM='%s'"%SFI_SM) + fileconf.write('\n') + fileconf.close() + utils.header ("(Over)wrote %s"%file_name) + + # using sfaadmin to bootstrap + def sfa_add_site (self, options): + "bootstrap a site using sfaadmin" + command="sfaadmin reg register -t authority -x %s"%self.hrn() + return self.test_plc.run_in_guest(command)==0 + + def sfa_add_pi (self, options): + "bootstrap a PI user for that site" + pi_spec = self.auth_sfa_spec['pi_spec'] + pi_hrn=self.qualified(pi_spec['name']) + pi_mail=pi_spec['email'] + # as installed by sfi_config + pi_key=os.path.join(self.sfi_path(),self.qualified(pi_spec['name']+'.pub')) + command="sfaadmin reg register -t user -x %s --email %s --key %s"%(pi_hrn,pi_mail,pi_key) + if self.test_plc.run_in_guest(command)!=0: return False + command="sfaadmin reg update -t authority -x %s --pi %s"%(self.hrn(),pi_hrn) + return self.test_plc.run_in_guest(command)==0 + + # run as pi + def sfi_pi (self, command): + pi_name=self.auth_sfa_spec['pi_spec']['name'] + return "sfi -d %s -u %s %s"%(self.sfi_path(),self.qualified(pi_name), command,) + # the sfi command line option to run as a regular user + def sfi_user (self, command): + user_name=self.auth_sfa_spec['user_spec']['name'] + return "sfi -d %s -u %s %s"%(self.sfi_path(),self.qualified(user_name), command,) + + # user management + @user_sfa_mapper + def sfa_add_user (self, *args, **kwds): pass + @user_sfa_mapper + def sfa_update_user (self, *args, **kwds): pass + @user_sfa_mapper + def sfa_delete_user (self, *args, **kwds): pass + + def sfi_list (self, options): + "run (as regular user) sfi list (on Registry)" + return \ + self.test_plc.run_in_guest(self.sfi_user("list -r %s"%self.root_hrn()))==0 and \ + self.test_plc.run_in_guest(self.sfi_user("list %s"%(self.hrn())))==0 + + def sfi_show (self, options): + "run (as regular user) sfi show (on Registry)" + return \ + self.test_plc.run_in_guest(self.sfi_user("show %s"%(self.hrn())))==0 + + def sfi_slices (self, options): + "run (as regular user) sfi slices (on SM)" + return \ + self.test_plc.run_in_guest(self.sfi_user("slices"))==0 + + # those are step names exposed as methods of TestPlc, hence the _sfa + @slice_sfa_mapper + def sfa_add_slice (self, *args, **kwds): pass + @slice_sfa_mapper + def sfa_discover (self, *args, **kwds): pass + @slice_sfa_mapper + def sfa_create_slice (self, *args, **kwds): pass + @slice_sfa_mapper + def sfa_check_slice_plc (self, *args, **kwds): pass + @slice_sfa_mapper + def sfa_update_slice (self, *args, **kwds): pass + @slice_sfa_mapper + def sfa_delete_slice (self, *args, **kwds): pass + @slice_sfa_mapper + def ssh_slice_sfa (self, *args, **kwds): pass + diff --git a/system/TestNode.py b/system/TestNode.py index e4cc1d4..238778c 100644 --- a/system/TestNode.py +++ b/system/TestNode.py @@ -2,7 +2,6 @@ # Copyright (C) 2010 INRIA # import sys, os, os.path, time, base64 -import xmlrpclib import utils from TestUser import TestUser diff --git a/system/TestPlc.py b/system/TestPlc.py index c6658a1..5b5efe4 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -19,7 +19,7 @@ from TestSliver import TestSliver from TestBoxQemu import TestBoxQemu from TestSsh import TestSsh from TestApiserver import TestApiserver -from TestSliceSfa import TestSliceSfa +from TestAuthSfa import TestAuthSfa # step methods must take (self) and return a boolean (options is a member of the class) @@ -62,16 +62,16 @@ def slice_mapper (method): actual.__doc__=TestSlice.__dict__[method.__name__].__doc__ return actual -def slice_sfa_mapper (method): +def auth_sfa_mapper (method): def actual(self): overall=True - slice_method = TestSliceSfa.__dict__[method.__name__] - for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']: - test_slice=TestSliceSfa(self,slice_spec) + slice_method = TestAuthSfa.__dict__[method.__name__] + for slice_spec in self.plc_spec['sfa']['auth_sfa_specs']: + test_slice=TestAuthSfa(self,slice_spec) if not slice_method(test_slice,self.options): overall=False return overall # restore the doc text - actual.__doc__=TestSliceSfa.__dict__[method.__name__].__doc__ + actual.__doc__=TestAuthSfa.__dict__[method.__name__].__doc__ return actual SEP='' @@ -1247,13 +1247,14 @@ class TestPlc: # ignore result sfa_spec=self.plc_spec['sfa'] - for sfa_slice_spec in sfa_spec['sfa_slice_specs']: - login_base=sfa_slice_spec['login_base'] + for auth_sfa_spec in sfa_spec['auth_sfa_specs']: + login_base=auth_sfa_spec['login_base'] try: self.apiserver.DeleteSite (self.auth_root(),login_base) except: print "Site %s already absent from PLC db"%login_base - for key in ['piuser','regularuser']: - username="%s@%s"%(sfa_slice_spec[key],sfa_slice_spec['domain']) + for spec_name in ['pi_spec','user_spec']: + user_spec=auth_sfa_spec[spec_name] + username=user_spec['email'] try: self.apiserver.DeletePerson(self.auth_root(),username) except: # this in fact is expected as sites delete their members @@ -1399,9 +1400,9 @@ class TestPlc: utils.header("DRY RUN - skipping step") return True sfa_spec=self.plc_spec['sfa'] - # cannot use slice_sfa_mapper to pass dir_name - for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']: - test_slice=TestSliceSfa(self,slice_spec) + # cannot use auth_sfa_mapper to pass dir_name + for slice_spec in self.plc_spec['sfa']['auth_sfa_specs']: + test_slice=TestAuthSfa(self,slice_spec) dir_basename=os.path.basename(test_slice.sfi_path()) dir_name=self.confsubdir("dot-sfi/%s"%dir_basename,clean=True,dry_run=self.options.dry_run) test_slice.sfi_configure(dir_name) @@ -1419,35 +1420,35 @@ class TestPlc: self.run_in_guest("rm -rf /root/sfi") return True - @slice_sfa_mapper + @auth_sfa_mapper def sfa_add_site (self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_add_pi (self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_add_user(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_update_user(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_add_slice(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_discover(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_create_slice(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_check_slice_plc(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_update_slice(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfi_list(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfi_show(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfi_slices(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def ssh_slice_sfa(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_delete_user(self): pass - @slice_sfa_mapper + @auth_sfa_mapper def sfa_delete_slice(self): pass def sfa_stop(self): diff --git a/system/TestSlice.py b/system/TestSlice.py index 4377e66..3b37d62 100644 --- a/system/TestSlice.py +++ b/system/TestSlice.py @@ -144,6 +144,7 @@ class TestSlice: date_test_ssh = TestSsh (hostname,key=remote_privatekey,username=self.name()) command = date_test_ssh.actual_command("echo hostname ; hostname; echo id; id; echo uname -a ; uname -a") date = utils.system (command, silent=datetime.datetime.now() < graceout) + if getattr(options,'dry_run',None): return True if expected: success = date==0 else: success = date!=0 diff --git a/system/TestSliceSfa.py b/system/TestSliceSfa.py index 2c90359..fa451ff 100644 --- a/system/TestSliceSfa.py +++ b/system/TestSliceSfa.py @@ -1,171 +1,52 @@ # Thierry Parmentelat # Copyright (C) 2010 INRIA # -import utils -import os, os.path -import datetime -import time -from TestKey import TestKey +import utils from TestUser import TestUser -from TestNode import TestNode +from TestBoxQemu import TestBoxQemu from TestSsh import TestSsh -from TestUserSfa import TestUserSfa + class TestSliceSfa: - def __init__ (self,test_plc,sfa_slice_spec): - self.test_plc=test_plc - self.sfa_slice_spec=sfa_slice_spec - self.test_ssh=TestSsh(self.test_plc.test_ssh) + def __init__ (self, test_auth_sfa, slice_spec): + self.test_auth_sfa=test_auth_sfa + self.slice_spec=slice_spec # shortcuts - self.sfa_spec=test_plc.plc_spec['sfa'] - self.piuser=self.sfa_slice_spec['piuser'] - self.regularuser=self.sfa_slice_spec['regularuser'] - self.slicename=self.sfa_slice_spec['slicename'] - self.login_base=self.sfa_slice_spec['login_base'] - - def plc_name(self): - return self.sfa_slice_spec['plc_slicename'] - - def rspec_style (self): return self.sfa_slice_spec['rspec_style'] - - # the hrn for the site - def auth_hrn (self): - return self.test_plc.plc_spec['sfa']['SFA_REGISTRY_ROOT_AUTH'] - - # the hrn for the site - def site_hrn (self): - return "%s.%s"%(self.auth_hrn(),self.login_base) + self.test_plc=self.test_auth_sfa.test_plc - # something in the site (users typically) - def qualified_hrn (self, name): - return "%s.%s"%(self.site_hrn(),name) + def qualified(self,name): return self.test_auth_sfa.qualified(name) + def hrn (self): return self.qualified(self.slice_spec['name']) + def sfi_path (self): return self.test_auth_sfa.sfi_path() - # the slice hrn - def hrn(self): return self.qualified_hrn (self.slicename) + # send back up to the TestAuthSfa + def rspec_style (self): return self.test_auth_sfa.rspec_style() + def sfi_pi(self,*args,**kwds): return self.test_auth_sfa.sfi_pi(*args, **kwds) + def sfi_user(self,*args,**kwds): return self.test_auth_sfa.sfi_user(*args, **kwds) - # result name - def resname (self,name,ext): return "%s.%s"%(name,ext) - - def adfile (self): return self.resname("ad","rspec") - def reqfile (self): return self.resname("req","rspec") - def nodefile (self): return self.resname("nodes","txt") - # xxx this needs tweaks with more recent versions of sfa that have pgv2 as the default ? def discover_option(self): if self.rspec_style()=='pg': return "-r protogeni" else: return "-r sfa" - def sfi_path (self): - return "/root/sfi/%s%s"%(self.slicename,self.rspec_style()) - - def locate_key(self): - for key_name in self.sfa_slice_spec['slice_key_names']: - key_spec=self.test_plc.locate_key(key_name) - test_key=TestKey(self.test_plc,key_spec) - publickey=test_key.publicpath() - privatekey=test_key.privatepath() - if os.path.isfile(publickey) and os.path.isfile(privatekey): - found=True - return (found,privatekey) - - # dir_name is local and will be pushed later on by TestPlc - # by default set SFI_USER to the pi, we'll overload this - # on the command line when needed - def sfi_configure (self,dir_name): - plc_spec=self.test_plc.plc_spec - sfa_spec=self.sfa_spec - sfa_slice_spec=self.sfa_slice_spec - keys=plc_spec['keys'] - # fetch keys in config spec and expose to sfi - for (hrn_leaf,key_name) in sfa_slice_spec['hrn_keys'].items(): - key_spec = self.test_plc.locate_key (key_name) - for (kind,ext) in [ ('private', 'pkey'), ('public', 'pub') ] : - contents=key_spec[kind] - file_name=os.path.join(dir_name,self.qualified_hrn(hrn_leaf))+"."+ext - fileconf=open(file_name,'w') - fileconf.write (contents) - fileconf.close() - utils.header ("(Over)wrote %s"%file_name) - # - file_name=dir_name + os.sep + 'sfi_config' - fileconf=open(file_name,'w') - SFI_AUTH="%s"%(self.site_hrn()) - fileconf.write ("SFI_AUTH='%s'"%SFI_AUTH) - fileconf.write('\n') - SFI_USER=SFI_AUTH + '.' + self.piuser - fileconf.write ("SFI_USER='%s'"%SFI_USER) - fileconf.write('\n') - SFI_REGISTRY='http://' + sfa_spec['SFA_REGISTRY_HOST'] + ':12345/' - fileconf.write ("SFI_REGISTRY='%s'"%SFI_REGISTRY) - fileconf.write('\n') - SFI_SM='http://' + sfa_spec['SFA_SM_HOST'] + ':12347/' - fileconf.write ("SFI_SM='%s'"%SFI_SM) - fileconf.write('\n') - fileconf.close() - utils.header ("(Over)wrote %s"%file_name) - - # using sfaadmin to bootstrap - def sfa_add_site (self, options): - "bootstrap a site using sfaadmin" - command="sfaadmin reg register -t authority -x %s"%self.site_hrn() - return self.test_plc.run_in_guest(command)==0 - - def sfa_add_pi (self, options): - "bootstrap a PI user for that site" - pi_hrn=self.qualified_hrn(self.piuser) - pi_mail=self.sfa_slice_spec['pimail'] - # as installed by sfi_config - pi_key=os.path.join(self.sfi_path(),self.qualified_hrn(self.piuser+'.pub')) - command="sfaadmin reg register -t user -x %s --email %s --key %s"%(pi_hrn,pi_mail,pi_key) - if self.test_plc.run_in_guest(command)!=0: return False - command="sfaadmin reg update -t authority -x %s --pi %s"%(self.site_hrn(),pi_hrn) - return self.test_plc.run_in_guest(command)==0 - - # user management - def sfa_add_user (self, options): - "add a regular user using sfi add" - return TestUserSfa(self.test_plc, self.sfa_slice_spec, self).add_user() - def sfa_update_user (self, options): - "update a user record using sfi update" - return TestUserSfa(self.test_plc, self.sfa_slice_spec, self).update_user() - def sfa_delete_user (self, options): - "run sfi delete" - return TestUserSfa(self.test_plc, self.sfa_slice_spec, self).delete_user() - - # run as pi - def sfi_pi (self, command): - return "sfi -d %s -u %s %s"%(self.sfi_path(),self.qualified_hrn(self.piuser), command,) - # the sfi command line option to run as a regular user - def sfi_user (self, command): - return "sfi -d %s -u %s %s"%(self.sfi_path(),self.qualified_hrn(self.regularuser), command,) - # those are step names exposed as methods of TestPlc, hence the _sfa - def sfi_list (self, options): - "run (as regular user) sfi list (on Registry)" - return \ - self.test_plc.run_in_guest(self.sfi_user("list -r %s"%self.auth_hrn()))==0 and \ - self.test_plc.run_in_guest(self.sfi_user("list %s"%(self.site_hrn())))==0 - - def sfi_show (self, options): - "run (as regular user) sfi show (on Registry)" - return \ - self.test_plc.run_in_guest(self.sfi_user("show %s"%(self.site_hrn())))==0 - - def sfi_slices (self, options): - "run (as regular user) sfi slices (on SM)" - return \ - self.test_plc.run_in_guest(self.sfi_user("slices"))==0 - # needs to be run as pi def sfa_add_slice(self,options): "run sfi add (on Registry) from slice.xml" - sfi_options="add" - for opt in self.sfa_slice_spec['slice_sfi_options']: - sfi_options += " %s"%(opt) - return self.test_plc.run_in_guest(self.sfi_pi(sfi_options))==0 - + sfi_command="add" + sfi_command += " --type slice" + sfi_command += " --xrn %s"%self.qualified(self.slice_spec['name']) + for opt in self.slice_spec['sfi_options']: + sfi_command += " %s"%(opt) + return self.test_plc.run_in_guest(self.sfi_pi(sfi_command))==0 + + # helper - filename to store a given result + def _resname (self,name,ext): return "%s.%s"%(name,ext) + def adfile (self): return self._resname("ad","rspec") + def reqfile (self): return self._resname("req","rspec") + def nodefile (self): return self._resname("nodes","txt") + # run as user def sfa_discover(self,options): "discover resources into resouces_in.rspec" @@ -188,7 +69,8 @@ class TestSliceSfa: # all local nodes in slice ? def sfa_check_slice_plc (self,options): "check sfa_create_slice at the plcs - all local nodes should be in slice" - slice_name = self.plc_name() + login_base=self.test_auth_sfa.login_base + slice_name = "%s_%s"%(login_base,self.slice_spec['name']) slice=self.test_plc.apiserver.GetSlices(self.test_plc.auth_root(), slice_name)[0] nodes=self.test_plc.apiserver.GetNodes(self.test_plc.auth_root(), {'peer_id':None}) result=True @@ -223,10 +105,9 @@ class TestSliceSfa: return False # convert nodenames to real hostnames - sfa_slice_spec = self.sfa_slice_spec restarted=[] tocheck=[] - for nodename in sfa_slice_spec['nodenames']: + for nodename in self.auth_sfa_spec['nodenames']: (site_spec,node_spec) = self.test_plc.locate_node(nodename) tocheck.append(node_spec['node_fields']['hostname']) @@ -269,3 +150,4 @@ class TestSliceSfa: # for an empty slice return True + diff --git a/system/TestUserSfa.py b/system/TestUserSfa.py index ccd07c3..49eb7eb 100644 --- a/system/TestUserSfa.py +++ b/system/TestUserSfa.py @@ -8,23 +8,25 @@ import utils class TestUserSfa: - def __init__ (self,test_plc,sfa_slice_spec,test_slice_sfa): - self.test_plc=test_plc - self.sfa_slice_spec=sfa_slice_spec - self.test_slice_sfa=test_slice_sfa + def __init__ (self,test_auth_sfa, user_spec): + self.test_auth_sfa=test_auth_sfa + self.user_spec=user_spec # shortcuts - self.sfa_spec=test_plc.plc_spec['sfa'] - self.piuser=self.sfa_slice_spec['piuser'] - self.regularuser=self.sfa_slice_spec['regularuser'] - self.login_base=self.sfa_slice_spec['login_base'] + self.test_plc=self.test_auth_sfa.test_plc + self.login_base=self.test_auth_sfa.login_base - def sfi_path(self): return self.test_slice_sfa.sfi_path() + def sfi_path(self): return self.test_auth_sfa.sfi_path() + def qualified(self,name): return self.test_auth_sfa.qualified(name) # xxx todo - not the right place any longer - or is it ? - def add_user (self): - sfi_add_options = self.sfa_slice_spec['user_sfi_options'] - user_hrn = self.sfa_slice_spec['user_hrn'] + def sfa_add_user (self,options): + "add a regular user using sfi add" + sfi_add_options = self.user_spec['sfi_options'] + user_hrn = self.qualified(self.user_spec['name']) command="sfi -d %s add"%(self.sfi_path()) + command += " --type user" + command += " --xrn %s"%user_hrn + command += " --email %s"%self.user_spec['email'] for opt in sfi_add_options: command += " %s"%(opt,) # handle key separately because of embedded whitespace @@ -32,13 +34,15 @@ class TestUserSfa: command += " -k %s/%s.pub"%(self.sfi_path(),user_hrn) return self.test_plc.run_in_guest(command)==0 - def update_user (self): + def sfa_update_user (self,options): + "update a user record using sfi update" # xxx TODO now that we use sfi arguments utils.header ("WARNING: TestUserSfa.update_user needs more work") return True - def delete_user(self): - auth=self.sfa_spec['SFA_REGISTRY_ROOT_AUTH'] + def sfa_delete_user(self,options): + "run sfi delete on user record" + auth=self.test_auth_sfa.root_hrn() return \ self.test_plc.run_in_guest("sfi -d %s remove -t user %s.%s.%s"%( self.sfi_path(),auth,self.login_base,self.regularuser))==0 diff --git a/system/config_default.py b/system/config_default.py index 690e532..3c3cb9f 100644 --- a/system/config_default.py +++ b/system/config_default.py @@ -126,7 +126,7 @@ def sites (options,index): 'login_base':login_base(index), 'abbreviated_name':'PlanetTest%d'%index, 'max_slices':100, - 'url':'http://test.onelab.eu', + 'url':'http://test.%s'%domain, 'latitude':float(latitude), 'longitude':float(longitude), }, @@ -500,59 +500,56 @@ def sfa (options,index) : 'SFA_GENERIC_FLAVOUR' : 'pl', 'SFA_AGGREGATE_ENABLED' : 'true', # details of the slices to create - 'sfa_slice_specs' : [ sfa_slice_spec(options,index,rspec_style) - for rspec_style in options.rspec_styles ] + 'auth_sfa_specs' : [ test_auth_sfa_spec(options,index,rspec_style) + for rspec_style in options.rspec_styles ] } # rspecstyle is 'pl' for sfav1 or 'pg' for pgv2 -def sfa_slice_spec (options,index,rspec_style): - the_login_base=sfa_login_base(index,rspec_style) - # we're already in a dedicated site/authority so no need to encumber with odd names - piuser='pi' - pimail=piuser+'@test.onelab.eu' - regularuser='us' - slicename='sl' - prefix='%s.%s'%(sfa_root(index),the_login_base) - hrn=prefix+'.'+slicename - user_hrn=prefix+'.'+regularuser - pi_hrn=prefix+'.'+piuser - mail="%s@%s"%(regularuser,domain) - # passed to sfi - # -k gets computed later on from the hrn (i.e. from the '-x' key..) - user_sfi_options = [ '--type','user', - '--xrn',user_hrn, - '--email',mail, - # xxx - '--extra',"enabled=true", - '--extra',"first_name=Fake", - '--extra',"last_name=SFA-style-%s"%rspec_style, - ] - - slice_sfi_options = [ '--type', 'slice', - '--xrn', hrn, - '--researchers', user_hrn, +def test_auth_sfa_spec (options,index,rspec_style): + # the auth/site part per se + login_base=sfa_login_base(index,rspec_style) + hrn_prefix='%s.%s'%(sfa_root(index),login_base) + def full_hrn(x): return "%s.%s"%(hrn_prefix,x) + def full_mail(x): return "%s@test.%s"%(x,domain) + + # 2 users + pi_spec = { + 'name': 'pi', + 'email': full_mail ('piuser'), + 'key_name': 'key_sfapi', + } + user_hrn = full_hrn ('us') + user_spec = { + 'name': 'us', + 'email': full_mail ('regularuser'), + 'key_name': 'key_sfauser', + 'sfi_options': [ '--extra',"enabled=true", + '--extra',"first_name=Fake", + '--extra',"last_name=SFA-style-%s"%rspec_style, + ], + } + + slice_spec = { + 'name': 'sl', + 'sfi_options': [ '--researchers', user_hrn, # xxx '--extra', "description=SFA-testing-%s"%rspec_style, '--extra', "url=http://slice%d.test.onelab.eu/"%index, '--extra', "max_nodes=2", - ] + ], + 'key_name': 'key_sfauser', + 'nodenames': all_nodenames(options,index), + } + + # we're already in a dedicated site/authority so no need to encumber with odd names - return { 'plc_slicename': '%s_%s'%(the_login_base,slicename), - 'login_base' : the_login_base, - 'piuser' : piuser, - 'pimail' : pimail, - 'regularuser':regularuser, + return { #'hrn_prefix': hrn_prefix, + 'login_base' : login_base, 'domain':domain, - 'slice_key_names' : [ 'key_sfauser' ], - 'hrn_keys' : { piuser : 'key_sfapi', - regularuser : 'key_sfauser' }, - 'nodenames' : all_nodenames(options,index), - 'sitename' : the_login_base, - 'slicename' : slicename, 'rspec_style':rspec_style, - 'user_sfi_options': user_sfi_options, - 'user_hrn': user_hrn, - 'slice_sfi_options': slice_sfi_options, + 'pi_spec': pi_spec, + 'user_spec': user_spec, + 'slice_spec': slice_spec, } diff --git a/system/macros.py b/system/macros.py index c807f2f..d52be74 100644 --- a/system/macros.py +++ b/system/macros.py @@ -50,6 +50,13 @@ sequences['sfa_create'] = [ 'sfa_add_slice', ] +sequences['sfa_provision'] = [ + 'sfa-discover', + 'sfa-create_slice', + 'sfa_check_slice_plc', + 'sfa_view_all', +] + # run the whole SFA stuff but from scratch, new vs all reinstalled and all sequences['sfa_scratch'] = [ 'show',