def get_delete_member_vthunder_internal_subflow(self, member_id):
        delete_member_thunder_subflow = linear_flow.Flow(
            a10constants.DELETE_MEMBER_VTHUNDER_INTERNAL_SUBFLOW)
        delete_member_thunder_subflow.add(
            vthunder_tasks.SetupDeviceNetworkMap(
                name='setup_device_network_map_' + member_id,
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        delete_member_thunder_subflow.add(
            a10_database_tasks.CountMembersWithIPPortProtocol(
                name='count_members_ip_port_' + member_id,
                requires=(constants.MEMBER, constants.POOL),
                provides=a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL,
                rebind={constants.MEMBER: member_id}))
        delete_member_thunder_subflow.add(
            a10_database_tasks.PoolCountforIP(
                name='pool_count_for_ip_' + member_id,
                requires=constants.MEMBER,
                provides=a10constants.POOL_COUNT_IP,
                rebind={constants.MEMBER: member_id}))
        delete_member_thunder_subflow.add(
            server_tasks.MemberDeletePool(
                name='delete_thunder_member_pool_' + member_id,
                requires=(constants.MEMBER, a10constants.VTHUNDER,
                          constants.POOL, a10constants.POOL_COUNT_IP,
                          a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL),
                rebind={constants.MEMBER: member_id}))
        if CONF.a10_global.network_type == 'vlan':
            delete_member_thunder_subflow.add(
                vthunder_tasks.DeleteInterfaceTagIfNotInUseForMember(
                    name='delete_unused_interface_tag_in_member_' + member_id,
                    requires=[constants.MEMBER, a10constants.VTHUNDER],
                    rebind={constants.MEMBER: member_id}))

        return delete_member_thunder_subflow
    def get_rack_vthunder_delete_member_flow(self):
        """Flow to delete a member in Thunder devices

        :returns: The flow for deleting a member
        """
        delete_member_flow = linear_flow.Flow(constants.DELETE_MEMBER_FLOW)
        delete_member_flow.add(
            lifecycle_tasks.MemberToErrorOnRevertTask(requires=[
                constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER,
                constants.POOL
            ]))
        delete_member_flow.add(
            database_tasks.MarkMemberPendingDeleteInDB(
                requires=constants.MEMBER))
        delete_member_flow.add(
            model_tasks.DeleteModelObject(
                rebind={constants.OBJECT: constants.MEMBER}))
        delete_member_flow.add(
            a10_database_tasks.GetVThunderByLoadBalancer(
                requires=constants.LOADBALANCER,
                provides=a10constants.VTHUNDER))
        delete_member_flow.add(
            vthunder_tasks.SetupDeviceNetworkMap(
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        delete_member_flow.add(
            a10_database_tasks.CountMembersWithIP(
                requires=constants.MEMBER,
                provides=a10constants.MEMBER_COUNT_IP))
        delete_member_flow.add(
            a10_database_tasks.CountMembersWithIPPortProtocol(
                requires=(constants.MEMBER, constants.POOL),
                provides=a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL))
        delete_member_flow.add(
            server_tasks.MemberDelete(
                requires=(constants.MEMBER, a10constants.VTHUNDER,
                          constants.POOL, a10constants.MEMBER_COUNT_IP,
                          a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL)))
        if CONF.a10_global.network_type == 'vlan':
            delete_member_flow.add(
                vthunder_tasks.DeleteInterfaceTagIfNotInUseForMember(
                    requires=[constants.MEMBER, a10constants.VTHUNDER]))
        # Handle VRID setting
        delete_member_flow.add(self.get_delete_member_vrid_subflow())
        delete_member_flow.add(
            database_tasks.DeleteMemberInDB(requires=constants.MEMBER))
        delete_member_flow.add(
            database_tasks.DecrementMemberQuota(requires=constants.MEMBER))
        delete_member_flow.add(
            database_tasks.MarkPoolActiveInDB(requires=constants.POOL))
        delete_member_flow.add(
            database_tasks.MarkLBAndListenersActiveInDB(
                requires=[constants.LOADBALANCER, constants.LISTENERS]))
        delete_member_flow.add(
            vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER))
        return delete_member_flow
 def test_DeleteInterfaceTagIfNotInUseForMember_execute_log_warning_no_subnet_id(
         self):
     member = self._mock_member()
     member.id = "1234"
     member.subnet_id = None
     task_path = "a10_octavia.controller.worker.tasks.vthunder_tasks"
     log_message = str(
         "Subnet id argument was not specified during "
         "issuance of create command/API call for member %s. "
         "Skipping DeleteInterfaceTagIfNotInUseForMember task")
     expected_log = [
         "WARNING:{}:{}".format(task_path, log_message % member.id)
     ]
     mock_task = task.DeleteInterfaceTagIfNotInUseForMember()
     with self.assertLogs(task_path, level='WARN') as cm:
         mock_task.execute(member, VTHUNDER)
         self.assertEqual(expected_log, cm.output)
 def test_DeleteInterfaceTagIfNotInUseForMember_execute_delete_vlan(self):
     intf = a10_utils.convert_interface_to_data_model(ETHERNET_INTERFACE)
     device1_network_map = a10_data_models.DeviceNetworkMap(
         vcs_device_id=1, ethernet_interfaces=[intf])
     mock_thunder = copy.deepcopy(VTHUNDER)
     mock_thunder.device_network_map = [device1_network_map]
     member = self._mock_member()
     mock_task = task.DeleteInterfaceTagIfNotInUseForMember()
     self._mock_tag_task(mock_task)
     mock_task.axapi_client.slb.virtual_server.get.return_value = DEL_VS_LIST
     mock_task.axapi_client.slb.server.get.return_value = DEL_SERVER_LIST
     mock_task._network_driver.get_port_id_from_ip = mock.Mock()
     mock_task._network_driver.neutron_client.delete_port = mock.Mock()
     mock_task._network_driver.get_port_id_from_ip.return_value = DEL_PORT_ID
     mock_task.execute(member, mock_thunder)
     self.client_mock.vlan.delete.assert_called_with(VLAN_ID)
     mock_task._network_driver.neutron_client.delete_port.assert_called_with(
         DEL_PORT_ID)
    def get_delete_member_vthunder_internal_subflow(self, member_id):
        delete_member_thunder_subflow = linear_flow.Flow(
            a10constants.DELETE_MEMBER_VTHUNDER_INTERNAL_SUBFLOW)
        delete_member_thunder_subflow.add(
            vthunder_tasks.SetupDeviceNetworkMap(
                name='setup_device_network_map_' + member_id,
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        delete_member_thunder_subflow.add(
            server_tasks.MemberDelete(
                name='delete_thunder_member_' + member_id,
                requires=(constants.MEMBER, a10constants.VTHUNDER,
                          constants.POOL),
                rebind={constants.MEMBER: member_id}))
        if CONF.a10_global.network_type == 'vlan':
            delete_member_thunder_subflow.add(
                vthunder_tasks.DeleteInterfaceTagIfNotInUseForMember(
                    name='delete_unused_interface_tag_in_member_' + member_id,
                    requires=[constants.MEMBER, a10constants.VTHUNDER],
                    rebind={constants.MEMBER: member_id}))

        return delete_member_thunder_subflow
    def get_delete_member_vthunder_internal_subflow(self,
                                                    member_id,
                                                    pool=constants.POOL):
        delete_member_thunder_subflow = linear_flow.Flow(
            a10constants.DELETE_MEMBER_VTHUNDER_INTERNAL_SUBFLOW)
        delete_member_thunder_subflow.add(
            vthunder_tasks.SetupDeviceNetworkMap(
                name='setup_device_network_map_' + member_id,
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        delete_member_thunder_subflow.add(
            a10_database_tasks.CountMembersWithIPPortProtocol(
                name='count_members_ip_port_' + member_id,
                requires=(constants.MEMBER, constants.POOL),
                provides=a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL,
                rebind={
                    constants.MEMBER: member_id,
                    constants.POOL: pool
                }))
        delete_member_thunder_subflow.add(
            a10_database_tasks.PoolCountforIP(
                name='pool_count_for_ip_' + member_id,
                requires=constants.MEMBER,
                provides=a10constants.POOL_COUNT_IP,
                rebind={constants.MEMBER: member_id}))

        # NAT pools database and pools clean up for flavor
        delete_member_thunder_subflow.add(
            a10_database_tasks.GetFlavorData(
                name='get_flavor_data_' + member_id,
                rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER},
                provides=constants.FLAVOR))
        delete_member_thunder_subflow.add(
            server_tasks.MemberFindNatPool(
                name='member_find_nat_pool_' + member_id,
                requires=[
                    constants.MEMBER, a10constants.VTHUNDER, constants.POOL,
                    constants.FLAVOR
                ],
                provides=a10constants.NAT_FLAVOR,
                rebind={
                    constants.MEMBER: member_id,
                    constants.POOL: pool
                }))
        delete_member_thunder_subflow.add(
            a10_database_tasks.GetNatPoolEntry(
                name='get_nat_pool_db_entry_' + member_id,
                requires=[constants.MEMBER, a10constants.NAT_FLAVOR],
                provides=a10constants.NAT_POOL,
                rebind={constants.MEMBER: member_id}))
        delete_member_thunder_subflow.add(
            a10_network_tasks.ReleaseSubnetAddressForMember(
                name='release_subnet_address_for_member_' + member_id,
                requires=[
                    constants.MEMBER, a10constants.NAT_FLAVOR,
                    a10constants.NAT_POOL
                ],
                rebind={constants.MEMBER: member_id}))
        delete_member_thunder_subflow.add(
            a10_database_tasks.DeleteNatPoolEntry(
                name='delete_nat_pool_entry_' + member_id,
                requires=a10constants.NAT_POOL))

        delete_member_thunder_subflow.add(
            server_tasks.MemberDeletePool(
                name='delete_thunder_member_pool_' + member_id,
                requires=(constants.MEMBER, a10constants.VTHUNDER,
                          constants.POOL, a10constants.POOL_COUNT_IP,
                          a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL),
                rebind={
                    constants.MEMBER: member_id,
                    constants.POOL: pool
                }))
        if CONF.a10_global.network_type == 'vlan':
            delete_member_thunder_subflow.add(
                vthunder_tasks.DeleteInterfaceTagIfNotInUseForMember(
                    name='delete_unused_interface_tag_in_member_' + member_id,
                    requires=[constants.MEMBER, a10constants.VTHUNDER],
                    rebind={constants.MEMBER: member_id}))

        return delete_member_thunder_subflow
    def get_rack_vthunder_delete_member_flow(self, vthunder_conf, device_dict):
        """Flow to delete a member in Thunder devices

        :returns: The flow for deleting a member
        """
        delete_member_flow = linear_flow.Flow(constants.DELETE_MEMBER_FLOW)
        delete_member_flow.add(
            lifecycle_tasks.MemberToErrorOnRevertTask(requires=[
                constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER,
                constants.POOL
            ]))
        delete_member_flow.add(
            database_tasks.MarkMemberPendingDeleteInDB(
                requires=constants.MEMBER))
        delete_member_flow.add(
            model_tasks.DeleteModelObject(
                rebind={constants.OBJECT: constants.MEMBER}))
        delete_member_flow.add(
            a10_database_tasks.GetVThunderByLoadBalancer(
                requires=constants.LOADBALANCER,
                provides=a10constants.VTHUNDER))
        delete_member_flow.add(
            vthunder_tasks.SetupDeviceNetworkMap(
                requires=a10constants.VTHUNDER,
                provides=a10constants.VTHUNDER))
        delete_member_flow.add(
            a10_database_tasks.CountMembersWithIP(
                requires=constants.MEMBER,
                provides=a10constants.MEMBER_COUNT_IP))
        delete_member_flow.add(
            a10_database_tasks.CountMembersWithIPPortProtocol(
                requires=(constants.MEMBER, constants.POOL),
                provides=a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL))
        delete_member_flow.add(
            a10_database_tasks.GetFlavorData(
                rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER},
                provides=constants.FLAVOR))
        delete_member_flow.add(
            vthunder_tasks.GetVthunderConfByFlavor(
                inject={
                    a10constants.VTHUNDER_CONFIG: vthunder_conf,
                    a10constants.DEVICE_CONFIG_DICT: device_dict
                },
                requires=(constants.LOADBALANCER, a10constants.VTHUNDER_CONFIG,
                          a10constants.DEVICE_CONFIG_DICT),
                rebind={constants.FLAVOR_DATA: constants.FLAVOR},
                provides=(a10constants.VTHUNDER_CONFIG,
                          a10constants.USE_DEVICE_FLAVOR)))
        delete_member_flow.add(
            a10_network_tasks.GetLBResourceSubnet(
                name=a10constants.GET_LB_RESOURCE_SUBNET,
                rebind={a10constants.LB_RESOURCE: constants.MEMBER},
                provides=constants.SUBNET))
        delete_member_flow.add(
            a10_network_tasks.GetMembersOnThunder(
                requires=[
                    a10constants.VTHUNDER, a10constants.USE_DEVICE_FLAVOR
                ],
                provides=a10constants.MEMBERS))
        delete_member_flow.add(
            a10_database_tasks.CountMembersOnThunderBySubnet(
                requires=[
                    constants.SUBNET, a10constants.USE_DEVICE_FLAVOR,
                    a10constants.MEMBERS
                ],
                provides=a10constants.MEMBER_COUNT_THUNDER))
        delete_member_flow.add(
            server_tasks.MemberFindNatPool(requires=[
                constants.MEMBER, a10constants.VTHUNDER, constants.POOL,
                constants.FLAVOR
            ],
                                           provides=a10constants.NAT_FLAVOR))
        delete_member_flow.add(
            a10_database_tasks.GetNatPoolEntry(
                requires=[constants.MEMBER, a10constants.NAT_FLAVOR],
                provides=a10constants.NAT_POOL))
        delete_member_flow.add(
            a10_network_tasks.ReleaseSubnetAddressForMember(requires=[
                constants.MEMBER, a10constants.NAT_FLAVOR,
                a10constants.NAT_POOL
            ]))
        delete_member_flow.add(
            a10_database_tasks.DeleteNatPoolEntry(
                requires=a10constants.NAT_POOL))
        delete_member_flow.add(
            server_tasks.MemberDelete(
                requires=(constants.MEMBER, a10constants.VTHUNDER,
                          constants.POOL, a10constants.MEMBER_COUNT_IP,
                          a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL)))
        if CONF.a10_global.network_type == 'vlan':
            delete_member_flow.add(
                vthunder_tasks.DeleteInterfaceTagIfNotInUseForMember(
                    requires=[constants.MEMBER, a10constants.VTHUNDER]))
        # Handle VRID setting
        delete_member_flow.add(self.get_delete_member_vrid_subflow())
        delete_member_flow.add(
            database_tasks.DeleteMemberInDB(requires=constants.MEMBER))
        delete_member_flow.add(
            database_tasks.DecrementMemberQuota(requires=constants.MEMBER))
        delete_member_flow.add(
            database_tasks.MarkPoolActiveInDB(requires=constants.POOL))
        delete_member_flow.add(
            database_tasks.MarkLBAndListenersActiveInDB(
                requires=[constants.LOADBALANCER, constants.LISTENERS]))
        delete_member_flow.add(
            vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER))
        delete_member_flow.add(
            a10_database_tasks.SetThunderUpdatedAt(
                requires=a10constants.VTHUNDER))
        return delete_member_flow