mirror of
https://github.com/project-zot/zot.git
synced 2025-01-27 23:01:43 -05:00
b80deb9927
unified both local and s3 ImageStore logic into a single ImageStore added a new driver interface for common file/dirs manipulations to be implemented by different storage types refactor(gc): drop umoci dependency, implemented internal gc added retentionDelay config option that specifies the garbage collect delay for images without tags this will also clean manifests which are part of an index image (multiarch) that no longer exist. fix(dedupe): skip blobs under .sync/ directory if startup dedupe is running while also syncing is running ignore blobs under sync's temporary storage fix(storage): do not allow image indexes modifications when deleting a manifest verify that it is not part of a multiarch image and throw a MethodNotAllowed error to the client if it is. we don't want to modify multiarch images Signed-off-by: Petu Eusebiu <peusebiu@cisco.com>
159 lines
5.3 KiB
Bash
159 lines
5.3 KiB
Bash
load helpers_zot
|
|
|
|
function verify_prerequisites {
|
|
if [ ! $(command -v curl) ]; then
|
|
echo "you need to install curl as a prerequisite to running the tests" >&3
|
|
return 1
|
|
fi
|
|
|
|
if [ ! $(command -v jq) ]; then
|
|
echo "you need to install jq as a prerequisite to running the tests" >&3
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
function setup_file() {
|
|
# Verify prerequisites are available
|
|
if ! $(verify_prerequisites); then
|
|
exit 1
|
|
fi
|
|
|
|
# Download test data to folder common for the entire suite, not just this file
|
|
skopeo --insecure-policy copy --format=oci docker://ghcr.io/project-zot/golang:1.20 oci:${TEST_DATA_DIR}/golang:1.20
|
|
# Setup zot server
|
|
local zot_root_dir=${BATS_FILE_TMPDIR}/zot
|
|
local zot_config_file=${BATS_FILE_TMPDIR}/zot_config.json
|
|
local oci_data_dir=${BATS_FILE_TMPDIR}/oci
|
|
mkdir -p ${zot_root_dir}
|
|
mkdir -p ${oci_data_dir}
|
|
cat > ${zot_config_file}<<EOF
|
|
{
|
|
"distSpecVersion": "1.1.0",
|
|
"storage": {
|
|
"rootDirectory": "${zot_root_dir}",
|
|
"gc": true,
|
|
"gcReferrers": true,
|
|
"gcDelay": "30s",
|
|
"untaggedImageRetentionDelay": "40s",
|
|
"gcInterval": "1s"
|
|
},
|
|
"http": {
|
|
"address": "0.0.0.0",
|
|
"port": "8080"
|
|
},
|
|
"log": {
|
|
"level": "debug",
|
|
"output": "/tmp/gc.log"
|
|
}
|
|
}
|
|
EOF
|
|
zot_serve ${ZOT_PATH} ${zot_config_file}
|
|
wait_zot_reachable 8080
|
|
}
|
|
|
|
function teardown_file() {
|
|
zot_stop_all
|
|
}
|
|
|
|
@test "push image" {
|
|
run skopeo --insecure-policy copy --dest-tls-verify=false \
|
|
oci:${TEST_DATA_DIR}/golang:1.20 \
|
|
docker://127.0.0.1:8080/golang:1.20
|
|
[ "$status" -eq 0 ]
|
|
run curl http://127.0.0.1:8080/v2/_catalog
|
|
[ "$status" -eq 0 ]
|
|
[ $(echo "${lines[-1]}" | jq '.repositories[]') = '"golang"' ]
|
|
run curl http://127.0.0.1:8080/v2/golang/tags/list
|
|
[ "$status" -eq 0 ]
|
|
[ $(echo "${lines[-1]}" | jq '.tags[]') = '"1.20"' ]
|
|
}
|
|
|
|
@test "push image index" {
|
|
# --multi-arch below pushes an image index (containing many images) instead
|
|
# of an image manifest (single image)
|
|
run skopeo --insecure-policy copy --format=oci --dest-tls-verify=false --multi-arch=all \
|
|
docker://public.ecr.aws/docker/library/busybox:latest \
|
|
docker://127.0.0.1:8080/busybox:latest
|
|
[ "$status" -eq 0 ]
|
|
run curl http://127.0.0.1:8080/v2/_catalog
|
|
[ "$status" -eq 0 ]
|
|
[ $(echo "${lines[-1]}" | jq '.repositories[0]') = '"busybox"' ]
|
|
run curl http://127.0.0.1:8080/v2/busybox/tags/list
|
|
[ "$status" -eq 0 ]
|
|
[ $(echo "${lines[-1]}" | jq '.tags[]') = '"latest"' ]
|
|
}
|
|
|
|
@test "attach oras artifacts" {
|
|
# attach signature to image
|
|
echo "{\"artifact\": \"\", \"signature\": \"pat hancock\"}" > signature.json
|
|
run oras attach --plain-http 127.0.0.1:8080/golang:1.20 --image-spec v1.1-image --artifact-type 'signature/example' ./signature.json:application/json
|
|
[ "$status" -eq 0 ]
|
|
# attach sbom to image
|
|
echo "{\"version\": \"0.0.0.0\", \"artifact\": \"'127.0.0.1:8080/golang:1.20'\", \"contents\": \"good\"}" > sbom.json
|
|
run oras attach --plain-http 127.0.0.1:8080/golang:1.20 --image-spec v1.1-image --artifact-type 'sbom/example' ./sbom.json:application/json
|
|
[ "$status" -eq 0 ]
|
|
|
|
# attach signature to index image
|
|
run oras attach --plain-http 127.0.0.1:8080/busybox:latest --image-spec v1.1-image --artifact-type 'signature/example' ./signature.json:application/json
|
|
[ "$status" -eq 0 ]
|
|
# attach sbom to index image
|
|
echo "{\"version\": \"0.0.0.0\", \"artifact\": \"'127.0.0.1:8080/golang:1.20'\", \"contents\": \"good\"}" > sbom.json
|
|
run oras attach --plain-http 127.0.0.1:8080/busybox:latest --image-spec v1.1-image --artifact-type 'sbom/example' ./sbom.json:application/json
|
|
[ "$status" -eq 0 ]
|
|
}
|
|
|
|
@test "push OCI artifact with regclient" {
|
|
run regctl registry set 127.0.0.1:8080 --tls disabled
|
|
[ "$status" -eq 0 ]
|
|
|
|
run regctl artifact put --artifact-type application/vnd.example.artifact --subject 127.0.0.1:8080/golang:1.20 <<EOF
|
|
this is an artifact
|
|
EOF
|
|
[ "$status" -eq 0 ]
|
|
|
|
run regctl artifact get --subject 127.0.0.1:8080/golang:1.20
|
|
[ "$status" -eq 0 ]
|
|
|
|
run regctl artifact put --artifact-type application/vnd.example.artifact --subject 127.0.0.1:8080/busybox:latest <<EOF
|
|
this is an artifact
|
|
EOF
|
|
[ "$status" -eq 0 ]
|
|
|
|
run regctl artifact get --subject 127.0.0.1:8080/busybox:latest
|
|
[ "$status" -eq 0 ]
|
|
}
|
|
|
|
@test "garbage collect all artifacts after image delete" {
|
|
run skopeo --insecure-policy delete --tls-verify=false \
|
|
docker://127.0.0.1:8080/golang:1.20
|
|
[ "$status" -eq 0 ]
|
|
|
|
run skopeo --insecure-policy delete --tls-verify=false \
|
|
docker://127.0.0.1:8080/busybox:latest
|
|
[ "$status" -eq 0 ]
|
|
|
|
# sleep past gc delay
|
|
sleep 100
|
|
|
|
# gc should have removed artifacts
|
|
run regctl artifact get --subject 127.0.0.1:8080/golang:1.20
|
|
[ "$status" -eq 1 ]
|
|
|
|
run regctl artifact get --subject 127.0.0.1:8080/busybox:latest
|
|
[ "$status" -eq 1 ]
|
|
|
|
run oras discover --plain-http -o json 127.0.0.1:8080/golang:1.20
|
|
[ "$status" -eq 1 ]
|
|
|
|
run oras discover --plain-http -o json 127.0.0.1:8080/busybox:latest
|
|
[ "$status" -eq 1 ]
|
|
|
|
# repos should also be gc'ed
|
|
run curl http://127.0.0.1:8080/v2/_catalog
|
|
[ "$status" -eq 0 ]
|
|
[ $(echo "${lines[-1]}" | jq -r '.repositories | length') -eq 0 ]
|
|
}
|
|
|
|
|