364 lines
12 KiB
Bash
364 lines
12 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Test for issue #2097: OCI chart digest support
|
|
# This test combines validation tests (fast) with registry tests (comprehensive)
|
|
|
|
issue_2097_input_dir="${cases_dir}/issue-2097/input"
|
|
issue_2097_chart_dir="${cases_dir}/issue-2097/chart"
|
|
issue_2097_tmp_dir=$(mktemp -d)
|
|
|
|
test_start "issue-2097: OCI chart digest support"
|
|
|
|
# ==============================================================================================================
|
|
# PART 1: Fast Validation Tests (no registry required)
|
|
# ==============================================================================================================
|
|
|
|
info "Part 1: Validation tests (no registry required)"
|
|
|
|
# Test 1.1: Digest in version field should NOT trigger semver validation error
|
|
info "Test 1.1: Verifying version with digest (2.0.0@sha256:...) does not trigger validation error"
|
|
set +e
|
|
${helmfile} -f "${issue_2097_input_dir}/helmfile-digest-in-version.yaml" template > "${issue_2097_tmp_dir}/digest-in-version.txt" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
# The command will fail because the registry doesn't exist, but it should NOT fail with
|
|
# "semver compliant" validation error
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/digest-in-version.txt"; then
|
|
cat "${issue_2097_tmp_dir}/digest-in-version.txt"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
fail "Issue #2097 regression: version with digest triggered validation error"
|
|
fi
|
|
|
|
info "SUCCESS: version with digest does not trigger validation error"
|
|
|
|
# Test 1.2: Version tag in chart URL should NOT trigger validation error
|
|
info "Test 1.2: Verifying chart URL with version tag (oci://reg/chart:2.0.0) does not trigger validation error"
|
|
set +e
|
|
${helmfile} -f "${issue_2097_input_dir}/helmfile-version-in-url.yaml" template > "${issue_2097_tmp_dir}/version-in-url.txt" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/version-in-url.txt"; then
|
|
cat "${issue_2097_tmp_dir}/version-in-url.txt"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
fail "Issue #2097 regression: version in chart URL triggered validation error"
|
|
fi
|
|
|
|
info "SUCCESS: version in chart URL does not trigger validation error"
|
|
|
|
# Test 1.3: Digest in chart URL should NOT trigger validation error
|
|
info "Test 1.3: Verifying chart URL with digest (oci://reg/chart@sha256:...) does not trigger validation error"
|
|
set +e
|
|
${helmfile} -f "${issue_2097_input_dir}/helmfile-digest-in-url.yaml" template > "${issue_2097_tmp_dir}/digest-in-url.txt" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/digest-in-url.txt"; then
|
|
cat "${issue_2097_tmp_dir}/digest-in-url.txt"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
fail "Issue #2097 regression: digest in chart URL triggered validation error"
|
|
fi
|
|
|
|
info "SUCCESS: digest in chart URL does not trigger validation error"
|
|
|
|
# ==============================================================================================================
|
|
# PART 2: Comprehensive Registry Tests (requires Docker)
|
|
# ==============================================================================================================
|
|
|
|
# Check if Docker is available
|
|
if ! command -v docker &> /dev/null; then
|
|
info "Skipping registry tests (Docker not available)"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
|
|
# Check if Docker daemon is running
|
|
if ! docker info &> /dev/null; then
|
|
info "Skipping registry tests (Docker daemon not running)"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
|
|
info "Part 2: Comprehensive tests with real OCI registry"
|
|
|
|
registry_container_name="helmfile-test-registry-2097"
|
|
registry_port=5097
|
|
|
|
# Cleanup function
|
|
cleanup_registry_2097() {
|
|
info "Cleaning up test registry (issue-2097)"
|
|
docker stop ${registry_container_name} &>/dev/null || true
|
|
docker rm ${registry_container_name} &>/dev/null || true
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
}
|
|
|
|
# Ensure cleanup on exit
|
|
trap cleanup_registry_2097 EXIT
|
|
|
|
# Test 2.1: Start local OCI registry
|
|
info "Test 2.1: Starting local OCI registry on port ${registry_port}"
|
|
docker run -d \
|
|
--name ${registry_container_name} \
|
|
-p ${registry_port}:5000 \
|
|
--rm \
|
|
registry:2 &> "${issue_2097_tmp_dir}/registry-start.log"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/registry-start.log"
|
|
warn "Failed to start Docker registry - skipping registry tests"
|
|
rm -rf "${issue_2097_tmp_dir}"
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
|
|
# Wait for registry to be ready
|
|
info "Waiting for registry to be ready..."
|
|
max_attempts=30
|
|
attempt=0
|
|
while [ $attempt -lt $max_attempts ]; do
|
|
if curl -s http://localhost:${registry_port}/v2/ > /dev/null 2>&1; then
|
|
info "Registry is ready"
|
|
break
|
|
fi
|
|
attempt=$((attempt + 1))
|
|
sleep 1
|
|
done
|
|
|
|
if [ $attempt -eq $max_attempts ]; then
|
|
warn "Registry did not become ready in time - skipping registry tests"
|
|
cleanup_registry_2097
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
|
|
# Test 2.2: Package and push the test chart
|
|
info "Test 2.2: Packaging and pushing test charts"
|
|
set +e
|
|
${helm} package "${issue_2097_chart_dir}" -d "${issue_2097_tmp_dir}" > "${issue_2097_tmp_dir}/package.log" 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
set -e
|
|
cat "${issue_2097_tmp_dir}/package.log"
|
|
warn "Failed to package chart - skipping registry tests"
|
|
cleanup_registry_2097
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
set -e
|
|
|
|
info "Pushing chart version 1.0.0 to local registry"
|
|
set +e
|
|
${helm} push "${issue_2097_tmp_dir}/test-chart-2097-1.0.0.tgz" oci://localhost:${registry_port} --plain-http > "${issue_2097_tmp_dir}/push.log" 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
set -e
|
|
cat "${issue_2097_tmp_dir}/push.log"
|
|
warn "Failed to push chart to registry - skipping registry tests"
|
|
cleanup_registry_2097
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
set -e
|
|
|
|
# Create version 2.0.0 as well
|
|
info "Creating and pushing version 2.0.0"
|
|
cp -r "${issue_2097_chart_dir}" "${issue_2097_tmp_dir}/chart-v2"
|
|
sed -i.bak 's/version: 1.0.0/version: 2.0.0/' "${issue_2097_tmp_dir}/chart-v2/Chart.yaml"
|
|
set +e
|
|
${helm} package "${issue_2097_tmp_dir}/chart-v2" -d "${issue_2097_tmp_dir}" > "${issue_2097_tmp_dir}/package-v2.log" 2>&1
|
|
${helm} push "${issue_2097_tmp_dir}/test-chart-2097-2.0.0.tgz" oci://localhost:${registry_port} --plain-http > "${issue_2097_tmp_dir}/push-v2.log" 2>&1
|
|
set -e
|
|
|
|
info "Successfully pushed chart versions 1.0.0 and 2.0.0"
|
|
|
|
# Get the digest of the v1.0.0 chart
|
|
info "Fetching digest for v1.0.0"
|
|
set +e
|
|
chart_digest=$(${helm} pull oci://localhost:${registry_port}/test-chart-2097 --version 1.0.0 --plain-http -d "${issue_2097_tmp_dir}/pull-test" 2>&1 | grep -oE 'sha256:[a-f0-9]+')
|
|
set -e
|
|
|
|
if [ -z "$chart_digest" ]; then
|
|
# Try alternative: use the registry API
|
|
chart_digest=$(curl -s http://localhost:${registry_port}/v2/test-chart-2097/manifests/1.0.0 \
|
|
-H "Accept: application/vnd.oci.image.manifest.v1+json" \
|
|
-D - -o /dev/null 2>/dev/null | grep -i "docker-content-digest" | tr -d '\r' | awk '{print $2}')
|
|
fi
|
|
|
|
if [ -z "$chart_digest" ]; then
|
|
warn "Could not determine chart digest - skipping digest registry tests"
|
|
cleanup_registry_2097
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (validation tests only)"
|
|
return 0
|
|
fi
|
|
|
|
info "Chart v1.0.0 digest: ${chart_digest}"
|
|
|
|
# Test 2.3: Baseline - chart with version in field (should work)
|
|
info "Test 2.3: Baseline - chart with version in field"
|
|
cat > "${issue_2097_tmp_dir}/helmfile-baseline.yaml" <<EOF
|
|
helmDefaults:
|
|
plainHttp: true
|
|
releases:
|
|
- name: test-oci-baseline
|
|
namespace: default
|
|
chart: oci://localhost:${registry_port}/test-chart-2097
|
|
version: "1.0.0"
|
|
EOF
|
|
|
|
set +e
|
|
${helmfile} -f "${issue_2097_tmp_dir}/helmfile-baseline.yaml" template --skip-deps > "${issue_2097_tmp_dir}/template-baseline.yaml" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if [ $code -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/template-baseline.yaml"
|
|
cleanup_registry_2097
|
|
fail "Baseline test failed - cannot proceed with digest tests"
|
|
fi
|
|
|
|
info "SUCCESS: Baseline test passed"
|
|
if grep -q "Hello from test chart 1.0.0" "${issue_2097_tmp_dir}/template-baseline.yaml"; then
|
|
info "SUCCESS: Correctly pulled version 1.0.0"
|
|
fi
|
|
|
|
# Test 2.4: Version tag in chart URL
|
|
info "Test 2.4: Version tag in chart URL"
|
|
cat > "${issue_2097_tmp_dir}/helmfile-version-url.yaml" <<EOF
|
|
helmDefaults:
|
|
plainHttp: true
|
|
releases:
|
|
- name: test-oci-version-url
|
|
namespace: default
|
|
chart: oci://localhost:${registry_port}/test-chart-2097:1.0.0
|
|
EOF
|
|
|
|
set +e
|
|
${helmfile} -f "${issue_2097_tmp_dir}/helmfile-version-url.yaml" template --skip-deps > "${issue_2097_tmp_dir}/template-version-url.yaml" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/template-version-url.yaml"; then
|
|
cat "${issue_2097_tmp_dir}/template-version-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Version in chart URL triggered validation error"
|
|
fi
|
|
|
|
if [ $code -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/template-version-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Version in chart URL failed"
|
|
fi
|
|
|
|
info "SUCCESS: Version in chart URL works"
|
|
if grep -q "Hello from test chart 1.0.0" "${issue_2097_tmp_dir}/template-version-url.yaml"; then
|
|
info "SUCCESS: Correctly pulled version 1.0.0 from URL tag"
|
|
fi
|
|
|
|
# Test 2.5: Digest in chart URL
|
|
info "Test 2.5: Digest in chart URL"
|
|
cat > "${issue_2097_tmp_dir}/helmfile-digest-url.yaml" <<EOF
|
|
helmDefaults:
|
|
plainHttp: true
|
|
releases:
|
|
- name: test-oci-digest-url
|
|
namespace: default
|
|
chart: oci://localhost:${registry_port}/test-chart-2097@${chart_digest}
|
|
EOF
|
|
|
|
set +e
|
|
${helmfile} -f "${issue_2097_tmp_dir}/helmfile-digest-url.yaml" template --skip-deps > "${issue_2097_tmp_dir}/template-digest-url.yaml" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/template-digest-url.yaml"; then
|
|
cat "${issue_2097_tmp_dir}/template-digest-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Digest in chart URL triggered validation error"
|
|
fi
|
|
|
|
if [ $code -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/template-digest-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Digest in chart URL failed"
|
|
fi
|
|
|
|
info "SUCCESS: Digest in chart URL works"
|
|
|
|
# Test 2.6: Digest in version field
|
|
info "Test 2.6: Digest in version field"
|
|
cat > "${issue_2097_tmp_dir}/helmfile-digest-version.yaml" <<EOF
|
|
helmDefaults:
|
|
plainHttp: true
|
|
releases:
|
|
- name: test-oci-digest-version
|
|
namespace: default
|
|
chart: oci://localhost:${registry_port}/test-chart-2097
|
|
version: "1.0.0@${chart_digest}"
|
|
EOF
|
|
|
|
set +e
|
|
${helmfile} -f "${issue_2097_tmp_dir}/helmfile-digest-version.yaml" template --skip-deps > "${issue_2097_tmp_dir}/template-digest-version.yaml" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/template-digest-version.yaml"; then
|
|
cat "${issue_2097_tmp_dir}/template-digest-version.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Digest in version field triggered validation error"
|
|
fi
|
|
|
|
if [ $code -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/template-digest-version.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Digest in version field failed"
|
|
fi
|
|
|
|
info "SUCCESS: Digest in version field works"
|
|
if grep -q "Hello from test chart 1.0.0" "${issue_2097_tmp_dir}/template-digest-version.yaml"; then
|
|
info "SUCCESS: Correctly pulled version 1.0.0 with digest verification"
|
|
fi
|
|
|
|
# Test 2.7: Version + digest in chart URL
|
|
info "Test 2.7: Version + digest in chart URL"
|
|
cat > "${issue_2097_tmp_dir}/helmfile-both-url.yaml" <<EOF
|
|
helmDefaults:
|
|
plainHttp: true
|
|
releases:
|
|
- name: test-oci-both-url
|
|
namespace: default
|
|
chart: oci://localhost:${registry_port}/test-chart-2097:1.0.0@${chart_digest}
|
|
EOF
|
|
|
|
set +e
|
|
${helmfile} -f "${issue_2097_tmp_dir}/helmfile-both-url.yaml" template --skip-deps > "${issue_2097_tmp_dir}/template-both-url.yaml" 2>&1
|
|
code=$?
|
|
set -e
|
|
|
|
if grep -q "semver compliant" "${issue_2097_tmp_dir}/template-both-url.yaml"; then
|
|
cat "${issue_2097_tmp_dir}/template-both-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Version + digest in chart URL triggered validation error"
|
|
fi
|
|
|
|
if [ $code -ne 0 ]; then
|
|
cat "${issue_2097_tmp_dir}/template-both-url.yaml"
|
|
cleanup_registry_2097
|
|
fail "Issue #2097: Version + digest in chart URL failed"
|
|
fi
|
|
|
|
info "SUCCESS: Version + digest in chart URL works"
|
|
|
|
# All tests passed!
|
|
# Remove the EXIT trap to avoid interfering with subsequent tests
|
|
cleanup_registry_2097
|
|
trap - EXIT
|
|
test_pass "issue-2097: OCI chart digest support (all tests including registry)"
|