예제 #1
0
파일: tag.py 프로젝트: sabre1041/quay-1
def create_or_update_tag(repo,
                         tag_name,
                         models_ref,
                         manifest_list=None,
                         linked_tag=None,
                         tag_kind="release"):
    Tag = models_ref.Tag

    now_ts = get_epoch_timestamp_ms()
    tag_kind_id = Tag.tag_kind.get_id(tag_kind)
    with db_transaction():
        try:
            tag = db_for_update(
                tag_is_alive(
                    Tag.select().where(Tag.repository == repo,
                                       Tag.name == tag_name,
                                       Tag.tag_kind == tag_kind_id),
                    Tag,
                    now_ts,
                )).get()
            if tag.manifest_list == manifest_list and tag.linked_tag == linked_tag:
                return tag
            tag.lifetime_end = now_ts
            tag.save()
        except Tag.DoesNotExist:
            pass

        try:
            return Tag.create(
                repository=repo,
                manifest_list=manifest_list,
                linked_tag=linked_tag,
                name=tag_name,
                lifetime_start=now_ts,
                lifetime_end=None,
                tag_kind=tag_kind_id,
            )
        except IntegrityError:
            msg = "Tag with name %s and lifetime start %s under repository %s/%s already exists"
            raise TagAlreadyCreatedException(
                msg % (tag_name, now_ts, repo.namespace_user, repo.name))
예제 #2
0
파일: tag.py 프로젝트: zhill/quay
def create_or_update_tag_for_repo(repository_id,
                                  tag_name,
                                  tag_docker_image_id,
                                  reversion=False,
                                  oci_manifest=None,
                                  now_ms=None):
    now_ms = now_ms or get_epoch_timestamp_ms()
    now_ts = int(now_ms / 1000)

    with db_transaction():
        try:
            tag = db_for_update(
                _tag_alive(
                    RepositoryTag.select().where(
                        RepositoryTag.repository == repository_id,
                        RepositoryTag.name == tag_name),
                    now_ts,
                )).get()
            tag.lifetime_end_ts = now_ts
            tag.save()

            # Check for an OCI tag.
            try:
                oci_tag = db_for_update(
                    Tag.select().join(TagToRepositoryTag).where(
                        TagToRepositoryTag.repository_tag == tag)).get()
                oci_tag.lifetime_end_ms = now_ms
                oci_tag.save()
            except Tag.DoesNotExist:
                pass
        except RepositoryTag.DoesNotExist:
            pass
        except IntegrityError:
            msg = "Tag with name %s was stale when we tried to update it; Please retry the push"
            raise StaleTagException(msg % tag_name)

        try:
            image_obj = Image.get(Image.docker_image_id == tag_docker_image_id,
                                  Image.repository == repository_id)
        except Image.DoesNotExist:
            raise DataModelException("Invalid image with id: %s" %
                                     tag_docker_image_id)

        try:
            created = RepositoryTag.create(
                repository=repository_id,
                image=image_obj,
                name=tag_name,
                lifetime_start_ts=now_ts,
                reversion=reversion,
            )
            if oci_manifest:
                # Create the OCI tag as well.
                oci_tag = Tag.create(
                    repository=repository_id,
                    manifest=oci_manifest,
                    name=tag_name,
                    lifetime_start_ms=now_ms,
                    reversion=reversion,
                    tag_kind=Tag.tag_kind.get_id("tag"),
                )
                TagToRepositoryTag.create(tag=oci_tag,
                                          repository_tag=created,
                                          repository=repository_id)

            return created
        except IntegrityError:
            msg = "Tag with name %s and lifetime start %s already exists"
            raise TagAlreadyCreatedException(msg % (tag_name, now_ts))