diff --git a/octane/commands/cleanup.py b/octane/commands/cleanup.py index 5d6e9738..517929c7 100644 --- a/octane/commands/cleanup.py +++ b/octane/commands/cleanup.py @@ -17,17 +17,31 @@ from fuelclient import objects from octane.util import env as env_util from octane.util import node as node_util +from octane.util import nova LOG = logging.getLogger(__name__) +def clean_services_for_node(controller, node): + services_stdout = nova.run_nova_cmd( + ["nova", "service-list", "--host", node.data['hostname']], + controller) + services = nova.nova_stdout_parser(services_stdout) + for service in services: + nova.run_nova_cmd( + ["nova", "service-delete", service['Id']], controller, + output=False) + + def cleanup_environment(env_id): env = objects.Environment(env_id) + controller = env_util.get_one_controller(env) nodes = env_util.get_nodes(env, ['controller', 'compute']) for node in nodes: node_util.remove_compute_upgrade_levels(node) node_util.restart_nova_services(node) + clean_services_for_node(controller, node) class CleanupCommand(cmd.Command): diff --git a/octane/tests/test_cleanup.py b/octane/tests/test_cleanup.py index 2da922b0..521cd184 100644 --- a/octane/tests/test_cleanup.py +++ b/octane/tests/test_cleanup.py @@ -20,9 +20,14 @@ from octane.commands import cleanup @pytest.mark.parametrize("node_count", [0, 1, 10]) def test_cleanup_env(mocker, env_id, node_count): env = mock.Mock() + controller = mock.Mock() get_env_mock = mocker.patch( "fuelclient.objects.Environment", return_value=env) - nodes = [mock.MagicMock() for _ in range(node_count)] + nodes = [mock.Mock() for idx in range(node_count)] + get_controller = mocker.patch( + "octane.util.env.get_one_controller", return_value=controller) + clean_services_mock = mocker.patch( + "octane.commands.cleanup.clean_services_for_node") get_nodes_mock = mocker.patch( "octane.util.env.get_nodes", return_value=nodes) remove_compute_mock = mocker.patch( @@ -33,5 +38,33 @@ def test_cleanup_env(mocker, env_id, node_count): for node in nodes: remove_compute_mock.assert_any_call(node) restart_service_mock.assert_any_call(node) + clean_services_mock.assert_any_call(controller, node) + assert len(nodes) == clean_services_mock.call_count get_nodes_mock.assert_called_once_with(env, ["controller", "compute"]) get_env_mock.assert_called_once_with(env_id) + get_controller.assert_called_once_with(env) + + +@pytest.mark.parametrize("hostname", ["test_hostname"]) +@pytest.mark.parametrize("stdout,deleted_services", [( + " +----+\n" + " | Id |\n" + " +----+\n" + " | 1 |\n" + " | 2 |\n" + " | 3 |\n" + " +----+\n", + ["1", "2", "3"] +)]) +def test_clean_services_for_node(mocker, hostname, stdout, deleted_services): + node = mock.MagicMock(data={"hostname": hostname}) + controller = mock.Mock() + nova_run_mock = mocker.patch( + "octane.util.nova.run_nova_cmd", return_value=stdout) + cleanup.clean_services_for_node(controller, node) + for service_id in deleted_services: + nova_run_mock.assert_any_call( + ["nova", "service-delete", service_id], controller, output=False) + get_service_call = mock.call( + ["nova", "service-list", "--host", hostname], controller) + assert get_service_call == nova_run_mock.call_args_list[0]