def __init__(self): self._sites = {} self.compute_host_manager = ComputeHostManager(self) sites = models.list_sites(t_context.get_db_context(), []) for site in sites: # skip top site if not site['az_id']: continue self.create_site(t_context.get_admin_context(), site['site_name'])
def post(self, **kw): context = _extract_context_from_environ(_get_environment()) if not context.is_admin: pecan.abort(400, 'Admin role required to create sites') return site_name = kw.get('name') is_top_site = kw.get('top', False) if not site_name: pecan.abort(400, 'Name of site required') return site_filters = [{ 'key': 'site_name', 'comparator': 'eq', 'value': site_name }] sites = models.list_sites(context, site_filters) if sites: pecan.abort(409, 'Site with name %s exists' % site_name) return ag_name = 'ag_%s' % site_name # top site doesn't need az az_name = 'az_%s' % site_name if not is_top_site else '' try: site_dict = { 'site_id': str(uuid.uuid4()), 'site_name': site_name, 'az_id': az_name } site = models.create_site(context, site_dict) except Exception as e: LOG.debug(e.message) pecan.abort(500, 'Fail to create site') return # top site doesn't need aggregate if is_top_site: pecan.response.status = 201 return {'site': site} else: try: top_client = client.Client() top_client.create_aggregates(context, ag_name, az_name) except Exception as e: LOG.debug(e.message) # delete previously created site models.delete_site(context, site['site_id']) pecan.abort(500, 'Fail to create aggregate') return pecan.response.status = 201 return {'site': site}
def test_query(self): site1 = {'site_id': 'test_site1_uuid', 'site_name': 'test_site1', 'az_id': 'test_az1_uuid'} site2 = {'site_id': 'test_site2_uuid', 'site_name': 'test_site2', 'az_id': 'test_az2_uuid'} models.create_site(self.context, site1) models.create_site(self.context, site2) filters = [{'key': 'site_name', 'comparator': 'eq', 'value': 'test_site2'}] sites = models.list_sites(self.context, filters) self.assertEqual(len(sites), 1) self.assertEqual(sites[0], site2) filters = [{'key': 'site_name', 'comparator': 'eq', 'value': 'test_site3'}] sites = models.list_sites(self.context, filters) self.assertEqual(len(sites), 0)
def test_post_create_aggregate_exception(self, mock_method): mock_method.side_effect = Exception kw = {'name': 'BottomSite'} self.controller.post(**kw) pecan.abort.assert_called_once_with(500, 'Fail to create aggregate') # make sure site is deleted site_filter = [{'key': 'site_name', 'comparator': 'eq', 'value': 'BottomSite'}] sites = models.list_sites(self.context, site_filter) self.assertEqual(len(sites), 0)
def post(self, **kw): context = _extract_context_from_environ(_get_environment()) if not context.is_admin: pecan.abort(400, 'Admin role required to create sites') return site_name = kw.get('name') is_top_site = kw.get('top', False) if not site_name: pecan.abort(400, 'Name of site required') return site_filters = [{'key': 'site_name', 'comparator': 'eq', 'value': site_name}] sites = models.list_sites(context, site_filters) if sites: pecan.abort(409, 'Site with name %s exists' % site_name) return ag_name = utils.get_ag_name(site_name) # top site doesn't need az az_name = utils.get_az_name(site_name) if not is_top_site else '' try: site_dict = {'site_id': str(uuid.uuid4()), 'site_name': site_name, 'az_id': az_name} site = models.create_site(context, site_dict) except Exception as e: LOG.debug(e.message) pecan.abort(500, 'Fail to create site') return # top site doesn't need aggregate if is_top_site: pecan.response.status = 201 return {'site': site} else: try: top_client = client.Client() top_client.create_aggregates(context, ag_name, az_name) site_api = cascading_site_api.CascadingSiteNotifyAPI() site_api.create_site(context, site_name) except Exception as e: LOG.debug(e.message) # delete previously created site models.delete_site(context, site['site_id']) pecan.abort(500, 'Fail to create aggregate') return pecan.response.status = 201 return {'site': site}
def _update_endpoint_from_keystone(self, cxt, is_internal): """Update the database by querying service endpoint url from Keystone :param cxt: context object :param is_internal: if True, this method utilizes pre-configured admin username and password to apply an new admin token, this happens only when auto_refresh_endpoint is set to True. if False, token in cxt is directly used, users should prepare admin token themselves :return: None """ if is_internal: admin_context = tricircle_context.Context() admin_context.auth_token = self._get_admin_token() endpoint_map = self._get_endpoint_from_keystone(admin_context) else: endpoint_map = self._get_endpoint_from_keystone(cxt) for region in endpoint_map: # use region name to query site site_filters = [{'key': 'site_name', 'comparator': 'eq', 'value': region}] site_list = models.list_sites(cxt, site_filters) # skip region/site not registered in cascade service if len(site_list) != 1: continue for service in endpoint_map[region]: site_id = site_list[0]['site_id'] config_filters = [{'key': 'site_id', 'comparator': 'eq', 'value': site_id}, {'key': 'service_type', 'comparator': 'eq', 'value': service}] config_list = models.list_site_service_configuration( cxt, config_filters) if len(config_list) > 1: raise exception.EndpointNotUnique(site_id, service) if len(config_list) == 1: config_id = config_list[0]['service_id'] update_dict = { 'service_url': endpoint_map[region][service]} models.update_site_service_configuration( cxt, config_id, update_dict) else: config_dict = { 'service_id': str(uuid.uuid4()), 'site_id': site_id, 'service_name': '%s_%s' % (region, service), 'service_type': service, 'service_url': endpoint_map[region][service] } models.create_site_service_configuration( cxt, config_dict)
def _update_endpoint_from_keystone(self, cxt, is_internal): """Update the database by querying service endpoint url from Keystone :param cxt: context object :param is_internal: if True, this method utilizes pre-configured admin username and password to apply an new admin token, this happens only when auto_refresh_endpoint is set to True. if False, token in cxt is directly used, users should prepare admin token themselves :return: None """ if is_internal: admin_context = tricircle_context.Context() admin_context.auth_token = self._get_admin_token() endpoint_map = self._get_endpoint_from_keystone(admin_context) else: endpoint_map = self._get_endpoint_from_keystone(cxt) for region in endpoint_map: # use region name to query site site_filters = [{'key': 'site_name', 'comparator': 'eq', 'value': region}] site_list = models.list_sites(cxt, site_filters) # skip region/site not registered in cascade service if len(site_list) != 1: continue for service in endpoint_map[region]: site_id = site_list[0]['site_id'] config_filters = [{'key': 'site_id', 'comparator': 'eq', 'value': site_id}, {'key': 'service_type', 'comparator': 'eq', 'value': service}] config_list = models.list_site_service_configurations( cxt, config_filters) if len(config_list) > 1: raise exception.EndpointNotUnique(site_id, service) if len(config_list) == 1: config_id = config_list[0]['service_id'] update_dict = { 'service_url': endpoint_map[region][service]} models.update_site_service_configuration( cxt, config_id, update_dict) else: config_dict = { 'service_id': str(uuid.uuid4()), 'site_id': site_id, 'service_type': service, 'service_url': endpoint_map[region][service] } models.create_site_service_configuration( cxt, config_dict)
def test_post_create_aggregate_exception(self, mock_method): mock_method.side_effect = Exception kw = {'name': 'BottomSite'} self.controller.post(**kw) pecan.abort.assert_called_once_with(500, 'Fail to create aggregate') # make sure site is deleted site_filter = [{ 'key': 'site_name', 'comparator': 'eq', 'value': 'BottomSite' }] sites = models.list_sites(self.context, site_filter) self.assertEqual(len(sites), 0)
def _ensure_endpoint_set(self, cxt, service): handle = self.service_handle_map[service] if not handle.is_endpoint_url_set(): site_filters = [{'key': 'site_name', 'comparator': 'eq', 'value': cfg.CONF.client.top_site_name}] site_list = models.list_sites(cxt, site_filters) if len(site_list) == 0: raise exception.ResourceNotFound(models.Site, cfg.CONF.client.top_site_name) # site_name is unique key, safe to get the first element site_id = site_list[0]['site_id'] config_filters = [ {'key': 'site_id', 'comparator': 'eq', 'value': site_id}, {'key': 'service_type', 'comparator': 'eq', 'value': service}] conf_list = self._get_config_with_retry( cxt, config_filters, site_id, service, cfg.CONF.client.auto_refresh_endpoint) url = conf_list[0]['service_url'] handle.update_endpoint_url(url)
def get_all(self): context = _extract_context_from_environ(_get_environment()) sites = models.list_sites(context, []) return {'sites': sites}