Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 43 additions & 30 deletions .github/workflows/images_hash_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import sys
import argparse

parser = argparse.ArgumentParser(description="Validate image hashes against Docker Hub manifest digests")
parser = argparse.ArgumentParser(
description="Validate image hashes against Docker Hub manifest digests"
)
parser.add_argument("-f", "--file", required=True, help="Path to the JSON file")
args = parser.parse_args()

Expand All @@ -12,17 +14,20 @@
with open(json_file) as f:
data = json.load(f)


def get_digest(image, arch="amd64"):
repo, tag = image.split(":")

token_url = f"https://auth.docker.io/token?service=registry.docker.io&scope=repository:{repo}:pull"
token = requests.get(token_url).json()["token"]

headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.docker.distribution.manifest.list.v2+json"
"Accept": "application/vnd.docker.distribution.manifest.list.v2+json",
}
r = requests.get(f"https://registry-1.docker.io/v2/{repo}/manifests/{tag}", headers=headers)
r = requests.get(
f"https://registry-1.docker.io/v2/{repo}/manifests/{tag}", headers=headers
)
r.raise_for_status()
manifest_list = r.json()

Expand All @@ -34,43 +39,51 @@ def get_digest(image, arch="amd64"):
else:
return r.headers["Docker-Content-Digest"]


errors = []


def check_hash(image, arch, expected_hash):
try:
digest = get_digest(image, arch)
expected_digest = f"sha256:{expected_hash}"
if digest == expected_digest:
print(f"✅ {image} ({arch}) OK")
return

print(f"❌ {image} ({arch}) mismatch: expected {expected_digest}, got {digest}")
errors.append((image, arch, expected_hash, digest))
except Exception as e:
print(f"⚠️ Failed to check {image} ({arch}): {e}")
errors.append((image, arch, expected_hash, "ERROR"))


for version in data["versions"]:
for product, versions in version["matrix"].items():
for ver, details in versions.items():
image = details["image_path"]

expected_amd = details.get("image_hash")
if expected_amd is not None:
try:
digest = get_digest(image, "amd64")
if digest == f"sha256:{expected_amd}":
print(f"✅ {image} (amd64) OK")
else:
print(f"❌ {image} (amd64) mismatch: expected sha256:{expected_amd}, got {digest}")
errors.append((image, "amd64", expected_amd, digest))
except Exception as e:
print(f"⚠️ Failed to check {image} (amd64): {e}")
errors.append((image, "amd64", expected_amd, "ERROR"))

expected_arm = details.get("image_hash_arm64")
if expected_arm is not None:
try:
digest = get_digest(image, "arm64")
if digest == f"sha256:{expected_arm}":
print(f"✅ {image} (arm64) OK")
else:
print(f"❌ {image} (arm64) mismatch: expected sha256:{expected_arm}, got {digest}")
errors.append((image, "arm64", expected_arm, digest))
except Exception as e:
print(f"⚠️ Failed to check {image} (arm64): {e}")
errors.append((image, "arm64", expected_arm, "ERROR"))
hash_checks = [
("amd64", details.get("image_hash")),
("arm64", details.get("image_hash_arm64")),
]

checked_any_hash = False
for arch, expected_hash in hash_checks:
if expected_hash is None:
continue

checked_any_hash = True
check_hash(image, arch, expected_hash)

if not checked_any_hash:
print(f"❌ {image} has no image_hash/image_hash_arm64")
errors.append((image, "hash", "defined", "MISSING"))

if errors:
print("\n❌ Some images did not match:")
for img, arch, exp, got in errors:
print(f"- {img} ({arch}): expected sha256:{exp}, got {got}")
sys.exit(1)
else:
print("\n🎉 All image hashes match Docker Hub!")
print("\nAll image hashes match Docker Hub!")
20 changes: 19 additions & 1 deletion api-tests/apply_route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func TestApplyShouldReturnJustOneVersion(t *testing.T) {

psmdbParams := &version_service.VersionServiceApplyParams{
Apply: "latest",
OperatorVersion: "1.21.2",
OperatorVersion: "1.22.0",
Product: "psmdb-operator",
}
psmdbParams.WithTimeout(2 * time.Second)
Expand Down Expand Up @@ -450,6 +450,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
version string
}{
// test latest
{"latest", "1.22.0", nil, "8.0.19-7"},
{"latest", "1.21.2", nil, "8.0.17-6"},
{"latest", "1.21.1", nil, "8.0.12-4"},
{"latest", "1.21.0", nil, "8.0.12-4"},
Expand All @@ -473,13 +474,15 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"latest", "1.7.0", nil, "4.4.3-5"},
{"latest", "1.6.0", nil, "4.4.2-4"},
{"latest", "1.5.0", nil, "4.2.8-8"},
{"latest", "1.22.0", &v80, "8.0.19-7"},
{"latest", "1.21.2", &v80, "8.0.17-6"},
{"latest", "1.21.1", &v80, "8.0.12-4"},
{"latest", "1.21.0", &v80, "8.0.12-4"},
{"latest", "1.20.1", &v80, "8.0.8-3"},
{"latest", "1.20.0", &v80, "8.0.8-3"},
{"latest", "1.19.1", &v80, "8.0.4-1"},
{"latest", "1.19.0", &v80, "8.0.4-1"},
{"latest", "1.22.0", &v70, "7.0.30-16"},
{"latest", "1.21.2", &v70, "7.0.28-15"},
{"latest", "1.21.1", &v70, "7.0.24-13"},
{"latest", "1.21.0", &v70, "7.0.24-13"},
Expand All @@ -492,6 +495,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"latest", "1.16.2", &v70, "7.0.8-5"},
{"latest", "1.16.1", &v70, "7.0.8-5"},
{"latest", "1.16.0", &v70, "7.0.8-5"},
{"latest", "1.22.0", &v60, "6.0.27-21"},
{"latest", "1.21.2", &v60, "6.0.27-21"},
{"latest", "1.21.1", &v60, "6.0.25-20"},
{"latest", "1.21.0", &v60, "6.0.25-20"},
Expand Down Expand Up @@ -545,6 +549,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"latest", "1.5.0", &v36, "3.6.19-7.0"},

// test recommended
{"recommended", "1.22.0", nil, "8.0.19-7"},
{"recommended", "1.21.2", nil, "8.0.17-6"},
{"recommended", "1.21.1", nil, "8.0.12-4"},
{"recommended", "1.21.0", nil, "8.0.12-4"},
Expand All @@ -568,9 +573,11 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"recommended", "1.7.0", nil, "4.4.3-5"},
{"recommended", "1.6.0", nil, "4.4.2-4"},
{"recommended", "1.5.0", nil, "4.2.8-8"},
{"recommended", "1.22.0", &v80, "8.0.19-7"},
{"recommended", "1.21.2", &v80, "8.0.17-6"},
{"recommended", "1.21.1", &v80, "8.0.12-4"},
{"recommended", "1.21.0", &v80, "8.0.12-4"},
{"recommended", "1.22.0", &v70, "7.0.30-16"},
{"recommended", "1.21.2", &v70, "7.0.28-15"},
{"recommended", "1.21.1", &v70, "7.0.24-13"},
{"recommended", "1.21.0", &v70, "7.0.24-13"},
Expand All @@ -582,6 +589,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"recommended", "1.16.2", &v70, "7.0.8-5"},
{"recommended", "1.16.1", &v70, "7.0.8-5"},
{"recommended", "1.16.0", &v70, "7.0.8-5"},
{"recommended", "1.22.0", &v60, "6.0.27-21"},
{"recommended", "1.21.2", &v60, "6.0.27-21"},
{"recommended", "1.21.1", &v60, "6.0.25-20"},
{"recommended", "1.21.0", &v60, "6.0.25-20"},
Expand Down Expand Up @@ -636,13 +644,15 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"recommended", "1.5.0", &v36, "3.6.19-7.0"},

// test exact
{"8.0.19-7", "1.22.0", nil, "8.0.19-7"},
{"8.0.17-6", "1.21.2", nil, "8.0.17-6"},
{"8.0.12-4", "1.21.1", nil, "8.0.12-4"},
{"8.0.12-4", "1.21.0", nil, "8.0.12-4"},
{"8.0.8-3", "1.20.1", nil, "8.0.8-3"},
{"8.0.8-3", "1.20.0", nil, "8.0.8-3"},
{"8.0.4-1", "1.19.1", nil, "8.0.4-1"},
{"8.0.4-1", "1.19.0", nil, "8.0.4-1"},
{"7.0.30-16", "1.22.0", nil, "7.0.30-16"},
{"7.0.28-15", "1.21.2", nil, "7.0.28-15"},
{"7.0.24-13", "1.21.1", nil, "7.0.24-13"},
{"7.0.24-13", "1.21.0", nil, "7.0.24-13"},
Expand All @@ -655,6 +665,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"7.0.8-5", "1.16.2", nil, "7.0.8-5"},
{"7.0.8-5", "1.16.1", nil, "7.0.8-5"},
{"7.0.8-5", "1.16.0", nil, "7.0.8-5"},
{"6.0.27-21", "1.22.0", nil, "6.0.27-21"},
{"6.0.27-21", "1.21.2", nil, "6.0.27-21"},
{"6.0.25-20", "1.21.1", nil, "6.0.25-20"},
{"6.0.25-20", "1.21.0", nil, "6.0.25-20"},
Expand Down Expand Up @@ -712,13 +723,15 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"3.6.18-5.0", "1.5.0", nil, "3.6.18-5.0"},

//test with suffix
{"8.0-latest", "1.22.0", nil, "8.0.19-7"},
{"8.0-latest", "1.21.2", nil, "8.0.17-6"},
{"8.0-latest", "1.21.1", nil, "8.0.12-4"},
{"8.0-latest", "1.21.0", nil, "8.0.12-4"},
{"8.0-latest", "1.20.1", nil, "8.0.8-3"},
{"8.0-latest", "1.20.0", nil, "8.0.8-3"},
{"8.0-latest", "1.19.1", nil, "8.0.4-1"},
{"8.0-latest", "1.19.0", nil, "8.0.4-1"},
{"7.0-latest", "1.22.0", nil, "7.0.30-16"},
{"7.0-latest", "1.21.2", nil, "7.0.28-15"},
{"7.0-latest", "1.21.1", nil, "7.0.24-13"},
{"7.0-latest", "1.21.0", nil, "7.0.24-13"},
Expand All @@ -731,6 +744,7 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"7.0-latest", "1.16.2", nil, "7.0.8-5"},
{"7.0-latest", "1.16.1", nil, "7.0.8-5"},
{"7.0-latest", "1.16.0", nil, "7.0.8-5"},
{"6.0-latest", "1.22.0", nil, "6.0.27-21"},
{"6.0-latest", "1.21.2", nil, "6.0.27-21"},
{"6.0-latest", "1.21.1", nil, "6.0.25-20"},
{"6.0-latest", "1.21.0", nil, "6.0.25-20"},
Expand Down Expand Up @@ -787,9 +801,11 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"3.6-latest", "1.6.0", nil, "3.6.21-10.0"},
{"3.6-latest", "1.5.0", nil, "3.6.19-7.0"},

{"8.0-recommended", "1.22.0", nil, "8.0.19-7"},
{"8.0-recommended", "1.21.2", nil, "8.0.17-6"},
{"8.0-recommended", "1.21.1", nil, "8.0.12-4"},
{"8.0-recommended", "1.21.0", nil, "8.0.12-4"},
{"7.0-recommended", "1.22.0", nil, "7.0.30-16"},
{"7.0-recommended", "1.21.2", nil, "7.0.28-15"},
{"7.0-recommended", "1.21.1", nil, "7.0.24-13"},
{"7.0-recommended", "1.21.0", nil, "7.0.24-13"},
Expand All @@ -802,6 +818,8 @@ func TestApplyPsmdbReturnedVersions(t *testing.T) {
{"7.0-recommended", "1.16.2", nil, "7.0.8-5"},
{"7.0-recommended", "1.16.1", nil, "7.0.8-5"},
{"7.0-recommended", "1.16.0", nil, "7.0.8-5"},
{"6.0-recommended", "1.22.0", nil, "6.0.27-21"},
{"6.0-recommended", "1.21.2", nil, "6.0.27-21"},
{"6.0-recommended", "1.21.1", nil, "6.0.25-20"},
{"6.0-recommended", "1.21.0", nil, "6.0.25-20"},
{"6.0-recommended", "1.20.1", nil, "6.0.21-18"},
Expand Down
2 changes: 2 additions & 0 deletions api-tests/operator_route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ func TestOperatorRouteShouldReturnRightOperatorVersion(t *testing.T) {
{"psmdb-operator", "1.21.0"},
{"psmdb-operator", "1.21.1"},
{"psmdb-operator", "1.21.2"},
{"psmdb-operator", "1.22.0"},
{"pg-operator", "1.1.0"},
{"pg-operator", "1.2.0"},
{"pg-operator", "1.3.0"},
Expand Down Expand Up @@ -187,6 +188,7 @@ func TestOperatorRoutePsmdbShouldReturnNotEmptyResponses(t *testing.T) {
{"psmdb-operator", "1.21.0"},
{"psmdb-operator", "1.21.1"},
{"psmdb-operator", "1.21.2"},
{"psmdb-operator", "1.22.0"},
}

for _, c := range cases {
Expand Down
1 change: 1 addition & 0 deletions sources/operator.1.22.0.psmdb-operator.dep.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
Loading