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