def _create_deployment_environment(self, deployment, deployment_plan, now):
        deployment_env_creation_task_id = str(uuid.uuid4())
        wf_id = 'create_deployment_environment'
        deployment_env_creation_task_name = \
            'cloudify_system_workflows.deployment_environment.create'

        context = self._build_context_from_deployment(
            deployment, deployment_env_creation_task_id, wf_id,
            deployment_env_creation_task_name)
        kwargs = {
            DEPLOYMENT_PLUGINS_TO_INSTALL: deployment_plan[
                DEPLOYMENT_PLUGINS_TO_INSTALL],
            'workflow_plugins_to_install': deployment_plan[
                'workflow_plugins_to_install'],
            'policy_configuration': {
                'policy_types': deployment_plan['policy_types'],
                'policy_triggers': deployment_plan['policy_triggers'],
                'groups': deployment_plan['groups'],
            },
            '__cloudify_context': context
        }

        new_execution = models.Execution(
            id=deployment_env_creation_task_id,
            status=models.Execution.PENDING,
            created_at=now,
            blueprint_id=deployment.blueprint_id,
            workflow_id=wf_id,
            deployment_id=deployment.id,
            error='',
            parameters=self._get_only_user_execution_parameters(kwargs))
        get_storage_manager().put_execution(new_execution.id, new_execution)

        celery_client().execute_task(
            deployment_env_creation_task_name,
            'cloudify.management',
            deployment_env_creation_task_id,
            kwargs=kwargs)
Exemplo n.º 2
0
    def _create_deployment_environment(self, deployment, deployment_plan, now):
        deployment_env_creation_task_id = str(uuid.uuid4())
        wf_id = 'create_deployment_environment'
        deployment_env_creation_task_name = \
            'system_workflows.deployment_environment.create'

        context = self._build_context_from_deployment(
            deployment, deployment_env_creation_task_id, wf_id,
            deployment_env_creation_task_name)
        kwargs = {
            'management_plugins_to_install':
            deployment_plan['management_plugins_to_install'],
            'workflow_plugins_to_install':
            deployment_plan['workflow_plugins_to_install'],
            'policy_configuration': {
                'policy_types': deployment_plan['policy_types'],
                'policy_triggers': deployment_plan['policy_triggers'],
                'groups': deployment_plan['groups'],
            },
            '__cloudify_context':
            context
        }

        new_execution = models.Execution(
            id=deployment_env_creation_task_id,
            status=models.Execution.PENDING,
            created_at=now,
            blueprint_id=deployment.blueprint_id,
            workflow_id=wf_id,
            deployment_id=deployment.id,
            error='',
            parameters=self._get_only_user_execution_parameters(kwargs))
        get_storage_manager().put_execution(new_execution.id, new_execution)

        celery_client().execute_task(deployment_env_creation_task_name,
                                     'cloudify.management',
                                     deployment_env_creation_task_id,
                                     kwargs=kwargs)
    def _delete_deployment_environment(self, deployment_id):
        deployment = get_storage_manager().get_deployment(deployment_id)

        deployment_env_deletion_task_id = str(uuid.uuid4())
        wf_id = 'delete_deployment_environment'
        deployment_env_deletion_task_name = \
            'cloudify_system_workflows.deployment_environment.delete'

        context = self._build_context_from_deployment(
            deployment,
            deployment_env_deletion_task_id,
            wf_id,
            deployment_env_deletion_task_name)
        kwargs = {'__cloudify_context': context}

        new_execution = models.Execution(
            id=deployment_env_deletion_task_id,
            status=models.Execution.PENDING,
            created_at=str(datetime.now()),
            blueprint_id=deployment.blueprint_id,
            workflow_id=wf_id,
            deployment_id=deployment_id,
            error='',
            parameters=self._get_only_user_execution_parameters(kwargs))
        get_storage_manager().put_execution(new_execution.id, new_execution)

        deployment_env_deletion_task_async_result = \
            celery_client().execute_task(
                deployment_env_deletion_task_name,
                'cloudify.management',
                deployment_env_deletion_task_id,
                kwargs=kwargs)

        # wait for deployment environment deletion to complete
        deployment_env_deletion_task_async_result.get(timeout=300,
                                                      propagate=True)
        # verify deployment environment deletion completed successfully
        execution = get_storage_manager().get_execution(
            deployment_env_deletion_task_id)
        if execution.status != models.Execution.TERMINATED:
            raise RuntimeError('Failed to delete environment for deployment '
                               '{0}'.format(deployment_id))
Exemplo n.º 4
0
    def _delete_deployment_environment(self, deployment_id):
        deployment = get_storage_manager().get_deployment(deployment_id)

        deployment_env_deletion_task_id = str(uuid.uuid4())
        wf_id = 'delete_deployment_environment'
        deployment_env_deletion_task_name = \
            'system_workflows.deployment_environment.delete'

        context = self._build_context_from_deployment(
            deployment, deployment_env_deletion_task_id, wf_id,
            deployment_env_deletion_task_name)
        kwargs = {'__cloudify_context': context}

        new_execution = models.Execution(
            id=deployment_env_deletion_task_id,
            status=models.Execution.PENDING,
            created_at=str(datetime.now()),
            blueprint_id=deployment.blueprint_id,
            workflow_id=wf_id,
            deployment_id=deployment_id,
            error='',
            parameters=self._get_only_user_execution_parameters(kwargs))
        get_storage_manager().put_execution(new_execution.id, new_execution)

        deployment_env_deletion_task_async_result = \
            celery_client().execute_task(
                deployment_env_deletion_task_name,
                'cloudify.management',
                deployment_env_deletion_task_id,
                kwargs=kwargs)

        # wait for deployment environment deletion to complete
        deployment_env_deletion_task_async_result.get(timeout=300,
                                                      propagate=True)
        # verify deployment environment deletion completed successfully
        execution = get_storage_manager().get_execution(
            deployment_env_deletion_task_id)
        if execution.status != models.Execution.TERMINATED:
            raise RuntimeError('Failed to delete environment for deployment '
                               '{0}'.format(deployment_id))
    def _verify_deployment_environment_created_successfully(self,
                                                            deployment_id,
                                                            is_retry=False):
        deployment_env_creation_execution = next(
            (execution for execution in
             get_storage_manager().executions_list(
                 deployment_id=deployment_id) if execution.workflow_id ==
                'create_deployment_environment'),
            None)

        if not deployment_env_creation_execution:
            raise RuntimeError('Failed to find "create_deployment_environment"'
                               ' execution for deployment {0}'.format(
                                   deployment_id))

        # Because of ES eventual consistency, we need to get the execution by
        # its id in order to make sure the read status is correct.
        deployment_env_creation_execution = \
            get_storage_manager().get_execution(
                deployment_env_creation_execution.id)

        if deployment_env_creation_execution.status == \
                models.Execution.TERMINATED:
            # deployment environment creation is complete
            return
        elif deployment_env_creation_execution.status == \
                models.Execution.STARTED:
            # deployment environment creation is still in process
            raise manager_exceptions\
                .DeploymentEnvironmentCreationInProgressError(
                    'Deployment environment creation is still in progress, '
                    'try again in a minute')
        elif deployment_env_creation_execution.status == \
                models.Execution.FAILED:
            # deployment environment creation execution failed
            raise RuntimeError(
                "Can't launch executions since environment creation for "
                "deployment {0} has failed: {1}".format(
                    deployment_id, deployment_env_creation_execution.error))
        elif deployment_env_creation_execution.status in (
            models.Execution.CANCELLED, models.Execution.CANCELLING,
                models.Execution.FORCE_CANCELLING):
            # deployment environment creation execution got cancelled
            raise RuntimeError(
                "Can't launch executions since the environment creation for "
                "deployment {0} has been cancelled [status={1}]".format(
                    deployment_id, deployment_env_creation_execution.status))

        # status is 'pending'. Waiting for a few seconds and retrying to
        # verify (to avoid eventual consistency issues). If this is already a
        # failed retry, it might mean there was a problem with the Celery task
        if not is_retry:
            time.sleep(5)
            self._verify_deployment_environment_created_successfully(
                deployment_id, True)
        else:
            # deployment environment creation failed but not on the workflow
            # level - retrieving the celery task's status for the error
            # message, and the error object from celery if one is available
            celery_task_status = celery_client().get_task_status(
                deployment_env_creation_execution.id)
            error_message = \
                "Can't launch executions since environment for deployment {" \
                "0} hasn't been created (Execution status is still '{1}'). " \
                "Celery task status is ".format(
                    deployment_id, deployment_env_creation_execution.status)
            if celery_task_status != CELERY_TASK_STATE_FAILURE:
                raise RuntimeError(
                    "{0} {1}".format(error_message, celery_task_status))
            else:
                celery_error = celery_client().get_failed_task_error(
                    deployment_env_creation_execution.id)
                raise RuntimeError(
                    "{0} {1}; Error is of type {2}; Error message: {3}"
                    .format(error_message, celery_task_status,
                            celery_error.__class__.__name__, celery_error))
Exemplo n.º 6
0
    def _verify_deployment_environment_created_successfully(
            self, deployment_id, is_retry=False):
        deployment_env_creation_execution = next(
            (execution for execution in get_storage_manager().executions_list(
                deployment_id=deployment_id)
             if execution.workflow_id == 'create_deployment_environment'),
            None)

        if not deployment_env_creation_execution:
            raise RuntimeError(
                'Failed to find "create_deployment_environment"'
                ' execution for deployment {0}'.format(deployment_id))

        # Because of ES eventual consistency, we need to get the execution by
        # its id in order to make sure the read status is correct.
        deployment_env_creation_execution = \
            get_storage_manager().get_execution(
                deployment_env_creation_execution.id)

        if deployment_env_creation_execution.status == \
                models.Execution.TERMINATED:
            # deployment environment creation is complete
            return
        elif deployment_env_creation_execution.status == \
                models.Execution.STARTED:
            # deployment environment creation is still in process
            raise manager_exceptions\
                .DeploymentEnvironmentCreationInProgressError(
                    'Deployment environment creation is still in progress, '
                    'try again in a minute')
        elif deployment_env_creation_execution.status == \
                models.Execution.FAILED:
            # deployment environment creation execution failed
            raise RuntimeError(
                "Can't launch executions since environment creation for "
                "deployment {0} has failed: {1}".format(
                    deployment_id, deployment_env_creation_execution.error))
        elif deployment_env_creation_execution.status in (
                models.Execution.CANCELLED, models.Execution.CANCELLING,
                models.Execution.FORCE_CANCELLING):
            # deployment environment creation execution got cancelled
            raise RuntimeError(
                "Can't launch executions since the environment creation for "
                "deployment {0} has been cancelled [status={1}]".format(
                    deployment_id, deployment_env_creation_execution.status))

        # status is 'pending'. Waiting for a few seconds and retrying to
        # verify (to avoid eventual consistency issues). If this is already a
        # failed retry, it might mean there was a problem with the Celery task
        if not is_retry:
            time.sleep(5)
            self._verify_deployment_environment_created_successfully(
                deployment_id, True)
        else:
            # deployment environment creation failed but not on the workflow
            # level - retrieving the celery task's status for the error
            # message, and the error object from celery if one is available
            celery_task_status = celery_client().get_task_status(
                deployment_env_creation_execution.id)
            error_message = \
                "Can't launch executions since environment for deployment {" \
                "0} hasn't been created (Execution status is still '{1}'). " \
                "Celery task status is ".format(
                    deployment_id, deployment_env_creation_execution.status)
            if celery_task_status != CELERY_TASK_STATE_FAILURE:
                raise RuntimeError("{0} {1}".format(error_message,
                                                    celery_task_status))
            else:
                celery_error = celery_client().get_failed_task_error(
                    deployment_env_creation_execution.id)
                raise RuntimeError(
                    "{0} {1}; Error is of type {2}; Error message: {3}".format(
                        error_message, celery_task_status,
                        celery_error.__class__.__name__, celery_error))