Example #1
0
    def get_update_listener_flow(self, topology):
        """Flow to update a listener"""

        update_listener_flow = linear_flow.Flow(constants.UPDATE_LISTENER_FLOW)
        update_listener_flow.add(lifecycle_tasks.ListenerToErrorOnRevertTask(
            requires=[constants.LISTENER]))
        update_listener_flow.add(vthunder_tasks.VthunderInstanceBusy(
            requires=a10constants.COMPUTE_BUSY))
        update_listener_flow.add(a10_database_tasks.GetVThunderByLoadBalancer(
            requires=constants.LOADBALANCER,
            provides=a10constants.VTHUNDER))
        if topology == constants.TOPOLOGY_ACTIVE_STANDBY:
            update_listener_flow.add(vthunder_tasks.GetMasterVThunder(
                name=a10constants.GET_MASTER_VTHUNDER,
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        update_listener_flow.add(self.handle_ssl_cert_flow(flow_type='update'))
        update_listener_flow.add(a10_database_tasks.GetFlavorData(
            rebind={a10constants.LB_RESOURCE: constants.LISTENER},
            provides=constants.FLAVOR_DATA))
        update_listener_flow.add(virtual_port_tasks.ListenerUpdate(
            requires=[constants.LOADBALANCER, constants.LISTENER,
                      a10constants.VTHUNDER, constants.FLAVOR_DATA, constants.UPDATE_DICT]))
        update_listener_flow.add(database_tasks.UpdateListenerInDB(
            requires=[constants.LISTENER, constants.UPDATE_DICT]))
        update_listener_flow.add(a10_database_tasks.
                                 MarkLBAndListenerActiveInDB(
                                     requires=[constants.LOADBALANCER,
                                               constants.LISTENER]))
        update_listener_flow.add(vthunder_tasks.WriteMemory(
            requires=a10constants.VTHUNDER))
        update_listener_flow.add(a10_database_tasks.SetThunderUpdatedAt(
            requires=a10constants.VTHUNDER))
        return update_listener_flow
Example #2
0
    def get_create_pool_flow(self):
        """Create a flow to create a pool

        :returns: The flow for creating a pool
        """
        create_pool_flow = linear_flow.Flow(constants.CREATE_POOL_FLOW)
        create_pool_flow.add(
            lifecycle_tasks.PoolToErrorOnRevertTask(requires=[
                constants.POOL, constants.LISTENERS, constants.LOADBALANCER
            ]))
        create_pool_flow.add(
            database_tasks.MarkPoolPendingCreateInDB(requires=constants.POOL))
        create_pool_flow.add(
            a10_database_tasks.GetVThunderByLoadBalancer(
                requires=constants.LOADBALANCER,
                provides=a10constants.VTHUNDER))
        create_pool = service_group_tasks.PoolCreate(
            requires=[constants.POOL, a10constants.VTHUNDER],
            provides=constants.POOL)
        create_pool_flow.add(*self._get_sess_pers_subflow(create_pool))
        create_pool_flow.add(
            virtual_port_tasks.ListenerUpdate(requires=[
                constants.LOADBALANCER, constants.LISTENER,
                a10constants.VTHUNDER
            ]))
        create_pool_flow.add(
            database_tasks.MarkPoolActiveInDB(requires=constants.POOL))
        create_pool_flow.add(
            database_tasks.MarkLBAndListenersActiveInDB(
                requires=[constants.LOADBALANCER, constants.LISTENERS]))
        create_pool_flow.add(
            vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER))

        return create_pool_flow
    def get_update_listener_flow(self):
        """Flow to update a listener"""

        update_listener_flow = linear_flow.Flow(constants.UPDATE_LISTENER_FLOW)
        update_listener_flow.add(
            lifecycle_tasks.ListenerToErrorOnRevertTask(
                requires=[constants.LISTENER]))
        update_listener_flow.add(
            a10_database_tasks.GetVThunderByLoadBalancer(
                requires=constants.LOADBALANCER,
                provides=a10constants.VTHUNDER))
        update_listener_flow.add(self.handle_ssl_cert_flow(flow_type='update'))
        update_listener_flow.add(
            virtual_port_tasks.ListenerUpdate(requires=[
                constants.LOADBALANCER, constants.LISTENER,
                a10constants.VTHUNDER
            ]))
        update_listener_flow.add(
            database_tasks.UpdateListenerInDB(
                requires=[constants.LISTENER, constants.UPDATE_DICT]))
        update_listener_flow.add(
            a10_database_tasks.MarkLBAndListenerActiveInDB(
                requires=[constants.LOADBALANCER, constants.LISTENER]))
        update_listener_flow.add(
            vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER))
        return update_listener_flow
Example #4
0
    def get_delete_pool_flow(self, members, health_mon, store):
        """Create a flow to delete a pool

        :returns: The flow for deleting a pool
        """
        delete_pool_flow = linear_flow.Flow(constants.DELETE_POOL_FLOW)
        delete_pool_flow.add(
            lifecycle_tasks.PoolToErrorOnRevertTask(requires=[
                constants.POOL, constants.LISTENERS, constants.LOADBALANCER
            ]))
        delete_pool_flow.add(
            database_tasks.MarkPoolPendingDeleteInDB(requires=constants.POOL))
        delete_pool_flow.add(
            database_tasks.CountPoolChildrenForQuota(
                requires=constants.POOL, provides=constants.POOL_CHILD_COUNT))
        delete_pool_flow.add(
            model_tasks.DeleteModelObject(
                rebind={constants.OBJECT: constants.POOL}))
        # Get VThunder details from database
        delete_pool_flow.add(
            a10_database_tasks.GetVThunderByLoadBalancer(
                requires=constants.LOADBALANCER,
                provides=a10constants.VTHUNDER))
        delete_pool_flow.add(
            virtual_port_tasks.ListenerUpdate(requires=[
                constants.LOADBALANCER, constants.LISTENER,
                a10constants.VTHUNDER
            ]))
        delete_pool_flow.add(
            persist_tasks.DeleteSessionPersistence(
                requires=[a10constants.VTHUNDER, constants.POOL]))
        # Delete pool children
        delete_pool_flow.add(
            self._get_delete_health_monitor_vthunder_subflow(health_mon))
        delete_pool_flow.add(
            self._get_delete_member_vthunder_subflow(members, store))
        delete_pool_flow.add(
            service_group_tasks.PoolDelete(
                requires=[constants.POOL, a10constants.VTHUNDER]))
        delete_pool_flow.add(
            database_tasks.DeletePoolInDB(requires=constants.POOL))
        delete_pool_flow.add(
            database_tasks.DecrementPoolQuota(
                requires=[constants.POOL, constants.POOL_CHILD_COUNT]))
        delete_pool_flow.add(
            database_tasks.MarkLBAndListenersActiveInDB(
                requires=[constants.LOADBALANCER, constants.LISTENERS]))
        delete_pool_flow.add(
            vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER))

        return delete_pool_flow
    def test_update_http_virtual_port_with_flavor(self):
        listener = self._mock_listener('HTTP', 1000)
        flavor = {"virtual_port": {"support_http2": 1}}

        listener_task = task.ListenerUpdate()
        listener_task.axapi_client = self.client_mock

        with mock.patch('a10_octavia.common.openstack_mappings.virtual_port_protocol',
                        return_value=listener.protocol):
            listener_task.execute(LB, listener, VTHUNDER, flavor)

        args, kwargs = self.client_mock.slb.virtual_server.vport.replace.call_args
        self.assertIn('support_http2', kwargs['port'])
        self.assertEqual(kwargs['port'].get('support_http2'), 1)
    def test_set_http_virtual_port_conn_limit_with_config(self):
        listener = self._mock_listener('HTTP', -1)

        listener_task = task.ListenerUpdate()
        listener_task.axapi_client = self.client_mock
        self.conf.config(group=a10constants.LISTENER_CONF_SECTION,
                         conn_limit=200)
        listener_task.CONF = self.conf

        with mock.patch('a10_octavia.common.openstack_mappings.virtual_port_protocol',
                        return_value=listener.protocol):
            listener_task.execute(LB, listener, VTHUNDER, UPDATE_DICT)

        args, kwargs = self.client_mock.slb.virtual_server.vport.replace.call_args
        self.assertEqual(kwargs['conn_limit'], 200)
    def test_update_http_virtual_port_use_rcv_hop(self):
        listener = self._mock_listener('HTTP', 1000)

        listener_task = task.ListenerUpdate()
        listener_task.axapi_client = self.client_mock
        self.conf.config(group=a10constants.LISTENER_CONF_SECTION,
                         use_rcv_hop_for_resp=False)
        listener_task.CONF = self.conf

        with mock.patch('a10_octavia.common.openstack_mappings.virtual_port_protocol',
                        return_value=listener.protocol):
            listener_task.execute(LB, listener, VTHUNDER)

        args, kwargs = self.client_mock.slb.virtual_server.vport.replace.call_args
        self.assertIn('use_rcv_hop', kwargs)
        self.assertFalse(kwargs.get('use_rcv_hop'))
    def test_update_http_virtual_port_flavor_over_config(self):
        listener = self._mock_listener('HTTP', 1000)
        flavor = {"virtual_port": {"conn_limit": 300}}

        listener_task = task.ListenerUpdate()
        listener_task.axapi_client = self.client_mock
        self.conf.config(group=a10constants.LISTENER_CONF_SECTION,
                         conn_limit=200)
        listener_task.CONF = self.conf

        with mock.patch('a10_octavia.common.openstack_mappings.virtual_port_protocol',
                        return_value=listener.protocol):
            listener_task.execute(LB, listener, VTHUNDER, flavor, UPDATE_DICT)

        args, kwargs = self.client_mock.slb.virtual_server.vport.replace.call_args
        self.assertIn('conn_limit', kwargs['port'])
        self.assertEqual(kwargs['port'].get('conn_limit'), 300)