def _purge_oci_tag(tag, context, allow_non_expired=False): assert tag.repository_id == context.repository.id if not allow_non_expired: assert tag.lifetime_end_ms is not None assert tag.lifetime_end_ms <= oci_tag.get_epoch_timestamp_ms() # Add the manifest to be GCed. context.add_manifest_id(tag.manifest_id) with db_transaction(): # Reload the tag and verify its lifetime_end_ms has not changed. try: reloaded_tag = db_for_update(Tag.select().where(Tag.id == tag.id)).get() except Tag.DoesNotExist: return False assert reloaded_tag.id == tag.id assert reloaded_tag.repository_id == context.repository.id if reloaded_tag.lifetime_end_ms != tag.lifetime_end_ms: return False # Delete mapping rows. TagToRepositoryTag.delete().where(TagToRepositoryTag.tag == tag).execute() # Delete the tag. tag.delete_instance()
def test_lookup_unrecoverable_tags(initialized_db): # Ensure no existing tags are found. for repo in Repository.select(): assert not list(lookup_unrecoverable_tags(repo)) # Mark a tag as outside the expiration window and ensure it is found. repo = get_repository("devtable", "history") results, _ = list_repository_tag_history(repo, 1, 100, specific_tag_name="latest") assert len(results) == 2 results[1].lifetime_end_ms = 1 results[1].save() # Ensure the tag is now found. found = list(lookup_unrecoverable_tags(repo)) assert found assert len(found) == 1 assert found[0] == results[1] # Mark the tag as expiring in the future and ensure it is no longer found. results[1].lifetime_end_ms = get_epoch_timestamp_ms() + 1000000 results[1].save() found = list(lookup_unrecoverable_tags(repo)) assert not found
def test_get_current_tag_with_multiple_expired_tags(initialized_db): repo = model.repository.create_repository("devtable", "newrepo", None) manifest, _ = create_manifest_for_testing(repo, "1") nowms = get_epoch_timestamp_ms() count = (Tag.update( lifetime_start_ms=nowms - timedelta(hours=24).total_seconds() * 1000, lifetime_end_ms=nowms - timedelta(hours=12).total_seconds() * 1000, ).where(Tag.manifest == manifest.id).execute()) expired_tag = create_temporary_tag_if_necessary(manifest, 3600) expired_tag = Tag.create( name="v6.6.6", repository=repo.id, lifetime_start_ms=nowms - timedelta(hours=10).total_seconds() * 1000, lifetime_end_ms=nowms - timedelta(hours=8).total_seconds() * 1000, reversion=False, hidden=False, manifest=manifest, tag_kind=Tag.tag_kind.get_id("tag"), ) tag = Tag.create( name="v6.6.6", repository=repo.id, lifetime_start_ms=nowms - timedelta(hours=5).total_seconds() * 1000, lifetime_end_ms=nowms + timedelta(hours=5).total_seconds() * 1000, reversion=False, hidden=False, manifest=manifest, tag_kind=Tag.tag_kind.get_id("tag"), ) current_tag = get_current_tag(repo.id, tag.name) assert current_tag.id == tag.id
def test_get_tag_by_manifest_id_multiple_tags_returns_latest(initialized_db): repo = model.repository.create_repository("devtable", "newrepo", None) manifest, _ = create_manifest_for_testing(repo, "1") before_ms = get_epoch_timestamp_ms() - timedelta( hours=24).total_seconds() * 1000 count = (Tag.update( lifetime_start_ms=before_ms, lifetime_end_ms=before_ms + 5, ).where(Tag.manifest == manifest.id).execute()) assert count == 1 expired_tag = get_tag_by_manifest_id(repo.id, manifest.id) new_tag = create_temporary_tag_if_necessary( manifest, get_epoch_timestamp_ms() + 3600 * 1000) tag = get_tag_by_manifest_id(repo.id, manifest.id) assert tag is not None assert tag.id == new_tag.id assert tag.lifetime_end_ms > expired_tag.lifetime_end_ms
def test_get_current_tag_with_expired_tag(initialized_db): repo = model.repository.create_repository("devtable", "newrepo", None) manifest, _ = create_manifest_for_testing(repo, "1") before_ms = get_epoch_timestamp_ms() - timedelta( hours=24).total_seconds() * 1000 count = (Tag.update( lifetime_start_ms=before_ms, lifetime_end_ms=before_ms + 5, ).where(Tag.manifest == manifest.id).execute()) assert count == 1