Ejemplo n.º 1
0
Archivo: label.py Proyecto: zhill/quay
def get_manifest_label(label_uuid, manifest):
    """ Retrieves the manifest label on the manifest with the given UUID or None if none. """
    try:
        return (Label.select(
            Label, LabelSourceType).join(LabelSourceType).where(
                Label.uuid == label_uuid).switch(Label).join(ManifestLabel).
                where(ManifestLabel.manifest == manifest).get())
    except Label.DoesNotExist:
        return None
Ejemplo n.º 2
0
Archivo: label.py Proyecto: zhill/quay
def get_manifest_label(label_uuid, tag_manifest):
    """ Retrieves the manifest label on the tag manifest with the given ID. """
    try:
        return (Label.select(
            Label, LabelSourceType).join(LabelSourceType).where(
                Label.uuid == label_uuid).switch(Label).join(TagManifestLabel).
                where(TagManifestLabel.annotated == tag_manifest).get())
    except Label.DoesNotExist:
        return None
Ejemplo n.º 3
0
def create_manifest_label(tag_manifest,
                          key,
                          value,
                          source_type_name,
                          media_type_name=None):
    """
    Creates a new manifest label on a specific tag manifest.
    """
    if not key:
        raise InvalidLabelKeyException("Missing key on label")

    # Note that we don't prevent invalid label names coming from the manifest to be stored, as Docker
    # does not currently prevent them from being put into said manifests.
    if not validate_label_key(key) and source_type_name != "manifest":
        raise InvalidLabelKeyException(
            "Label key `%s` is invalid or reserved" % key)

    # Find the matching media type. If none specified, we infer.
    if media_type_name is None:
        media_type_name = "text/plain"
        if is_json(value):
            media_type_name = "application/json"

    media_type_id = _get_media_type_id(media_type_name)
    if media_type_id is None:
        raise InvalidMediaTypeException()

    source_type_id = _get_label_source_type_id(source_type_name)

    with db_transaction():
        label = Label.create(key=key,
                             value=value,
                             source_type=source_type_id,
                             media_type=media_type_id)
        tag_manifest_label = TagManifestLabel.create(
            annotated=tag_manifest,
            label=label,
            repository=tag_manifest.tag.repository)
        try:
            mapping_row = TagManifestToManifest.get(tag_manifest=tag_manifest)
            if mapping_row.manifest:
                manifest_label = ManifestLabel.create(
                    manifest=mapping_row.manifest,
                    label=label,
                    repository=tag_manifest.tag.repository,
                )
                TagManifestLabelMap.create(
                    manifest_label=manifest_label,
                    tag_manifest_label=tag_manifest_label,
                    label=label,
                    manifest=mapping_row.manifest,
                    tag_manifest=tag_manifest,
                )
        except TagManifestToManifest.DoesNotExist:
            pass

    return label
Ejemplo n.º 4
0
Archivo: label.py Proyecto: zhill/quay
def list_manifest_labels(manifest_id, prefix_filter=None):
    """ Lists all labels found on the given manifest, with an optional filter by key prefix. """
    query = (Label.select(Label, MediaType).join(MediaType).switch(Label).join(
        LabelSourceType).switch(Label).join(ManifestLabel).where(
            ManifestLabel.manifest == manifest_id))

    if prefix_filter is not None:
        query = query.where(prefix_search(Label.key, prefix_filter))

    return query
Ejemplo n.º 5
0
Archivo: label.py Proyecto: zhill/quay
def list_manifest_labels(tag_manifest, prefix_filter=None):
    """ Lists all labels found on the given tag manifest. """
    query = (Label.select(Label, MediaType).join(MediaType).switch(Label).join(
        LabelSourceType).switch(Label).join(TagManifestLabel).where(
            TagManifestLabel.annotated == tag_manifest))

    if prefix_filter is not None:
        query = query.where(prefix_search(Label.key, prefix_filter))

    return query
Ejemplo n.º 6
0
def _garbage_collect_label(label_id, context):
  assert label_id is not None

  # We can now delete the label.
  with db_transaction():
    if _check_label_used(label_id):
      return False

    result = Label.delete().where(Label.id == label_id).execute() == 1

  if result:
    context.mark_label_id_removed(label_id)

  return result
Ejemplo n.º 7
0
def create_manifest_label(manifest_id, key, value, source_type_name, media_type_name=None):
    """
    Creates a new manifest label on a specific tag manifest.
    """
    if not key:
        raise InvalidLabelKeyException("Missing key on label")

    # Note that we don't prevent invalid label names coming from the manifest to be stored, as Docker
    # does not currently prevent them from being put into said manifests.
    if source_type_name != "manifest" and not validate_label_key(key):
        raise InvalidLabelKeyException("Key `%s` is invalid or reserved" % key)

    # Find the matching media type. If none specified, we infer.
    if media_type_name is None:
        media_type_name = "text/plain"
        if is_json(value):
            media_type_name = "application/json"

    try:
        media_type_id = Label.media_type.get_id(media_type_name)
    except MediaType.DoesNotExist:
        raise InvalidMediaTypeException()

    source_type_id = Label.source_type.get_id(source_type_name)

    # Ensure the manifest exists.
    try:
        manifest = (
            Manifest.select(Manifest, Repository)
            .join(Repository)
            .where(Manifest.id == manifest_id)
            .get()
        )
    except Manifest.DoesNotExist:
        return None

    repository = manifest.repository

    with db_transaction():
        label = Label.create(
            key=key, value=value, source_type=source_type_id, media_type=media_type_id
        )
        manifest_label = ManifestLabel.create(
            manifest=manifest_id, label=label, repository=repository
        )

    return label
Ejemplo n.º 8
0
def _get_dangling_labels():
    label_ids = set([current.id for current in Label.select()])
    referenced_by_manifest = set(
        [mlabel.label_id for mlabel in ManifestLabel.select()])
    return label_ids - referenced_by_manifest
Ejemplo n.º 9
0
def create_manifest_label(manifest_id, key, value, source_type_name, media_type_name=None,
                          adjust_old_model=True):
  """ Creates a new manifest label on a specific tag manifest. """
  if not key:
    raise InvalidLabelKeyException()

  # Note that we don't prevent invalid label names coming from the manifest to be stored, as Docker
  # does not currently prevent them from being put into said manifests.
  if not validate_label_key(key) and source_type_name != 'manifest':
    raise InvalidLabelKeyException('Key `%s` is invalid' % key)

  # Find the matching media type. If none specified, we infer.
  if media_type_name is None:
    media_type_name = 'text/plain'
    if is_json(value):
      media_type_name = 'application/json'

  try:
    media_type_id = Label.media_type.get_id(media_type_name)
  except MediaType.DoesNotExist:
    raise InvalidMediaTypeException()

  source_type_id = Label.source_type.get_id(source_type_name)

  # Ensure the manifest exists.
  try:
    manifest = (Manifest
                .select(Manifest, Repository)
                .join(Repository)
                .where(Manifest.id == manifest_id)
                .get())
  except Manifest.DoesNotExist:
    return None

  repository = manifest.repository

  # TODO: Remove this code once the TagManifest table is gone.
  tag_manifest = None
  if adjust_old_model:
    try:
      mapping_row = (TagManifestToManifest
                     .select(TagManifestToManifest, TagManifest)
                     .join(TagManifest)
                     .where(TagManifestToManifest.manifest == manifest)
                     .get())
      tag_manifest = mapping_row.tag_manifest
    except TagManifestToManifest.DoesNotExist:
      tag_manifest = None

  with db_transaction():
    label = Label.create(key=key, value=value, source_type=source_type_id, media_type=media_type_id)
    manifest_label = ManifestLabel.create(manifest=manifest_id, label=label, repository=repository)

    # If there exists a mapping to a TagManifest, add the old-style label.
    # TODO: Remove this code once the TagManifest table is gone.
    if tag_manifest:
      tag_manifest_label = TagManifestLabel.create(annotated=tag_manifest, label=label,
                                                   repository=repository)
      TagManifestLabelMap.create(manifest_label=manifest_label,
                                 tag_manifest_label=tag_manifest_label,
                                 label=label,
                                 manifest=manifest,
                                 tag_manifest=tag_manifest)

  return label