def Run(self, args): def Push(image, dest_name, creds, http_obj, src_name, session_push_type): with session_push_type(dest_name, creds, http_obj) as push: push.upload(image) log.CreatedResource(dest_name) log.UpdatedResource(src_name) http_obj = http.Http() src_name = util.GetDockerImageFromTagOrDigest(args.src_image) dest_name = docker_name.Tag(args.dest_image) console_io.PromptContinue('This will tag {0} with {1}'.format( src_name, dest_name), default=True, cancel_on_no=True) creds = util.CredentialProvider() with v2_2_image.FromRegistry(src_name, creds, http_obj) as v2_2_img: if v2_2_img.exists(): Push(v2_2_img, dest_name, creds, http_obj, src_name, v2_2_session.Push) return with v2_image.FromRegistry(src_name, creds, http_obj) as v2_img: Push(v2_img, dest_name, creds, http_obj, src_name, v2_session.Push)
def testBadDigestPrefix(self): repo = 'gcr.io/google-appengine/java-compat' hex_str = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b' image_name = '{repo}@sha25:{hex_str}'.format(repo=repo, hex_str=hex_str) with self.assertRaises(util.InvalidImageNameError): util.GetDockerImageFromTagOrDigest(image_name)
def Run(self, args): # pylint: disable=missing-docstring def Push(image, dest_name, creds, http_obj, src_name, session_push_type): try: with session_push_type(dest_name, creds, http_obj) as push: push.upload(image) log.CreatedResource(dest_name) log.UpdatedResource(src_name) except docker_http.V2DiagnosticException as err: raise util.GcloudifyRecoverableV2Errors( err, { 403: 'Tagging failed, access denied: {0}'.format(dest_name) }) http_obj = http.Http() src_name = util.GetDockerImageFromTagOrDigest(args.src_image) dest_name = docker_name.Tag(args.dest_image) console_io.PromptContinue('This will tag {0} with {1}'.format( src_name, dest_name), default=True, cancel_on_no=True) creds = util.CredentialProvider() with v2_2_image.FromRegistry(src_name, creds, http_obj) as v2_2_img: if v2_2_img.exists(): Push(v2_2_img, dest_name, creds, http_obj, src_name, v2_2_session.Push) return with v2_image.FromRegistry(src_name, creds, http_obj) as v2_img: Push(v2_img, dest_name, creds, http_obj, src_name, v2_session.Push)
def testDigest(self): repo = 'gcr.io/google-appengine/java-compat' hex_str = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b' image_name = '{repo}@sha256:{hex_str}'.format(repo=repo, hex_str=hex_str) expected_digest = docker_name.Digest(image_name) digest = util.GetDockerImageFromTagOrDigest(image_name) self.assertEqual(expected_digest, digest)
def _ProcessImageNames(self, image_names): digests = set() tags = set() for image_name in image_names: docker_obj = util.GetDockerImageFromTagOrDigest(image_name) if isinstance(docker_obj, docker_name.Digest): digests.add(docker_obj) elif isinstance(docker_obj, docker_name.Tag): tags.add(docker_obj) return [digests, tags]
def Run(self, args): # pylint: disable=missing-docstring def Push(image, dest_names, creds, http_obj, src_name, session_push_type): for dest_name in dest_names: with session_push_type(dest_name, creds, http_obj) as push: push.upload(image) log.CreatedResource(dest_name) log.UpdatedResource(src_name) http_obj = http.Http() src_name = util.GetDockerImageFromTagOrDigest(args.src_image) dest_names = [] for dest_image in args.dest_image: try: dest_name = docker_name.Tag(dest_image) except docker_name.BadNameException as e: raise util.InvalidImageNameError(six.text_type(e)) if '/' not in dest_name.repository: raise exceptions.Error( 'Pushing to project root-level images is disabled. ' 'Please designate an image within a project, ' 'e.g. gcr.io/project-id/my-image:tag') dest_names.append(dest_name) console_io.PromptContinue('This will tag {} with:\n{}'.format( src_name, '\n'.join(six.text_type(dest_name) for dest_name in dest_names)), default=True, cancel_on_no=True) creds = util.CredentialProvider() with util.WrapExpectedDockerlessErrors(): with docker_image_list.FromRegistry(src_name, creds, http_obj) as manifest_list: if manifest_list.exists(): Push(manifest_list, dest_names, creds, http_obj, src_name, v2_2_session.Push) return with v2_2_image.FromRegistry(src_name, creds, http_obj, accepted_mimes=docker_http. SUPPORTED_MANIFEST_MIMES) as v2_2_img: if v2_2_img.exists(): Push(v2_2_img, dest_names, creds, http_obj, src_name, v2_2_session.Push) return with v2_image.FromRegistry(src_name, creds, http_obj) as v2_img: Push(v2_img, dest_names, creds, http_obj, src_name, v2_session.Push)
def _ProcessImageNames(self, image_names): digests = set() tags = set() for image_name in image_names: docker_obj = util.GetDockerImageFromTagOrDigest(image_name) if isinstance(docker_obj, docker_name.Digest): digests.add(docker_obj) elif isinstance(docker_obj, docker_name.Tag): if not util.IsFullySpecified(image_name): log.warn('Implicit ":latest" tag specified: ' + image_name) tags.add(docker_obj) return [digests, tags]
def _ParseArgs(self, image_names): tags = set() for image_name in image_names: docker_obj = util.GetDockerImageFromTagOrDigest(image_name) if (isinstance(docker_obj, docker_name.Tag) and util.IsFullySpecified(image_name)): # Only accept explicitly named tags for removal. tags.add(docker_obj) else: raise util.InvalidImageNameError( 'IMAGE_NAME must be of the form [*.gcr.io/repository:<tag>]: ' '[{}]'.format(image_name)) return tags