1 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
2 # Copyright (C) 2010 INRIA
7 from TestSsh import TestSsh
8 from TestUserSfa import TestUserSfa
9 from TestSliceSfa import TestSliceSfa
12 def slice_sfa_mapper (method):
13 def actual(self,*args, **kwds):
14 # used to map on several slices...
16 slice_method = TestSliceSfa.__dict__[method.__name__]
17 slice_spec=self.auth_sfa_spec['slice_spec']
18 test_slice_sfa = TestSliceSfa(self,slice_spec)
19 if not slice_method(test_slice_sfa, *args, **kwds): overall=False
21 # restore the doc text
22 actual.__doc__=TestSliceSfa.__dict__[method.__name__].__doc__
26 def user_sfa_mapper (method):
27 def actual(self,*args, **kwds):
29 user_method = TestUserSfa.__dict__[method.__name__]
30 for user_spec in [ self.auth_sfa_spec['user_spec'] ]:
31 test_user_sfa = TestUserSfa(self,user_spec)
32 if not user_method(test_user_sfa, *args, **kwds): overall=False
34 # restore the doc text
35 actual.__doc__=TestUserSfa.__dict__[method.__name__].__doc__
41 def __init__ (self,test_plc,auth_sfa_spec):
42 self.test_plc=test_plc
43 self.auth_sfa_spec=auth_sfa_spec
44 self.test_ssh=TestSsh(self.test_plc.test_ssh)
46 self.login_base=self.auth_sfa_spec['login_base']
47 # self.piuser=self.auth_sfa_spec['piuser']
48 # self.regularuser=self.auth_sfa_spec['regularuser']
49 # self.slicename=self.auth_sfa_spec['slicename']
52 # return self.auth_sfa_spec['plc_slicename']
54 def rspec_style (self): return self.auth_sfa_spec['rspec_style']
57 return "/root/sfi/%s"%(self.rspec_style())
59 # the hrn for the root authority
61 return self.test_plc.plc_spec['sfa']['SFA_REGISTRY_ROOT_AUTH']
63 # the hrn for the auth/site
65 return "%s.%s"%(self.root_hrn(),self.login_base)
67 # something in this site (users typically); for use by classes for subobjects
68 def obj_hrn (self, name):
69 return "%s.%s"%(self.auth_hrn(),name)
71 # xxx this needs tweaks with more recent versions of sfa that have pgv2 as the default ?
72 # dir_name is local and will be pushed later on by TestPlc
73 # by default set SFI_USER to the pi, we'll overload this
74 # on the command line when needed
75 def sfi_configure (self,dir_name):
76 plc_spec=self.test_plc.plc_spec
77 # cheat a bit: retrieve the global SFA spec from the plc obj
78 sfa_spec=self.test_plc.plc_spec['sfa']
79 # fetch keys in config spec and expose to sfi
80 for spec_name in ['pi_spec','user_spec']:
81 user_spec=self.auth_sfa_spec[spec_name]
82 user_leaf=user_spec['name']
83 key_name=user_spec['key_name']
84 key_spec = self.test_plc.locate_key (key_name)
85 for (kind,ext) in [ ('private', 'pkey'), ('public', 'pub') ] :
86 contents=key_spec[kind]
87 file_name=os.path.join(dir_name,self.obj_hrn(user_leaf))+"."+ext
88 fileconf=open(file_name,'w')
89 fileconf.write (contents)
91 utils.header ("(Over)wrote %s"%file_name)
93 file_name=dir_name + os.sep + 'sfi_config'
94 fileconf=open(file_name,'w')
95 SFI_AUTH=self.auth_hrn()
96 fileconf.write ("SFI_AUTH='%s'"%SFI_AUTH)
98 # default is to run as a PI
99 SFI_USER=self.obj_hrn(self.auth_sfa_spec['pi_spec']['name'])
100 fileconf.write ("SFI_USER='%s'"%SFI_USER)
102 SFI_REGISTRY='http://' + sfa_spec['SFA_REGISTRY_HOST'] + ':12345/'
103 fileconf.write ("SFI_REGISTRY='%s'"%SFI_REGISTRY)
105 SFI_SM='http://' + sfa_spec['SFA_SM_HOST'] + ':12347/'
106 fileconf.write ("SFI_SM='%s'"%SFI_SM)
109 utils.header ("(Over)wrote %s"%file_name)
111 # using sfaadmin to bootstrap
112 def sfa_add_site (self, options):
113 "bootstrap a site using sfaadmin"
114 command="sfaadmin reg register -t authority -x %s"%self.auth_hrn()
115 return self.test_plc.run_in_guest(command)==0
117 def sfa_add_pi (self, options):
118 "bootstrap a PI user for that site"
119 pi_spec = self.auth_sfa_spec['pi_spec']
120 pi_hrn=self.obj_hrn(pi_spec['name'])
121 pi_mail=pi_spec['email']
122 # as installed by sfi_config
123 pi_key=os.path.join(self.sfi_path(),self.obj_hrn(pi_spec['name']+'.pub'))
124 command="sfaadmin reg register -t user -x %s --email %s --key %s"%(pi_hrn,pi_mail,pi_key)
125 if self.test_plc.run_in_guest(command)!=0: return False
126 command="sfaadmin reg update -t authority -x %s --pi %s"%(self.auth_hrn(),pi_hrn)
127 return self.test_plc.run_in_guest(command)==0
130 def sfi_pi (self, command):
131 pi_name=self.auth_sfa_spec['pi_spec']['name']
132 return "sfi -d %s -u %s %s"%(self.sfi_path(),self.obj_hrn(pi_name), command,)
133 # the sfi command line option to run as a regular user
134 def sfi_user (self, command):
135 user_name=self.auth_sfa_spec['user_spec']['name']
136 return "sfi -d %s -u %s %s"%(self.sfi_path(),self.obj_hrn(user_name), command,)
140 def sfa_add_user (self, *args, **kwds): pass
142 def sfa_update_user (self, *args, **kwds): pass
144 def sfa_delete_user (self, *args, **kwds): pass
146 def sfi_list (self, options):
147 "run (as regular user) sfi list (on Registry)"
149 self.test_plc.run_in_guest(self.sfi_user("list -r %s"%self.root_hrn()))==0 and \
150 self.test_plc.run_in_guest(self.sfi_user("list %s"%(self.auth_hrn())))==0
152 def sfi_show_slice (self, options):
153 "run (as PI) sfi show -n <slice> (on Registry)"
154 slice_spec=self.auth_sfa_spec['slice_spec']
155 slice_hrn=self.obj_hrn(slice_spec['name'])
157 self.test_plc.run_in_guest(self.sfi_pi("show -n %s"%slice_hrn))==0
159 def sfi_show_site (self, options):
160 "run (as regular user) sfi show (on Registry)"
162 self.test_plc.run_in_guest(self.sfi_user("show %s"%(self.auth_hrn())))==0
164 # those are step names exposed as methods of TestPlc, hence the _sfa
166 def sfa_add_slice (self, *args, **kwds): pass
168 def sfa_renew_slice (self, *args, **kwds): pass
170 def sfa_discover (self, *args, **kwds): pass
172 def sfa_create_slice (self, *args, **kwds): pass
174 def sfa_check_slice_plc (self, *args, **kwds): pass
176 def sfa_update_slice (self, *args, **kwds): pass
178 def sfa_delete_slice (self, *args, **kwds): pass
180 def ssh_slice_sfa (self, *args, **kwds): pass