Get node service name by Neutron agent name

Change-Id: Ifd453313ff05a2fb9eb4d2c5a26f0f7b30dafbc4
This commit is contained in:
Federico Ressi 2020-10-14 09:16:28 +02:00
parent 13a51715c5
commit e876d70998
4 changed files with 53 additions and 31 deletions

View File

@ -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

View File

@ -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()

View File

@ -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]

View File

@ -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):