Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 'deprecated' field for depreacted section generation in image docs #203

Closed
wants to merge 10 commits into from
32 changes: 16 additions & 16 deletions oci/mock-rock/_releases.json
Original file line number Diff line number Diff line change
@@ -1,68 +1,68 @@
{
"latest": {
"candidate": {
"target": "283"
"target": "1.0-22.04_candidate"
},
"beta": {
"target": "283"
"target": "latest_candidate"
},
"edge": {
"target": "283"
"target": "latest_beta"
},
"end-of-life": "2025-05-01T00:00:00Z"
},
"1.0-22.04": {
"candidate": {
"target": "283"
"target": "316"
},
"beta": {
"target": "283"
"target": "316"
},
"edge": {
"target": "283"
"target": "316"
},
"end-of-life": "2025-05-01T00:00:00Z"
},
"test": {
"beta": {
"target": "283"
"target": "1.0-22.04_beta"
},
"edge": {
"target": "283"
"target": "test_beta"
},
"end-of-life": "2026-05-01T00:00:00Z"
},
"1.1-22.04": {
"end-of-life": "2025-05-01T00:00:00Z",
"candidate": {
"target": "284"
"target": "317"
},
"beta": {
"target": "284"
"target": "317"
},
"edge": {
"target": "284"
"target": "317"
}
},
"1-22.04": {
"end-of-life": "2025-05-01T00:00:00Z",
"candidate": {
"target": "284"
"target": "317"
},
"beta": {
"target": "284"
"target": "317"
},
"edge": {
"target": "284"
"target": "317"
}
},
"1.2-22.04": {
"end-of-life": "2025-05-01T00:00:00Z",
"beta": {
"target": "285"
"target": "318"
},
"edge": {
"target": "285"
"target": "1.2-22.04_beta"
}
}
}
2 changes: 1 addition & 1 deletion oci/mock-rock/image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ upload:
directory: examples/mock-rock/1.0
release:
1.0-22.04:
end-of-life: "2025-05-01T00:00:00Z"
end-of-life: "2024-05-01T00:00:00Z"
risks:
- candidate
- edge
Expand Down
7 changes: 7 additions & 0 deletions src/docs/generate_oci_doc_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import subprocess
import sys
import tempfile
import timezone
from typing import Any, Dict, List
from datetime import datetime
from dateutil import parser

import boto3
Expand Down Expand Up @@ -269,6 +271,11 @@ def build_releases_data(
"until": eol.strftime("%m/%Y")
}

if eol > datetime.now(timezone.utc):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

release_data["deprecated"] = {
"date": eol.strftime("%m/%Y")
}

releases.append(release_data)

return releases
Expand Down
23 changes: 18 additions & 5 deletions src/image/prepare_single_image_build_matrix.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python3

import argparse
from datetime import datetime, timezone
import glob
import json
import os
Expand Down Expand Up @@ -53,8 +54,10 @@ def validate_image_trigger(data: dict) -> None:
builds = image_trigger.get("upload", [])

release_to = "true" if "release" in image_trigger else ""

img_number = 0
# inject some extra metadata into the matrix data
for img_number, _ in enumerate(builds):
while img_number < len(builds):
builds[img_number]["name"] = args.oci_path.rstrip("/").split("/")[-1]
builds[img_number]["path"] = args.oci_path
# make sure every build of this image has a unique identifier
Expand All @@ -69,13 +72,23 @@ def validate_image_trigger(data: dict) -> None:

# set an output as a marker for later knowing if we need to release
if "release" in builds[img_number]:
release_to = "true"
# the workflow GH matrix has a problem parsing nested JSON dicts
# so let's remove this field since we don't need it for the builds
builds[img_number]["release"] = "true"
min_eol = datetime.strptime(min(
v["end-of-life"] for v in builds[img_number]["release"].values()
), "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc)
if min_eol < datetime.now(timezone.utc):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI these dates are ISO formatted, so you should be able to compare them as strings

print("Track skipped because it reached its end of life")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this too late? I.e. the name and path are set before this, which means that even if there's no release, the image will still be built and tested right? But do we want that?

del builds[img_number]
continue
else:
release_to = "true"
# the workflow GH matrix has a problem parsing nested JSON dicts
# so let's remove this field since we don't need it for the builds
builds[img_number]["release"] = "true"
else:
builds[img_number]["release"] = ""

img_number += 1

matrix = {"include": builds}
print(f"{args.oci_path} - build matrix:\n{json.dumps(matrix, indent=4)}")
with open(os.environ["GITHUB_OUTPUT"], "a") as gh_out:
Expand Down
18 changes: 2 additions & 16 deletions src/image/utils/schema/triggers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pydantic

from datetime import datetime, timezone
from datetime import datetime
from typing import Dict, List, Literal, Optional


Expand All @@ -25,13 +25,6 @@ class ImageUploadReleaseSchema(pydantic.BaseModel):
class Config:
extra = pydantic.Extra.forbid

@pydantic.validator("end_of_life")
def ensure_still_supported(cls, v: datetime) -> datetime:
"""ensure that the end of life isn't reached."""
if v < datetime.now(timezone.utc):
raise ImageReachedEol("This track has reached its end of life")
return v


class ImageUploadSchema(pydantic.BaseModel):
"""Schema of each upload within the image.yaml files."""
Expand All @@ -58,21 +51,14 @@ class Config:
extra = pydantic.Extra.forbid

@pydantic.validator("stable", "candidate", "beta", "edge", pre=True)
def _check_risks(cls, values: List) -> str:
def _check_risks(cls, values: List) -> List:
"""There must be at least one risk specified."""
error = "At least one risk must be specified per track."
if not any(values):
raise ImageTriggerValidationError(error)

return values

@pydantic.validator("end_of_life")
def ensure_still_supported(cls, v: datetime) -> datetime:
"""ensure that the end of life isn't reached."""
if v < datetime.now(timezone.utc):
raise ImageReachedEol("This track has reached its end of life")
return v


class ImageSchema(pydantic.BaseModel):
"""Validates the schema of the image.yaml files."""
Expand Down
Loading