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