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 get_rack_vthunder_update_member_flow(self): """Flow to update a member in Thunder devices :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) update_member_flow.add( database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) update_member_flow.add( vthunder_tasks.SetupDeviceNetworkMap( requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) # Handle VRID settings update_member_flow.add(self.handle_vrid_for_member_subflow()) update_member_flow.add( a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) update_member_flow.add( server_tasks.MemberUpdate(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, constants.FLAVOR))) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) if CONF.a10_global.network_type == 'vlan': update_member_flow.add( vthunder_tasks.TagInterfaceForMember( requires=[constants.MEMBER, a10constants.VTHUNDER])) update_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) update_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_member_flow.add( vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER)) update_member_flow.add( a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return update_member_flow
def test_TagInterfaceForMember_revert_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 TagInterfaceForMember task") expected_log = [ "WARNING:{}:{}".format(task_path, log_message % member.id) ] mock_task = task.TagInterfaceForMember() with self.assertLogs(task_path, level='WARN') as cm: mock_task.revert(member, VTHUNDER) self.assertEqual(expected_log, cm.output)
def test_TagInterfaceForMember_create_vlan_ve_with_neutron_exception(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.TagInterfaceForMember() self._mock_tag_task(mock_task) self.client_mock.interface.ethernet.get.return_value = ETH_DATA self.client_mock.vlan.exists.return_value = False mock_task._network_driver.neutron_client.create_port = mock.Mock() mock_task._network_driver.neutron_client.create_port.side_effect = Exception self.assertRaises(Exception, lambda: mock_task.execute(member, mock_thunder))
def test_TagInterfaceForMember_revert_created_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.TagInterfaceForMember() 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.revert(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 test_TagInterfaceForMember_create_vlan_ve_with_dhcp(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.TagInterfaceForMember() self._mock_tag_task(mock_task) self.client_mock.interface.ethernet.get.return_value = ETH_DATA self.client_mock.vlan.exists.return_value = False mock_task._network_driver.neutron_client.create_port = mock.Mock() mock_task._network_driver.get_network = mock.Mock() mock_task._network_driver.get_network.return_value = NETWORK_11 mock_task._network_driver.list_networks = mock.Mock() mock_task._network_driver.list_networks.return_value = [NETWORK_11] mock_task.execute(member, mock_thunder) self.client_mock.vlan.create.assert_called_with( VLAN_ID, tagged_eths=[TAG_INTERFACE], veth=True) args, kwargs = mock_task._network_driver.neutron_client.create_port.call_args self.assertIn('port', args[0]) port = args[0]['port'] fixed_ip = port['fixed_ips'][0] self.assertEqual(VE_IP, fixed_ip['ip_address'])