From 1f0611f0582fdd55f5963a62969eecd842f71db5 Mon Sep 17 00:00:00 2001 From: Federico Ressi Date: Mon, 27 Jan 2020 15:51:10 +0100 Subject: [PATCH] Add nova client functions to shutdown and activate Nova server Change-Id: I5cd46dd56d7ace7258d9f334320368977ab3a861 --- tobiko/openstack/nova/__init__.py | 2 + tobiko/openstack/nova/_client.py | 42 ++++++++++++++++--- .../tests/functional/openstack/test_nova.py | 18 +++++++- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/tobiko/openstack/nova/__init__.py b/tobiko/openstack/nova/__init__.py index f7aa77291..4c8e325ae 100644 --- a/tobiko/openstack/nova/__init__.py +++ b/tobiko/openstack/nova/__init__.py @@ -31,6 +31,8 @@ nova_client = _client.nova_client NovaClientFixture = _client.NovaClientFixture wait_for_server_status = _client.wait_for_server_status ServerStatusTimeout = _client.ServerStatusTimeout +shutoff_server = _client.shutoff_server +activate_server = _client.activate_server skip_if_missing_hypervisors = _hypervisor.skip_if_missing_hypervisors get_same_host_hypervisors = _hypervisor.get_same_host_hypervisors diff --git a/tobiko/openstack/nova/_client.py b/tobiko/openstack/nova/_client.py index d208e4cea..00cd498ad 100644 --- a/tobiko/openstack/nova/_client.py +++ b/tobiko/openstack/nova/_client.py @@ -150,20 +150,52 @@ class ServerStatusTimeout(tobiko.TobikoException): "status after {timeout} seconds") -def wait_for_server_status(server_id, status, client=None, timeout=30., - sleep_time=5.): +def wait_for_server_status(server, status, client=None, timeout=None, + sleep_time=None): + if timeout is None: + timeout = 300. + if sleep_time is None: + sleep_time = 5. start_time = time.time() while True: - server = get_server(server_id, client) + server = get_server(server=server, client=client) if server.status == status: break if time.time() - start_time >= timeout: - raise ServerStatusTimeout(server_id=server_id, + raise ServerStatusTimeout(server_id=server.id, status=status, timeout=timeout) LOG.debug('Waiting for server %r status to get from %r to %r', - server_id, server.status, status) + server.id, server.status, status) time.sleep(sleep_time) return server + + +def shutoff_server(server, client=None, timeout=None, sleep_time=None): + client = nova_client(client) + server = get_server(server=server, client=client) + if server.status == 'SHUTOFF': + return server + + client.servers.stop(server.id) + return wait_for_server_status(server=server.id, status='SHUTOFF', + client=client, timeout=timeout, + sleep_time=sleep_time) + + +def activate_server(server, client=None, timeout=None, sleep_time=None): + client = nova_client(client) + server = get_server(server=server, client=client) + if server.status == 'ACTIVE': + return server + + if server.status == 'SHUTOFF': + client.servers.start(server.id) + else: + client.servers.reboot(server.id, reboot_type='HARD') + + return wait_for_server_status(server=server.id, status='ACTIVE', + client=client, timeout=timeout, + sleep_time=sleep_time) diff --git a/tobiko/tests/functional/openstack/test_nova.py b/tobiko/tests/functional/openstack/test_nova.py index 9f855f955..08065d998 100644 --- a/tobiko/tests/functional/openstack/test_nova.py +++ b/tobiko/tests/functional/openstack/test_nova.py @@ -96,7 +96,23 @@ class ClientTest(testtools.TestCase): def test_wait_for_server_status(self): server_id = self.stack.server_id - server = nova.wait_for_server_status(server_id, 'ACTIVE') + server = nova.wait_for_server_status(server=server_id, status='ACTIVE') + self.assertEqual(server_id, server.id) + self.assertEqual('ACTIVE', server.status) + + def test_shutof_and_activate_server(self): + server_id = self.useFixture(stacks.CirrosServerStackFixture( + stack_name=self.id())).server_id + + server = nova.wait_for_server_status(server=server_id, status='ACTIVE') + self.assertEqual(server_id, server.id) + self.assertEqual('ACTIVE', server.status) + + server = nova.shutoff_server(server=server_id) + self.assertEqual(server_id, server.id) + self.assertEqual('SHUTOFF', server.status) + + server = nova.activate_server(server=server_id) self.assertEqual(server_id, server.id) self.assertEqual('ACTIVE', server.status)