Skip to content

Commit 68c8784

Browse files
committed
wip
1 parent c376102 commit 68c8784

File tree

4 files changed

+138
-117
lines changed

4 files changed

+138
-117
lines changed

.github/scripts/extract_opflex_metadata.py

Lines changed: 54 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ def load_releases(filepath):
2424
print(f"Error parsing YAML: {exc}")
2525
return {}
2626

27-
def save_releases(filepath, data):
28-
with open(filepath, "w") as file:
29-
yaml.dump(data, file, default_flow_style=False)
30-
3127
def get_base_image_digest(image_name):
3228
if image_name == "placeholder-image":
3329
return None
@@ -37,74 +33,70 @@ def get_base_image_digest(image_name):
3733
shell=True,
3834
text=True
3935
).strip()
40-
return result.replace("sha256:", "") if result else None
36+
return result.replace("sha256:", "")
4137
except subprocess.CalledProcessError as e:
4238
print(f"Error fetching digest for {image_name}: {e}")
4339
return None
4440

45-
def process_opflex_metadata(releases):
41+
def extract_opflex_metadata(releases):
4642
release_list = []
47-
updated = False
4843

4944
for release in releases.get("releases", []):
50-
if not release.get("released", False):
51-
for stream in release.get("release_streams", []):
52-
if stream.get("release_name", "").endswith(".z"):
53-
for image in stream.get("container_images", []):
54-
if image.get("name") == "opflex":
55-
# Ensure opflex-metadata exists
56-
if "opflex-metadata" not in image:
57-
print(f"Adding missing opflex-metadata for {release['release_tag']}")
58-
image["opflex-metadata"] = {
59-
"base-image": "placeholder-image",
60-
"base-image-sha": "unknown",
61-
"update_digest": "true"
62-
}
63-
updated = True
64-
65-
metadata = image["opflex-metadata"]
66-
base_image = metadata["base-image"]
67-
stored_digest = metadata["base-image-sha"]
68-
69-
if base_image == "placeholder-image":
70-
print(f"Skipping digest lookup for {release['release_tag']} (Base-Image is placeholder).")
71-
release_list.append({
72-
"release_tag": release["release_tag"],
73-
"base_tag": f"{release['release_tag']}-opflex-build-base",
74-
"base_image": base_image,
75-
"stored_digest": stored_digest,
76-
"latest_digest": "unknown",
77-
"update_digest": "true"
78-
})
79-
continue
80-
81-
latest_digest = get_base_image_digest(base_image)
82-
83-
if latest_digest and latest_digest != stored_digest:
84-
print(f"Digest changed for {release['release_tag']}: {stored_digest}{latest_digest}")
85-
metadata["base-image-sha"] = latest_digest
86-
updated = True
87-
release_list.append({
88-
"release_tag": release["release_tag"],
89-
"base_tag": f"{release['release_tag']}-opflex-build-base",
90-
"base_image": base_image,
91-
"stored_digest": stored_digest,
92-
"latest_digest": latest_digest,
93-
"update_digest": "false"
94-
})
95-
96-
return release_list, updated
45+
release_tag = release.get("release_tag", "")
46+
release_status = None
47+
z_stream = None
48+
49+
for stream in release.get("release_streams", []):
50+
release_name = stream.get("release_name", "")
51+
if ".rc" in release_name:
52+
continue
53+
if release_name == release_tag:
54+
release_status = stream.get("released", False)
55+
elif release_name.endswith(".z"):
56+
z_stream = stream
57+
58+
if z_stream:
59+
if release_status is False:
60+
print(f"Processing .z stream for {release_tag}")
61+
for image in z_stream.get("container_images", []):
62+
if image.get("name") == "opflex":
63+
base_image = image.get("opflex-metadata", {}).get("base-image", "placeholder-image")
64+
stored_digest = image.get("opflex-metadata", {}).get("base-image-sha", "unknown")
65+
66+
if base_image == "placeholder-image":
67+
print(f"Skipping digest lookup for {release_tag} (Base-Image is placeholder).")
68+
release_list.append({
69+
"release_tag": release_tag,
70+
"base_tag": f"{release_tag}-opflex-build-base",
71+
"base_image": base_image,
72+
"stored_digest": stored_digest,
73+
"latest_digest": "unknown",
74+
"update_digest": "true"
75+
})
76+
continue
77+
78+
print(f"digest lookup for {release_tag}, {base_image}")
79+
latest_digest = get_base_image_digest(base_image)
80+
if latest_digest and latest_digest != stored_digest:
81+
print(f"Digest changed for {release_tag}: {stored_digest}{latest_digest}")
82+
image["opflex-metadata"]["base-image-sha"] = latest_digest
83+
release_list.append({
84+
"release_tag": release_tag,
85+
"base_tag": f"{release_tag}-opflex-build-base",
86+
"base_image": base_image,
87+
"stored_digest": stored_digest,
88+
"latest_digest": latest_digest,
89+
"update_digest": "false"
90+
})
91+
else:
92+
print(f"Digest not changed for {release_tag}: stored:{stored_digest} :: latest:{latest_digest}")
93+
94+
return release_list
9795

9896
releases = load_releases(release_filepath)
99-
release_list, metadata_updated = process_opflex_metadata(releases)
100-
101-
# Save updated releases.yaml if changes were made
102-
if metadata_updated:
103-
save_releases(release_filepath, releases)
104-
print(f"Updated releases.yaml with new opflex metadata and digest information.")
97+
release_list = extract_opflex_metadata(releases)
10598

106-
# Save extracted metadata to JSON file
10799
with open(output_filepath, "w") as json_file:
108100
json.dump(release_list, json_file, indent=2)
109101

110-
print(f"Extracted opflex metadata saved to {output_filepath}")
102+
print(f"Extracted OpFlex metadata saved to {output_filepath}")
Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,46 @@
11
#!/bin/bash
22

3-
# Ensure an argument is provided
4-
if [ -z "$1" ]; then
5-
echo "Usage: $0 <metadata_json_file>"
3+
# Ensure two arguments are provided
4+
if [ -z "$1" ] || [ -z "$2" ]; then
5+
echo "Usage: $0 <metadata_json_file> <updated_metadata_json_file>"
66
exit 1
77
fi
88

99
METADATA_FILE=$1
10+
UPDATED_METADATA=$2
1011
CLONE_DIR="opflex"
11-
UPDATED_METADATA="updated_metadata.json"
1212

13-
# Check if the metadata file exists
1413
if [ ! -f "$METADATA_FILE" ]; then
1514
echo "Error: File $METADATA_FILE not found!"
1615
exit 1
1716
fi
1817

19-
# Ensure the OpFlex repository is available
2018
if [ ! -d "$CLONE_DIR" ]; then
2119
echo "Error: OpFlex repository not found! Ensure it is cloned in the workspace."
2220
exit 1
2321
fi
2422

25-
# Clear old metadata file
2623
jq -n '[]' > "$UPDATED_METADATA"
2724

2825
# Process metadata
2926
jq -c '.[]' "$METADATA_FILE" | while read -r item; do
3027
RELEASE_TAG=$(echo "$item" | jq -r '.release_tag')
3128
BASE_TAG=$(echo "$item" | jq -r '.base_tag')
3229
BASE_IMAGE=$(echo "$item" | jq -r '.base_image')
30+
LATEST_DIGEST=$(echo "$item" | jq -r '.latest_digest')
3331
UPDATE_DIGEST=$(echo "$item" | jq -r '.update_digest')
3432

3533
if [ -z "$BASE_TAG" ]; then
3634
echo "Base tag is empty for $RELEASE_TAG. Skipping..."
3735
continue
3836
fi
3937

40-
# Move to OpFlex repo
4138
cd "$CLONE_DIR" || exit 1
42-
git checkout master
43-
git pull origin master
44-
45-
# Skip updating if the branch doesn't exist
46-
if git show-ref --verify --quiet "refs/heads/$BASE_TAG"; then
47-
git checkout "$BASE_TAG"
39+
git fetch --tags
40+
if git rev-parse "refs/tags/$BASE_TAG" >/dev/null 2>&1; then
41+
git checkout "tags/$BASE_TAG"
4842
else
49-
echo "Branch $BASE_TAG does not exist. Skipping update for $RELEASE_TAG."
43+
echo "Tag $BASE_TAG does not exist. Skipping update for $RELEASE_TAG."
5044
cd .. || exit 1
5145
continue
5246
fi
@@ -63,7 +57,6 @@ jq -c '.[]' "$METADATA_FILE" | while read -r item; do
6357

6458
echo "Base image for $RELEASE_TAG resolved to: $BASE_IMAGE"
6559

66-
# Fetch digest of resolved base image
6760
LATEST_DIGEST=$(skopeo inspect --no-creds "docker://$BASE_IMAGE" | jq -r '.Digest' | sed 's/sha256://')
6861

6962
if [ -z "$LATEST_DIGEST" ]; then
@@ -73,29 +66,27 @@ jq -c '.[]' "$METADATA_FILE" | while read -r item; do
7366
fi
7467

7568
echo "Resolved digest for $RELEASE_TAG: $LATEST_DIGEST"
76-
77-
# Append updated metadata safely
78-
tmp_file=$(mktemp)
79-
jq --arg release_tag "$RELEASE_TAG" \
80-
--arg base_tag "$BASE_TAG" \
81-
--arg base_image "$BASE_IMAGE" \
82-
--arg latest_digest "$LATEST_DIGEST" \
83-
'. + [{"release_tag": $release_tag, "base_tag": $base_tag, "base_image": $base_image, "latest_digest": $latest_digest, "update_digest": "true"}]' \
84-
"$UPDATED_METADATA" > "$tmp_file" && mv "$tmp_file" "$UPDATED_METADATA"
8569
fi
8670

87-
# Set up git user & ensure remote exists
71+
tmp_file=$(mktemp)
72+
jq --arg release_tag "$RELEASE_TAG" \
73+
--arg base_image "$BASE_IMAGE" \
74+
--arg latest_digest "$LATEST_DIGEST" \
75+
'. + [{"release_tag": $release_tag, "base_image": $base_image, "latest_digest": $latest_digest, "update_digest": "true"}]' \
76+
"$UPDATED_METADATA" > "$tmp_file" && mv "$tmp_file" "$UPDATED_METADATA"
77+
8878
git config --local user.name "noiro-generic"
8979
git config --local user.email "[email protected]"
9080

9181
if ! git remote | grep -q noiro-generic; then
92-
git remote add noiro-generic https://noiro-generic:${{ secrets.NOIRO101_GENERIC_PAT }}@github.com/noironetworks/opflex.git
82+
git remote add noiro-generic https://noiro-generic:[email protected]/noironetworks/opflex.git
83+
#git remote add noiro-generic https://noiro-generic:${{ secrets.NOIRO101_GENERIC_PAT }}@github.com/noironetworks/opflex.git
9384
fi
9485

95-
TAG_MESSAGE="ACI Release $BASE_TAG Created by Github workflow ${{ github.workflow }} ${{ github.server_url }}/noironetworks/opflex/actions/runs/${{ github.run_id }}"
96-
97-
git tag -f -a "$BASE_TAG" -m "$TAG_MESSAGE"
98-
git push noiro-generic -f "$BASE_TAG"
86+
TAG_MESSAGE="ACI Release $BASE_TAG Created by Github workflow ${GITHUB_WORKFLOW} ${GITHUB_SERVER_URL}/noironetworks/opflex/actions/runs/${GITHUB_RUN_ID}"
87+
echo "$BASE_TAG: $TAG_MESSAGE"
88+
# git tag -f -a "$BASE_TAG" -m "$TAG_MESSAGE"
89+
# git push noiro-generic -f "$BASE_TAG"
9990

10091
cd .. || exit 1
10192
done

.github/scripts/update_releases.py

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import json
55

66
if len(sys.argv) < 3:
7-
print("Usage: python update_releases_yaml.py <metadata_file> <releases_file>")
7+
print("Usage: python update_releases_yaml.py <updated_metadata_file> <releases_file>")
88
sys.exit(1)
99

10-
metadata_file = sys.argv[1]
10+
updated_metadata_file = sys.argv[1]
1111
releases_file = sys.argv[2]
1212

1313
def load_json(filepath):
@@ -38,35 +38,55 @@ def save_yaml(filepath, data):
3838
with open(filepath, "w") as file:
3939
yaml.dump(data, file, default_flow_style=False)
4040

41-
def update_releases(releases, metadata):
41+
def update_releases(releases, updated_metadata):
4242
updated = False
43-
release_map = {item["release_tag"]: item for item in metadata}
43+
release_map = {item["release_tag"]: item for item in updated_metadata}
4444

4545
for release in releases.get("releases", []):
46-
release_tag = release.get("release_tag")
47-
if release_tag in release_map:
48-
opflex_metadata = release_map[release_tag]
49-
for stream in release.get("release_streams", []):
50-
if stream.get("release_name", "").endswith(".z"):
51-
for image in stream.get("container_images", []):
52-
if image.get("name") == "opflex":
53-
print(f"Updating opflex-metadata for {release_tag}")
46+
release_tag = release.get("release_tag", "")
47+
release_status = None
48+
z_stream = None
49+
50+
for stream in release.get("release_streams", []):
51+
release_name = stream.get("release_name", "")
52+
if ".rc" in release_name:
53+
continue
54+
if release_name == release_tag:
55+
release_status = stream.get("released", False)
56+
elif release_name.endswith(".z"):
57+
z_stream = stream
58+
59+
if z_stream:
60+
if release_status is False and release_tag in release_map:
61+
print(f"Updating .z stream metadata for {release_tag}")
62+
63+
for image in z_stream.get("container_images", []):
64+
if image.get("name") == "opflex":
65+
opflex_metadata = release_map[release_tag]
66+
67+
if "opflex-metadata" not in image:
68+
print(f"'opflex-metadata' missing for {release_tag}, initializing...")
69+
image["opflex-metadata"] = {
70+
"base-image": opflex_metadata["base_image"],
71+
"base-image-sha": opflex_metadata["latest_digest"]
72+
}
73+
else:
74+
print(f"Updating existing OpFlex metadata for {release_tag}")
5475
image["opflex-metadata"]["base-image"] = opflex_metadata["base_image"]
5576
image["opflex-metadata"]["base-image-sha"] = opflex_metadata["latest_digest"]
56-
updated = True
57-
break
77+
78+
updated = True
79+
5880
return updated
5981

60-
# Load metadata and releases.yaml
61-
metadata = load_json(metadata_file)
82+
updated_metadata = load_json(updated_metadata_file)
6283
releases = load_yaml(releases_file)
6384

64-
if not metadata or not releases:
85+
if not updated_metadata or not releases:
6586
print("No valid data to update. Exiting.")
6687
sys.exit(1)
6788

68-
# Update releases.yaml with new metadata
69-
if update_releases(releases, metadata):
89+
if update_releases(releases, updated_metadata):
7090
save_yaml(releases_file, releases)
7191
print(f"Updated releases.yaml with new OpFlex metadata.")
7292
else:

.github/workflows/push-opflex-base-tag.yml

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ jobs:
1212
env:
1313
CICD_REPO: "noironetworks/test-cicd-status"
1414
OPFLEX_REPO: "noironetworks/opflex"
15-
CICD_DIR: "test-cicd-status" # Local directory name for cloned repo
16-
OPFLEX_DIR: "opflex" # Local directory name for cloned repo
17-
WORKSPACE_DIR: "workspace"
15+
CICD_DIR: ${{ github.workspace }}/test-cicd-status
16+
OPFLEX_DIR: ${{ github.workspace }}/opflex
17+
WORKSPACE_DIR: ${{ github.workspace }}/workspace
1818

1919
steps:
2020
- name: Checkout Main Repository
@@ -48,19 +48,37 @@ jobs:
4848
- name: Extract current tags opflex metadata
4949
run: python .github/scripts/extract_opflex_metadata.py ${{ env.CICD_DIR }} ${{ env.WORKSPACE_DIR }}/opflex_metadata.json
5050

51+
- name: Print Metadata File
52+
run: |
53+
echo "Printing opflex_metadata.json:"
54+
cat "${{ env.WORKSPACE_DIR }}/opflex_metadata.json" || echo "ERR: Unable to read $METADATA_FILE"
55+
5156
- name: Push subsequent tags (only if digest changed)
52-
run: bash .github/scripts/push_opflex_tags.sh ${{ env.WORKSPACE_DIR }}/opflex_metadata.json
57+
run: bash .github/scripts/push_opflex_tags.sh ${{ env.WORKSPACE_DIR }}/opflex_metadata.json ${{ env.WORKSPACE_DIR }}/updated_metadata.json
58+
59+
- name: Print Updated Metadata File
60+
run: |
61+
echo "Printing updated_metadata.json:"
62+
cat "${{ env.WORKSPACE_DIR }}/updated_metadata.json" || echo "ERR: Unable to read $METADATA_FILE"
5363
5464
- name: Update releases.yaml with new OpFlex metadata
5565
run: python .github/scripts/update_releases.py ${{ env.WORKSPACE_DIR }}/updated_metadata.json ${{ env.CICD_DIR }}/docs/release_artifacts/releases.yaml
5666

5767
- name: Commit and Push Updated releases.yaml
5868
run: |
5969
cd ${{ env.CICD_DIR }}
70+
git config --local user.name "noiro-generic"
71+
git config --local user.email "[email protected]"
72+
6073
if git diff --quiet docs/release_artifacts/releases.yaml; then
6174
echo "No changes in releases.yaml. Skipping commit."
6275
else
76+
echo "Changes detected in releases.yaml. Committing..."
77+
6378
git add docs/release_artifacts/releases.yaml
64-
git commit -m "Update stored digests in releases.yaml"
79+
git commit -m "Update stored digests for opflex base image in releases.yaml"
80+
git remote set-url origin https://noiro-generic:[email protected]/noironetworks/test-cicd-status.git
81+
# git remote set-url origin https://noiro-generic:${{ secrets.NOIRO101_GENERIC_PAT }}@github.com/noironetworks/test-cicd-status.git
6582
git push origin main
6683
fi
84+

0 commit comments

Comments
 (0)