From ce0b9def7dee9a3754ad6ad307bbdd0885d1cea8 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Tue, 2 Dec 2025 15:45:44 +0100 Subject: [PATCH 01/13] Add information about latest OM and agent in release.json --- release.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/release.json b/release.json index c864802e8..e5f526216 100644 --- a/release.json +++ b/release.json @@ -37,6 +37,26 @@ } ], "supportedImages": { + "latestOpsManagerAgentMapping": [ + { + "6": { + "opsManagerVersion": "6.0.27", + "agentVersion": "12.0.35.7911-1" + } + }, + { + "7": { + "opsManagerVersion": "7.0.19", + "agentVersion": "107.0.19.8805-1" + } + }, + { + "8": { + "opsManagerVersion": "8.0.16", + "agentVersion": "108.0.16.8895-1" + } + } + ], "ops-manager": { "ssdlc_name": "MongoDB Controllers for Kubernetes Enterprise Ops Manager", "versions": [ From 2fe85da14aa3c0a66ef6cc3065493ca51abae34d Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Wed, 3 Dec 2025 12:51:41 +0100 Subject: [PATCH 02/13] Address review comments 1. Move mapping field in json to root level 2. Change log lever for logs --- release.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/release.json b/release.json index e5f526216..592e0acc8 100644 --- a/release.json +++ b/release.json @@ -56,7 +56,21 @@ "agentVersion": "108.0.16.8895-1" } } - ], + }, + { + "7": { + "opsManagerVersion": "7.0.19", + "agentVersion": "107.0.19.8805-1" + } + }, + { + "8": { + "opsManagerVersion": "8.0.16", + "agentVersion": "108.0.16.8895-1" + } + } + ], + "supportedImages": { "ops-manager": { "ssdlc_name": "MongoDB Controllers for Kubernetes Enterprise Ops Manager", "versions": [ From b9bf260cb42437f0f7646d8c0592a160b916dd9d Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Tue, 2 Dec 2025 23:10:38 +0100 Subject: [PATCH 03/13] Add functinality to upload release info to GitHub release assets --- .evergreen-functions.yml | 12 ++++ .evergreen-release.yml | 18 ++++++ scripts/release/release_info.py | 105 +++++++++++++++++++++----------- 3 files changed, 99 insertions(+), 36 deletions(-) diff --git a/.evergreen-functions.yml b/.evergreen-functions.yml index b56dd947a..01c19eab5 100644 --- a/.evergreen-functions.yml +++ b/.evergreen-functions.yml @@ -778,6 +778,18 @@ functions: GH_TOKEN: ${GH_TOKEN} binary: scripts/dev/run_python.sh scripts/release/create_chart_release_pr.py --chart_version ${OPERATOR_VERSION|*triggered_by_git_tag} + add_releaseinfo_to_github_assets: + - command: github.generate_token + params: + expansion_name: GH_TOKEN + - command: subprocess.exec + type: setup + params: + working_dir: src/github.com/mongodb/mongodb-kubernetes + env: + GH_TOKEN: ${GH_TOKEN} + binary: scripts/dev/run_python.sh scripts/release/release_info.py --version 1.0.1 + release_kubectl_mongodb_plugin: - command: github.generate_token params: diff --git a/.evergreen-release.yml b/.evergreen-release.yml index e86cdda13..034a6c30a 100644 --- a/.evergreen-release.yml +++ b/.evergreen-release.yml @@ -115,6 +115,12 @@ tasks: - func: install_macos_notarization_service - func: release_kubectl_mongodb_plugin + - name: add_releaseinfo_to_github_assets + commands: + - func: clone + - func: python_venv + - func: add_releaseinfo_to_github_assets + - name: create_chart_release_pr tags: [ "helm_chart_release_pr" ] commands: @@ -151,6 +157,18 @@ buildvariants: - name: release_readiness_probe - name: release_version_upgrade_hook + - name: add_releaseinfo_to_github_assets + display_name: add_releaseinfo_to_github_assets + tags: ["release"] + run_on: + - ubuntu2404-small + allowed_requesters: ["patch", "github_tag"] + # depends_on: + # - name: "*" + # variant: release_images + tasks: + - name: add_releaseinfo_to_github_assets + - name: preflight_release_images display_name: preflight_release_images tags: [ "release" ] diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index f16f34923..0dc2b34a3 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -1,6 +1,6 @@ import argparse import json -import pathlib +import os from scripts.release.build.build_info import ( DATABASE_IMAGE, @@ -10,9 +10,12 @@ OPERATOR_IMAGE, READINESS_PROBE_IMAGE, UPGRADE_HOOK_IMAGE, + OPS_MANAGER_IMAGE, + AGENT_IMAGE, BuildInfo, load_build_info, ) +from scripts.release.kubectl_mongodb.promote_kubectl_plugin import upload_assets_to_github_release from scripts.release.build.build_scenario import BuildScenario from scripts.release.constants import ( DEFAULT_CHANGELOG_PATH, @@ -20,71 +23,101 @@ DEFAULT_REPOSITORY_PATH, ) +SEARCH_IMAGE = "search" +SEARCH_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-search" + RELEASE_INFO_IMAGES_ORDERED = [ - OPERATOR_IMAGE, - INIT_DATABASE_IMAGE, - INIT_APPDB_IMAGE, - INIT_OPS_MANAGER_IMAGE, - DATABASE_IMAGE, - READINESS_PROBE_IMAGE, - UPGRADE_HOOK_IMAGE, + OPERATOR_IMAGE, # mongodb-kubernetes + INIT_DATABASE_IMAGE, # mongodb-kubernetes-init-database + INIT_APPDB_IMAGE, # mongodb-kubernetes-init-appdb + INIT_OPS_MANAGER_IMAGE, # mongodb-kubernetes-init-ops-manager + DATABASE_IMAGE, # mongodb-kubernetes-database + READINESS_PROBE_IMAGE, # mongodb-kubernetes-readinessprobe + UPGRADE_HOOK_IMAGE, # mongodb-kubernetes-operator-version-upgrade-post-start-hook ] -# TODO: this is dummy version, to be replaced with actual versioning logic https://docs.google.com/document/d/1eJ8iKsI0libbpcJakGjxcPfbrTn8lmcZDbQH1UqMR_g/edit?tab=t.45ig7xr3e3w4#bookmark=id.748ik8snxcyl -DUMMY_VERSION = "dummy_version" - +EXTERNAL_INFO_IMAGES = [ + OPS_MANAGER_IMAGE, + AGENT_IMAGE +] -def create_release_info_json() -> str: +def create_release_info_json(version: str) -> str: build_info = load_build_info(scenario=BuildScenario.RELEASE) - release_info_json = convert_to_release_info_json(build_info) + release_info_json = convert_to_release_info_json(build_info, version) return json.dumps(release_info_json, indent=2) -def convert_to_release_info_json(build_info: BuildInfo) -> dict: - output = { +def convert_to_release_info_json(build_info: BuildInfo, version: str) -> dict: + release_json_data = os.path.join(os.getcwd(), "release.json") + with open(release_json_data, "r") as fd: + release_data = json.load(fd) + + release_info_output = { "images": {}, - "binaries": {}, - "helm-charts": {}, } # Filter (and order) images to include only those relevant for release info - images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED} + images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED + EXTERNAL_INFO_IMAGES} for name, image in images.items(): - output["images"][name] = { + release_info_output["images"][name] = { "repositories": image.repositories, "platforms": image.platforms, - "version": DUMMY_VERSION, } + + if name == OPS_MANAGER_IMAGE: + release_info_output["images"][name]["version"] = latest_om_version(release_data) + continue - for name, binary in build_info.binaries.items(): - output["binaries"][name] = { - "platforms": binary.platforms, - "version": DUMMY_VERSION, - } + if name == AGENT_IMAGE: + release_info_output["images"][name]["version"] = latest_agent_version(release_data) + continue - for name, chart in build_info.helm_charts.items(): - output["helm-charts"][name] = { - "registry": chart.registry, - "repository": chart.repository, - "version": DUMMY_VERSION, - } + release_info_output["images"][name]["version"] = version + + # add search image detail + release_info_output["images"][SEARCH_IMAGE] = { + "repositories": SEARCH_IMAGE_REPOSITORY, + "platforms": ["linux/arm64", "linux/amd64"], + "version": latest_search_version(release_data) + } + + release_info_output = add_om_agent_mappings(release_data, release_info_output) + + return release_info_output + +def add_om_agent_mappings(release_data, output): + om_agent_mapping = release_data["supportedImages"]["latestOpsManagerAgentMapping"] + output["latestOpsManagerAgentMapping"] = om_agent_mapping return output +def latest_om_version(release_data): + return release_data["supportedImages"]["ops-manager"]["versions"][-1] + +def latest_agent_version(release_data): + newest_om_version = release_data["supportedImages"]["ops-manager"]["versions"][-1] + newest_om_mapping = release_data["supportedImages"]["mongodb-agent"]["opsManagerMapping"]["ops_manager"][newest_om_version] + return newest_om_mapping["agent_version"] + +def latest_search_version(release_data): + return release_data["search"]["version"] if __name__ == "__main__": parser = argparse.ArgumentParser( description="Create relevant release artifacts information in JSON format.", formatter_class=argparse.RawTextHelpFormatter, ) + parser.add_argument("--version", help="released MCK version", required=True) args = parser.parse_args() - release_info = create_release_info_json() + release_info_filename = f"release_info_{args.version}.json" - if args.output is not None: - with open(args.output, "w") as file: + release_info = create_release_info_json(args.version) + + if release_info_filename is not None: + with open(release_info_filename, "w") as file: file.write(release_info) - else: - print(release_info) + + upload_assets_to_github_release([release_info_filename], args.version) From fcf77cccc1b85de0c028d44f409558cf5c4b1317 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Wed, 3 Dec 2025 12:59:52 +0100 Subject: [PATCH 04/13] Accommodate the change of moving latestOpsManagerAgentMapping to root level --- scripts/release/release_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 0dc2b34a3..8b0af4bcb 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -88,7 +88,7 @@ def convert_to_release_info_json(build_info: BuildInfo, version: str) -> dict: return release_info_output def add_om_agent_mappings(release_data, output): - om_agent_mapping = release_data["supportedImages"]["latestOpsManagerAgentMapping"] + om_agent_mapping = release_data["latestOpsManagerAgentMapping"] output["latestOpsManagerAgentMapping"] = om_agent_mapping return output From 2b5e01a1e78f076a32565f09dfa0f40859fe3c65 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Wed, 3 Dec 2025 14:24:30 +0100 Subject: [PATCH 05/13] Address review comments, refactor --- .evergreen-functions.yml | 4 +- .../kubectl_mongodb/promote_kubectl_plugin.py | 50 +------- scripts/release/kubectl_mongodb/utils.py | 50 ++++++++ scripts/release/release_info.py | 114 +++++++++++------- 4 files changed, 124 insertions(+), 94 deletions(-) diff --git a/.evergreen-functions.yml b/.evergreen-functions.yml index 01c19eab5..3f87f9d1f 100644 --- a/.evergreen-functions.yml +++ b/.evergreen-functions.yml @@ -786,9 +786,11 @@ functions: type: setup params: working_dir: src/github.com/mongodb/mongodb-kubernetes + include_expansions_in_env: + - OPERATOR_VERSION env: GH_TOKEN: ${GH_TOKEN} - binary: scripts/dev/run_python.sh scripts/release/release_info.py --version 1.0.1 + binary: scripts/dev/run_python.sh scripts/release/release_info.py --version ${OPERATOR_VERSION|*triggered_by_git_tag} release_kubectl_mongodb_plugin: - command: github.generate_token diff --git a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py index fad344381..470a8aaa1 100644 --- a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py +++ b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py @@ -6,7 +6,6 @@ from pathlib import Path from botocore.exceptions import ClientError -from github import Github, GithubException from lib.base_logger import logger from scripts.release.build.build_info import ( @@ -19,16 +18,14 @@ ) from scripts.release.kubectl_mongodb.utils import ( CHECKSUMS_PATH, - GITHUB_REPO, LOCAL_ARTIFACTS_DIR, create_s3_client, kubectl_plugin_name, parse_platform, s3_path, + upload_assets_to_github_release, ) -GITHUB_TOKEN = os.environ.get("GH_TOKEN") - def main(): release_version = os.environ.get("OPERATOR_VERSION") @@ -269,50 +266,5 @@ def create_tarballs(): return created_archives - -# upload_assets_to_github_release uploads the release artifacts (downloaded notarized/signed staging artifacts) to -# the GitHub release as assets. -def upload_assets_to_github_release(asset_paths: list[str], release_version: str): - if not GITHUB_TOKEN: - logger.info("ERROR: GITHUB_TOKEN environment variable not set.") - sys.exit(1) - - try: - g = Github(GITHUB_TOKEN) - repo = g.get_repo(GITHUB_REPO) - except GithubException as e: - logger.info(f"ERROR: Could not connect to GitHub or find repository '{GITHUB_REPO}', Error {e}.") - sys.exit(1) - - try: - gh_release = None - # list all the releases (including draft ones), and get the one corresponding to the passed release_version - for r in repo.get_releases(): - if r.tag_name == release_version: - gh_release = r - break - - if gh_release is None: - logger.error( - f"Could not find release (published or draft) with tag '{release_version}'. Please ensure the release exists." - ) - sys.exit(2) - except GithubException as e: - logger.debug(f"Failed to retrieve releases from the repository {GITHUB_REPO}. Error: {e}") - sys.exit(2) - - for asset_path in asset_paths: - asset_name = os.path.basename(asset_path) - logger.info(f"Uploading artifact '{asset_name}' to github release as asset") - try: - gh_release.upload_asset(path=asset_path, name=asset_name, content_type="application/gzip") - except GithubException as e: - logger.debug(f"ERROR: Failed to upload asset {asset_name}. Error: {e}") - sys.exit(2) - except Exception as e: - logger.debug(f"An unexpected error occurred during upload of {asset_name}: {e}") - sys.exit(2) - - if __name__ == "__main__": main() diff --git a/scripts/release/kubectl_mongodb/utils.py b/scripts/release/kubectl_mongodb/utils.py index 26d972bbc..12aae5e1a 100644 --- a/scripts/release/kubectl_mongodb/utils.py +++ b/scripts/release/kubectl_mongodb/utils.py @@ -1,11 +1,17 @@ +import os +import sys + import boto3 from botocore.exceptions import NoCredentialsError, PartialCredentialsError +from github import Github, GithubException +from lib.base_logger import logger from scripts.release.build.build_info import KUBECTL_PLUGIN_BINARY AWS_REGION = "eu-north-1" GITHUB_REPO = "mongodb/mongodb-kubernetes" +GITHUB_TOKEN = os.environ.get("GH_TOKEN") LOCAL_ARTIFACTS_DIR = "artifacts" CHECKSUMS_PATH = f"{LOCAL_ARTIFACTS_DIR}/checksums.txt" @@ -34,3 +40,47 @@ def kubectl_plugin_name(os_name: str, arch_name: str) -> str: # The `version` string has the correct version (either patch id or commit sha), based on the BuildScenario. def s3_path(filename: str, version: str) -> str: return f"{KUBECTL_PLUGIN_BINARY}/{version}/{filename}" + + +# upload_assets_to_github_release uploads the release artifacts (downloaded notarized/signed staging artifacts) to +# the GitHub release as assets. +def upload_assets_to_github_release(asset_paths: list[str], release_version: str): + if not GITHUB_TOKEN: + logger.info("ERROR: GITHUB_TOKEN environment variable not set.") + sys.exit(1) + + try: + g = Github(GITHUB_TOKEN) + repo = g.get_repo(GITHUB_REPO) + except GithubException as e: + logger.info(f"ERROR: Could not connect to GitHub or find repository '{GITHUB_REPO}', Error {e}.") + sys.exit(1) + + try: + gh_release = None + # list all the releases (including draft ones), and get the one corresponding to the passed release_version + for r in repo.get_releases(): + if r.tag_name == release_version: + gh_release = r + break + + if gh_release is None: + logger.error( + f"Could not find release (published or draft) with tag '{release_version}'. Please ensure the release exists." + ) + sys.exit(2) + except GithubException as e: + logger.debug(f"Failed to retrieve releases from the repository {GITHUB_REPO}. Error: {e}") + sys.exit(2) + + for asset_path in asset_paths: + asset_name = os.path.basename(asset_path) + logger.info(f"Uploading artifact '{asset_name}' to github release as asset") + try: + gh_release.upload_asset(path=asset_path, name=asset_name, content_type="application/gzip") + except GithubException as e: + logger.debug(f"ERROR: Failed to upload asset {asset_name}. Error: {e}") + sys.exit(2) + except Exception as e: + logger.debug(f"An unexpected error occurred during upload of {asset_name}: {e}") + sys.exit(2) diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 8b0af4bcb..9a4bb2812 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -3,53 +3,45 @@ import os from scripts.release.build.build_info import ( + AGENT_IMAGE, DATABASE_IMAGE, INIT_APPDB_IMAGE, INIT_DATABASE_IMAGE, INIT_OPS_MANAGER_IMAGE, OPERATOR_IMAGE, + OPS_MANAGER_IMAGE, READINESS_PROBE_IMAGE, UPGRADE_HOOK_IMAGE, - OPS_MANAGER_IMAGE, - AGENT_IMAGE, BuildInfo, load_build_info, ) -from scripts.release.kubectl_mongodb.promote_kubectl_plugin import upload_assets_to_github_release from scripts.release.build.build_scenario import BuildScenario -from scripts.release.constants import ( - DEFAULT_CHANGELOG_PATH, - DEFAULT_RELEASE_INITIAL_VERSION, - DEFAULT_REPOSITORY_PATH, +from scripts.release.kubectl_mongodb.utils import ( + upload_assets_to_github_release, ) SEARCH_IMAGE = "search" SEARCH_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-search" RELEASE_INFO_IMAGES_ORDERED = [ - OPERATOR_IMAGE, # mongodb-kubernetes - INIT_DATABASE_IMAGE, # mongodb-kubernetes-init-database - INIT_APPDB_IMAGE, # mongodb-kubernetes-init-appdb - INIT_OPS_MANAGER_IMAGE, # mongodb-kubernetes-init-ops-manager - DATABASE_IMAGE, # mongodb-kubernetes-database - READINESS_PROBE_IMAGE, # mongodb-kubernetes-readinessprobe - UPGRADE_HOOK_IMAGE, # mongodb-kubernetes-operator-version-upgrade-post-start-hook + OPERATOR_IMAGE, # mongodb-kubernetes + INIT_DATABASE_IMAGE, # mongodb-kubernetes-init-database + INIT_APPDB_IMAGE, # mongodb-kubernetes-init-appdb + INIT_OPS_MANAGER_IMAGE, # mongodb-kubernetes-init-ops-manager + DATABASE_IMAGE, # mongodb-kubernetes-database + READINESS_PROBE_IMAGE, # mongodb-kubernetes-readinessprobe ] -EXTERNAL_INFO_IMAGES = [ - OPS_MANAGER_IMAGE, - AGENT_IMAGE -] -def create_release_info_json(version: str) -> str: +def create_release_info_json(operator_version: str) -> str: build_info = load_build_info(scenario=BuildScenario.RELEASE) - release_info_json = convert_to_release_info_json(build_info, version) + release_info_json = convert_to_release_info_json(build_info, operator_version) return json.dumps(release_info_json, indent=2) -def convert_to_release_info_json(build_info: BuildInfo, version: str) -> dict: +def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -> dict: release_json_data = os.path.join(os.getcwd(), "release.json") with open(release_json_data, "r") as fd: release_data = json.load(fd) @@ -58,52 +50,86 @@ def convert_to_release_info_json(build_info: BuildInfo, version: str) -> dict: "images": {}, } # Filter (and order) images to include only those relevant for release info - images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED + EXTERNAL_INFO_IMAGES} + images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED} for name, image in images.items(): - release_info_output["images"][name] = { - "repositories": image.repositories, - "platforms": image.platforms, - } - - if name == OPS_MANAGER_IMAGE: - release_info_output["images"][name]["version"] = latest_om_version(release_data) - continue - - if name == AGENT_IMAGE: - release_info_output["images"][name]["version"] = latest_agent_version(release_data) - continue - - release_info_output["images"][name]["version"] = version - - # add search image detail - release_info_output["images"][SEARCH_IMAGE] = { - "repositories": SEARCH_IMAGE_REPOSITORY, - "platforms": ["linux/arm64", "linux/amd64"], - "version": latest_search_version(release_data) - } + add_image_info(release_info_output, name, image.repositories, image.platforms, operator_version) + + # add OPS manager image info + om_build_info = build_info.images[OPS_MANAGER_IMAGE] + add_image_info( + release_info_output, + OPS_MANAGER_IMAGE, + om_build_info.repositories, + om_build_info.platforms, + latest_om_version(release_data), + ) + + # add agent image info + agent_build_info = build_info.images[AGENT_IMAGE] + add_image_info( + release_info_output, + AGENT_IMAGE, + agent_build_info.repositories, + agent_build_info.platforms, + latest_agent_version(release_data), + ) + + # add upgrade hook image info + upgradehook_build_info = build_info.images[UPGRADE_HOOK_IMAGE] + add_image_info( + release_info_output, + UPGRADE_HOOK_IMAGE, + upgradehook_build_info.repositories, + upgradehook_build_info.platforms, + latest_upgrade_hook_version(release_data), + ) + + # add search image info + add_image_info( + release_info_output, + SEARCH_IMAGE, + SEARCH_IMAGE_REPOSITORY, + ["linux/arm64", "linux/amd64"], + latest_search_version(release_data), + ) release_info_output = add_om_agent_mappings(release_data, release_info_output) return release_info_output + +def add_image_info(release_info_output, name, repositories, platforms, version): + release_info_output["images"][name] = {"repositories": repositories, "platforms": platforms, "version": version} + + def add_om_agent_mappings(release_data, output): om_agent_mapping = release_data["latestOpsManagerAgentMapping"] output["latestOpsManagerAgentMapping"] = om_agent_mapping return output + +def latest_upgrade_hook_version(relese_data): + return relese_data["versionUpgradeHookVersion"] + + def latest_om_version(release_data): return release_data["supportedImages"]["ops-manager"]["versions"][-1] + def latest_agent_version(release_data): newest_om_version = release_data["supportedImages"]["ops-manager"]["versions"][-1] - newest_om_mapping = release_data["supportedImages"]["mongodb-agent"]["opsManagerMapping"]["ops_manager"][newest_om_version] + newest_om_mapping = release_data["supportedImages"]["mongodb-agent"]["opsManagerMapping"]["ops_manager"][ + newest_om_version + ] return newest_om_mapping["agent_version"] + def latest_search_version(release_data): return release_data["search"]["version"] + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Create relevant release artifacts information in JSON format.", From 3de6fe24ef3049bd611430efc73cb6f8e5c0895b Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Wed, 3 Dec 2025 15:41:51 +0100 Subject: [PATCH 06/13] Add readiness probe as separate image --- .../kubectl_mongodb/promote_kubectl_plugin.py | 1 + scripts/release/release_info.py | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py index 470a8aaa1..7a7ecff75 100644 --- a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py +++ b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py @@ -266,5 +266,6 @@ def create_tarballs(): return created_archives + if __name__ == "__main__": main() diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 9a4bb2812..641b80f16 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -29,7 +29,6 @@ INIT_APPDB_IMAGE, # mongodb-kubernetes-init-appdb INIT_OPS_MANAGER_IMAGE, # mongodb-kubernetes-init-ops-manager DATABASE_IMAGE, # mongodb-kubernetes-database - READINESS_PROBE_IMAGE, # mongodb-kubernetes-readinessprobe ] @@ -85,6 +84,16 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - latest_upgrade_hook_version(release_data), ) + # add readiness image info + readiness_build_info = build_info.images[READINESS_PROBE_IMAGE] + add_image_info( + release_info_output, + READINESS_PROBE_IMAGE, + readiness_build_info.repositories, + readiness_build_info.platforms, + latest_readiness_version(release_data), + ) + # add search image info add_image_info( release_info_output, @@ -110,6 +119,10 @@ def add_om_agent_mappings(release_data, output): return output +def latest_readiness_version(release_data): + return release_data["readinessProbeVersion"] + + def latest_upgrade_hook_version(relese_data): return relese_data["versionUpgradeHookVersion"] From da1847d17a009c377eb75b206fe117ec77f7e198 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Thu, 4 Dec 2025 15:59:28 +0100 Subject: [PATCH 07/13] Change the format of the relese_info file --- scripts/release/build/image_build_process.py | 36 ++++++++++++++++++- scripts/release/release_info.py | 38 ++++++++++++++++---- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/scripts/release/build/image_build_process.py b/scripts/release/build/image_build_process.py index b2cb6e598..ec3d57b86 100644 --- a/scripts/release/build/image_build_process.py +++ b/scripts/release/build/image_build_process.py @@ -1,6 +1,6 @@ import base64 import subprocess -from typing import Dict +from typing import Dict, Optional import boto3 import docker @@ -22,6 +22,14 @@ def build_image(self, tags: list[str], args: Dict[str, str], platforms: list[str]): pass + # check_if_image_exists could easily be used to get the digest of manfiest list but + # the python package that we use somehow doesn't return the digest of manifest list + # even though the respective docker CLI returns the digest. That's why we had to introduce + # this function. + def get_manfiest_list_digest(self, image: str) -> Optional[str]: pass + + def pull_image(self, image: str): pass + DEFAULT_BUILDER_NAME = "multiarch" # Default buildx builder name @@ -109,6 +117,25 @@ def check_if_image_exists(self, image_tag: str) -> bool: else: return True + def pull_image(self, image): + docker_cmd = python_on_whales.docker + try: + docker_cmd.image.pull(image, quiet=True) + except Exception as e: + logger.error(f"Failed pulling image. {e}") + raise e + + def get_manfiest_list_digest(self, image) -> Optional[str]: + self.pull_image(image) + + docker_cmd = python_on_whales.docker + try: + manifest = docker_cmd.image.inspect(image) + return manifest.id + except Exception as e: + logger.error(f"Failed inspecting the image to get manifest list digest. {e}") + raise e + def build_image(self, tags: list[str], dockerfile: str, path: str, @@ -167,6 +194,13 @@ def check_if_image_exists(self, image_tag: str) -> bool: f"PodmanImageBuilder does not support checking if image exists remotely. Skipping check for {image_tag}.") return False + def get_manfiest_list_digest(self, image) -> Optional[str]: + logger.warning(f"PodmanImageBuilder does not support getting digest for manifest list, returning empty digest.") + return "" + + def pull_image(self, image: str): + logger.warning("PodmanImageBuilder does not support pulling image right now.") + def build_image(self, tags: list[str], dockerfile: str, path: str, diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 641b80f16..2a6613beb 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -2,6 +2,7 @@ import json import os +from lib.base_logger import logger from scripts.release.build.build_info import ( AGENT_IMAGE, DATABASE_IMAGE, @@ -16,12 +17,16 @@ load_build_info, ) from scripts.release.build.build_scenario import BuildScenario +from scripts.release.build.image_build_process import ( + DockerImageBuilder, +) from scripts.release.kubectl_mongodb.utils import ( upload_assets_to_github_release, ) SEARCH_IMAGE = "search" SEARCH_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-search" +AGENT_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-agent" RELEASE_INFO_IMAGES_ORDERED = [ OPERATOR_IMAGE, # mongodb-kubernetes @@ -52,14 +57,14 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED} for name, image in images.items(): - add_image_info(release_info_output, name, image.repositories, image.platforms, operator_version) + add_image_info(release_info_output, name, image.repositories[0], image.platforms, operator_version) # add OPS manager image info om_build_info = build_info.images[OPS_MANAGER_IMAGE] add_image_info( release_info_output, OPS_MANAGER_IMAGE, - om_build_info.repositories, + om_build_info.repositories[0], om_build_info.platforms, latest_om_version(release_data), ) @@ -69,7 +74,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - add_image_info( release_info_output, AGENT_IMAGE, - agent_build_info.repositories, + AGENT_IMAGE_REPOSITORY, agent_build_info.platforms, latest_agent_version(release_data), ) @@ -79,7 +84,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - add_image_info( release_info_output, UPGRADE_HOOK_IMAGE, - upgradehook_build_info.repositories, + upgradehook_build_info.repositories[0], upgradehook_build_info.platforms, latest_upgrade_hook_version(release_data), ) @@ -89,7 +94,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - add_image_info( release_info_output, READINESS_PROBE_IMAGE, - readiness_build_info.repositories, + readiness_build_info.repositories[0], readiness_build_info.platforms, latest_readiness_version(release_data), ) @@ -108,8 +113,14 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - return release_info_output -def add_image_info(release_info_output, name, repositories, platforms, version): - release_info_output["images"][name] = {"repositories": repositories, "platforms": platforms, "version": version} +def add_image_info(release_info_output, name, repository: str, platforms, version): + digest = manifest_list_digest_for_image(f"{repository}:{version}") + release_info_output["images"][name] = { + "repoURL": repository, + "platforms": platforms, + "tag": version, + "digest": digest, + } def add_om_agent_mappings(release_data, output): @@ -143,6 +154,19 @@ def latest_search_version(release_data): return release_data["search"]["version"] +# manifest_list_digest_for_image returns manifest list digest for the passed image. Returns +# empty string if there was an error figuring that out. +def manifest_list_digest_for_image(image: str) -> str: + builder = DockerImageBuilder() + try: + digest = builder.get_manfiest_list_digest(image) + except Exception as e: + logger.error(f"There was an error, figuring out manifest list digest for image {image}. Error: {e}") + return "" + + return digest + + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Create relevant release artifacts information in JSON format.", From 41d0ca821a5985408fe382124a05f2185a2fad56 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Thu, 4 Dec 2025 16:22:28 +0100 Subject: [PATCH 08/13] Add image mongodb-enterprise-server --- scripts/release/release_info.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 2a6613beb..fcb9da84f 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -26,8 +26,12 @@ SEARCH_IMAGE = "search" SEARCH_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-search" + AGENT_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-agent" +MONGODB_ENTERPRISE_SERVER_IMAGE = "mongodb-enterprise-server" +MONGODB_ENTERPRISE_SERVER_REPOSITORY = "quay.io/mongodb/mongodb-enterprise-server" + RELEASE_INFO_IMAGES_ORDERED = [ OPERATOR_IMAGE, # mongodb-kubernetes INIT_DATABASE_IMAGE, # mongodb-kubernetes-init-database @@ -108,6 +112,8 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - latest_search_version(release_data), ) + add_image_info(release_info_output, MONGODB_ENTERPRISE_SERVER_IMAGE, MONGODB_ENTERPRISE_SERVER_REPOSITORY, ["linux/arm64", "linux/amd64"], latest_enterprise_server_version(release_data)) + release_info_output = add_om_agent_mappings(release_data, release_info_output) return release_info_output @@ -129,6 +135,8 @@ def add_om_agent_mappings(release_data, output): return output +def latest_enterprise_server_version(release_data): + return release_data["supportedImages"]["mongodb-enterprise-server"]["versions"][-1] def latest_readiness_version(release_data): return release_data["readinessProbeVersion"] @@ -183,4 +191,4 @@ def manifest_list_digest_for_image(image: str) -> str: with open(release_info_filename, "w") as file: file.write(release_info) - upload_assets_to_github_release([release_info_filename], args.version) + # upload_assets_to_github_release([release_info_filename], args.version) From a97587242f9cf60ee73c308a9ba9fb4f2d2a2a82 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Thu, 4 Dec 2025 16:23:44 +0100 Subject: [PATCH 09/13] Run precommit --- scripts/release/release_info.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index fcb9da84f..9a24fdbec 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -112,7 +112,13 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) - latest_search_version(release_data), ) - add_image_info(release_info_output, MONGODB_ENTERPRISE_SERVER_IMAGE, MONGODB_ENTERPRISE_SERVER_REPOSITORY, ["linux/arm64", "linux/amd64"], latest_enterprise_server_version(release_data)) + add_image_info( + release_info_output, + MONGODB_ENTERPRISE_SERVER_IMAGE, + MONGODB_ENTERPRISE_SERVER_REPOSITORY, + ["linux/arm64", "linux/amd64"], + latest_enterprise_server_version(release_data), + ) release_info_output = add_om_agent_mappings(release_data, release_info_output) @@ -135,9 +141,11 @@ def add_om_agent_mappings(release_data, output): return output + def latest_enterprise_server_version(release_data): return release_data["supportedImages"]["mongodb-enterprise-server"]["versions"][-1] + def latest_readiness_version(release_data): return release_data["readinessProbeVersion"] From 63b6cd1d50c07b4693a7ee3ab9b340aa10d977a1 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Thu, 4 Dec 2025 16:28:21 +0100 Subject: [PATCH 10/13] Uncomment unnecessarily commented code --- scripts/release/release_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 9a24fdbec..2f065529c 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -199,4 +199,4 @@ def manifest_list_digest_for_image(image: str) -> str: with open(release_info_filename, "w") as file: file.write(release_info) - # upload_assets_to_github_release([release_info_filename], args.version) + upload_assets_to_github_release([release_info_filename], args.version) From a59ec39b9f3371a80678bbd35332c09f5e503ac8 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Fri, 5 Dec 2025 12:12:59 +0100 Subject: [PATCH 11/13] Handle exceptions properly --- scripts/release/build/image_build_process.py | 6 ++---- .../kubectl_mongodb/promote_kubectl_plugin.py | 5 ++++- scripts/release/kubectl_mongodb/utils.py | 18 ++++++------------ scripts/release/release_info.py | 6 ++++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/scripts/release/build/image_build_process.py b/scripts/release/build/image_build_process.py index ec3d57b86..0096bbcc9 100644 --- a/scripts/release/build/image_build_process.py +++ b/scripts/release/build/image_build_process.py @@ -122,8 +122,7 @@ def pull_image(self, image): try: docker_cmd.image.pull(image, quiet=True) except Exception as e: - logger.error(f"Failed pulling image. {e}") - raise e + raise Exception("Failed pulling image.") from e def get_manfiest_list_digest(self, image) -> Optional[str]: self.pull_image(image) @@ -133,8 +132,7 @@ def get_manfiest_list_digest(self, image) -> Optional[str]: manifest = docker_cmd.image.inspect(image) return manifest.id except Exception as e: - logger.error(f"Failed inspecting the image to get manifest list digest. {e}") - raise e + raise Exception("Failed inspecting the image to get manifest list digest") from e def build_image(self, tags: list[str], dockerfile: str, diff --git a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py index 7a7ecff75..d86203662 100644 --- a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py +++ b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py @@ -62,7 +62,10 @@ def main(): if os.environ.get("SKIP_GITHUB_RELEASE_UPLOAD", "false").lower() == "false": github_artifacts = artifacts_tar + [checksum_file] - upload_assets_to_github_release(github_artifacts, release_version) + try: + upload_assets_to_github_release(github_artifacts, release_version) + except Exception as e: + raise e # get_commit_from_tag gets the commit associated with a release tag, so that we can use that diff --git a/scripts/release/kubectl_mongodb/utils.py b/scripts/release/kubectl_mongodb/utils.py index 12aae5e1a..be6536d51 100644 --- a/scripts/release/kubectl_mongodb/utils.py +++ b/scripts/release/kubectl_mongodb/utils.py @@ -46,15 +46,13 @@ def s3_path(filename: str, version: str) -> str: # the GitHub release as assets. def upload_assets_to_github_release(asset_paths: list[str], release_version: str): if not GITHUB_TOKEN: - logger.info("ERROR: GITHUB_TOKEN environment variable not set.") - sys.exit(1) + raise Exception("ERROR: GITHUB_TOKEN environment variable not set.") try: g = Github(GITHUB_TOKEN) repo = g.get_repo(GITHUB_REPO) except GithubException as e: - logger.info(f"ERROR: Could not connect to GitHub or find repository '{GITHUB_REPO}', Error {e}.") - sys.exit(1) + raise Exception(f"ERROR: Could not connect to GitHub or find repository {GITHUB_REPO}") from e try: gh_release = None @@ -65,13 +63,11 @@ def upload_assets_to_github_release(asset_paths: list[str], release_version: str break if gh_release is None: - logger.error( + raise Exception( f"Could not find release (published or draft) with tag '{release_version}'. Please ensure the release exists." ) - sys.exit(2) except GithubException as e: - logger.debug(f"Failed to retrieve releases from the repository {GITHUB_REPO}. Error: {e}") - sys.exit(2) + raise Exception(f"Failed to retrieve releases from the repository {GITHUB_REPO}") from e for asset_path in asset_paths: asset_name = os.path.basename(asset_path) @@ -79,8 +75,6 @@ def upload_assets_to_github_release(asset_paths: list[str], release_version: str try: gh_release.upload_asset(path=asset_path, name=asset_name, content_type="application/gzip") except GithubException as e: - logger.debug(f"ERROR: Failed to upload asset {asset_name}. Error: {e}") - sys.exit(2) + raise Exception(f"ERROR: Failed to upload asset {asset_name}") from e except Exception as e: - logger.debug(f"An unexpected error occurred during upload of {asset_name}: {e}") - sys.exit(2) + raise Exception(f"An unexpected error occurred during upload of {asset_name}") from e diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index 2f065529c..f9263214e 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -198,5 +198,7 @@ def manifest_list_digest_for_image(image: str) -> str: if release_info_filename is not None: with open(release_info_filename, "w") as file: file.write(release_info) - - upload_assets_to_github_release([release_info_filename], args.version) + try: + upload_assets_to_github_release([release_info_filename], args.version) + except Exception as e: + raise e From f0a8b0f83d631f6713aa30040ff7053cf81d2a17 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Fri, 5 Dec 2025 17:42:46 +0100 Subject: [PATCH 12/13] Address review comments 1. Use `docker run skopeo inspect` to get digest of manifest list of a container image instead of docker inspect 2. Write unit test --- scripts/release/build/image_build_process.py | 36 +- scripts/release/release_info.py | 9 +- scripts/release/tests/release_info_test.py | 167 ++++++--- .../release/tests/testdata/release_test.json | 337 ++++++++++++++++++ 4 files changed, 486 insertions(+), 63 deletions(-) create mode 100644 scripts/release/tests/testdata/release_test.json diff --git a/scripts/release/build/image_build_process.py b/scripts/release/build/image_build_process.py index 0096bbcc9..477c6f9e5 100644 --- a/scripts/release/build/image_build_process.py +++ b/scripts/release/build/image_build_process.py @@ -25,11 +25,9 @@ def build_image(self, tags: list[str], # check_if_image_exists could easily be used to get the digest of manfiest list but # the python package that we use somehow doesn't return the digest of manifest list # even though the respective docker CLI returns the digest. That's why we had to introduce - # this function. + # this function. def get_manfiest_list_digest(self, image: str) -> Optional[str]: pass - def pull_image(self, image: str): pass - DEFAULT_BUILDER_NAME = "multiarch" # Default buildx builder name @@ -117,22 +115,27 @@ def check_if_image_exists(self, image_tag: str) -> bool: else: return True - def pull_image(self, image): - docker_cmd = python_on_whales.docker - try: - docker_cmd.image.pull(image, quiet=True) - except Exception as e: - raise Exception("Failed pulling image.") from e - def get_manfiest_list_digest(self, image) -> Optional[str]: - self.pull_image(image) + SKOPEO_IMAGE = "quay.io/skopeo/stable" - docker_cmd = python_on_whales.docker + skopeo_inspect_command = ["inspect", f"docker://{image}", "--format", "{{.Digest}}"] + docker_run_skopeo = ["docker", "run", "--rm", SKOPEO_IMAGE] + docker_run_skopeo.extend(skopeo_inspect_command) + try: - manifest = docker_cmd.image.inspect(image) - return manifest.id + result = subprocess.run( + docker_run_skopeo, + capture_output=True, + text=True, + check=True + ) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + raise Exception(f"Failed to run skopeo inspect using 'docker run' for image {image}. Error: {e.stderr.strip()}") from e + except FileNotFoundError: + raise Exception("docker is not installed on the system.") except Exception as e: - raise Exception("Failed inspecting the image to get manifest list digest") from e + raise e def build_image(self, tags: list[str], dockerfile: str, @@ -196,9 +199,6 @@ def get_manfiest_list_digest(self, image) -> Optional[str]: logger.warning(f"PodmanImageBuilder does not support getting digest for manifest list, returning empty digest.") return "" - def pull_image(self, image: str): - logger.warning("PodmanImageBuilder does not support pulling image right now.") - def build_image(self, tags: list[str], dockerfile: str, path: str, diff --git a/scripts/release/release_info.py b/scripts/release/release_info.py index f9263214e..0afe3aa4b 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -44,14 +44,15 @@ def create_release_info_json(operator_version: str) -> str: build_info = load_build_info(scenario=BuildScenario.RELEASE) - release_info_json = convert_to_release_info_json(build_info, operator_version) + release_json_path = os.path.join(os.getcwd(), "release.json") + + release_info_json = convert_to_release_info_json(build_info, release_json_path, operator_version) return json.dumps(release_info_json, indent=2) -def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -> dict: - release_json_data = os.path.join(os.getcwd(), "release.json") - with open(release_json_data, "r") as fd: +def convert_to_release_info_json(build_info: BuildInfo, release_json_path: str, operator_version: str) -> dict: + with open(release_json_path, "r") as fd: release_data = json.load(fd) release_info_output = { diff --git a/scripts/release/tests/release_info_test.py b/scripts/release/tests/release_info_test.py index 193cb38f9..741fb3c76 100644 --- a/scripts/release/tests/release_info_test.py +++ b/scripts/release/tests/release_info_test.py @@ -1,65 +1,150 @@ import json +import os +from scripts.release.build.build_scenario import BuildScenario +from scripts.release.release_info import convert_to_release_info_json +from scripts.release.build.build_info import load_build_info -from scripts.release.release_info import DUMMY_VERSION, create_release_info_json - +OPERATOR_VERSION = "1.6.0" def test_create_release_info_json(): expected_json = { "images": { "operator": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes"], - "platforms": ["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes", + "platforms": [ + "linux/arm64", + "linux/amd64", + "linux/s390x", + "linux/ppc64le" + ], + "tag": "1.6.0", + "digest": "sha256:317a7f2d40807629b1df78e7ef81790bcaeb09993d88b476ec3a33ee44cbb78d" }, "init-database": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-init-database"], - "platforms": ["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes-init-database", + "platforms": [ + "linux/arm64", + "linux/amd64", + "linux/s390x", + "linux/ppc64le" + ], + "tag": "1.6.0", + "digest": "sha256:ce10a711a6e6a31d20deecbe0ef15b5f82c2ca24d495fb832f5199ac327ee8ec" }, "init-appdb": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-init-appdb"], - "platforms": ["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes-init-appdb", + "platforms": [ + "linux/arm64", + "linux/amd64", + "linux/s390x", + "linux/ppc64le" + ], + "tag": "1.6.0", + "digest": "sha256:b0b66397056636052756157628c164d480f540d919a615d057192d553a7e892c" }, "init-ops-manager": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-init-ops-manager"], - "platforms": ["linux/amd64"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes-init-ops-manager", + "platforms": [ + "linux/amd64" + ], + "tag": "1.6.0", + "digest": "sha256:62825c8edcd45e26586cce5b4062d6930847db0c58a76c168312be8cdc934707" }, "database": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-database"], - "platforms": ["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes-database", + "platforms": [ + "linux/arm64", + "linux/amd64", + "linux/s390x", + "linux/ppc64le" + ], + "tag": "1.6.0", + "digest": "sha256:382248da5bdd90c8dbb0a1571b5f9ec90c10931c7e0974f4563a522963304b58" }, - "readiness-probe": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-readinessprobe"], - "platforms": ["linux/arm64", "linux/amd64"], - "version": DUMMY_VERSION, + "ops-manager": { + "repoURL": "quay.io/mongodb/mongodb-enterprise-ops-manager-ubi", + "platforms": [ + "linux/amd64" + ], + "tag": "8.0.16", + "digest": "sha256:ca4aad523f14d68fccb60256f9ce8909c66ebb5b321ee15e5abf9ac5738947f9" + }, + "agent": { + "repoURL": "quay.io/mongodb/mongodb-agent", + "platforms": [ + "linux/arm64", + "linux/amd64", + "linux/s390x", + "linux/ppc64le" + ], + "tag": "108.0.16.8895-1", + "digest": "sha256:6c5df0e0ec425731da1f82c7229304c1a01353d3aa81e02423f84904d96a7688" }, "upgrade-hook": { - "repositories": ["quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook"], - "platforms": ["linux/arm64", "linux/amd64"], - "version": DUMMY_VERSION, + "repoURL": "quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook", + "platforms": [ + "linux/arm64", + "linux/amd64" + ], + "tag": "1.0.10", + "digest": "sha256:f321ec1d25d6e98805b8be9321f2a926d702835136dde88d5fffe917c2df1d0a" }, - }, - "binaries": { - "kubectl-mongodb": { + "readiness-probe": { + "repoURL": "quay.io/mongodb/mongodb-kubernetes-readinessprobe", "platforms": [ - "darwin/amd64", - "darwin/arm64", - "linux/amd64", "linux/arm64", - "linux/s390x", - "linux/ppc64le", + "linux/amd64" ], - "version": DUMMY_VERSION, + "tag": "1.0.23", + "digest": "sha256:436fc328f3887f022a4760afd03da1a7091d285baf3d627a17d80bbdaab0ee47" + }, + "search": { + "repoURL": "quay.io/mongodb/mongodb-search", + "platforms": [ + "linux/arm64", + "linux/amd64" + ], + "tag": "0.55.0", + "digest": "sha256:c1e636119aa206ff98cefed37ee4b488d75c6a5e6025dcb71f44275a8f3f546a" + }, + "mongodb-enterprise-server": { + "repoURL": "quay.io/mongodb/mongodb-enterprise-server", + "platforms": [ + "linux/arm64", + "linux/amd64" + ], + "tag": "8.0.0-ubi9", + "digest": "sha256:7a93a0276531ff9be4c90bb8fe8d104e0a9e930c29792aafe03cc6a76a9fa89c" } }, - "helm-charts": { - "mongodb-kubernetes": {"registry": "quay.io", "repository": "mongodb/helm-charts", "version": DUMMY_VERSION} - }, - } - expected_release_info_json = json.dumps(expected_json, indent=2) - release_info_json = create_release_info_json() - - assert release_info_json == expected_release_info_json + "latestOpsManagerAgentMapping": [ + { + "6": { + "opsManagerVersion": "6.0.27", + "agentVersion": "12.0.35.7911-1" + } + }, + { + "7": { + "opsManagerVersion": "7.0.19", + "agentVersion": "107.0.19.8805-1" + } + }, + { + "8": { + "opsManagerVersion": "8.0.16", + "agentVersion": "108.0.16.8895-1" + } + } + ] + } + + build_info = load_build_info(scenario=BuildScenario.RELEASE) + + # release_test.json is just a copy of our original release.json file and it's created so that we can easily + # test release_info.py. If we directly used release.json, we will have to change the expected output `expected_json` + # because content of release.json changes after every MCK/OM/Agent release. + test_release_json_path = os.path.join(os.getcwd(), "scripts/release/tests/testdata/release_test.json") + release_info_asset = convert_to_release_info_json(build_info, test_release_json_path, OPERATOR_VERSION) + + assert release_info_asset == expected_json diff --git a/scripts/release/tests/testdata/release_test.json b/scripts/release/tests/testdata/release_test.json new file mode 100644 index 000000000..c864802e8 --- /dev/null +++ b/scripts/release/tests/testdata/release_test.json @@ -0,0 +1,337 @@ +{ + "mongodbToolsBundle": { + "ubi": "mongodb-database-tools-rhel88-x86_64-100.13.0.tgz" + }, + "mongodbOperator": "1.6.0", + "initDatabaseVersion": "1.6.0", + "initOpsManagerVersion": "1.6.0", + "initAppDbVersion": "1.6.0", + "databaseImageVersion": "1.6.0", + "agentVersion": "108.0.12.8846-1", + "readinessProbeVersion": "1.0.23", + "versionUpgradeHookVersion": "1.0.10", + "openshift": { + "minimumSupportedVersion": "4.6" + }, + "search": { + "version": "0.55.0" + }, + "latestOpsManagerAgentMapping": [ + { + "6": { + "opsManagerVersion": "6.0.27", + "agentVersion": "12.0.35.7911-1" + } + }, + { + "7": { + "opsManagerVersion": "7.0.19", + "agentVersion": "107.0.19.8805-1" + } + }, + { + "8": { + "opsManagerVersion": "8.0.16", + "agentVersion": "108.0.16.8895-1" + } + } + ], + "supportedImages": { + "ops-manager": { + "ssdlc_name": "MongoDB Controllers for Kubernetes Enterprise Ops Manager", + "versions": [ + "6.0.26", + "6.0.27", + "7.0.11", + "7.0.12", + "7.0.13", + "7.0.14", + "7.0.15", + "7.0.17", + "7.0.18", + "7.0.19", + "8.0.0", + "8.0.1", + "8.0.2", + "8.0.3", + "8.0.4", + "8.0.5", + "8.0.6", + "8.0.7", + "8.0.11", + "8.0.12", + "8.0.13", + "8.0.14", + "8.0.15", + "8.0.16" + ], + "variants": [ + "ubi" + ] + }, + "mongodb-kubernetes": { + "Description": "We support 3 last versions, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Controllers for Kubernetes Operator", + "versions": [ + "1.0.1", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.6.0" + ], + "variants": [ + "ubi" + ] + }, + "mongodb-kubernetes-operator": { + "Description": "Community Operator daily rebuilds", + "ssdlc_name": "MongoDB Community Operator", + "versions": [ + "0.12.0", + "0.11.0", + "0.10.0", + "0.9.0", + "0.8.3", + "0.8.2", + "0.8.1", + "0.8.0", + "0.7.9", + "0.7.8", + "0.7.7", + "0.7.6" + ], + "variants": [ + "ubi" + ] + }, + "mongodb-agent": { + "Description": "Agents corresponding to OpsManager 5.x and 6.x series", + "ssdlc_name": "MongoDB Controllers for Kubernetes MongoDB Agent", + "Description for specific versions": { + "11.0.5.6963-1": "An upgraded version for OM 5.0 we use for Operator-only deployments", + "12.0.28.7763-1": "OM 6 basic version" + }, + "versions": [ + "108.0.2.8729-1" + ], + "opsManagerMapping": { + "Description": "These are the agents from which we start supporting static containers.", + "cloud_manager": "13.43.0.9995-1", + "cloud_manager_tools": "100.13.0", + "ops_manager": { + "6.0.27": { + "agent_version": "12.0.35.7911-1", + "tools_version": "100.10.0" + }, + "7.0.12": { + "agent_version": "107.0.12.8669-1", + "tools_version": "100.10.0" + }, + "7.0.13": { + "agent_version": "107.0.13.8702-1", + "tools_version": "100.10.0" + }, + "7.0.14": { + "agent_version": "107.0.13.8702-1", + "tools_version": "100.10.0" + }, + "7.0.15": { + "agent_version": "107.0.15.8741-1", + "tools_version": "100.11.0" + }, + "7.0.17": { + "agent_version": "107.0.17.8771-1", + "tools_version": "100.12.2" + }, + "7.0.18": { + "agent_version": "107.0.18.8784-1", + "tools_version": "100.13.0" + }, + "7.0.19": { + "agent_version": "107.0.19.8805-1", + "tools_version": "100.13.0" + }, + "8.0.1": { + "agent_version": "108.0.1.8718-1", + "tools_version": "100.10.0" + }, + "8.0.2": { + "agent_version": "108.0.2.8729-1", + "tools_version": "100.10.0" + }, + "8.0.3": { + "agent_version": "108.0.3.8758-1", + "tools_version": "100.10.0" + }, + "8.0.4": { + "agent_version": "108.0.4.8770-1", + "tools_version": "100.11.0" + }, + "8.0.5": { + "agent_version": "108.0.4.8770-1", + "tools_version": "100.11.0" + }, + "8.0.6": { + "agent_version": "108.0.6.8796-1", + "tools_version": "100.11.0" + }, + "8.0.7": { + "agent_version": "108.0.7.8810-1", + "tools_version": "100.12.0" + }, + "8.0.11": { + "agent_version": "108.0.11.8830-1", + "tools_version": "100.12.2" + }, + "8.0.12": { + "agent_version": "108.0.12.8846-1", + "tools_version": "100.12.2" + }, + "8.0.13": { + "agent_version": "108.0.13.8870-1", + "tools_version": "100.13.0" + }, + "8.0.14": { + "agent_version": "108.0.13.8870-1", + "tools_version": "100.13.0" + }, + "8.0.15": { + "agent_version": "108.0.15.8888-1", + "tools_version": "100.13.0" + }, + "8.0.16": { + "agent_version": "108.0.16.8895-1", + "tools_version": "100.13.0" + } + } + }, + "variants": [ + "ubi" + ] + }, + "init-ops-manager": { + "Description": "The lowest version corresponds to the lowest supported Operator version, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Controllers for Kubernetes Init Ops Manager", + "versions": [ + "1.0.1", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.6.0" + ], + "variants": [ + "ubi" + ] + }, + "init-database": { + "Description": "The lowest version corresponds to the lowest supported Operator version, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Controllers for Kubernetes Init Database", + "versions": [ + "1.0.1", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.6.0" + ], + "variants": [ + "ubi" + ] + }, + "init-appdb": { + "Description": "The lowest version corresponds to the lowest supported Operator version, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Controllers for Kubernetes Init AppDB", + "versions": [ + "1.0.1", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.6.0" + ], + "variants": [ + "ubi" + ] + }, + "database": { + "Description": "The lowest version corresponds to the lowest supported Operator version, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Controllers for Kubernetes Database", + "versions": [ + "1.0.1", + "1.1.0", + "1.2.0", + "1.3.0", + "1.4.0", + "1.5.0", + "1.6.0" + ], + "variants": [ + "ubi" + ] + }, + "mongodb-enterprise-server": { + "Description": "The lowest version corresponds to the lowest supported Operator version, see https://wiki.corp.mongodb.com/display/MMS/Kubernetes+Operator+Support+Policy", + "ssdlc_name": "MongoDB Enterprise Server", + "versions": [ + "4.4.0-ubi8", + "4.4.1-ubi8", + "4.4.2-ubi8", + "4.4.3-ubi8", + "4.4.4-ubi8", + "4.4.5-ubi8", + "4.4.6-ubi8", + "4.4.7-ubi8", + "4.4.8-ubi8", + "4.4.9-ubi8", + "4.4.10-ubi8", + "4.4.11-ubi8", + "4.4.12-ubi8", + "4.4.13-ubi8", + "4.4.14-ubi8", + "4.4.15-ubi8", + "4.4.16-ubi8", + "4.4.17-ubi8", + "4.4.18-ubi8", + "4.4.19-ubi8", + "4.4.20-ubi8", + "4.4.21-ubi8", + "5.0.0-ubi8", + "5.0.1-ubi8", + "5.0.2-ubi8", + "5.0.3-ubi8", + "5.0.4-ubi8", + "5.0.5-ubi8", + "5.0.6-ubi8", + "5.0.7-ubi8", + "5.0.8-ubi8", + "5.0.9-ubi8", + "5.0.10-ubi8", + "5.0.11-ubi8", + "5.0.12-ubi8", + "5.0.13-ubi8", + "5.0.14-ubi8", + "5.0.15-ubi8", + "5.0.16-ubi8", + "5.0.17-ubi8", + "5.0.18-ubi8", + "6.0.0-ubi8", + "6.0.1-ubi8", + "6.0.2-ubi8", + "6.0.3-ubi8", + "6.0.4-ubi8", + "6.0.5-ubi8", + "8.0.0-ubi8", + "8.0.0-ubi9" + ], + "variants": [ + "ubi" + ] + } + } +} From f449247361250940b29dd1dad7a732d1c2ddd7d9 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Fri, 5 Dec 2025 17:48:40 +0100 Subject: [PATCH 13/13] Fix rebase messup --- release.json | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/release.json b/release.json index 592e0acc8..c864802e8 100644 --- a/release.json +++ b/release.json @@ -36,40 +36,6 @@ } } ], - "supportedImages": { - "latestOpsManagerAgentMapping": [ - { - "6": { - "opsManagerVersion": "6.0.27", - "agentVersion": "12.0.35.7911-1" - } - }, - { - "7": { - "opsManagerVersion": "7.0.19", - "agentVersion": "107.0.19.8805-1" - } - }, - { - "8": { - "opsManagerVersion": "8.0.16", - "agentVersion": "108.0.16.8895-1" - } - } - }, - { - "7": { - "opsManagerVersion": "7.0.19", - "agentVersion": "107.0.19.8805-1" - } - }, - { - "8": { - "opsManagerVersion": "8.0.16", - "agentVersion": "108.0.16.8895-1" - } - } - ], "supportedImages": { "ops-manager": { "ssdlc_name": "MongoDB Controllers for Kubernetes Enterprise Ops Manager",