def test_delete_member_task_single_no_port(self): mock_delete_member = task.MemberDelete() mock_delete_member.axapi_client = self.client_mock mock_delete_member.execute(MEMBER, VTHUNDER, POOL, 0, 0) self.client_mock.slb.service_group.member.delete.assert_called_with( POOL.id, SERVER_NAME, MEMBER.protocol_port) self.client_mock.slb.server.delete.assert_called_with(SERVER_NAME)
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 get_delete_member_flow(self): """Flow to delete a member on VThunder :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( 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( server_tasks.MemberDelete( requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, a10constants.MEMBER_COUNT_IP, a10constants.MEMBER_COUNT_IP_PORT_PROTOCOL))) 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
def get_delete_member_flow(self): """Create a flow to delete a member :returns: The flow for deleting a member """ delete_member_flow = linear_flow.Flow(constants.DELETE_MEMBER_FLOW) delete_member_flow.add( a10_database_tasks.CountMembersInProject( requires=constants.MEMBER, provides=a10constants.MEMBER_COUNT)) 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( database_tasks.DeleteMemberInDB(requires=constants.MEMBER)) delete_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) delete_member_flow.add( server_tasks.MemberDelete(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL))) 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( a10_database_tasks.GetVRIDForProjectMember( requires=constants.MEMBER, provides=a10constants.VRID)) delete_member_flow.add( a10_network_tasks.DeleteMemberVRIDPort( requires=[ a10constants.VTHUNDER, a10constants.VRID, a10constants.MEMBER_COUNT ], provides=a10constants.DELETE_VRID)) delete_member_flow.add( a10_database_tasks.DeleteVRIDEntry( requires=[a10constants.VRID, a10constants.DELETE_VRID])) return delete_member_flow
def test_delete_member_task_multi_port(self): member_port_count_ip = 2 pool_protocol_tcp = 'tcp' mock_delete_member = task.MemberDelete() mock_delete_member.axapi_client = self.client_mock mock_delete_member.axapi_client.slb.service_group.TCP = \ pool_protocol_tcp mock_delete_member.execute(MEMBER, VTHUNDER, POOL, member_port_count_ip, 0) self.client_mock.slb.service_group.member.delete.assert_called_with( POOL.id, SERVER_NAME, MEMBER.protocol_port) self.client_mock.slb.server.port.delete.assert_called_with( SERVER_NAME, MEMBER.protocol_port, pool_protocol_tcp)
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_flow(self): """Flow to delete a member on VThunder :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( database_tasks.GetAmphoraeFromLoadbalancer( requires=constants.LOADBALANCER, provides=constants.AMPHORA)) delete_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, 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( database_tasks.DeleteMemberInDB(requires=constants.MEMBER)) delete_member_flow.add( a10_database_tasks.GetLoadBalancerListByProjectID( requires=a10constants.VTHUNDER, provides=a10constants.LOADBALANCERS_LIST)) delete_member_flow.add( a10_network_tasks.CalculateDelta( requires=(constants.LOADBALANCER, a10constants.LOADBALANCERS_LIST), provides=constants.DELTAS)) delete_member_flow.add( a10_network_tasks.HandleNetworkDeltas( requires=constants.DELTAS, provides=constants.ADDED_PORTS)) delete_member_flow.add( vthunder_tasks.AmphoraePostNetworkUnplug( requires=(constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) delete_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( requires=(a10constants.VTHUNDER, constants.AMPHORA))) 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))) delete_member_flow.add(self.get_delete_member_vrid_subflow()) 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
def get_delete_member_flow(self, topology): """Flow to delete a member on VThunder :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(vthunder_tasks.VthunderInstanceBusy( requires=a10constants.COMPUTE_BUSY)) 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(database_tasks.GetAmphoraeFromLoadbalancer( requires=constants.LOADBALANCER, provides=constants.AMPHORA)) delete_member_flow.add(a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, 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(a10_database_tasks.GetLoadBalancerListByProjectID( requires=a10constants.VTHUNDER, provides=a10constants.LOADBALANCERS_LIST)) delete_member_flow.add(a10_network_tasks.CalculateDelta( requires=(constants.LOADBALANCER, a10constants.LOADBALANCERS_LIST), provides=constants.DELTAS)) delete_member_flow.add(a10_network_tasks.HandleNetworkDeltas( requires=constants.DELTAS, provides=constants.ADDED_PORTS)) delete_member_flow.add( vthunder_tasks.AmphoraePostNetworkUnplug( requires=( constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) delete_member_flow.add(vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.VTHUNDER_CONNECTIVITY_WAIT, requires=(a10constants.VTHUNDER, constants.AMPHORA))) if topology == constants.TOPOLOGY_ACTIVE_STANDBY: delete_member_flow.add( a10_database_tasks.GetBackupVThunderByLoadBalancer( name=a10constants.GET_BACKUP_VTHUNDER_BY_LB, requires=(constants.LOADBALANCER, a10constants.VTHUNDER), provides=a10constants.BACKUP_VTHUNDER)) delete_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.BACKUP_CONNECTIVITY_WAIT + "-before-unplug", requires=constants.AMPHORA, rebind={a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) delete_member_flow.add( vthunder_tasks.AmphoraePostNetworkUnplug( name=a10constants.AMPHORA_POST_NETWORK_UNPLUG_FOR_BACKUP_VTHUNDER, requires=(constants.LOADBALANCER, constants.ADDED_PORTS), rebind={a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) delete_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.BACKUP_CONNECTIVITY_WAIT, requires=constants.AMPHORA, rebind={a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) delete_member_flow.add(vthunder_tasks.VCSSyncWait( name='member-unplug-' + a10constants.VCS_SYNC_WAIT, requires=a10constants.VTHUNDER)) delete_member_flow.add(vthunder_tasks.GetMasterVThunder( name=a10constants.GET_VTHUNDER_MASTER, requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) 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))) 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
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