diff --git a/common/library/module_utils/input_validation/common_utils/config.py b/common/library/module_utils/input_validation/common_utils/config.py index 095849d88f..d1bb4b5b61 100644 --- a/common/library/module_utils/input_validation/common_utils/config.py +++ b/common/library/module_utils/input_validation/common_utils/config.py @@ -132,7 +132,7 @@ "openmpi": "5.0.8", "csi_driver_powerscale": "v2.15.0", "rocm": "6.3.1", - "service_k8s": "1.34.1" + "service_k8s": "1.35.1" } # All of the passwords fields diff --git a/common/library/module_utils/input_validation/common_utils/en_us_validation_msg.py b/common/library/module_utils/input_validation/common_utils/en_us_validation_msg.py index 6cea78848b..2fd4cd50b7 100644 --- a/common/library/module_utils/input_validation/common_utils/en_us_validation_msg.py +++ b/common/library/module_utils/input_validation/common_utils/en_us_validation_msg.py @@ -375,12 +375,12 @@ def powerscale_csm_values_parse_error_msg(error): "URL must start with 'http://' or 'https://'." ) def powerscale_image_version_mismatch_msg(image_name, values_image, service_k8s_image): - """Returns error message when CSM values.yaml image version doesn't match service_k8s.json.""" + """Returns error message when CSM values.yaml image version doesn't match service_k8s (versioned).""" return ( f"Image version mismatch for '{image_name}': " f"CSM Observability values.yaml has '{values_image}' but " - f"service_k8s.json has '{service_k8s_image}'. " - f"Please update service_k8s.json to match the values.yaml version " + f"service_k8s (versioned) has '{service_k8s_image}'. " + f"Please update service_k8s (versioned) to match the values.yaml version " f"and re-run local_repo.yml to mirror the correct image to Pulp." ) # pylint: enable=invalid-name diff --git a/common/library/module_utils/input_validation/validation_flows/common_validation.py b/common/library/module_utils/input_validation/validation_flows/common_validation.py index 6ff8df745c..37692e7c0d 100644 --- a/common/library/module_utils/input_validation/validation_flows/common_validation.py +++ b/common/library/module_utils/input_validation/validation_flows/common_validation.py @@ -252,15 +252,23 @@ def validate_software_config( for software_pkg in data['softwares']: software = software_pkg['name'] arch_list = software_pkg.get('arch') + # Get software version for versioned JSON files (e.g., service_k8s_v1.35.1.json) + software_version = software_pkg.get('version') for arch in arch_list: json_path = get_json_file_path( - software, cluster_os_type, cluster_os_version, input_file_path, arch) + software, cluster_os_type, cluster_os_version, input_file_path, arch, + software_version=software_version) # Check if json_path is None or if the JSON syntax is invalid if not json_path: + # Construct expected filename for error message + if software == "service_k8s" and software_version: + expected_file = f"{software}_v{software_version}.json" + else: + expected_file = f"{software}.json" errors.append( create_error_msg( "Validation Error: ", software, - f"is present in software_config.json. JSON file not found: {software}.json" + f"is present in software_config.json. JSON file not found: {expected_file}" ) ) else: @@ -1809,12 +1817,13 @@ def get_config_file_paths(input_dir, data, software_config_file_path): Returns: dict: Dictionary containing resolved file paths: - - service_k8s_json_path: Path to service_k8s.json + - service_k8s_json_path: Path to service_k8s (versioned) - csi_driver_powerscale_json_path: Path to csi_driver_powerscale.json """ # Try reading cluster_os_type/version from data first, then from software_config.json cluster_os_type = data.get("cluster_os_type", "rhel") cluster_os_version = data.get("cluster_os_version", "10.0") + service_k8s_version = None if os.path.exists(software_config_file_path): try: @@ -1822,11 +1831,20 @@ def get_config_file_paths(input_dir, data, software_config_file_path): sc_data = json.load(scf) cluster_os_type = sc_data.get("cluster_os_type", cluster_os_type) cluster_os_version = sc_data.get("cluster_os_version", cluster_os_version) + # Extract service_k8s version from software_config.json + for sw in sc_data.get("softwares", []): + if sw.get("name") == "service_k8s" and sw.get("version"): + service_k8s_version = sw["version"] + break except (json.JSONDecodeError, IOError): pass config_base_path = os.path.join(input_dir, "config", "x86_64", cluster_os_type, cluster_os_version) - service_k8s_json_path = os.path.join(config_base_path, "service_k8s.json") + # Use versioned service_k8s file - version is required + if not service_k8s_version: + raise ValueError("service_k8s version not found in software_config.json") + service_k8s_json = f"service_k8s_v{service_k8s_version}.json" + service_k8s_json_path = os.path.join(config_base_path, service_k8s_json) csi_driver_powerscale_json_path = os.path.join(config_base_path, "csi_driver_powerscale.json") return { diff --git a/common/library/module_utils/input_validation/validation_flows/local_repo_validation.py b/common/library/module_utils/input_validation/validation_flows/local_repo_validation.py index 8254faca1e..e81ecd8be7 100644 --- a/common/library/module_utils/input_validation/validation_flows/local_repo_validation.py +++ b/common/library/module_utils/input_validation/validation_flows/local_repo_validation.py @@ -21,7 +21,7 @@ from ansible.module_utils.input_validation.common_utils import validation_utils from ansible.module_utils.input_validation.common_utils import config from ansible.module_utils.input_validation.common_utils import en_us_validation_msg -from ansible.module_utils.local_repo.software_utils import load_yaml, load_json +from ansible.module_utils.local_repo.software_utils import load_yaml, load_json, get_json_file_path file_names = config.files create_error_msg = validation_utils.create_error_msg @@ -239,13 +239,22 @@ def validate_local_repo_config(input_file_path, data, for software in software_config_json["softwares"]: sw = software["name"] arch_list = software.get("arch") + # Get software version for versioned JSON files (e.g., service_k8s_v1.35.1.json) + software_version = software.get("version") for arch in arch_list: - json_path = create_file_path( - input_file_path, - f"config/{arch}{os_ver_path}" + sw +".json") - if not os.path.exists(json_path): + # Use get_json_file_path for proper versioned JSON file resolution + json_path = get_json_file_path( + sw, cluster_os_type, cluster_os_version, + software_config_file_path, arch, + software_version=software_version) + if not json_path or not os.path.exists(json_path): + # Construct expected filename for error message + if sw == "service_k8s" and software_version: + expected_file = f"{sw}_v{software_version}.json" + else: + expected_file = f"{sw}.json" errors.append( - create_error_msg(sw + '/' + arch, f"{sw} JSON file not found for architecture {arch}.", json_path)) + create_error_msg(sw + '/' + arch, f"{sw} JSON file not found for architecture {arch}.", expected_file)) else: curr_json = load_json(json_path) pkg_list = curr_json[sw]['cluster'] diff --git a/common/library/module_utils/input_validation/validation_flows/powerscale_telemetry_validation.py b/common/library/module_utils/input_validation/validation_flows/powerscale_telemetry_validation.py index 985a6de72d..d72659d542 100644 --- a/common/library/module_utils/input_validation/validation_flows/powerscale_telemetry_validation.py +++ b/common/library/module_utils/input_validation/validation_flows/powerscale_telemetry_validation.py @@ -191,7 +191,7 @@ def validate_powerscale_telemetry_config( )) # Cross-validate image versions - # between values.yaml and service_k8s.json + # between values.yaml and service_k8s (versioned) service_k8s_json_path = config_paths.get( "service_k8s_json_path", "" ) @@ -204,7 +204,7 @@ def validate_powerscale_telemetry_config( with open(service_k8s_json_path, 'r', encoding='utf-8') as sk8s_f: service_k8s_data = json.load(sk8s_f) - # Build lookup: package -> tag from service_k8s.json + # Build lookup: package -> tag from service_k8s (versioned) sk8s_images = {} for entry in service_k8s_data.get( "service_k8s", {} @@ -237,7 +237,7 @@ def validate_powerscale_telemetry_config( sidecar_proxy = karavi_auth.get("sidecarProxy", {}) if sidecar_proxy and sidecar_proxy.get("image"): # csm-authorization-sidecar is in - # csi_driver_powerscale.json, not service_k8s.json + # csi_driver_powerscale.json, not service_k8s (versioned) if (csi_driver_powerscale_json_path and os.path.exists(csi_driver_powerscale_json_path)): try: @@ -305,18 +305,18 @@ def validate_powerscale_telemetry_config( ) else: logger.warning( - f"Image {sk8s_key} not found in service_k8s.json, " + f"Image {sk8s_key} not found in service_k8s file, " f"skipping version check" ) except (json.JSONDecodeError, IOError) as sk8s_err: logger.warning( - f"Could not read service_k8s.json for " + f"Could not read service_k8s file for " f"image version validation: {sk8s_err}" ) else: logger.warning( - f"service_k8s.json not found at {service_k8s_json_path}, " + f"service_k8s file not found at {service_k8s_json_path}, " f"skipping image version validation" ) diff --git a/common/library/module_utils/input_validation/validation_flows/telemetry_validation.py b/common/library/module_utils/input_validation/validation_flows/telemetry_validation.py index 106d70db97..b3c054068a 100644 --- a/common/library/module_utils/input_validation/validation_flows/telemetry_validation.py +++ b/common/library/module_utils/input_validation/validation_flows/telemetry_validation.py @@ -252,12 +252,13 @@ def get_config_file_paths(input_dir, data, software_config_file_path): Returns: dict: Dictionary containing resolved file paths: - - service_k8s_json_path: Path to service_k8s.json + - service_k8s_json_path: Path to service_k8s (versioned) - csi_driver_powerscale_json_path: Path to csi_driver_powerscale.json """ # Try reading cluster_os_type/version from data first, then from software_config.json cluster_os_type = data.get("cluster_os_type", "rhel") cluster_os_version = data.get("cluster_os_version", "10.0") + service_k8s_version = None if os.path.exists(software_config_file_path): try: @@ -265,11 +266,20 @@ def get_config_file_paths(input_dir, data, software_config_file_path): sc_data = json.load(scf) cluster_os_type = sc_data.get("cluster_os_type", cluster_os_type) cluster_os_version = sc_data.get("cluster_os_version", cluster_os_version) + # Extract service_k8s version from software_config.json + for sw in sc_data.get("softwares", []): + if sw.get("name") == "service_k8s" and sw.get("version"): + service_k8s_version = sw["version"] + break except (json.JSONDecodeError, IOError): pass config_base_path = os.path.join(input_dir, "config", "x86_64", cluster_os_type, cluster_os_version) - service_k8s_json_path = os.path.join(config_base_path, "service_k8s.json") + # Use versioned service_k8s file - version is required + if not service_k8s_version: + raise ValueError("service_k8s version not found in software_config.json") + service_k8s_json = f"service_k8s_v{service_k8s_version}.json" + service_k8s_json_path = os.path.join(config_base_path, service_k8s_json) csi_driver_powerscale_json_path = os.path.join(config_base_path, "csi_driver_powerscale.json") return { diff --git a/common/library/module_utils/local_repo/software_utils.py b/common/library/module_utils/local_repo/software_utils.py index bc5da2876a..d3306d58b8 100644 --- a/common/library/module_utils/local_repo/software_utils.py +++ b/common/library/module_utils/local_repo/software_utils.py @@ -118,7 +118,7 @@ def load_yaml(file_path): return yaml.safe_load(file) def get_json_file_path(software_name, cluster_os_type, - cluster_os_version, user_json_path, arch): + cluster_os_version, user_json_path, arch, software_version=None): """ Generate the file path for a JSON file based on the provided software name, cluster OS type, cluster OS version, and user JSON path. @@ -129,13 +129,23 @@ def get_json_file_path(software_name, cluster_os_type, cluster_os_version (str): The version of the cluster operating system. user_json_path (str): The path to the user JSON file. arch: Architecture for a particular software + software_version (str, optional): Version of the software for versioned JSON files. + Used for software like service_k8s that have versioned JSON files + (e.g., service_k8s_v1.35.1.json). Returns: str or None: The file path for the JSON file if it exists, otherwise None. """ base_path = os.path.dirname(os.path.abspath(user_json_path)) + + # Handle versioned JSON files (e.g., service_k8s_v1.35.1.json) + if software_name == "service_k8s" and software_version: + json_filename = f"{software_name}_v{software_version}.json" + else: + json_filename = f"{software_name}.json" + json_path = os.path.join(base_path, - f'{SOFTWARE_CONFIG_SUBDIR}/{arch}/{cluster_os_type}/{cluster_os_version}/{software_name}.json' + f'{SOFTWARE_CONFIG_SUBDIR}/{arch}/{cluster_os_type}/{cluster_os_version}/{json_filename}' ) return json_path diff --git a/common/library/modules/image_package_collector.py b/common/library/modules/image_package_collector.py index 77ff67b50d..087129c56a 100644 --- a/common/library/modules/image_package_collector.py +++ b/common/library/modules/image_package_collector.py @@ -151,7 +151,12 @@ def process_functional_group(fg_name, arch, os_version, input_project_dir, packages = [] for json_file in json_files: + # Extract software name from json file + # Handle versioned files like service_k8s_v1.35.1.json -> service_k8s sw_name = json_file.replace(".json", "") + # Remove version suffix for versioned files (e.g., service_k8s_v1.35.1 -> service_k8s) + if sw_name.startswith("service_k8s_v"): + sw_name = "service_k8s" if sw_name not in allowed_softwares: continue @@ -170,7 +175,8 @@ def process_functional_group(fg_name, arch, os_version, input_project_dir, sw_data, fg_name=fg_name, slurm_defined=True ) ) - elif json_file == "service_k8s.json": + elif json_file.startswith("service_k8s_v"): + # Handle versioned service_k8s_v.json files packages.extend( collect_packages_from_json( sw_data, fg_name=fg_name, service_k8s_defined=True @@ -194,6 +200,7 @@ def run_module(): software_config_file=dict(type="str", required=True), input_project_dir=dict(type="str", required=True), additional_json_path=dict(type="str", required=False, default=""), + service_k8s_version=dict(type="str", required=False, default=""), ) result = dict( @@ -212,6 +219,7 @@ def run_module(): software_config_file = module.params["software_config_file"] input_project_dir = module.params["input_project_dir"] additional_json_path = module.params["additional_json_path"] + service_k8s_version = module.params["service_k8s_version"] software_config = load_json_file(software_config_file, module) if not software_config: @@ -221,6 +229,13 @@ def run_module(): if not os_version: module.fail_json(msg="cluster_os_version not found in software_config.json") + # Extract service_k8s version from software_config if not provided + if not service_k8s_version: + for sw in software_config.get("softwares", []): + if sw.get("name") == "service_k8s" and sw.get("version"): + service_k8s_version = sw["version"] + break + allowed_softwares = { sw["name"] for sw in software_config.get("softwares", []) } @@ -229,14 +244,19 @@ def run_module(): additional_enabled = is_additional_packages_enabled(software_config) allowed_additional_subgroups = get_allowed_additional_subgroups(software_config) if additional_enabled else [] + # Versioned JSON file for service_k8s: service_k8s_v.json + if not service_k8s_version: + module.fail_json(msg="service_k8s version not found in software_config.json") + service_k8s_json = f"service_k8s_v{service_k8s_version}.json" + # pylint: disable=line-too-long # Functional group → json files mapping software_map = { "os_x86_64": ["default_packages.json", "ldms.json"], "os_aarch64": ["default_packages.json", "ldms.json"], - "service_kube_node_x86_64": ["service_k8s.json"], - "service_kube_control_plane_first_x86_64": ["service_k8s.json"], - "service_kube_control_plane_x86_64": ["service_k8s.json"], + "service_kube_node_x86_64": [service_k8s_json], + "service_kube_control_plane_first_x86_64": [service_k8s_json], + "service_kube_control_plane_x86_64": [service_k8s_json], "slurm_control_node_x86_64": ["slurm_custom.json", "openldap.json", "ldms.json"], "slurm_node_x86_64": ["slurm_custom.json", "openldap.json", "ldms.json"], "login_node_x86_64": ["slurm_custom.json", "openldap.json", "ldms.json"], diff --git a/common/library/modules/prepare_tasklist.py b/common/library/modules/prepare_tasklist.py index 9714c7aaf0..688774cdd7 100644 --- a/common/library/modules/prepare_tasklist.py +++ b/common/library/modules/prepare_tasklist.py @@ -123,8 +123,15 @@ def main(): logger.info("Preparing package lists...") for software in software_list[arch]: logger.info(f"Processing software: {software}") + # Get software version for versioned JSON files (e.g., service_k8s_v1.35.1.json) + software_version = None + for sw in user_data.get("softwares", []): + if sw.get("name") == software and sw.get("version"): + software_version = sw["version"] + break json_path[arch] = get_json_file_path(software, cluster_os_type, - cluster_os_version, user_json_file, arch) + cluster_os_version, user_json_file, arch, + software_version=software_version) status_csv_path[arch] = get_csv_file_path(software, log_dir, arch) logger.info(f"json_path: {json_path}") logger.info(f"status_csv_path: {status_csv_path}") diff --git a/examples/rhel_software_config.json b/examples/rhel_software_config.json index 394ef53120..b9f60b3f3d 100644 --- a/examples/rhel_software_config.json +++ b/examples/rhel_software_config.json @@ -6,7 +6,7 @@ {"name": "default_packages", "arch": ["x86_64","aarch64"]}, {"name": "admin_debug_packages", "arch": ["x86_64","aarch64"]}, {"name": "openldap", "arch": ["x86_64","aarch64"]}, - {"name": "service_k8s","version": "1.34.1", "arch": ["x86_64"]}, + {"name": "service_k8s","version": "1.35.1", "arch": ["x86_64"]}, {"name": "slurm_custom", "arch": ["x86_64","aarch64"]}, {"name": "ucx", "version": "1.19.0", "arch": ["x86_64","aarch64"]}, {"name": "openmpi", "version": "5.0.8", "arch": ["x86_64","aarch64"]}, diff --git a/examples/software_config_template/template_rhel_10.0_multi_arch_software_config.json b/examples/software_config_template/template_rhel_10.0_multi_arch_software_config.json index 83eaa12a8c..69bc80c84f 100644 --- a/examples/software_config_template/template_rhel_10.0_multi_arch_software_config.json +++ b/examples/software_config_template/template_rhel_10.0_multi_arch_software_config.json @@ -7,7 +7,7 @@ {"name": "admin_debug_packages", "arch": ["x86_64","aarch64"]}, {"name": "openldap", "arch": ["x86_64","aarch64"]}, {"name": "slurm_custom", "arch": ["x86_64","aarch64"]}, - {"name": "service_k8s", "version": "1.34.1", "arch": ["x86_64"]}, + {"name": "service_k8s", "version": "1.35.1", "arch": ["x86_64"]}, {"name": "ucx", "version": "1.19.0", "arch": ["x86_64","aarch64"]}, {"name": "openmpi", "version": "5.0.8", "arch": ["x86_64","aarch64"]}, {"name": "csi_driver_powerscale", "version":"v2.15.0", "arch": ["x86_64"]}, diff --git a/examples/software_config_template/template_rhel_10.0_x86-64_software_config.json b/examples/software_config_template/template_rhel_10.0_x86-64_software_config.json index 907958e590..650e912b78 100644 --- a/examples/software_config_template/template_rhel_10.0_x86-64_software_config.json +++ b/examples/software_config_template/template_rhel_10.0_x86-64_software_config.json @@ -7,7 +7,7 @@ {"name": "admin_debug_packages", "arch": ["x86_64"]}, {"name": "openldap", "arch": ["x86_64"]}, {"name": "slurm_custom", "arch": ["x86_64"]}, - {"name": "service_k8s", "version": "1.34.1", "arch": ["x86_64"]}, + {"name": "service_k8s", "version": "1.35.1", "arch": ["x86_64"]}, {"name": "ucx", "version": "1.19.0", "arch": ["x86_64"]}, {"name": "openmpi", "version": "5.0.8", "arch": ["x86_64"]}, {"name": "csi_driver_powerscale", "version":"v2.15.0", "arch": ["x86_64"]}, diff --git a/input/config/x86_64/rhel/10.0/service_k8s_v1.34.1.json b/input/config/x86_64/rhel/10.0/service_k8s_v1.34.1.json new file mode 100644 index 0000000000..6deed2309b --- /dev/null +++ b/input/config/x86_64/rhel/10.0/service_k8s_v1.34.1.json @@ -0,0 +1,108 @@ +{ + "service_k8s": { + "cluster": [ + { "package": "docker.io/library/busybox", "type": "image", "tag": "1.36" }, + { "package": "firewalld", "type": "rpm", "repo_name": "baseos" }, + { "package": "python3-firewall", "type": "rpm", "repo_name": "baseos" }, + { "package": "git", "type": "rpm", "repo_name": "appstream"}, + { "package": "vim-enhanced", "type": "rpm", "repo_name": "appstream"}, + { "package": "fuse-overlayfs", "type": "rpm", "repo_name": "appstream"}, + { "package": "podman", "type": "rpm", "repo_name": "appstream"}, + { "package": "kubeadm-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "kubelet-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "container-selinux", "type": "rpm", "repo_name": "appstream"}, + { "package": "cri-o-1.34.1", "type": "rpm", "repo_name": "cri-o"}, + { "package": "docker.io/victoriametrics/victoria-metrics", "type": "image", "tag": "v1.128.0" }, + { "package": "docker.io/victoriametrics/vmagent", "type": "image", "tag": "v1.128.0" }, + { "package": "docker.io/victoriametrics/vmstorage", "type": "image", "tag": "v1.128.0-cluster" }, + { "package": "docker.io/victoriametrics/vminsert", "type": "image", "tag": "v1.128.0-cluster" }, + { "package": "docker.io/victoriametrics/vmselect", "type": "image", "tag": "v1.128.0-cluster" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, + { "package": "docker.io/curlimages/curl", "type": "image", "tag": "8.17.0" }, + { "package": "docker.io/rmohr/activemq", "type": "image", "tag": "5.15.9" }, + { "package": "docker.io/library/mysql", "type": "image", "tag": "9.3.0" }, + { "package": "docker.io/dellhpcomniaaisolution/idrac_telemetry_receiver", "type": "image", "tag": "1.2" }, + { "package": "docker.io/dellhpcomniaaisolution/kafkapump", "type": "image", "tag": "1.2" }, + { "package": "docker.io/dellhpcomniaaisolution/victoriapump", "type": "image", "tag": "1.2" }, + { "package": "cryptography==45.0.7", "type": "pip_module" }, + { "package": "omsdk==1.2.518", "type": "pip_module" }, + { "package": "cffi==1.17.1", "type": "pip_module" }, + { "package": "quay.io/strimzi/operator", "tag": "0.48.0", "type": "image" }, + { "package": "quay.io/strimzi/kafka", "tag": "0.48.0-kafka-4.1.0", "type": "image" }, + { "package": "docker.io/dellhpcomniaaisolution/ubuntu-ldms", "tag": "1.0", "type": "image" }, + { "package": "strimzi-kafka-operator-helm-3-chart-0.48.0", "type": "tarball", "url": "https://github.com/strimzi/strimzi-kafka-operator/releases/download/0.48.0/strimzi-kafka-operator-helm-3-chart-0.48.0.tgz" }, + { "package": "quay.io/strimzi/kafka-bridge", "tag": "0.33.1", "type": "image" }, + { "package": "apptainer", "type": "rpm", "repo_name": "epel" }, + { "package": "doca-ofed", "type": "rpm_repo", "repo_name": "doca" } + ] + }, + "service_kube_control_plane": { + "cluster": [ + { "package": "ghcr.io/kube-vip/kube-vip", "tag": "v0.8.9", "type": "image" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-proxy", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.12.1", "type": "image" }, + { "package": "registry.k8s.io/pause", "tag": "3.10.1", "type": "image" }, + { "package": "registry.k8s.io/etcd", "tag": "3.6.4-0", "type": "image" }, + { "package": "docker.io/calico/cni", "tag": "v3.30.3", "type": "image" }, + { "package": "docker.io/calico/kube-controllers", "tag": "v3.30.3", "type": "image" }, + { "package": "docker.io/calico/node", "tag": "v3.30.3", "type": "image" }, + { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, + { "package": "kubectl-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "prettytable==3.14.0", "type": "pip_module" }, + { "package": "python3-3.12.9", "type": "rpm", "repo_name": "baseos" }, + { "package": "git", "type": "rpm", "repo_name": "appstream"}, + { "package": "kubernetes==33.1.0", "type": "pip_module" }, + { "package": "PyMySQL==1.1.2", "type": "pip_module" } + + ] + }, + "service_kube_control_plane_first": { + "cluster": [ + { "package": "ghcr.io/kube-vip/kube-vip", "tag": "v0.8.9", "type": "image" }, + { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-proxy", "tag": "v1.34.1", "type": "image" }, + { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.12.1", "type": "image" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, + { "package": "registry.k8s.io/pause", "tag": "3.10.1", "type": "image" }, + { "package": "registry.k8s.io/etcd", "tag": "3.6.4-0", "type": "image" }, + { "package": "docker.io/calico/cni", "tag": "v3.30.3", "type": "image" }, + { "package": "docker.io/calico/kube-controllers", "tag": "v3.30.3", "type": "image" }, + { "package": "docker.io/calico/node", "tag": "v3.30.3", "type": "image" }, + { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, + { + "package": "calico-v3.30.3", + "type": "manifest", + "url": "https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml" + }, + { + "package": "metallb-native-v0.15.2", + "type": "manifest", + "url": "https://raw.githubusercontent.com/metallb/metallb/v0.15.2/config/manifests/metallb-native.yaml" + }, + { "package": "helm-v3.19.0-amd64", "type": "tarball", "url": "https://get.helm.sh/helm-v3.19.0-linux-amd64.tar.gz" }, + { "package": "nfs-subdir-external-provisioner-4.0.18", "type": "tarball", "url": "https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/releases/download/nfs-subdir-external-provisioner-4.0.18/nfs-subdir-external-provisioner-4.0.18.tgz" }, + { "package": "kubectl-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "prettytable==3.14.0", "type": "pip_module" }, + { "package": "python3-3.12.9", "type": "rpm", "repo_name": "baseos" }, + { "package": "git", "type": "rpm", "repo_name": "appstream"}, + { "package": "kubernetes==33.1.0", "type": "pip_module" }, + { "package": "PyMySQL==1.1.2", "type": "pip_module" } + + ] + }, + + "service_kube_node": { + "cluster": [ + { "package": "registry.k8s.io/sig-storage/nfs-subdir-external-provisioner", "tag": "v4.0.2", "type": "image" }, + { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, + { "package": "quay.io/metallb/controller", "tag": "v0.15.2", "type": "image" } + ] + } +} + diff --git a/input/config/x86_64/rhel/10.0/service_k8s.json b/input/config/x86_64/rhel/10.0/service_k8s_v1.35.1.json similarity index 77% rename from input/config/x86_64/rhel/10.0/service_k8s.json rename to input/config/x86_64/rhel/10.0/service_k8s_v1.35.1.json index c2836af6e9..4ed6a19ad9 100644 --- a/input/config/x86_64/rhel/10.0/service_k8s.json +++ b/input/config/x86_64/rhel/10.0/service_k8s_v1.35.1.json @@ -8,10 +8,10 @@ { "package": "vim-enhanced", "type": "rpm", "repo_name": "appstream"}, { "package": "fuse-overlayfs", "type": "rpm", "repo_name": "appstream"}, { "package": "podman", "type": "rpm", "repo_name": "appstream"}, - { "package": "kubeadm-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, - { "package": "kubelet-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "kubeadm-1.35.1", "type": "rpm", "repo_name": "kubernetes-v1-35"}, + { "package": "kubelet-1.35.1", "type": "rpm", "repo_name": "kubernetes-v1-35"}, { "package": "container-selinux", "type": "rpm", "repo_name": "appstream"}, - { "package": "cri-o-1.34.1", "type": "rpm", "repo_name": "cri-o"}, + { "package": "cri-o-1.35.1", "type": "rpm", "repo_name": "cri-o-v1-35"}, { "package": "docker.io/victoriametrics/victoria-metrics", "type": "image", "tag": "v1.128.0" }, { "package": "docker.io/victoriametrics/vmagent", "type": "image", "tag": "v1.128.0" }, { "package": "docker.io/victoriametrics/vmstorage", "type": "image", "tag": "v1.128.0-cluster" }, @@ -19,7 +19,7 @@ { "package": "docker.io/victoriametrics/vmselect", "type": "image", "tag": "v1.128.0-cluster" }, { "package": "docker.io/victoriametrics/victoria-logs", "type": "image", "tag": "v1.50.0" }, { "package": "docker.io/victoriametrics/vlagent", "type": "image", "tag": "v1.50.0" }, - { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.35.1", "type": "image" }, { "package": "docker.io/curlimages/curl", "type": "image", "tag": "8.17.0" }, { "package": "docker.io/rmohr/activemq", "type": "image", "tag": "5.15.9" }, { "package": "docker.io/library/mysql", "type": "image", "tag": "9.3.0" }, @@ -62,57 +62,60 @@ "service_kube_control_plane": { "cluster": [ { "package": "ghcr.io/kube-vip/kube-vip", "tag": "v0.8.9", "type": "image" }, - { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-proxy", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.12.1", "type": "image" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-proxy", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.13.1", "type": "image" }, { "package": "registry.k8s.io/pause", "tag": "3.10.1", "type": "image" }, - { "package": "registry.k8s.io/etcd", "tag": "3.6.4-0", "type": "image" }, - { "package": "docker.io/calico/cni", "tag": "v3.30.3", "type": "image" }, - { "package": "docker.io/calico/kube-controllers", "tag": "v3.30.3", "type": "image" }, - { "package": "docker.io/calico/node", "tag": "v3.30.3", "type": "image" }, - { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, - { "package": "kubectl-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "registry.k8s.io/etcd", "tag": "3.6.6-0", "type": "image" }, + { "package": "docker.io/calico/cni", "tag": "v3.31.4", "type": "image" }, + { "package": "docker.io/calico/kube-controllers", "tag": "v3.31.4", "type": "image" }, + { "package": "docker.io/calico/node", "tag": "v3.31.4", "type": "image" }, + { "package": "quay.io/metallb/speaker", "tag": "v0.15.3", "type": "image" }, + { "package": "kubectl-1.35.1", "type": "rpm", "repo_name": "kubernetes-v1-35"}, { "package": "prettytable==3.14.0", "type": "pip_module" }, { "package": "python3-3.12.9", "type": "rpm", "repo_name": "baseos" }, { "package": "git", "type": "rpm", "repo_name": "appstream"}, + { "package": "kubernetes==35.0.0", "type": "pip_module" }, { "package": "PyMySQL==1.1.2", "type": "pip_module" } + ] }, "service_kube_control_plane_first": { "cluster": [ { "package": "ghcr.io/kube-vip/kube-vip", "tag": "v0.8.9", "type": "image" }, - { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/kube-proxy", "tag": "v1.34.1", "type": "image" }, - { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.12.1", "type": "image" }, - { "package": "docker.io/alpine/kubectl", "tag": "1.34.1", "type": "image" }, + { "package": "registry.k8s.io/kube-apiserver", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-controller-manager", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-scheduler", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/kube-proxy", "tag": "v1.35.1", "type": "image" }, + { "package": "registry.k8s.io/coredns/coredns", "tag": "v1.13.1", "type": "image" }, + { "package": "docker.io/alpine/kubectl", "tag": "1.35.1", "type": "image" }, { "package": "registry.k8s.io/pause", "tag": "3.10.1", "type": "image" }, - { "package": "registry.k8s.io/etcd", "tag": "3.6.4-0", "type": "image" }, - { "package": "docker.io/calico/cni", "tag": "v3.30.3", "type": "image" }, - { "package": "docker.io/calico/kube-controllers", "tag": "v3.30.3", "type": "image" }, - { "package": "docker.io/calico/node", "tag": "v3.30.3", "type": "image" }, - { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, - { "package": "calico-v3.30.3", "type": "manifest", "url": "https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml" }, - { "package": "metallb-native-v0.15.2", "type": "manifest", "url": "https://raw.githubusercontent.com/metallb/metallb/v0.15.2/config/manifests/metallb-native.yaml" }, - { "package": "helm-v3.19.0-amd64", "type": "tarball", "url": "https://get.helm.sh/helm-v3.19.0-linux-amd64.tar.gz" }, + { "package": "registry.k8s.io/etcd", "tag": "3.6.6-0", "type": "image" }, + { "package": "docker.io/calico/cni", "tag": "v3.31.4", "type": "image" }, + { "package": "docker.io/calico/kube-controllers", "tag": "v3.31.4", "type": "image" }, + { "package": "docker.io/calico/node", "tag": "v3.31.4", "type": "image" }, + { "package": "quay.io/metallb/speaker", "tag": "v0.15.3", "type": "image" }, + { "package": "calico-v3.31.4","type": "manifest", "url": "https://raw.githubusercontent.com/projectcalico/calico/v3.31.4/manifests/calico.yaml" }, + { "package": "metallb-native-v0.15.3", "type": "manifest", "url": "https://raw.githubusercontent.com/metallb/metallb/v0.15.3/config/manifests/metallb-native.yaml" }, + { "package": "helm-v3.20.1-amd64", "type": "tarball", "url": "https://get.helm.sh/helm-v3.20.1-linux-amd64.tar.gz" }, { "package": "nfs-subdir-external-provisioner-4.0.18", "type": "tarball", "url": "https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/releases/download/nfs-subdir-external-provisioner-4.0.18/nfs-subdir-external-provisioner-4.0.18.tgz" }, - { "package": "kubectl-1.34.1", "type": "rpm", "repo_name": "kubernetes"}, + { "package": "kubectl-1.35.1", "type": "rpm", "repo_name": "kubernetes-v1-35"}, { "package": "prettytable==3.14.0", "type": "pip_module" }, { "package": "python3-3.12.9", "type": "rpm", "repo_name": "baseos" }, { "package": "git", "type": "rpm", "repo_name": "appstream"}, + { "package": "kubernetes==35.0.0", "type": "pip_module" }, { "package": "PyMySQL==1.1.2", "type": "pip_module" } ] }, + "service_kube_node": { "cluster": [ { "package": "registry.k8s.io/sig-storage/nfs-subdir-external-provisioner", "tag": "v4.0.2", "type": "image" }, - { "package": "quay.io/metallb/speaker", "tag": "v0.15.2", "type": "image" }, - { "package": "quay.io/metallb/controller", "tag": "v0.15.2", "type": "image" } + { "package": "quay.io/metallb/speaker", "tag": "v0.15.3", "type": "image" }, + { "package": "quay.io/metallb/controller", "tag": "v0.15.3", "type": "image" } ] } -} - +} \ No newline at end of file diff --git a/input/local_repo_config.yml b/input/local_repo_config.yml index 7eca8c9346..2a0b0d5276 100644 --- a/input/local_repo_config.yml +++ b/input/local_repo_config.yml @@ -51,6 +51,7 @@ # - Do not use Jinja variables in this configuration. # - Omit SSL fields entirely if SSL is not in use. # - Its a mandatory field in case of slurm_custom with name as 'slurm_custom' +# - Version-specific naming (e.g., 'kubernetes-v1-35', 'cri-o-v1-35') is used only for service_k8s # # 3. user_repo_url_aarch64 #--------------------------- @@ -180,11 +181,20 @@ rhel_os_url_aarch64: rhel_subscription_repo_config_x86_64: rhel_subscription_repo_config_aarch64: # Making incorrect changes to this variable can cause omnia failure. Please edit cautiously. +# ============================================================================ +# VERSIONED REPOSITORY NAMING CONVENTION (Omnia 2.2+) +# ============================================================================ +# Starting from Omnia 2.2, repositories use versioned naming: +# - kubernetes-v- (e.g., kubernetes-v1-35) +# - cri-o-v- (e.g., cri-o-v1-35) +# Version-specific naming is used only for service_k8s components (kubernetes, cri-o) +# Other components (doca, cuda, slurm_custom) use non-versioned naming +# ============================================================================ omnia_repo_url_rhel_x86_64: - { url: "https://download.docker.com/linux/centos/10/x86_64/stable/", gpgkey: "https://download.docker.com/linux/centos/gpg", name: "docker-ce"} - { url: "https://dl.fedoraproject.org/pub/epel/10/Everything/x86_64/", gpgkey: "https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-10", name: "epel"} - - { url: "https://pkgs.k8s.io/core:/stable:/v1.34/rpm/", gpgkey: "https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key", name: "kubernetes"} - - { url: "https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.34/rpm/", gpgkey: "https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.34/rpm/repodata/repomd.xml.key", name: "cri-o"} + - { url: "https://pkgs.k8s.io/core:/stable:/v1.35/rpm/", gpgkey: "https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key", name: "kubernetes-v1-35"} + - { url: "https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.35/rpm/", gpgkey: "https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.35/rpm/repodata/repomd.xml.key", name: "cri-o-v1-35"} - { url: "https://linux.mellanox.com/public/repo/doca/3.2.1/rhel10/x86_64/", gpgkey: "https://linux.mellanox.com/public/repo/doca/3.2.1/rhel10/x86_64/repodata/repomd.xml.key", name: "doca"} - { url: "https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/", gpgkey: "https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/repodata/repomd.xml.key", name: "cuda"} omnia_repo_url_rhel_aarch64: diff --git a/input/software_config.json b/input/software_config.json index 8fa558bf28..70e3d679ee 100644 --- a/input/software_config.json +++ b/input/software_config.json @@ -6,7 +6,7 @@ {"name": "default_packages", "arch": ["x86_64","aarch64"]}, {"name": "admin_debug_packages", "arch": ["x86_64","aarch64"]}, {"name": "openldap", "arch": ["x86_64","aarch64"]}, - {"name": "service_k8s","version": "1.34.1", "arch": ["x86_64"]}, + {"name": "service_k8s","version": "1.35.1", "arch": ["x86_64"]}, {"name": "slurm_custom", "arch": ["x86_64","aarch64"]}, {"name": "csi_driver_powerscale", "version":"v2.15.0", "arch": ["x86_64"]}, {"name": "ldms", "arch": ["x86_64","aarch64"]}, diff --git a/local_repo/roles/validation/tasks/validate_software_config_json.yml b/local_repo/roles/validation/tasks/validate_software_config_json.yml index 0a221ebfee..190904eb95 100644 --- a/local_repo/roles/validation/tasks/validate_software_config_json.yml +++ b/local_repo/roles/validation/tasks/validate_software_config_json.yml @@ -91,4 +91,4 @@ msg: "{{ fail_msg }}" when: - service_k8s_support - - service_k8s_version != default_k8s_version + - service_k8s_version not in supported_k8s_versions diff --git a/local_repo/roles/validation/vars/main.yml b/local_repo/roles/validation/vars/main.yml index 88cceea868..8720bec1de 100644 --- a/local_repo/roles/validation/vars/main.yml +++ b/local_repo/roles/validation/vars/main.yml @@ -106,11 +106,14 @@ specific_softwares: - 'intelgaudi' - 'openmpi' - 'bcm_roce_libraries' -default_k8s_version: "1.34.1" +default_k8s_version: "1.35.1" +supported_k8s_versions: + - "1.34.1" + - "1.35.1" fail_msg: >- service_k8s is not supported for version: {{ service_k8s_version }}. - Please update the service_k8s version in software_config.json to {{ default_k8s_version }} - and rerun the playbook. + Please update the service_k8s version in software_config.json to a supported version + ({{ supported_k8s_versions | join(', ') }}) and rerun the playbook. versions_fail_msg: "Versions were not defined for the following softwares: {{ failed_softwares | join(', ') }} in software_config.json. Refer examples/template_{{ cluster_os_type }}_software_config.json and define version details accordingly in {{ project_input_path }}/software_config.json" @@ -175,6 +178,10 @@ http_key: http # Usage: validate_metadata.yml meta_dest: "{{ nfs_shared_path }}/offline_repo/.data" metadata_file_path: "{{ meta_dest }}/localrepo_metadata.yml" +metadata_identical_msg: "Metadata is identical. No changes detected." +metadata_warn_msg: | + WARNING: Metadata has changed since last run. + This may indicate changes in software_config.json or local_repo_config.yml. build_stream_auto_accept_metadata_msg: "Build stream is enabled, automatically accepting metadata changes." # Usage: remove_k8s_line.yml diff --git a/prepare_oim/roles/prepare_oim_validation/tasks/check_k8s_support.yml b/prepare_oim/roles/prepare_oim_validation/tasks/check_k8s_support.yml index 9bbda37138..b3b4c76fb9 100644 --- a/prepare_oim/roles/prepare_oim_validation/tasks/check_k8s_support.yml +++ b/prepare_oim/roles/prepare_oim_validation/tasks/check_k8s_support.yml @@ -31,10 +31,10 @@ k8s_versions: "{{ software_config.softwares | selectattr('name', 'in', ['compute_k8s', 'service_k8s']) | map(attribute='version') | list | unique }}" # noqa: yaml[line-length] k8s_arch: "{{ (software_config.softwares | selectattr('name', 'in', ['compute_k8s', 'service_k8s']) | first).get('arch', default_archs) }}" - - name: Set k8s_support_check to false if any k8s version is not default_k8s_version + - name: Set k8s_support_check to false if any k8s version is not in supported_k8s_versions ansible.builtin.set_fact: k8s_support_check: false - when: (k8s_versions | select('ne', default_k8s_version) | list | length) > 0 + when: (k8s_versions | reject('in', supported_k8s_versions) | list | length) > 0 - name: Fail if unsupported service_k8s version is detected ansible.builtin.fail: diff --git a/prepare_oim/roles/prepare_oim_validation/vars/main.yml b/prepare_oim/roles/prepare_oim_validation/vars/main.yml index 79bd5f5b4d..7ee5cfd5a9 100644 --- a/prepare_oim/roles/prepare_oim_validation/vars/main.yml +++ b/prepare_oim/roles/prepare_oim_validation/vars/main.yml @@ -32,13 +32,16 @@ software_config_syntax_fail_msg: "Failed. Syntax errors present in software_conf file_permission: "0755" # Usage: check_k8s_support.yml -fail_msg_k8s_version: "Failed. Kubernetes Version is unsupported or incorrect in software_config.json. Update software_config.json with a supported Kubernetes versions and re-run the playbook.Supported versions are - {{ supported_k8s_version }}" # noqa: yaml[line-length] -invalid_k8s_versions: "{{ k8s_versions | select('ne', default_k8s_version) | list }}" +fail_msg_k8s_version: "Failed. Kubernetes Version is unsupported or incorrect in software_config.json. Update software_config.json with a supported Kubernetes versions and re-run the playbook.Supported versions are - {{ supported_k8s_versions }}" # noqa: yaml[line-length] +invalid_k8s_versions: "{{ k8s_versions | reject('in', supported_k8s_versions) | list }}" fail_msg: >- service_k8s is not supported for version: {{ invalid_k8s_versions }}. - Please update the service_k8s version in software_config.json to {{ default_k8s_version }} - and rerun the playbook. -default_k8s_version: "1.34.1" + Please update the service_k8s version in software_config.json to a supported version + ({{ supported_k8s_versions | join(', ') }}) and rerun the playbook. +default_k8s_version: "1.35.1" +supported_k8s_versions: + - "1.34.1" + - "1.35.1" # Usage: validate_network_spec.yml network_spec: "{{ input_project_dir }}/network_spec.yml" diff --git a/provision/roles/k8s_config/tasks/create_k8s_config_nfs.yml b/provision/roles/k8s_config/tasks/create_k8s_config_nfs.yml index ac573840b9..d4c4ee0bd3 100644 --- a/provision/roles/k8s_config/tasks/create_k8s_config_nfs.yml +++ b/provision/roles/k8s_config/tasks/create_k8s_config_nfs.yml @@ -197,7 +197,7 @@ - name: Include local repo access variable file ansible.builtin.include_vars: "{{ local_repo_access_config_file }}" -- name: Load service_k8s.json +- name: Load service_k8s_v.json ansible.builtin.set_fact: k8s_packages_json: "{{ lookup('file', k8s_packages_file) | from_json }}" diff --git a/provision/roles/k8s_config/vars/main.yml b/provision/roles/k8s_config/vars/main.yml index 5785565568..9f0dfff2ee 100644 --- a/provision/roles/k8s_config/vars/main.yml +++ b/provision/roles/k8s_config/vars/main.yml @@ -15,7 +15,8 @@ local_repo_access_config_file: "/opt/omnia/provision/local_repo_access.yml" input_project_dir: "{{ hostvars['localhost']['input_project_dir'] }}" -k8s_packages_file: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/service_k8s.json" # noqa: yaml[line-length] +# Versioned JSON file: service_k8s_v.json (e.g., service_k8s_v1.35.1.json) +k8s_packages_file: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/service_k8s_v{{ hostvars['localhost']['service_k8s_version'] }}.json" # noqa: yaml[line-length] calico_manifest_yaml_url: "{{ offline_manifest_path }}/{{ calico_package }}/{{ calico_package }}.yml" metallb_manifest_yaml_url: "{{ offline_manifest_path }}/{{ metallb_package }}/{{ metallb_package }}.yml" multus_manifest_yaml_url: "{{ offline_manifest_path }}/{{ multus_package }}/{{ multus_package }}.yml" diff --git a/provision/roles/telemetry/tasks/get_powerscale_telemetry_dependencies.yml b/provision/roles/telemetry/tasks/get_powerscale_telemetry_dependencies.yml index b5f1bdd008..0ebb5ac196 100644 --- a/provision/roles/telemetry/tasks/get_powerscale_telemetry_dependencies.yml +++ b/provision/roles/telemetry/tasks/get_powerscale_telemetry_dependencies.yml @@ -23,10 +23,10 @@ # (installer/cert-manager.crds.yaml) -- no separate download needed. # # cert-manager Helm chart (from Jetstack) is pre-downloaded to Pulp via -# service_k8s.json tarball entry. The package name and version are read -# dynamically from service_k8s.json -- not hardcoded. +# service_k8s (versioned) tarball entry. The package name and version are read +# dynamically from service_k8s (versioned) -- not hardcoded. -- name: Extract cert-manager package name from service_k8s.json +- name: Extract cert-manager package name from service_k8s (versioned) ansible.builtin.set_fact: cert_manager_package: >- {{ telemetry_packages['service_k8s']['cluster'] @@ -39,7 +39,7 @@ ansible.builtin.set_fact: cert_manager_chart_tgz: "{{ cert_manager_package }}.tar.gz" -- name: Display cert-manager package read from service_k8s.json +- name: Display cert-manager package read from service_k8s (versioned) ansible.builtin.debug: msg: "{{ ps_cert_manager_pkg_msg }}" verbosity: 2 diff --git a/provision/roles/telemetry/tasks/load_service_images.yml b/provision/roles/telemetry/tasks/load_service_images.yml index 893b830fb2..acf5e6d6fd 100644 --- a/provision/roles/telemetry/tasks/load_service_images.yml +++ b/provision/roles/telemetry/tasks/load_service_images.yml @@ -13,7 +13,7 @@ # limitations under the License. --- -- name: Extract image packages from service_k8s.json +- name: Extract image packages from service_k8s_v.json ansible.builtin.set_fact: service_k8s_image_list: "{{ telemetry_packages['service_k8s']['cluster'] | selectattr('type', 'equalto', 'image') | list }}" diff --git a/provision/roles/telemetry/tasks/main.yml b/provision/roles/telemetry/tasks/main.yml index 1693a8f1cd..522c95e769 100644 --- a/provision/roles/telemetry/tasks/main.yml +++ b/provision/roles/telemetry/tasks/main.yml @@ -24,7 +24,7 @@ - name: Derive sink support flags from collection_targets ansible.builtin.include_tasks: derive_sink_support_flags.yml -- name: Load service images from service_k8s.json +- name: Load service images from service_k8s_v.json ansible.builtin.include_tasks: load_service_images.yml - name: Check kube_vip reachability for validation diff --git a/provision/roles/telemetry/tasks/read_software_config.yml b/provision/roles/telemetry/tasks/read_software_config.yml index 005f9e65a2..86a4f9c02f 100644 --- a/provision/roles/telemetry/tasks/read_software_config.yml +++ b/provision/roles/telemetry/tasks/read_software_config.yml @@ -35,11 +35,11 @@ ansible.builtin.set_fact: cluster_os_version: "{{ software_config['cluster_os_version'] }}" -- name: Load service_k8s.json +- name: Load service_k8s_.json ansible.builtin.set_fact: telemetry_packages: "{{ lookup('file', k8s_packages_file) | from_json }}" -- name: Extract service_k8s.json and set facts for pip_modules and python_version +- name: Extract service_k8s_v.json and set facts for pip_modules and python_version ansible.builtin.set_fact: k8s_pip_packages: >- {{ telemetry_packages['service_kube_control_plane']['cluster'] diff --git a/provision/roles/telemetry/templates/telemetry/common/telemetry_pod_cleanup.yaml.j2 b/provision/roles/telemetry/templates/telemetry/common/telemetry_pod_cleanup.yaml.j2 index 3709759f78..acd8d35029 100644 --- a/provision/roles/telemetry/templates/telemetry/common/telemetry_pod_cleanup.yaml.j2 +++ b/provision/roles/telemetry/templates/telemetry/common/telemetry_pod_cleanup.yaml.j2 @@ -25,7 +25,7 @@ spec: tolerationSeconds: 30 # Evict after 30s if node is unreachable containers: - name: kubectl-cleanup - image: docker.io/alpine/kubectl:1.34.1 + image: docker.io/alpine/kubectl:1.35.1 command: - /bin/sh - -c diff --git a/provision/roles/telemetry/vars/main.yml b/provision/roles/telemetry/vars/main.yml index 6c8756c7c2..fe6cd52ca6 100644 --- a/provision/roles/telemetry/vars/main.yml +++ b/provision/roles/telemetry/vars/main.yml @@ -20,7 +20,8 @@ service_cluster_metadata_path: "/opt/omnia/.data/service_cluster_metadata.yml" metadata_perm: "0644" # Usage: read_software_config.yml -k8s_packages_file: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/service_k8s.json" +# Versioned JSON file: service_k8s_v.json (e.g., service_k8s_v1.35.1.json) +k8s_packages_file: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/service_k8s_v{{ hostvars['localhost']['service_k8s_version'] }}.json" # Usage: secrets_creation.yml mysqldb_secrets_name: mysqldb-credentials @@ -68,7 +69,7 @@ kafka: service_name: "kafka-headless" lb_service_name: "kafka-loadbalancer" container_port1: 9093 - # Kafka images from service_k8s.json + # Kafka images from service_k8s_v.json operator_image: "{{ telemetry_images['strimzi/operator'] | default('quay.io/strimzi/operator:0.48.0') }}" kafka_image: "{{ telemetry_images['strimzi/kafka'] | default('quay.io/strimzi/kafka:0.48.0-kafka-4.1.0') }}" bridge_image: "{{ telemetry_images['strimzi/kafka-bridge'] | default('quay.io/strimzi/kafka-bridge:0.33.1') }}" @@ -98,8 +99,8 @@ kafka: # name: "{{ ome_identifier }}.logs" # partitions: 2 -# Dynamic image configuration from service_k8s.json -# Images and versions are read dynamically from input/config/x86_64/rhel/10.0/service_k8s.json +# Dynamic image configuration from service_k8s_v.json +# Images and versions are read dynamically from input/config/x86_64/rhel/10.0/service_k8s_v.json telemetry_images: "{{ service_k8s_images | default({}) }}" # Usage: victoriametric_deployment.yml @@ -345,7 +346,7 @@ vmagent: strmzi_kafka_tarball_url: "{{ offline_tarball_path }}/{{ strimzi_kafka_pkg }}/{{ strimzi_kafka_pkg }}.tar.gz" # Victoria Metrics operator tarball configuration -# Version must match the Helm chart entry in service_k8s.json (victoria-metrics-operator-0.59.3) +# Version must match the Helm chart entry in service_k8s (versioned) (victoria-metrics-operator-0.59.3) # Required for VLCluster and VLAgent CRD support (minimum v0.59.0) victoria_operator_pkg: "victoria-metrics-operator-0.59.3" victoria_operator_tarball_url: "{{ offline_tarball_path }}/{{ victoria_operator_pkg }}/{{ victoria_operator_pkg }}.tar.gz" @@ -537,7 +538,7 @@ ps_telemetry_prepared_msg: >- Values file: {{ k8s_client_mount_path }}/karavi-observability/csm_metrics_values.yaml Deployment will occur during cloud-init (PXE boot) on the control plane node. ps_cert_manager_pkg_msg: >- - cert-manager package from service_k8s.json: {{ cert_manager_package | default('') }} ({{ cert_manager_chart_tgz | default('') }}) + cert-manager package from service_k8s (versioned): {{ cert_manager_package | default('') }} ({{ cert_manager_chart_tgz | default('') }}) ps_cert_manager_required_msg: "cert-manager dependency download: REQUIRED" ps_cert_manager_skipped_msg: "cert-manager dependency download: SKIPPED (disabled in values file)" ps_cert_manager_staged_msg: >- @@ -554,11 +555,11 @@ ps_cert_manager_extract_fail_msg: >- ps_cert_manager_missing_msg: >- cert-manager Helm chart ({{ cert_manager_chart_tgz | default('') }}) was not found in {{ karavi_helm_chart_path }}/charts/. This chart is required for TLS certificate - management. Ensure the Jetstack cert-manager entry exists in service_k8s.json + management. Ensure the Jetstack cert-manager entry exists in service_k8s (versioned) and run local_repo.yml to download it to Pulp. ps_dependency_fail_msg: >- Failed to get karavi-observability dependencies from Pulp. - Ensure the following entries exist in service_k8s.json and run local_repo.yml: + Ensure the following entries exist in service_k8s (versioned) and run local_repo.yml: - karavi-observability (git) - helm-charts (git) - {{ cert_manager_package | default('cert-manager') }} (tarball from Jetstack Helm repo) @@ -573,7 +574,7 @@ ps_dependency_fail_msg: >- # Architecture: # Kafka topics → Vector pods → vmagent-vector/vlagent-vector → Victoria sinks # Vector image (shared by all Vector pods: vector-ldms, vector-ome) -# Registered in service_k8s.json +# Registered in service_k8s (versioned) vector: image: "{{ telemetry_images['timberio/vector'] | default('docker.io/timberio/vector:0.54.0-debian') }}"