blob: 1a6f51759a3848ec43e873537cb3083541060291 [file] [log] [blame]
Tony Mack336e0f92014-11-30 15:53:08 -05001import os
2import base64
3from collections import defaultdict
4from netaddr import IPAddress, IPNetwork
5from django.db.models import F, Q
Scott Baker76a840e2015-02-11 21:38:09 -08006from xos.config import Config
Tony Mack336e0f92014-11-30 15:53:08 -05007from observer.openstacksyncstep import OpenStackSyncStep
Sapan Bhatiae6376de2015-05-13 15:51:03 +02008from observer.syncstep import *
Sapan Bhatia9028c9a2015-05-09 18:14:40 +02009from core.models import *
Tony Mack336e0f92014-11-30 15:53:08 -050010from observer.ansible import *
Tony Mack33750882015-01-06 18:27:48 -050011from openstack.driver import OpenStackDriver
Tony Mack08f82882015-03-29 08:32:21 -040012from util.logger import observer_logger as logger
Sapan Bhatia9028c9a2015-05-09 18:14:40 +020013import json
Tony Mack336e0f92014-11-30 15:53:08 -050014
Tony Mack26564362015-01-06 17:49:25 -050015class SyncControllerSlices(OpenStackSyncStep):
Sapan Bhatiab3048aa2015-01-27 03:52:19 +000016 provides=[Slice]
Tony Mack336e0f92014-11-30 15:53:08 -050017 requested_interval=0
Sapan Bhatia99f49682015-01-29 20:58:25 +000018 observes=ControllerSlice
Tony Mack336e0f92014-11-30 15:53:08 -050019
20 def fetch_pending(self, deleted):
21 if (deleted):
Tony Macka7dbd422015-01-05 22:48:11 -050022 return ControllerSlice.deleted_objects.all()
Tony Mack336e0f92014-11-30 15:53:08 -050023 else:
Tony Macka7dbd422015-01-05 22:48:11 -050024 return ControllerSlice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
Tony Mack336e0f92014-11-30 15:53:08 -050025
Tony Mack336e0f92014-11-30 15:53:08 -050026 def sync_record(self, controller_slice):
27 logger.info("sync'ing slice controller %s" % controller_slice)
28
Sapan Bhatia9028c9a2015-05-09 18:14:40 +020029 controller_register = json.loads(controller_slice.controller.backend_register)
30 if (controller_register.get('disabled',False)):
Sapan Bhatiae6376de2015-05-13 15:51:03 +020031 raise InnocuousException('Controller %s is disabled'%controller_slice.controller.name)
Sapan Bhatia9028c9a2015-05-09 18:14:40 +020032
Tony Mack336e0f92014-11-30 15:53:08 -050033 if not controller_slice.controller.admin_user:
34 logger.info("controller %r has no admin_user, skipping" % controller_slice.controller)
35 return
36
Tony Macka7dbd422015-01-05 22:48:11 -050037 controller_users = ControllerUser.objects.filter(user=controller_slice.slice.creator,
Sapan Bhatiaf6db4db2014-12-22 11:25:31 -050038 controller=controller_slice.controller)
39 if not controller_users:
40 raise Exception("slice createor %s has not accout at controller %s" % (controller_slice.slice.creator, controller_slice.controller.name))
41 else:
42 controller_user = controller_users[0]
Andy Bavier196a37a2015-08-03 15:54:30 -040043 roles = ['admin']
Tony Mack336e0f92014-11-30 15:53:08 -050044
Sapan Bhatiaf6db4db2014-12-22 11:25:31 -050045 max_instances=int(controller_slice.slice.max_slivers)
46 tenant_fields = {'endpoint':controller_slice.controller.auth_url,
47 'admin_user': controller_slice.controller.admin_user,
48 'admin_password': controller_slice.controller.admin_password,
49 'admin_tenant': 'admin',
50 'tenant': controller_slice.slice.name,
51 'tenant_description': controller_slice.slice.description,
52 'roles':roles,
53 'name':controller_user.user.email,
54 'ansible_tag':'%s@%s'%(controller_slice.slice.name,controller_slice.controller.name),
55 'max_instances':max_instances}
56
Sapan Bhatiaf6db4db2014-12-22 11:25:31 -050057 expected_num = len(roles)+1
Sapan Bhatiab0464ba2015-01-23 16:21:57 +000058 res = run_template('sync_controller_slices.yaml', tenant_fields, path='controller_slices', expected_num=expected_num)
59 tenant_id = res[0]['id']
60 if (not controller_slice.tenant_id):
61 try:
Sapan Bhatia6218c4d2015-05-09 18:17:39 +020062 driver = OpenStackDriver().admin_driver(controller=controller_slice.controller)
63 driver.shell.nova.quotas.update(tenant_id=controller_slice.tenant_id, instances=int(controller_slice.slice.max_slivers))
Sapan Bhatiab0464ba2015-01-23 16:21:57 +000064 except:
Sapan Bhatia6218c4d2015-05-09 18:17:39 +020065 logger.log_exc('Could not update quota for %s'%controller_slice.slice.name)
66 raise Exception('Could not update quota for %s'%controller_slice.slice.name)
67
Sapan Bhatiab0464ba2015-01-23 16:21:57 +000068 controller_slice.tenant_id = tenant_id
Sapan Bhatia5851db42015-01-27 03:52:43 +000069 controller_slice.backend_status = '1 - OK'
Sapan Bhatiab0464ba2015-01-23 16:21:57 +000070 controller_slice.save()
Sapan Bhatiaf6db4db2014-12-22 11:25:31 -050071
Tony Mack336e0f92014-11-30 15:53:08 -050072
Tony Mack336e0f92014-11-30 15:53:08 -050073 def delete_record(self, controller_slice):
Sapan Bhatia6218c4d2015-05-09 18:17:39 +020074 controller_register = json.loads(controller_slice.controller.backend_register)
75 if (controller_register.get('disabled',False)):
Sapan Bhatiae6376de2015-05-13 15:51:03 +020076 raise InnocuousException('Controller %s is disabled'%controller_slice.controller.name)
Tony Mack336e0f92014-11-30 15:53:08 -050077
Sapan Bhatia6218c4d2015-05-09 18:17:39 +020078 controller_users = ControllerUser.objects.filter(user=controller_slice.slice.creator,
79 controller=controller_slice.controller)
80 if not controller_users:
81 raise Exception("slice createor %s has not accout at controller %s" % (controller_slice.slice.creator, controller_slice.controller.name))
82 else:
83 controller_user = controller_users[0]
84
85 tenant_fields = {'endpoint':controller_slice.controller.auth_url,
86 'admin_user': controller_slice.controller.admin_user,
87 'admin_password': controller_slice.controller.admin_password,
88 'admin_tenant': 'admin',
89 'tenant': controller_slice.slice.name,
90 'tenant_description': controller_slice.slice.description,
91 'name':controller_user.user.email,
92 'ansible_tag':'%s@%s'%(controller_slice.slice.name,controller_slice.controller.name),
93 'delete': True}
94
95 expected_num = 1
96 run_template('sync_controller_slices.yaml', tenant_fields, path='controller_slices', expected_num=expected_num)