7a4b90bb2837f6709c3945eb6ffa6e9bcf124b9c
[tests.git] / system / TestAuthSfa.py
1 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
2 # Copyright (C) 2010 INRIA 
3 #
4 import os, os.path
5
6 import utils
7 from TestSsh import TestSsh
8 from TestUserSfa import TestUserSfa
9 from TestSliceSfa import TestSliceSfa
10
11
12 def slice_sfa_mapper (method):
13     def actual(self,*args, **kwds):
14         overall=True
15         slice_method = TestSliceSfa.__dict__[method.__name__]
16         for slice_spec in [ self.auth_sfa_spec['slice_spec'] ]:
17             test_slice_sfa = TestSliceSfa(self,slice_spec)
18             if not slice_method(test_slice_sfa, *args, **kwds): overall=False
19         return overall
20     # restore the doc text
21     actual.__doc__=TestSliceSfa.__dict__[method.__name__].__doc__
22     return actual
23
24
25 def user_sfa_mapper (method):
26     def actual(self,*args, **kwds):
27         overall=True
28         user_method = TestUserSfa.__dict__[method.__name__]
29         for user_spec in [ self.auth_sfa_spec['user_spec'] ]:
30             test_user_sfa = TestUserSfa(self,user_spec)
31             if not user_method(test_user_sfa, *args, **kwds): overall=False
32         return overall
33     # restore the doc text
34     actual.__doc__=TestUserSfa.__dict__[method.__name__].__doc__
35     return actual
36
37
38 class TestAuthSfa:
39
40     def __init__ (self,test_plc,auth_sfa_spec):
41         self.test_plc=test_plc
42         self.auth_sfa_spec=auth_sfa_spec
43         self.test_ssh=TestSsh(self.test_plc.test_ssh)
44 #        # shortcuts
45         self.login_base=self.auth_sfa_spec['login_base']
46 #        self.piuser=self.auth_sfa_spec['piuser']
47 #        self.regularuser=self.auth_sfa_spec['regularuser']
48 #        self.slicename=self.auth_sfa_spec['slicename']
49 #        
50 #    def plc_name(self):
51 #        return self.auth_sfa_spec['plc_slicename']
52     
53     def rspec_style (self): return self.auth_sfa_spec['rspec_style']
54
55     def sfi_path (self):
56         return "/root/sfi/%s"%(self.rspec_style())
57
58     # the hrn for the root authority
59     def root_hrn (self):
60         return self.test_plc.plc_spec['sfa']['SFA_REGISTRY_ROOT_AUTH']
61
62     # the hrn for the auth/site
63     def hrn (self):
64         return "%s.%s"%(self.root_hrn(),self.login_base)
65
66     # something in this site (users typically)
67     def qualified (self, name):
68 #        return "%s.%s"%(self.auth_sfa_spec['hrn_prefix'],name)
69         return "%s.%s"%(self.hrn(),name)
70
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.qualified(user_leaf))+"."+ext
88                 fileconf=open(file_name,'w')
89                 fileconf.write (contents)
90                 fileconf.close()
91                 utils.header ("(Over)wrote %s"%file_name)
92         #
93         file_name=dir_name + os.sep + 'sfi_config'
94         fileconf=open(file_name,'w')
95         SFI_AUTH=self.hrn()
96         fileconf.write ("SFI_AUTH='%s'"%SFI_AUTH)
97         fileconf.write('\n')
98         # default is to run as a PI
99         SFI_USER=self.qualified(self.auth_sfa_spec['pi_spec']['name'])
100         fileconf.write ("SFI_USER='%s'"%SFI_USER)
101         fileconf.write('\n')
102         SFI_REGISTRY='http://' + sfa_spec['SFA_REGISTRY_HOST'] + ':12345/'
103         fileconf.write ("SFI_REGISTRY='%s'"%SFI_REGISTRY)
104         fileconf.write('\n')
105         SFI_SM='http://' + sfa_spec['SFA_SM_HOST'] + ':12347/'
106         fileconf.write ("SFI_SM='%s'"%SFI_SM)
107         fileconf.write('\n')
108         fileconf.close()
109         utils.header ("(Over)wrote %s"%file_name)
110
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.hrn()
115         return self.test_plc.run_in_guest(command)==0
116
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.qualified(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.qualified(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.hrn(),pi_hrn)
127         return self.test_plc.run_in_guest(command)==0
128
129     # run as pi
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.qualified(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.qualified(user_name), command,)
137
138     # user management
139     @user_sfa_mapper
140     def sfa_add_user (self, *args, **kwds): pass
141     @user_sfa_mapper
142     def sfa_update_user (self, *args, **kwds): pass
143     @user_sfa_mapper
144     def sfa_delete_user (self, *args, **kwds): pass
145
146     def sfi_list (self, options):
147         "run (as regular user) sfi list (on Registry)"
148         return \
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.hrn())))==0
151
152     def sfi_show (self, options):
153         "run (as regular user) sfi show (on Registry)"
154         return \
155             self.test_plc.run_in_guest(self.sfi_user("show %s"%(self.hrn())))==0
156
157     # those are step names exposed as methods of TestPlc, hence the _sfa
158     @slice_sfa_mapper
159     def sfa_add_slice (self, *args, **kwds): pass
160     @slice_sfa_mapper
161     def sfa_renew_slice (self, *args, **kwds): pass
162     @slice_sfa_mapper
163     def sfa_discover (self, *args, **kwds): pass
164     @slice_sfa_mapper
165     def sfa_create_slice (self, *args, **kwds): pass
166     @slice_sfa_mapper
167     def sfa_check_slice_plc (self, *args, **kwds): pass
168     @slice_sfa_mapper
169     def sfa_update_slice (self, *args, **kwds): pass
170     @slice_sfa_mapper
171     def sfa_delete_slice (self, *args, **kwds): pass
172     @slice_sfa_mapper
173     def ssh_slice_sfa     (self, *args, **kwds): pass
174