commit e876d709988850d139b591ead9328e5ade3ceff8 Author: Federico Ressi Date: Wed Oct 14 09:16:28 2020 +0200 Get node service name by Neutron agent name Change-Id: Ifd453313ff05a2fb9eb4d2c5a26f0f7b30dafbc4 diff --git a/tobiko/openstack/topology/__init__.py b/tobiko/openstack/topology/__init__.py index 93236eb..95e3bc0 100644 --- a/tobiko/openstack/topology/__init__.py +++ b/tobiko/openstack/topology/__init__.py @@ -20,6 +20,8 @@ from tobiko.openstack.topology import _topology NoSuchOpenStackTopologyNodeGroup = _exception.NoSuchOpenStackTopologyNodeGroup NoSuchOpenStackTopologyNode = _exception.NoSuchOpenStackTopologyNode +UnknowOpenStackServiceNameError = _topology.UnknowOpenStackServiceNameError +get_agent_service_name = _topology.get_agent_service_name get_openstack_topology = _topology.get_openstack_topology get_openstack_node = _topology.get_openstack_node find_openstack_node = _topology.find_openstack_node diff --git a/tobiko/openstack/topology/_topology.py b/tobiko/openstack/topology/_topology.py index 639f0be..87c2c32 100644 --- a/tobiko/openstack/topology/_topology.py +++ b/tobiko/openstack/topology/_topology.py @@ -28,6 +28,7 @@ from tobiko import podman from tobiko.shell import ip from tobiko.shell import sh from tobiko.shell import ssh +from tobiko.openstack import neutron from tobiko.openstack import nova from tobiko.openstack import keystone from tobiko.openstack.topology import _address @@ -39,16 +40,6 @@ from tobiko.openstack.topology import _exception LOG = log.getLogger(__name__) -DEFAULT_TOPOLOGY_CLASS = ( - 'tobiko.openstack.topology._topology.OpenStackTopology') - - -def get_openstack_topology(topology_class=None): - # type: (typing.Any) -> OpenStackTopology - topology_class = topology_class or get_default_openstack_topology_class() - return tobiko.setup_fixture(topology_class) - - def list_openstack_nodes(topology=None, group=None, hostnames=None, **kwargs): topology = topology or get_openstack_topology() if group is None: @@ -87,17 +78,29 @@ def list_openstack_node_groups(topology=None): return topology.groups -def get_default_openstack_topology_class(): - # type: () -> typing.Any +def get_default_openstack_topology_class() -> typing.Type: return DEFAULT_TOPOLOGY_CLASS -def set_default_openstack_topology_class(topology_class): +def set_default_openstack_topology_class(topology_class: typing.Type): # pylint: disable=global-statement + if not issubclass(topology_class, OpenStackTopology): + raise TypeError(f"'{topology_class}' is not subclass of " + f"'{OpenStackTopology}'") global DEFAULT_TOPOLOGY_CLASS DEFAULT_TOPOLOGY_CLASS = topology_class +def get_agent_service_name(agent_name: str) -> str: + topology_class = get_default_openstack_topology_class() + return topology_class.get_agent_service_name(agent_name) + + +class UnknowOpenStackServiceNameError(tobiko.TobikoException): + message = ("Unknown service name for agent name '{agent_name}' and " + "topology class '{topology_class}'") + + class OpenStackTopologyNode(object): _docker_client = None @@ -153,10 +156,10 @@ class OpenStackTopology(tobiko.SharedFixture): config = tobiko.required_setup_fixture(_config.OpenStackTopologyConfig) agent_to_service_name_mappings = { - 'neutron-dhcp-agent': 'devstack@q-dhcp', - 'neutron-l3-agent': 'devstack@q-l3', - 'neutron-ovs-agent': 'devstack@q-agt', - 'neutron-metadata-agent': 'devstack@q-meta', + neutron.DHCP_AGENT: 'devstack@q-dhcp', + neutron.L3_AGENT: 'devstack@q-l3', + neutron.OPENVSWITCH_AGENT: 'devstack@q-agt', + neutron.METADATA_AGENT: 'devstack@q-meta' } has_containers = False @@ -183,11 +186,14 @@ class OpenStackTopology(tobiko.SharedFixture): self._groups.clear() self._addresses.clear() - def get_agent_service_name(self, agent_name): + @classmethod + def get_agent_service_name(cls, agent_name: str) -> str: try: - return self.agent_to_service_name_mappings[agent_name] + return cls.agent_to_service_name_mappings[agent_name] except KeyError: - return None + pass + raise UnknowOpenStackServiceNameError(agent_name=agent_name, + topology_class=cls) def discover_nodes(self): self.discover_configured_nodes() @@ -391,6 +397,20 @@ class OpenStackTopology(tobiko.SharedFixture): ssh_config=True) +def get_openstack_topology(topology_class: typing.Type = None) -> \ + OpenStackTopology: + if topology_class: + if not issubclass(topology_class, OpenStackTopology): + raise TypeError(f"'{topology_class}' is not subclass of " + f"'{OpenStackTopology}'") + else: + topology_class = get_default_openstack_topology_class() + return tobiko.setup_fixture(topology_class) + + +DEFAULT_TOPOLOGY_CLASS = OpenStackTopology + + def node_name_from_hostname(hostname): return hostname.split('.', 1)[0].lower() diff --git a/tobiko/tests/faults/agents/test_neutron_agents.py b/tobiko/tests/faults/agents/test_neutron_agents.py index 8178d3d..6927743 100644 --- a/tobiko/tests/faults/agents/test_neutron_agents.py +++ b/tobiko/tests/faults/agents/test_neutron_agents.py @@ -223,7 +223,7 @@ class DHCPAgentTest(BaseAgentTest): def setUp(self): super(DHCPAgentTest, self).setUp() self.agent_service_name = self.get_agent_service_name( - "neutron-dhcp-agent") + neutron.DHCP_AGENT) def test_stop_dhcp_agent(self): '''Test that dnsmasq processes are not broken after DHCP agent restart @@ -284,7 +284,7 @@ class L3AgentTest(BaseAgentTest): def setUp(self): super(L3AgentTest, self).setUp() self.agent_service_name = self.get_agent_service_name( - "neutron-l3-agent") + neutron.L3_AGENT) self.router_id = self.stack.network_stack.gateway_id def wait_for_active_ha_l3_agent(self): @@ -449,7 +449,7 @@ class OvsAgentTest(BaseAgentTest): def setUp(self): super(OvsAgentTest, self).setUp() self.agent_service_name = self.get_agent_service_name( - "neutron-ovs-agent") + neutron.OPENVSWITCH_AGENT) self.ovs_agents = neutron.list_agents(agent_type=self.agent_type) if not self.ovs_agents: @@ -460,7 +460,7 @@ class OvsAgentTest(BaseAgentTest): for agent in self.ovs_agents: if host_shortname == tobiko.get_short_hostname(agent['host']): return agent - raise neutron.AgentNotFoundOnHost(agent_type="neutron-ovs-agent", + raise neutron.AgentNotFoundOnHost(agent_type=neutron.OPENVSWITCH_AGENT, host=host.name) def test_vm_reachability_during_stop_ovs_agent(self): @@ -485,7 +485,7 @@ class MetadataAgentTest(BaseAgentTest): def setUp(self): super(MetadataAgentTest, self).setUp() self.agent_service_name = self.get_agent_service_name( - "neutron-metadata-agent") + neutron.METADATA_AGENT) agents = neutron.list_agents(agent_type='Metadata agent') self.hosts = [agent['host'] for agent in agents] diff --git a/tobiko/tripleo/_topology.py b/tobiko/tripleo/_topology.py index 608f580..7bed57d 100644 --- a/tobiko/tripleo/_topology.py +++ b/tobiko/tripleo/_topology.py @@ -18,6 +18,7 @@ import typing # noqa from oslo_log import log +from tobiko.openstack import neutron from tobiko.openstack import topology from tobiko.tripleo import _overcloud from tobiko.tripleo import _undercloud @@ -29,10 +30,10 @@ LOG = log.getLogger(__name__) class TripleoTopology(topology.OpenStackTopology): agent_to_service_name_mappings = { - 'neutron-dhcp-agent': 'tripleo_neutron_dhcp', - 'neutron-l3-agent': 'tripleo_neutron_l3_agent', - 'neutron-ovs-agent': 'tripleo_neutron_ovs_agent', - 'neutron-metadata-agent': 'tripleo_neutron_metadata_agent', + neutron.DHCP_AGENT: 'tripleo_neutron_dhcp', + neutron.L3_AGENT: 'tripleo_neutron_l3_agent', + neutron.OPENVSWITCH_AGENT: 'tripleo_neutron_ovs_agent', + neutron.METADATA_AGENT: 'tripleo_neutron_metadata_agent' } has_containers = True @@ -114,8 +115,7 @@ def is_number(text: str): def setup_tripleo_topology(): if _undercloud.has_undercloud() or _overcloud.has_overcloud(): - topology.set_default_openstack_topology_class( - 'tobiko.tripleo.topology.TripleoTopology') + topology.set_default_openstack_topology_class(TripleoTopology) def get_ip_to_nodes_dict(openstack_nodes=None):