Пример #1
0
    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'])
Пример #2
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 = '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}
Пример #3
0
 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)
Пример #4
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)
Пример #5
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}
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
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)
Пример #9
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)
Пример #10
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)
Пример #11
0
 def get_all(self):
     context = _extract_context_from_environ(_get_environment())
     sites = models.list_sites(context, [])
     return {'sites': sites}
Пример #12
0
 def get_all(self):
     context = _extract_context_from_environ(_get_environment())
     sites = models.list_sites(context, [])
     return {'sites': sites}