Пример #1
0
 def test_tag_translation_docker_error_non_existent_image_id(
         self, mock_docker):
     mock_docker.from_env = MagicMock(
         side_effect=NullResource("mock error"))
     local_image = None
     with self.assertRaises(NoImageFoundException):
         tag_translation(local_image)
Пример #2
0
    def prompt_image_repository(self, parameter_overrides):
        image_repository = None
        artifacts_format = get_template_artifacts_format(
            template_file=self.template_file)
        if IMAGE in artifacts_format:
            self.transformed_resources = transform_template(
                parameter_overrides=parameter_overrides,
                template_dict=get_template_data(
                    template_file=self.template_file),
            )
            image_repository = prompt(
                f"\t{self.start_bold}Image Repository{self.end_bold}",
                type=click.STRING,
                default=self.image_repository if self.image_repository else "",
            )
            for _, function_prop in self.transformed_resources.functions.items(
            ):
                if function_prop.packagetype == IMAGE:
                    image = function_prop.imageuri
                    try:
                        tag = tag_translation(image)
                    except NonLocalImageException:
                        pass
                    else:
                        click.secho(
                            f"\t{self.start_bold}Images that will be pushed:{self.end_bold}"
                        )
                        click.secho(f"\t  {image} to {image_repository}:{tag}")
            click.secho(nl=True)

        return image_repository
Пример #3
0
    def upload(self, image):
        """
        Uploads given local image to ECR.
        :param image: locally tagged docker image that would be uploaded to ECR.
        :return: remote ECR image path that has been uploaded.
        """
        self.login()
        try:
            docker_img = self.docker_client.images.get(image)

            _tag = tag_translation(image,
                                   docker_image_id=docker_img.id,
                                   gen_tag=self.tag)

            docker_img.tag(repository=self.ecr_repo, tag=_tag)
            push_logs = self.docker_client.api.push(
                repository=self.ecr_repo,
                tag=_tag,
                auth_config=self.auth_config,
                stream=True,
                decode=True)
            self._stream_progress(push_logs)

        except (BuildError, APIError) as ex:
            raise DockerPushFailedError(msg=str(ex)) from ex

        return f"{self.ecr_repo}:{_tag}"
Пример #4
0
    def upload(self, image, resource_name):
        """
        Uploads given local image to ECR.
        :param image: locally tagged docker image that would be uploaded to ECR.
        :param resource_name: logical ID of the resource to be uploaded to ECR.
        :return: remote ECR image path that has been uploaded.
        """
        if not self.login_session_active:
            self.login()
            self.login_session_active = True
        try:
            docker_img = self.docker_client.images.get(image)

            _tag = tag_translation(image,
                                   docker_image_id=docker_img.id,
                                   gen_tag=self.tag)
            repository = (self.ecr_repo
                          if not isinstance(self.ecr_repo_multi, dict) else
                          self.ecr_repo_multi.get(resource_name))

            docker_img.tag(repository=repository, tag=_tag)
            push_logs = self.docker_client.api.push(
                repository=repository,
                tag=_tag,
                auth_config=self.auth_config,
                stream=True,
                decode=True)
            self._stream_progress(push_logs)

        except (BuildError, APIError) as ex:
            raise DockerPushFailedError(msg=str(ex)) from ex

        return f"{repository}:{_tag}"
Пример #5
0
 def test_tag_translation_without_image_id(self, mock_docker):
     mock_docker_client = MagicMock()
     mock_docker_id = MagicMock(id="sha256:1234")
     mock_docker_client.images.get.return_value = mock_docker_id
     mock_docker.from_env = mock_docker_client
     local_image = "helloworld:v1"
     self.assertEqual(
         "helloworld-1234-v1",
         tag_translation(local_image, docker_image_id="sha256:1234"))
Пример #6
0
    def prompt_image_repository(self, stacks: List[Stack]):
        """
        Prompt for the image repository to push the images.
        For each image function found in build artifacts, it will prompt for an image repository.

        Parameters
        ----------
        stacks : List[Stack]
            List of stacks to look for image functions.

        Returns
        -------
        Dict
            A dictionary contains image function logical ID as key, image repository as value.
        """
        image_repositories = {}
        artifacts_format = get_template_artifacts_format(
            template_file=self.template_file)
        if IMAGE in artifacts_format:
            self.function_provider = SamFunctionProvider(
                stacks, ignore_code_extraction_warnings=True)
            function_resources = get_template_function_resource_ids(
                template_file=self.template_file, artifact=IMAGE)
            for resource_id in function_resources:
                image_repositories[resource_id] = prompt(
                    f"\t{self.start_bold}Image Repository for {resource_id}{self.end_bold}",
                    default=self.image_repositories.get(resource_id, "")
                    if isinstance(self.image_repositories, dict) else ""
                    or self.image_repository,
                )
                if not is_ecr_url(image_repositories.get(resource_id)):
                    raise GuidedDeployFailedError(
                        f"Invalid Image Repository ECR URI: {image_repositories.get(resource_id)}"
                    )
            for resource_id, function_prop in self.function_provider.functions.items(
            ):
                if function_prop.packagetype == IMAGE:
                    image = function_prop.imageuri
                    try:
                        tag = tag_translation(image)
                    except NonLocalImageException:
                        pass
                    except NoImageFoundException as ex:
                        raise GuidedDeployFailedError(
                            "No images found to deploy, try running sam build"
                        ) from ex
                    else:
                        click.secho(
                            f"\t  {image} to be pushed to {image_repositories.get(resource_id)}:{tag}"
                        )
            click.secho(nl=True)

        return image_repositories
Пример #7
0
    def prompt_image_repository(self, parameter_overrides):
        image_repositories = {}
        artifacts_format = get_template_artifacts_format(
            template_file=self.template_file)
        if IMAGE in artifacts_format:
            self.transformed_resources = transform_template(
                parameter_overrides=parameter_overrides,
                template_dict=get_template_data(
                    template_file=self.template_file),
            )
            function_resources = get_template_function_resource_ids(
                template_file=self.template_file, artifact=IMAGE)
            for resource_id in function_resources:
                image_repositories[resource_id] = prompt(
                    f"\t{self.start_bold}Image Repository for {resource_id}{self.end_bold}",
                    default=self.image_repositories.get(resource_id, "")
                    if isinstance(self.image_repositories, dict) else ""
                    or self.image_repository,
                )
                if not is_ecr_url(image_repositories.get(resource_id)):
                    raise GuidedDeployFailedError(
                        f"Invalid Image Repository ECR URI: {image_repositories.get(resource_id)}"
                    )
            for resource_id, function_prop in self.transformed_resources.functions.items(
            ):
                if function_prop.packagetype == IMAGE:
                    image = function_prop.imageuri
                    try:
                        tag = tag_translation(image)
                    except NonLocalImageException:
                        pass
                    except NoImageFoundException as ex:
                        raise GuidedDeployFailedError(
                            "No images found to deploy, try running sam build"
                        ) from ex
                    else:
                        click.secho(
                            f"\t  {image} to be pushed to {image_repositories.get(resource_id)}:{tag}"
                        )
            click.secho(nl=True)

        return image_repositories
Пример #8
0
 def test_tag_translation_for_ecr_image(self):
     non_local_image = "123456789012.dkr.ecr.us-east-1.amazonaws.com/myrepo"
     with self.assertRaises(NonLocalImageException):
         tag_translation(non_local_image)
Пример #9
0
 def test_tag_translation_docker_error_without_image_id(self, mock_docker):
     mock_docker.from_env = MagicMock(side_effect=APIError("mock error"))
     local_image = "helloworld:v1"
     with self.assertRaises(DockerGetLocalImageFailedError):
         tag_translation(local_image)
Пример #10
0
 def test_tag_translation_with_image_id(self):
     local_image = "helloworld:v1"
     self.assertEqual(
         "helloworld-1234-v1",
         tag_translation(local_image, docker_image_id="sha256:1234"))