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']
53 # the hrn for the root authority
55 return self.test_plc.plc_spec['sfa']['settings']['SFA_REGISTRY_ROOT_AUTH']
57 # the hrn for the auth/site
59 return "{}.{}".format(self.root_hrn(), self.login_base)
61 # something in this site (users typically); for use by classes for subobjects
62 def obj_hrn (self, name):
63 return "{}.{}".format(self.auth_hrn(), name)
65 def regular_user_hrn(self):
66 return self.obj_hrn(self.auth_sfa_spec['user_spec']['name'])
68 return self.obj_hrn(self.auth_sfa_spec['slice_spec']['name'])
70 # xxx this needs tweaks with more recent versions of sfa that have pgv2 as the default ?
71 # dir_name is local and will be pushed later on by TestPlc
72 # by default set SFI_USER to the pi, we'll overload this
73 # on the command line when needed
74 def sfi_configure (self,dir_name):
75 plc_spec=self.test_plc.plc_spec
76 # cheat a bit: retrieve the global SFA spec from the plc obj
77 sfa_spec=self.test_plc.plc_spec['sfa']
78 # fetch keys in config spec and expose to sfi
79 for spec_name in ['pi_spec','user_spec']:
80 user_spec=self.auth_sfa_spec[spec_name]
81 user_leaf=user_spec['name']
82 key_name=user_spec['key_name']
83 key_spec = self.test_plc.locate_key (key_name)
84 for (kind,ext) in [ ('private', 'pkey'), ('public', 'pub') ] :
85 contents=key_spec[kind]
86 file_name=os.path.join(dir_name,self.obj_hrn(user_leaf))+"."+ext
87 fileconf=open(file_name,'w')
88 fileconf.write (contents)
90 utils.header ("(Over)wrote {}".format(file_name))
92 file_name=dir_name + os.sep + 'sfi_config'
93 fileconf=open(file_name,'w')
94 SFI_AUTH=self.auth_hrn()
95 fileconf.write ("SFI_AUTH='{}'".format(SFI_AUTH))
97 # default is to run as a PI
98 SFI_USER=self.obj_hrn(self.auth_sfa_spec['pi_spec']['name'])
99 fileconf.write("SFI_USER='{}'".format(SFI_USER))
101 SFI_REGISTRY='http://{}:{}/'.format(sfa_spec['settings']['SFA_REGISTRY_HOST'], 12345)
102 fileconf.write("SFI_REGISTRY='{}'".format(SFI_REGISTRY))
104 SFI_SM='http://{}:{}/'.format(sfa_spec['settings']['SFA_SM_HOST'], sfa_spec['sfi-connects-to-port'])
105 fileconf.write("SFI_SM='{}'".format(SFI_SM))
108 utils.header ("(Over)wrote {}".format(file_name))
110 # using sfaadmin to bootstrap
111 def sfa_register_site (self, options):
112 "bootstrap a site using sfaadmin"
113 command="sfaadmin reg register -t authority -x {}".format(self.auth_hrn())
114 return self.test_plc.run_in_guest(command)==0
116 def sfa_register_pi (self, options):
117 "bootstrap a PI user for that site"
118 pi_spec = self.auth_sfa_spec['pi_spec']
119 pi_hrn=self.obj_hrn(pi_spec['name'])
120 pi_mail=pi_spec['email']
121 # as installed by sfi_config
122 pi_key=os.path.join(self.sfi_path(),self.obj_hrn(pi_spec['name']+'.pub'))
123 command="sfaadmin reg register -t user -x {} --email {} --key {}".format(pi_hrn, pi_mail, pi_key)
124 if self.test_plc.run_in_guest(command)!=0: return False
125 command="sfaadmin reg update -t authority -x {} --pi {}".format(self.auth_hrn(), pi_hrn)
126 return self.test_plc.run_in_guest(command) == 0
129 def sfi_pi (self, command):
130 pi_name=self.auth_sfa_spec['pi_spec']['name']
131 return "sfi -d {} -u {} {}".format(self.sfi_path(), self.obj_hrn(pi_name), command)
132 # the sfi command line option to run as a regular user
133 def sfi_user (self, command):
134 user_name=self.auth_sfa_spec['user_spec']['name']
135 return "sfi -d {} -u {} {}".format(self.sfi_path(), self.obj_hrn(user_name), command)
139 def sfa_register_user (self, *args, **kwds): pass
141 def sfa_update_user (self, *args, **kwds): pass
143 def sfa_delete_user (self, *args, **kwds): pass
145 def sfa_remove_user_from_slice (self, options):
146 "remove regular user from slice"
147 command="update -t slice -x {} -r none".format(self.slice_hrn())
148 # xxx should check result other than visually
149 return self.test_plc.run_in_guest(self.sfi_pi(command))==0
151 def sfa_insert_user_in_slice (self, options):
152 "defines regular user as unique user in slice"
153 command="update -t slice -x {} -r {}".format(self.slice_hrn(), self.regular_user_hrn())
154 # xxx should check result other than visually
155 return self.test_plc.run_in_guest(self.sfi_pi(command))==0
157 def sfi_list (self, options):
158 "run (as regular user) sfi list (on Registry)"
160 self.test_plc.run_in_guest(self.sfi_user("list -r {}".format(self.root_hrn()))) == 0 and \
161 self.test_plc.run_in_guest(self.sfi_user("list {}".format(self.auth_hrn()))) == 0
163 def sfi_show_site (self, options):
164 "run (as regular user) sfi show (on Registry)"
166 self.test_plc.run_in_guest(self.sfi_user("show {}".format(self.auth_hrn()))) == 0
169 def sfi_show_slice (self, options):
170 "run (as PI) sfi show -n <slice> (on Registry)"
172 self.test_plc.run_in_guest(self.sfi_pi("show -n {}".format(self.slice_hrn()))) == 0
174 # checks if self.regular_user is found in registry's reg-researchers
175 def sfi_show_slice_researchers (self, options):
176 "run (as PI) sfi show <slice> -k researcher -k reg-researchers (on Registry)"
178 self.test_plc.run_in_guest(self.sfi_pi("show {} -k researcher -k reg-researchers".format(self.slice_hrn()))) == 0
181 # those are step names exposed as methods of TestPlc, hence the _sfa
183 def sfa_register_slice (self, *args, **kwds): pass
185 def sfa_renew_slice (self, *args, **kwds): pass
187 def sfa_get_expires (self, *args, **kwds): pass
189 def sfa_discover (self, *args, **kwds): pass
191 def sfa_rspec (self, *args, **kwds): pass
193 def sfa_allocate (self, *args, **kwds): pass
195 def sfa_allocate_empty (self, *args, **kwds): pass
197 def sfa_provision (self, *args, **kwds): pass
199 def sfa_provision_empty (self, *args, **kwds): pass
201 def sfa_describe (self, *args, **kwds): pass
203 def sfa_check_slice_plc (self, *args, **kwds): pass
205 def sfa_check_slice_plc_empty (self, *args, **kwds): pass
207 def sfa_update_slice (self, *args, **kwds): pass
209 def sfa_delete_slice (self, *args, **kwds): pass
211 def ssh_slice_sfa (self, *args, **kwds): pass