Update deployment status when deploying or failed

There were a couple spots where the deployment status was not properly
updated. The first was when the stack failed, the deployment status also
needed to be set to failed.

The second is when we start the config_download process, the status
needs to be set to deploying.

Depends-On: I87b97bcab3e8cec6bdbb79c0acb95a375bb2d2fa
Change-Id: Ida519df829450c1ce9216049d76bc098176c273b
Closes-Bug: #1795640
This commit is contained in:
James Slagle 2018-10-02 09:04:20 -04:00
parent 23f19693a5
commit e478e97231
4 changed files with 115 additions and 21 deletions

View File

@ -32,6 +32,9 @@ class DeploymentWorkflowFixture(fixtures.Fixture):
self.mock_get_horizon_url = self.useFixture(fixtures.MockPatch(
'tripleoclient.workflows.deployment.get_horizon_url')
).mock
self.mock_set_deployment_status = self.useFixture(fixtures.MockPatch(
'tripleoclient.workflows.deployment.set_deployment_status')
).mock
class PlanManagementFixture(fixtures.Fixture):

View File

@ -1533,6 +1533,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
self.assertTrue(fixture.mock_enable_ssh_admin.called)
self.assertTrue(fixture.mock_get_overcloud_hosts.called)
self.assertTrue(fixture.mock_config_download.called)
self.assertTrue(fixture.mock_set_deployment_status.called)
self.assertEqual(
'deploying',
fixture.mock_set_deployment_status.call_args[0][1])
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
autospec=True)
@ -1565,6 +1569,51 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
self.assertTrue(fixture.mock_enable_ssh_admin.called)
self.assertTrue(fixture.mock_get_overcloud_hosts.called)
self.assertTrue(fixture.mock_config_download.called)
self.assertTrue(fixture.mock_set_deployment_status.called)
self.assertEqual(
'deploying',
fixture.mock_set_deployment_status.call_args[0][1])
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
autospec=True)
@mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True)
@mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True)
@mock.patch('tripleoclient.workflows.deployment.create_overcloudrc',
autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tripleo_heat_templates_tmpdir', autospec=True)
def test_config_download_fails(
self, mock_deploy_tmpdir,
mock_overcloudrc, mock_write_overcloudrc,
mock_overcloud_endpoint,
mock_create_tempest_deployer_input):
fixture = deployment.DeploymentWorkflowFixture()
self.useFixture(fixture)
clients = self.app.client_manager
orchestration_client = clients.orchestration
orchestration_client.stacks.get.return_value = mock.Mock()
arglist = ['--templates', '--config-download-only']
verifylist = [
('templates', '/usr/share/openstack-tripleo-heat-templates/'),
('config_download_only', True),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
fixture.mock_config_download.side_effect = \
exceptions.DeploymentError('fails')
self.assertRaises(
exceptions.DeploymentError,
self.cmd.take_action,
parsed_args)
self.assertFalse(mock_deploy_tmpdir.called)
self.assertTrue(fixture.mock_enable_ssh_admin.called)
self.assertTrue(fixture.mock_get_overcloud_hosts.called)
self.assertTrue(fixture.mock_config_download.called)
self.assertTrue(fixture.mock_set_deployment_status.called)
self.assertEqual(
'failed',
fixture.mock_set_deployment_status.call_args[0][1])
@mock.patch('tripleoclient.workflows.deployment.get_overcloud_hosts')
@mock.patch('tripleoclient.workflows.deployment.enable_ssh_admin')

View File

@ -899,30 +899,40 @@ class DeployOvercloud(command.Command):
if parsed_args.config_download:
print("Deploying overcloud configuration")
deployment.set_deployment_status(
self.clients, 'deploying',
plan=stack.stack_name)
hosts = deployment.get_overcloud_hosts(
stack, parsed_args.overcloud_ssh_network)
deployment.enable_ssh_admin(self.log, self.clients,
stack.stack_name,
hosts,
parsed_args.overcloud_ssh_user,
parsed_args.overcloud_ssh_key)
try:
hosts = deployment.get_overcloud_hosts(
stack, parsed_args.overcloud_ssh_network)
deployment.enable_ssh_admin(
self.log, self.clients,
stack.stack_name,
hosts,
parsed_args.overcloud_ssh_user,
parsed_args.overcloud_ssh_key)
if parsed_args.config_download_timeout:
timeout = parsed_args.config_download_timeout * 60
else:
used = int(time.time() - start)
timeout = (parsed_args.timeout * 60) - used
if parsed_args.config_download_timeout:
timeout = parsed_args.config_download_timeout * 60
else:
used = int(time.time() - start)
timeout = (parsed_args.timeout * 60) - used
deployment.config_download(self.log, self.clients, stack,
parsed_args.templates,
parsed_args.overcloud_ssh_user,
parsed_args.overcloud_ssh_key,
parsed_args.overcloud_ssh_network,
parsed_args.output_dir,
parsed_args.override_ansible_cfg,
timeout,
verbosity=self.app_args.verbose_level)
deployment.config_download(
self.log, self.clients, stack,
parsed_args.templates, parsed_args.overcloud_ssh_user,
parsed_args.overcloud_ssh_key,
parsed_args.overcloud_ssh_network,
parsed_args.output_dir,
parsed_args.override_ansible_cfg,
timeout,
verbosity=self.app_args.verbose_level)
except Exception:
deployment.set_deployment_status(
self.clients, 'failed',
plan=stack.stack_name)
raise
# Force fetching of attributes
stack.get()

View File

@ -100,6 +100,7 @@ def deploy_and_wait(log, clients, stack, plan_name, verbose_level,
orchestration_client, plan_name, marker, action, verbose_events)
if not create_result:
shell.OpenStackShell().run(["stack", "failures", "list", plan_name])
set_deployment_status(clients, 'failed', plan=plan_name)
if stack is None:
raise exceptions.DeploymentError("Heat Stack create failed.")
else:
@ -345,6 +346,37 @@ def get_deployment_status(clients, **workflow_input):
payload.get('message', '')))
def set_deployment_status(clients, status='success', **workflow_input):
workflow_client = clients.workflow_engine
tripleoclients = clients.tripleoclient
if status == 'success':
workflow = 'tripleo.deployment.v1.set_deployment_status_success'
elif status == 'failed':
workflow = 'tripleo.deployment.v1.set_deployment_status_failed'
elif status == 'deploying':
workflow = 'tripleo.deployment.v1.set_deployment_status_deploying'
else:
raise Exception("Can't set unknown deployment status: %s" % status)
with tripleoclients.messaging_websocket() as ws:
execution = base.start_workflow(
workflow_client,
workflow,
workflow_input=workflow_input
)
for payload in base.wait_for_messages(workflow_client, ws, execution,
_WORKFLOW_TIMEOUT):
# Just continue until workflow is done
continue
if payload['status'] != 'SUCCESS':
raise exceptions.WorkflowServiceError(
'Exception setting deployment status: {}'.format(
payload.get('message', '')))
def get_deployment_failures(clients, **workflow_input):
workflow_client = clients.workflow_engine
tripleoclients = clients.tripleoclient