added create_network(), delete_network(), create_subnet(), delete_subnet(), process_t...
[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         site = Sites(api, {'login_base': site_fields['login_base']})[0]
43     else:
44         site = sites[0]    
45           
46     # bootstrap roles
47     # ensure admin, pi, tech and user roles exist
48     roles = ['admin', 'pi', 'tech', 'user']    
49     for role in roles:
50         role_found = False
51         try:
52             tmp_roles = Roles(api, role)
53             if tmp_roles:
54                 role_found = True
55         except:
56             pass
57         if not role_found:
58             logger.info("bootstrap: adding role %s" % role)  
59             Role(api, {'name': role}).sync()   
60  
61     # bootstrap admin user
62     persons = Persons(api, {'email': config.nova_admin_email})
63     if not persons:     
64         logger.info("bootstrap: adding admin user record")
65         name = config.nova_admin_user[:config.nova_admin_user.index('@')]  
66         person_fields = {'email': config.nova_admin_user,
67                          'first_name': name,
68                          'last_name': name,
69                          'password': config.nova_admin_password,
70                          'tenant_id': site['tenant_id'],
71                          'keystone_id': admin.id,
72                          'enabled': True
73         }
74         person = Person(api, fields=person_fields)
75         person.sync()
76     else:
77         person = persons[0]          
78                  
79         
80     # add admin person to admin site
81     site.add_person({'email': person['email']})   
82  
83     # check admin roles
84     if 'admin' not in person['roles']:
85         person.add_role('admin', site['login_base'])      
86      
87
88 if __name__ == '__main__':
89     bootstrap()
90
91     
92