diff --git a/.evergreen-functions.yml b/.evergreen-functions.yml index b56dd947ab..3f87f9d1fd 100644 --- a/.evergreen-functions.yml +++ b/.evergreen-functions.yml @@ -778,6 +778,20 @@ 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 + include_expansions_in_env: + - OPERATOR_VERSION + env: + GH_TOKEN: ${GH_TOKEN} + 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 params: diff --git a/.evergreen-release.yml b/.evergreen-release.yml index e86cdda131..034a6c30a1 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/changelog/20251208_other_added_a_new_asset_in_github_releases_that_would.md b/changelog/20251208_other_added_a_new_asset_in_github_releases_that_would.md new file mode 100644 index 0000000000..dd73670ef7 --- /dev/null +++ b/changelog/20251208_other_added_a_new_asset_in_github_releases_that_would.md @@ -0,0 +1,6 @@ +--- +kind: other +date: 2025-12-08 +--- + +* Added a new asset in GitHub releases that would contain detailed information about released MCK and other relevant container images. diff --git a/scripts/release/build/image_build_process.py b/scripts/release/build/image_build_process.py index b2cb6e598c..477c6f9e59 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,12 @@ 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 + DEFAULT_BUILDER_NAME = "multiarch" # Default buildx builder name @@ -109,6 +115,28 @@ def check_if_image_exists(self, image_tag: str) -> bool: else: return True + def get_manfiest_list_digest(self, image) -> Optional[str]: + SKOPEO_IMAGE = "quay.io/skopeo/stable" + + 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: + 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 e + def build_image(self, tags: list[str], dockerfile: str, path: str, @@ -167,6 +195,10 @@ 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 build_image(self, tags: list[str], dockerfile: str, path: str, diff --git a/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py b/scripts/release/kubectl_mongodb/promote_kubectl_plugin.py index fad344381b..d862036626 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") @@ -65,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 @@ -270,49 +270,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 26d972bbc0..be6536d51d 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,41 @@ 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: + raise Exception("ERROR: GITHUB_TOKEN environment variable not set.") + + try: + g = Github(GITHUB_TOKEN) + repo = g.get_repo(GITHUB_REPO) + except GithubException as e: + raise Exception(f"ERROR: Could not connect to GitHub or find repository {GITHUB_REPO}") from e + + 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: + raise Exception( + f"Could not find release (published or draft) with tag '{release_version}'. Please ensure the release exists." + ) + except GithubException as e: + 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) + 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: + raise Exception(f"ERROR: Failed to upload asset {asset_name}") from e + except Exception as e: + 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 f16f349231..0afe3aa4b8 100644 --- a/scripts/release/release_info.py +++ b/scripts/release/release_info.py @@ -1,90 +1,205 @@ import argparse import json -import pathlib +import os +from lib.base_logger import logger 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, BuildInfo, load_build_info, ) 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.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" + +MONGODB_ENTERPRISE_SERVER_IMAGE = "mongodb-enterprise-server" +MONGODB_ENTERPRISE_SERVER_REPOSITORY = "quay.io/mongodb/mongodb-enterprise-server" 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 ] -# 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" - -def create_release_info_json() -> 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) + 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) -> dict: - output = { +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 = { "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} for name, image in images.items(): - output["images"][name] = { - "repositories": image.repositories, - "platforms": image.platforms, - "version": DUMMY_VERSION, - } - - for name, binary in build_info.binaries.items(): - output["binaries"][name] = { - "platforms": binary.platforms, - "version": DUMMY_VERSION, - } - - for name, chart in build_info.helm_charts.items(): - output["helm-charts"][name] = { - "registry": chart.registry, - "repository": chart.repository, - "version": DUMMY_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[0], + 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_IMAGE_REPOSITORY, + 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[0], + upgradehook_build_info.platforms, + 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[0], + readiness_build_info.platforms, + latest_readiness_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), + ) + + 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 + + +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): + om_agent_mapping = release_data["latestOpsManagerAgentMapping"] + output["latestOpsManagerAgentMapping"] = om_agent_mapping 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"] + + +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 + ] + return newest_om_mapping["agent_version"] + + +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.", 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" + + release_info = create_release_info_json(args.version) - if args.output is not None: - with open(args.output, "w") as file: + if release_info_filename is not None: + with open(release_info_filename, "w") as file: file.write(release_info) - else: - print(release_info) + try: + upload_assets_to_github_release([release_info_filename], args.version) + except Exception as e: + raise e diff --git a/scripts/release/tests/release_info_test.py b/scripts/release/tests/release_info_test.py index 193cb38f90..741fb3c760 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 0000000000..c864802e82 --- /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" + ] + } + } +}