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