def test_revert_member_create_task(self): mock_member = task.MemberCreate() mock_member.axapi_client = self.client_mock mock_member.revert(MEMBER, VTHUNDER, POOL) self.client_mock.slb.service_group.member.delete.assert_called_with( POOL.id, MEMBER.id, MEMBER.protocol_port) self.client_mock.slb.server.delete.assert_called_with(MEMBER.id)
def test_MemberCreate_execute_create_with_regex_flavor( self, mock_server_name): mock_server_name.side_effect = acos_errors.NotFound() mock_create_member = task.MemberCreate() member_port_count_ip = 1 flavor = {} regex = { "name_expressions": [{ "regex": "srv1", "json": { "conn_limit": 800 } }] } flavor['server'] = regex expect_key_args = {"server": {'conn_limit': 800, 'conn_resume': None}} mock_create_member.CONF = self.conf member_obj = o_data_models.Member( id=a10constants.MOCK_MEMBER_ID, protocol_port=t_constants.MOCK_PORT_ID, project_id=t_constants.MOCK_PROJECT_ID, ip_address=t_constants.MOCK_IP_ADDRESS, name="srv1") mock_create_member.axapi_client = self.client_mock mock_create_member.execute(member_obj, VTHUNDER, POOL, member_port_count_ip, flavor) self.client_mock.slb.server.create.assert_called_with( SERVER_NAME, member_obj.ip_address, status=mock.ANY, server_templates=mock.ANY, **expect_key_args)
def _create_member_task_with_server_template(self, template_name, use_shared=False): member_task = task.MemberCreate() member_task.axapi_client = self.client_mock self.conf.config(group=a10constants.A10_GLOBAL_CONF_SECTION, use_shared_for_template_lookup=use_shared) self.conf.config(group=a10constants.SERVER_CONF_SECTION, template_server=template_name) member_task.CONF = self.conf return member_task
def test_MemberCreate_revert_created_member(self): mock_member = task.MemberCreate() member_port_count_ip = 1 mock_member.axapi_client = self.client_mock mock_member.revert(MEMBER, VTHUNDER, POOL, member_port_count_ip) self.client_mock.slb.server.delete.assert_called_with( SERVER_NAME)
def get_rack_vthunder_create_member_flow(self): """Create a flow to create a rack vthunder member :returns: The flow for creating a rack vthunder member """ create_member_flow = linear_flow.Flow(constants.CREATE_MEMBER_FLOW) create_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) create_member_flow.add( database_tasks.MarkMemberPendingCreateInDB( requires=constants.MEMBER)) create_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) create_member_flow.add( vthunder_tasks.SetupDeviceNetworkMap( requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) create_member_flow.add(self.handle_vrid_for_member_subflow()) if CONF.a10_global.network_type == 'vlan': create_member_flow.add( vthunder_tasks.TagInterfaceForMember( requires=[constants.MEMBER, a10constants.VTHUNDER])) create_member_flow.add( a10_database_tasks.CountMembersWithIP( requires=constants.MEMBER, provides=a10constants.MEMBER_COUNT_IP)) create_member_flow.add( a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) create_member_flow.add(self.get_create_member_snat_pool_subflow()) create_member_flow.add( server_tasks.MemberCreate(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, a10constants.MEMBER_COUNT_IP, constants.FLAVOR))) create_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) create_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) create_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=(constants.LOADBALANCER, constants.LISTENERS))) create_member_flow.add( vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER)) create_member_flow.add( a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return create_member_flow
def test_MemberCreate_execute_create_with_flavor(self): mock_create_member = task.MemberCreate() member_port_count_ip = 1 flavor = {"server": {"conn_limit": 65535, "conn_resume": 5000}} expect_key_args = {"server": {'conn_limit': 65535, 'conn_resume': 5000}} mock_create_member.CONF = self.conf mock_create_member.axapi_client = self.client_mock mock_create_member.execute(MEMBER, VTHUNDER, POOL, member_port_count_ip, flavor) self.client_mock.slb.server.create.assert_called_with( SERVER_NAME, MEMBER.ip_address, status=mock.ANY, server_templates=mock.ANY, **expect_key_args)
def test_create_member_task(self): mock_create_member = task.MemberCreate() member_port_count_ip = 1 mock_create_member.CONF = self.conf mock_create_member.axapi_client = self.client_mock mock_create_member.execute(MEMBER, VTHUNDER, POOL, member_port_count_ip) self.client_mock.slb.server.create.assert_called_with( SERVER_NAME, MEMBER.ip_address, status=mock.ANY, server_templates=mock.ANY, **KEY_ARGS) self.client_mock.slb.service_group.member.create.assert_called_with( POOL.id, SERVER_NAME, MEMBER.protocol_port)
def test_create_member_task_multi_port(self, mock_server_name): mock_server_name.return_value = SERVER_NAME mock_create_member = task.MemberCreate() mock_create_member.axapi_client = self.client_mock member_port_count_ip = 4 mock_create_member.execute(MEMBER, VTHUNDER, POOL, member_port_count_ip) self.client_mock.slb.server.create.assert_not_called() self.client_mock.slb.server.update.assert_called_with( SERVER_NAME, MEMBER.ip_address, status=mock.ANY, server_templates=mock.ANY, **KEY_ARGS) self.client_mock.slb.service_group.member.create.assert_called_with( POOL.id, SERVER_NAME, MEMBER.protocol_port)
def get_rack_vthunder_create_member_flow(self): """Create a flow to create a rack vthunder member :returns: The flow for creating a rack vthunder member """ create_member_flow = linear_flow.Flow(constants.CREATE_MEMBER_FLOW) create_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) create_member_flow.add( database_tasks.MarkMemberPendingCreateInDB( requires=constants.MEMBER)) create_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) create_member_flow.add( a10_database_tasks.GetVRIDForProjectMember( requires=constants.MEMBER, provides=a10constants.VRID)) create_member_flow.add( a10_network_tasks.HandleVRIDFloatingIP(requires=[ constants.MEMBER, a10constants.VTHUNDER, a10constants.VRID ], provides=a10constants.PORT)) create_member_flow.add( a10_database_tasks.UpdateVRIDForProjectMember(requires=[ constants.MEMBER, a10constants.VRID, a10constants.PORT ])) create_member_flow.add( server_tasks.MemberCreate(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL))) create_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) create_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) create_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=(constants.LOADBALANCER, constants.LISTENERS))) return create_member_flow
def test_MemberCreate_execute_create_flavor_override_config( self, mock_server_name): mock_server_name.side_effect = acos_errors.NotFound() self.conf.config(group=a10constants.SERVER_CONF_SECTION, conn_resume=300) mock_create_member = task.MemberCreate() member_port_count_ip = 1 flavor = {"server": {"conn_limit": 65535, "conn_resume": 5000}} expect_key_args = { "server": { 'conn_limit': 65535, 'conn_resume': 5000 } } mock_create_member.CONF = self.conf mock_create_member.axapi_client = self.client_mock mock_create_member.execute(MEMBER, VTHUNDER, POOL, member_port_count_ip, flavor) self.client_mock.slb.server.create.assert_called_with( SERVER_NAME, MEMBER.ip_address, status=mock.ANY, server_templates=mock.ANY, **expect_key_args)
def test_create_member_task_multi_port(self): mock_member = task.MemberCreate() mock_member.axapi_client = self.client_mock member_port_count_ip = 4 mock_member.revert(MEMBER, VTHUNDER, POOL, member_port_count_ip) self.client_mock.slb.server.delete.assert_not_called()
def get_create_member_flow(self, topology): """Create a flow to create a member :returns: The flow for creating a member """ create_member_flow = linear_flow.Flow(constants.CREATE_MEMBER_FLOW) create_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) create_member_flow.add( database_tasks.MarkMemberPendingCreateInDB( requires=constants.MEMBER)) create_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) create_member_flow.add( a10_database_tasks.GetLoadBalancerListByProjectID( requires=a10constants.VTHUNDER, provides=a10constants.LOADBALANCERS_LIST)) create_member_flow.add( database_tasks.GetAmphoraeFromLoadbalancer( requires=constants.LOADBALANCER, provides=constants.AMPHORA)) create_member_flow.add( a10_network_tasks.CalculateDelta( requires=(constants.LOADBALANCER, a10constants.LOADBALANCERS_LIST), provides=constants.DELTAS)) create_member_flow.add( a10_network_tasks.HandleNetworkDeltas( requires=constants.DELTAS, provides=constants.ADDED_PORTS)) # managing interface additions here create_member_flow.add( vthunder_tasks.AmphoraePostMemberNetworkPlug( requires=(constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) create_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( requires=(a10constants.VTHUNDER, constants.AMPHORA))) create_member_flow.add( vthunder_tasks.EnableInterfaceForMembers(requires=[ constants.ADDED_PORTS, constants.LOADBALANCER, a10constants.VTHUNDER ])) create_member_flow.add(self.handle_vrid_for_member_subflow()) # configure member flow for HA if topology == constants.TOPOLOGY_ACTIVE_STANDBY: create_member_flow.add( a10_database_tasks.GetBackupVThunderByLoadBalancer( name="get_backup_vThunder", requires=constants.LOADBALANCER, provides=a10constants.BACKUP_VTHUNDER)) create_member_flow.add( vthunder_tasks.AmphoraePostMemberNetworkPlug( name="backup_amphora_network_plug", requires=[constants.ADDED_PORTS, constants.LOADBALANCER], rebind={ a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER })) create_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( name="backup_compute_conn_wait", requires=constants.AMPHORA, rebind={ a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER })) create_member_flow.add( vthunder_tasks.EnableInterfaceForMembers( name="backup_enable_interface", requires=[constants.ADDED_PORTS, constants.LOADBALANCER], rebind={ a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER })) create_member_flow.add( a10_database_tasks.CountMembersWithIP( requires=constants.MEMBER, provides=a10constants.MEMBER_COUNT_IP)) create_member_flow.add( a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) create_member_flow.add(self.get_create_member_snat_pool_subflow()) create_member_flow.add( server_tasks.MemberCreate(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, a10constants.MEMBER_COUNT_IP, constants.FLAVOR))) create_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) create_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) create_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=(constants.LOADBALANCER, constants.LISTENERS))) create_member_flow.add( vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER)) create_member_flow.add( a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return create_member_flow
def get_create_member_flow(self, topology): """Create a flow to create a member :returns: The flow for creating a member """ create_member_flow = linear_flow.Flow(constants.CREATE_MEMBER_FLOW) create_member_flow.add(lifecycle_tasks.MemberToErrorOnRevertTask( requires=[constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL])) create_member_flow.add(vthunder_tasks.VthunderInstanceBusy( requires=a10constants.COMPUTE_BUSY)) create_member_flow.add(database_tasks.MarkMemberPendingCreateInDB( requires=constants.MEMBER)) create_member_flow.add(a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) create_member_flow.add(a10_database_tasks.GetLoadBalancerListByProjectID( requires=a10constants.VTHUNDER, provides=a10constants.LOADBALANCERS_LIST)) create_member_flow.add(database_tasks.GetAmphoraeFromLoadbalancer( requires=constants.LOADBALANCER, provides=constants.AMPHORA)) create_member_flow.add(a10_network_tasks.CalculateDelta( requires=(constants.LOADBALANCER, a10constants.LOADBALANCERS_LIST), provides=constants.DELTAS)) create_member_flow.add(a10_network_tasks.HandleNetworkDeltas( requires=constants.DELTAS, provides=constants.ADDED_PORTS)) # managing interface additions here if topology == constants.TOPOLOGY_SINGLE: create_member_flow.add( vthunder_tasks.AmphoraePostMemberNetworkPlug( requires=( constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) create_member_flow.add(vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.VTHUNDER_CONNECTIVITY_WAIT, requires=(a10constants.VTHUNDER, constants.AMPHORA))) create_member_flow.add( vthunder_tasks.EnableInterfaceForMembers( requires=[ constants.ADDED_PORTS, constants.LOADBALANCER, a10constants.VTHUNDER])) # configure member flow for HA if topology == constants.TOPOLOGY_ACTIVE_STANDBY: create_member_flow.add( a10_database_tasks.GetBackupVThunderByLoadBalancer( name="get_backup_vThunder", requires=(constants.LOADBALANCER, a10constants.VTHUNDER), provides=a10constants.BACKUP_VTHUNDER)) create_member_flow.add(vthunder_tasks.VThunderComputeConnectivityWait( name="backup_compute_conn_wait_before_probe_device", requires=constants.AMPHORA, rebind={a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) create_member_flow.add(vthunder_tasks.VCSSyncWait( name="vcs_sync_wait_before_probe_device", requires=a10constants.VTHUNDER)) create_member_flow.add( vthunder_tasks.AmphoraePostMemberNetworkPlug( requires=( constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) create_member_flow.add( vthunder_tasks.AmphoraePostMemberNetworkPlug( name="backup_amphora_network_plug", requires=[ constants.ADDED_PORTS, constants.LOADBALANCER], rebind={ a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) create_member_flow.add(vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.MASTER_CONNECTIVITY_WAIT, requires=(a10constants.VTHUNDER, constants.AMPHORA))) create_member_flow.add(vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.BACKUP_CONNECTIVITY_WAIT, requires=constants.AMPHORA, rebind={a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER})) create_member_flow.add(vthunder_tasks.VCSSyncWait( name="backup-plug-wait-vcs-ready", requires=a10constants.VTHUNDER)) create_member_flow.add(vthunder_tasks.GetMasterVThunder( name=a10constants.GET_MASTER_VTHUNDER, requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) create_member_flow.add(a10_database_tasks.GetBackupVThunderByLoadBalancer( name="get_backup_vThunder_after_get_master", requires=(constants.LOADBALANCER, a10constants.VTHUNDER), provides=a10constants.BACKUP_VTHUNDER)) create_member_flow.add( vthunder_tasks.EnableInterfaceForMembers( name=a10constants.ENABLE_MASTER_VTHUNDER_INTERFACE, requires=[ constants.ADDED_PORTS, constants.LOADBALANCER, a10constants.VTHUNDER])) create_member_flow.add(vthunder_tasks.AmphoraePostMemberNetworkPlug( name="amphorae-post-member-network-plug-for-master", requires=(constants.LOADBALANCER, constants.ADDED_PORTS, a10constants.VTHUNDER))) create_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.CONNECTIVITY_WAIT_FOR_MASTER_VTHUNDER, requires=(a10constants.VTHUNDER, constants.AMPHORA))) create_member_flow.add( vthunder_tasks.VThunderComputeConnectivityWait( name=a10constants.CONNECTIVITY_WAIT_FOR_BACKUP_VTHUNDER, rebind={ a10constants.VTHUNDER: a10constants.BACKUP_VTHUNDER}, requires=constants.AMPHORA)) create_member_flow.add(vthunder_tasks.VCSSyncWait( name="member_enable_interface_vcs_sync_wait", requires=a10constants.VTHUNDER)) create_member_flow.add(vthunder_tasks.GetMasterVThunder( name=a10constants.GET_VTHUNDER_MASTER, requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) create_member_flow.add( vthunder_tasks.EnableInterfaceForMembers( requires=[ constants.ADDED_PORTS, constants.LOADBALANCER, a10constants.VTHUNDER])) create_member_flow.add(self.handle_vrid_for_member_subflow()) create_member_flow.add(a10_database_tasks.CountMembersWithIP( requires=constants.MEMBER, provides=a10constants.MEMBER_COUNT_IP )) create_member_flow.add(vthunder_tasks.AllowLoadbalancerForwardWithAnySource( name=a10constants.ALLOW_NO_SNAT, requires=(constants.MEMBER, constants.AMPHORA))) create_member_flow.add(a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) create_member_flow.add(self.get_create_member_snat_pool_subflow()) create_member_flow.add(server_tasks.MemberCreate( requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, a10constants.MEMBER_COUNT_IP, constants.FLAVOR))) create_member_flow.add(database_tasks.MarkMemberActiveInDB( requires=constants.MEMBER)) create_member_flow.add(database_tasks.MarkPoolActiveInDB( requires=constants.POOL)) create_member_flow.add(database_tasks. MarkLBAndListenersActiveInDB( requires=(constants.LOADBALANCER, constants.LISTENERS))) create_member_flow.add(vthunder_tasks.WriteMemory( requires=a10constants.VTHUNDER)) create_member_flow.add(a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return create_member_flow