def run(self): swift = self.get_object_client() mistral = self.get_workflow_client() env_data = { 'name': self.container, } if not pattern_validator(constants.PLAN_NAME_PATTERN, self.container): message = ("Unable to create plan. The plan name must " "only contain letters, numbers or dashes") return mistral_workflow_utils.Result(error=message) # Check to see if an environment with that name already exists try: mistral.environments.get(self.container) except mistralclient_base.APIException: # The environment doesn't exist, as expected. Proceed. pass else: message = ("Unable to create plan. The Mistral environment " "already exists") return mistral_workflow_utils.Result(error=message) # Get plan environment from Swift try: plan_env_dict, plan_env_missing = self.get_plan_env_dict( swift, self.container) except exception.PlanOperationError as err: return mistral_workflow_utils.Result(error=six.text_type(err)) # Create mistral environment env_data['variables'] = json.dumps(plan_env_dict, sort_keys=True) try: mistral.environments.create(**env_data) except Exception as err: message = "Error occurred creating plan: %s" % err return mistral_workflow_utils.Result(error=message) # Delete the plan environment file from Swift, as it is no long needed. # (If we were to leave the environment file behind, we would have to # take care to keep it in sync with the actual contents of the Mistral # environment. To avoid that, we simply delete it.) # TODO(akrivoka): Once the 'Deployment plan management changes' spec # (https://review.openstack.org/#/c/438918/) is implemented, we will no # longer use Mistral environments for holding the plan data, so this # code can go away. if not plan_env_missing: try: swift.delete_object(self.container, constants.PLAN_ENVIRONMENT) except swiftexceptions.ClientException as err: message = "Error deleting file from container: %s" % err return mistral_workflow_utils.Result(error=message)
def run(self, context): oc = self.get_object_client(context) # checks to see if a container has a valid name if not pattern_validator(constants.PLAN_NAME_PATTERN, self.container): message = ("Unable to create plan. The plan name must " "only contain letters, numbers or dashes") return actions.Result(error=message) # checks to see if a container with that name exists if self.container in [container["name"] for container in oc.get_account()[1]]: result_string = ("A container with the name %s already" " exists.") % self.container return actions.Result(error=result_string) oc.put_container(self.container, headers=default_container_headers)
def run(self, context): oc = self.get_object_client(context) # checks to see if a container has a valid name if not pattern_validator(constants.PLAN_NAME_PATTERN, self.container): message = ("Unable to create plan. The plan name must " "only contain letters, numbers or dashes") return actions.Result(error=message) # checks to see if a container with that name exists if self.container in [container["name"] for container in oc.get_account()[1]]: result_string = ("A container with the name %s already" " exists.") % self.container return actions.Result(error=result_string) oc.put_container(self.container, headers=default_container_headers)
def test_invalid_patterns(self): self.assertFalse(validations.pattern_validator("^$", "foo")) self.assertFalse( validations.pattern_validator(PLAN_NAME_PATTERN, "foo_1"))
def test_valid_patterns(self): self.assertTrue(validations.pattern_validator("^$", "")) self.assertTrue(validations.pattern_validator(PLAN_NAME_PATTERN, "foo")) self.assertTrue( validations.pattern_validator(PLAN_NAME_PATTERN, "Foo-1"))
def test_invalid_patterns(self): self.assertFalse( validations.pattern_validator("^$", "foo")) self.assertFalse( validations.pattern_validator(PLAN_NAME_PATTERN, "foo_1"))
def test_valid_patterns(self): self.assertTrue(validations.pattern_validator("^$", "")) self.assertTrue( validations.pattern_validator(PLAN_NAME_PATTERN, "foo")) self.assertTrue( validations.pattern_validator(PLAN_NAME_PATTERN, "Foo-1"))