def reconcile_tags()

in appengine/reconciletags/tag_reconciler.py [0:0]


    def reconcile_tags(self, data, dry_run):
        for project in data['projects']:

            default_registry = project['base_registry']
            registries = project.get('additional_registries', [])
            registries.append(default_registry)

            default_repo = os.path.join(default_registry,
                                        project['repository'])

            for image in project['images']:
                digest = self.get_digest_from_prefix(default_repo,
                                                     image['digest'])

                default_digest = default_repo + '@sha256:' + digest
                default_name = docker_name.Digest(default_digest)
                default_creds = (docker_creds.DefaultKeychain
                                 .Resolve(default_name))
                transport = transport_pool.Http(httplib2.Http)

                # Bail out if the digest in the config file doesn't exist.
                with docker_image.FromRegistry(default_name,
                                               default_creds,
                                               transport) as img:

                    if not img.exists():
                        logging.debug('Could not retrieve  ' +
                                      '{0}'.format(default_digest))
                        return

                for registry in registries:

                    full_repo = os.path.join(registry, project['repository'])
                    full_digest = full_repo + '@sha256:' + digest
                    name = docker_name.Digest(full_digest)
                    creds = docker_creds.DefaultKeychain.Resolve(name)

                    with docker_image.FromRegistry(name, creds,
                                                   transport) as img:
                        if img.exists():

                            existing_tags = img.tags()
                            logging.debug('Existing Tags: ' +
                                          '{0}'.format(existing_tags))

                            manifests = img.manifests()
                            tagged_digest = self.get_tagged_digest(
                                manifests, image['tag'])

                            # Don't retag an image if the tag already exists
                            if tagged_digest.startswith('sha256:'):
                                tagged_digest = tagged_digest[len('sha256:'):]
                            if tagged_digest.startswith(digest):
                                logging.debug('Skipping tagging %s with %s as '
                                              'that tag already exists.',
                                              digest, image['tag'])
                                continue

                        # We can safely retag now.
                        full_tag = full_repo + ':' + image['tag']
                        self.add_tags(default_digest, full_tag, dry_run)

                logging.debug(self.get_existing_tags(default_repo, digest))