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
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
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
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
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
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
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
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
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