예제 #1
0
 def test_get_parent_project_not_exists(self, mock_key_client,
                                        mock_get_session):
     client_mock = mock.Mock()
     client_mock.projects.get.return_value = FakeProject()
     mock_key_client.return_value = client_mock
     self.assertIsNone(
         utils.get_parent_project(a10constants.MOCK_CHILD_PROJECT_ID))
예제 #2
0
 def test_get_parent_project_exists(self, mock_key_client, mock_get_session):
     client_mock = mock.Mock()
     client_mock.projects.get.return_value = FakeProject(
         parent_id=a10constants.MOCK_PARENT_PROJECT_ID)
     mock_key_client.return_value = client_mock
     self.assertEqual(utils.get_parent_project(a10constants.MOCK_CHILD_PROJECT_ID),
                      a10constants.MOCK_PARENT_PROJECT_ID)
예제 #3
0
    def execute(self, loadbalancer, vthunder_config, use_device_flavor=False):
        if use_device_flavor:
            return
        hierarchical_mt = vthunder_config.hierarchical_multitenancy
        if hierarchical_mt == 'enable' and CONF.a10_global.use_parent_partition:
            return
        vthunder_ids = self.vthunder_repo.get_vthunders_by_ip_address(
            db_apis.get_session(), ip_address=vthunder_config.ip_address)

        for vthunder_id in vthunder_ids:
            vthunder = self.vthunder_repo.get(db_apis.get_session(),
                                              id=vthunder_id)
            if vthunder is None:
                return

            existing_ip_addr_partition = '{}:{}'.format(
                vthunder.ip_address, vthunder.partition_name)
            config_ip_addr_partition = '{}:{}'.format(
                vthunder_config.ip_address, vthunder_config.partition_name)
            if existing_ip_addr_partition == config_ip_addr_partition:
                if loadbalancer.project_id not in (vthunder.project_id,
                                                   utils.get_parent_project(
                                                       vthunder.project_id)):
                    raise exceptions.ProjectInUseByExistingThunderError(
                        config_ip_addr_partition, vthunder.project_id,
                        loadbalancer.project_id)
예제 #4
0
    def create_member(self, member_id):
        """Creates a pool member.

        :param member_id: ID of the member to create
        :returns: None
        :raises NoSuitablePool: Unable to find the node pool
        """

        member = self._member_repo.get(db_apis.get_session(), id=member_id)
        if not member:
            LOG.warning(
                'Failed to fetch %s %s from DB. Retrying for up to '
                '60 seconds.', 'member', member_id)
            raise db_exceptions.NoResultFound

        pool = member.pool
        listeners = pool.listeners
        load_balancer = pool.load_balancer

        topology = CONF.a10_controller_worker.loadbalancer_topology
        parent_project_list = utils.get_parent_project_list()
        member_parent_proj = utils.get_parent_project(member.project_id)

        if (member.project_id in parent_project_list or
            (member_parent_proj and member_parent_proj in parent_project_list)
                or member.project_id in CONF.hardware_thunder.devices):
            create_member_tf = self._taskflow_load(
                self._member_flows.get_rack_vthunder_create_member_flow(),
                store={
                    constants.MEMBER: member,
                    constants.LISTENERS: listeners,
                    constants.LOADBALANCER: load_balancer,
                    constants.POOL: pool
                })
        else:
            create_member_tf = self._taskflow_load(
                self._member_flows.get_create_member_flow(topology=topology),
                store={
                    constants.MEMBER: member,
                    constants.LISTENERS: listeners,
                    constants.LOADBALANCER: load_balancer,
                    constants.POOL: pool
                })

        with tf_logging.DynamicLoggingListener(create_member_tf, log=LOG):
            create_member_tf.run()
 def execute(self, loadbalancer):
     loadbalancer_id = loadbalancer.id
     vthunder = self.vthunder_repo.get_vthunder_from_lb(
         db_apis.get_session(), loadbalancer_id)
     if vthunder is None:
         return None
     if (vthunder.undercloud and vthunder.hierarchical_multitenancy
             and CONF.a10_global.use_parent_partition):
         parent_project_id = utils.get_parent_project(vthunder.project_id)
         if parent_project_id:
             vthunder.partition_name = parent_project_id[:14]
     elif CONF.a10_global.use_parent_partition and not vthunder.hierarchical_multitenancy:
         LOG.warning(
             "Hierarchical multitenancy is disabled, use_parent_partition "
             "configuration will not be applied for loadbalancer: %s",
             loadbalancer.id)
     return vthunder
예제 #6
0
def _get_server_name(axapi_client, member):
    server_name = '{}_{}'.format(member.project_id[:5],
                                 member.ip_address.replace('.', '_'))
    try:
        server_name = axapi_client.slb.server.get(server_name)
    except (acos_errors.NotFound):
        # Backwards compatability with a10-neutron-lbaas
        if CONF.a10_global.use_parent_partition:
            try:
                parent_project_id = a10_utils.get_parent_project(
                    member.project_id)
                server_name = '_{}_{}_neutron'.format(
                    parent_project_id[:5], member.ip_address.replace('.', '_'))
                server_name = axapi_client.slb.server.get(server_name)
            except (acos_errors.NotFound):
                server_name = '_{}_{}_neutron'.format(
                    member.project_id[:5], member.ip_address.replace('.', '_'))
                server_name = axapi_client.slb.server.get(server_name)
        else:
            server_name = axapi_client.slb.server.get('_{}_{}'.format(
                server_name, 'neutron'))
    return server_name['server']['name']
예제 #7
0
    def execute(self, loadbalancer, vthunder_config):
        hierarchical_mt = vthunder_config.hierarchical_multitenancy
        if hierarchical_mt == 'enable':
            vthunder_config.partition_name = loadbalancer.project_id[:14]
            if CONF.a10_global.use_parent_partition:
                parent_project_id = utils.get_parent_project(
                    vthunder_config.project_id)
                if parent_project_id:
                    if parent_project_id != 'default':
                        vthunder_config.partition_name = parent_project_id[:14]
                else:
                    LOG.error(
                        "The parent project for project %s does not exist. ",
                        vthunder_config.project_id)
                    raise exceptions.ParentProjectNotFound(
                        vthunder_config.project_id)
            else:
                LOG.warning(
                    "Hierarchical multitenancy is disabled, use_parent_partition "
                    "configuration will not be applied for loadbalancer: %s",
                    loadbalancer.id)
        vthunder_ids = self.vthunder_repo.get_vthunders_by_project_id(
            db_apis.get_session(),
            project_id=loadbalancer.project_id)

        for vthunder_id in vthunder_ids:
            vthunder = self.vthunder_repo.get(
                db_apis.get_session(),
                id=vthunder_id)
            if vthunder is None:
                return
            existing_ip_addr_partition = '{}:{}'.format(
                vthunder.ip_address, vthunder.partition_name)
            config_ip_addr_partition = '{}:{}'.format(
                vthunder_config.ip_address, vthunder_config.partition_name)
            if existing_ip_addr_partition != config_ip_addr_partition:
                raise exceptions.ThunderInUseByExistingProjectError(
                    config_ip_addr_partition, existing_ip_addr_partition, loadbalancer.project_id)
        return vthunder_config
예제 #8
0
    def execute(self, loadbalancer, vthunder_config):
        hierarchical_mt = vthunder_config.hierarchical_multitenancy
        if hierarchical_mt == 'enable':
            vthunder_config.partition_name = loadbalancer.project_id[:14]
            if CONF.a10_global.use_parent_partition:
                parent_project_id = utils.get_parent_project(
                    vthunder_config.project_id)
                if parent_project_id:
                    if parent_project_id != 'default':
                        vthunder_config.partition_name = parent_project_id[:14]
                else:
                    LOG.error(
                        "The parent project for project %s does not exist. ",
                        vthunder_config.project_id)
                    raise exceptions.ParentProjectNotFound(
                        vthunder_config.project_id)
            else:
                LOG.warning(
                    "Hierarchical multitenancy is disabled, use_parent_partition "
                    "configuration will not be applied for loadbalancer: %s",
                    loadbalancer.id)

        return vthunder_config
예제 #9
0
    def create_listener(self, listener_id):
        """Function to create listener for A10 provider"""

        listener = self._listener_repo.get(db_apis.get_session(),
                                           id=listener_id)
        if not listener:
            LOG.warning(
                'Failed to fetch %s %s from DB. Retrying for up to '
                '60 seconds.', 'listener', listener_id)
            raise db_exceptions.NoResultFound

        load_balancer = listener.load_balancer
        parent_project_list = utils.get_parent_project_list()
        listener_parent_proj = utils.get_parent_project(listener.project_id)

        if (listener.project_id in parent_project_list
                or (listener_parent_proj
                    and listener_parent_proj in parent_project_list)
                or listener.project_id in CONF.hardware_thunder.devices):
            create_listener_tf = self._taskflow_load(
                self._listener_flows.get_rack_vthunder_create_listener_flow(
                    listener.project_id),
                store={
                    constants.LOADBALANCER: load_balancer,
                    constants.LISTENER: listener
                })
        else:
            create_listener_tf = self._taskflow_load(
                self._listener_flows.get_create_listener_flow(),
                store={
                    constants.LOADBALANCER: load_balancer,
                    constants.LISTENER: listener
                })

        with tf_logging.DynamicLoggingListener(create_listener_tf, log=LOG):
            create_listener_tf.run()