def run()

in servicecatalog_puppet/workflow/workspaces/provision_workspace_task.py [0:0]


    def run(self):
        with self.hub_client("s3") as s3:
            options = (
                zipfile.ZipFile(
                    io.BytesIO(
                        s3.get_object(Bucket=self.bucket, Key=self.key)
                        .get("Body")
                        .read()
                    )
                )
                .open(f"options.json", "r")
                .read()
            )

        options = json.loads(options)

        zip_file_path = f"s3://{self.bucket}/{self.key}"
        state_file_path = f"s3://sc-puppet-state-{self.account_id}/workspace/{self.workspace_name}/{self.account_id}/{self.region}.zip"
        with self.spoke_client("codebuild") as codebuild:
            parameters_to_use = [
                dict(name="TARGET_ACCOUNT", value=self.account_id, type="PLAINTEXT",),
                dict(name="STATE_FILE", value=state_file_path, type="PLAINTEXT",),
                dict(name="ZIP", value=zip_file_path, type="PLAINTEXT",),
            ]

            for parameter_name, parameter_value in self.get_parameter_values().items():
                parameters_to_use.append(
                    dict(
                        name=f"TF_VAR_{parameter_name}",
                        value=f"{parameter_value}",
                        type="PLAINTEXT",
                    ),
                )

            parameters_to_use.append(
                dict(
                    name="TERRAFORM_VERSION",
                    value=options.get("Terraform", {}).get(
                        "Version", constants.DEFAULT_TERRAFORM_VERSION_VALUE
                    ),
                    type="PLAINTEXT",
                ),
            )

            build = codebuild.start_build_and_wait_for_completion(
                projectName=constants.EXECUTE_TERRAFORM_PROJECT_NAME,
                environmentVariablesOverride=parameters_to_use,
            )

        if len(self.ssm_param_outputs) > 0:
            with self.spoke_client("s3") as s3:
                output_bucket = f"sc-puppet-state-{self.account_id}"
                output_key = f"terraform-executions/{build.get('id').split(':')[1]}/artifacts-execute/outputs.json"
                outputs = json.loads(
                    s3.get_object(Bucket=output_bucket, Key=output_key)
                    .get("Body")
                    .read()
                )

                for ssm_param_output in self.ssm_param_outputs:
                    self.info(
                        f"writing SSM Param: {ssm_param_output.get('stack_output')}"
                    )
                    with self.hub_client("ssm") as ssm:
                        if outputs.get(ssm_param_output.get("stack_output")):
                            output_value = outputs.get(
                                ssm_param_output.get("stack_output")
                            ).get("value")

                            ssm_parameter_name = ssm_param_output.get("param_name")
                            ssm_parameter_name = ssm_parameter_name.replace(
                                "${AWS::Region}", self.region
                            )
                            ssm_parameter_name = ssm_parameter_name.replace(
                                "${AWS::AccountId}", self.account_id
                            )
                            ssm.put_parameter_and_wait(
                                Name=ssm_parameter_name,
                                Value=output_value,
                                Type=ssm_param_output.get("param_type", "String"),
                                Overwrite=True,
                            )
                        else:
                            raise Exception(
                                f"Could not find {ssm_param_output.get('stack_output')} in the outputs"
                            )

        self.write_output(self.params_for_results_display())