Exemple #1
0
    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)
Exemple #2
0
 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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
 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]
Exemple #6
0
    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]
Exemple #8
0
 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