initial checkin
[plcapi.git] / bootstrap.py
1 #!/usr/bin/python
2
3 from PLC.Config import Config
4 from PLC.API import PLCAPI
5 from PLC.NovaShell import NovaShell     
6 from PLC.Sites import Site, Sites
7 from PLC.Persons import Person, Persons
8 from PLC.Roles import Role, Roles
9 from PLC.Logger import logger
10
11
12 def bootstrap():
13     """
14     Create admin records in PLC database. Requires valid nova config settings.
15     """        
16     # lookup admin account in nova
17     api = PLCAPI()
18     config = Config()
19     nova = NovaShell()
20     admin = nova.keystone.users.find(email=config.nova_admin_email)
21     tenant = nova.keystone.tenants.find(name=config.nova_admin_tenant)
22
23     # bootstrap admin site
24     sites = Sites(api, {'name': tenant.name, 'tenant_id': tenant.id})
25     if not sites:
26         logger.info("bootstrap: adding admin site record")
27         if tenant.description:
28             description = tenant.description
29         else:
30             description = tenant.name              
31         site_fields = {
32             'tenant_id': tenant.id,
33             'enabled': True,
34             'login_base': tenant.name,
35             'abbreviated_name': 'Admin Site',
36             'is_public': False,
37             'name': tenant.name,
38             'description': description,
39         }
40         site = Site(api, fields=site_fields)
41         site.sync()
42     else:
43         site = sites[0]    
44           
45     # bootstrap roles
46     # ensure admin, pi, tech and user roles exist
47     roles = ['admin', 'pi', 'tech', 'user']    
48     for role in roles:
49         role_found = False
50         try:
51             tmp_roles = Roles(api, role)
52             if tmp_roles:
53                 role_found = True
54         except:
55             pass
56         if not role_found:
57             logger.info("bootstrap: adding role %s" % role)  
58             Role(api, {'name': role}).sync()   
59  
60     # bootstrap admin user
61     persons = Persons(api, {'email': config.nova_admin_email})
62     if not persons:     
63         logger.info("bootstrap: adding admin user record")  
64         person_fields = {'email': config.nova_admin_email,
65                          'first_name': config.nova_admin_user,
66                          'last_name': config.nova_admin_user,
67                          'password': config.nova_admin_password,
68                          'tenant_id': site['tenant_id'],
69                          'keystone_id': admin.id,
70                          'enabled': True
71         }
72         person = Person(api, fields=person_fields)
73         person.sync()
74     else:
75         person = persons[0]          
76                  
77         
78     # add admin person to admin site
79     site.add_person({'email': person['email']})   
80  
81     # check admin roles
82     if 'admin' not in person['roles']:
83         person.add_role('admin', site['login_base'])      
84      
85
86 if __name__ == '__main__':
87     bootstrap()
88
89     
90