Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a713349
Added inputs and artifacts for k8s 1.35.1 and version-specific servic…
pullan1 Apr 24, 2026
106c24d
Merge pull request #4315 from pullan1/pub/q2_upgrade
jagadeeshnv Apr 24, 2026
5912e03
updated service_k8s json
pullan1 Apr 24, 2026
04d3e82
Merge pull request #4316 from pullan1/pub/q2_upgrade
snarthan Apr 24, 2026
d9fdbe5
Fix for k8s 1.35.1 fresh install support
pullan1 Apr 24, 2026
f7fae97
Feature branch sync - pub/q2_dev to pub/q2_upgrade (#4319)
abhishek-sa1 Apr 27, 2026
74e331f
updated kubectl to 1.35.1 in telemetry_pod_cleanup
pullan1 Apr 27, 2026
73d1209
Merge pull request #4321 from pullan1/pub/q2_upgrade
jagadeeshnv Apr 27, 2026
007e80b
localrepo support for k8s upgrade
pullan1 Apr 28, 2026
24760fd
updated vars
pullan1 Apr 28, 2026
973629a
Merge pull request #4325 from pullan1/pub/q2_upgrade
Katakam-Rakesh Apr 28, 2026
64f777a
provision update
abhishek-sa1 May 7, 2026
055c13b
update input validation
abhishek-sa1 May 7, 2026
ad47191
Merge branch 'q2_upgrade_sync' into q2_dev_sync
abhishek-sa1 May 7, 2026
4e7d091
update lint
abhishek-sa1 May 7, 2026
cf20a98
Merge pull request #65 from abhishek-sa1/q2_dev_sync
abhishek-sa1 May 7, 2026
9981137
Merge branch 'q2_upgrade_sync' of https://github.com/abhishek-sa1/omn…
abhishek-sa1 May 7, 2026
37edc41
Merge pull request #4381 from abhishek-sa1/q2_upgrade_sync
abhishek-sa1 May 8, 2026
c86e7bd
Merge pull request #4385 from dell/pub/q2_dev
abhishek-sa1 May 8, 2026
ed61b96
Update input config transformation for omnia upgrade and add previous…
mithileshreddy04 May 11, 2026
9b232c8
Initial draft upgrade structure (#4398)
abhishek-sa1 May 12, 2026
dd63d04
Merge pull request #4409 from dell/pub/q2_dev
abhishek-sa1 May 13, 2026
c45f836
Feature branch sync - pub/q2_dev to pub/q2_upgrade (#4412)
abhishek-sa1 May 13, 2026
9009192
Merge pull request #4423 from dell/pub/q2_dev
abhishek-sa1 May 14, 2026
40b7281
Merge pull request #4411 from mithileshreddy04/pub/q2_upgrade
mithileshreddy04 May 14, 2026
b0c03c5
Add Code for fresh k8s installation 1.35.1
Katakam-Rakesh May 14, 2026
8267233
update service_k8s_v1.35.1.json and local_repo_config.yml
Katakam-Rakesh May 14, 2026
8717f83
Merge branch 'pub/q2_dev' of https://github.com/Katakam-Rakesh/omnia …
Katakam-Rakesh May 14, 2026
288c488
update versioned service_k8s_v<service_k8s_version>.json instead of s…
Katakam-Rakesh May 14, 2026
ddc1fcf
Merge branch 'pub/q2_dev' of https://github.com/Katakam-Rakesh/omnia …
Katakam-Rakesh May 14, 2026
cb20910
Merge pull request #4414 from jagadeeshnv/pub/q2_upgrade
jagadeeshnv May 14, 2026
b7aa907
Merge branch 'dell:pub/q2_dev' into pub/q2_dev
Katakam-Rakesh May 14, 2026
df4b80b
update task names
Katakam-Rakesh May 14, 2026
61aff64
Merge branch 'pub/q2_dev' of https://github.com/Katakam-Rakesh/omnia …
Katakam-Rakesh May 14, 2026
6edc354
Feature branch sync - pub/q2_dev to pub/q2_upgrade (#4427)
abhishek-sa1 May 14, 2026
7252dc1
Merge branch 'pub/q2_upgrade' into pub/q2_dev
Katakam-Rakesh May 14, 2026
1d9c12e
Merge pull request #1 from Katakam-Rakesh/pub/q2_dev
Katakam-Rakesh May 14, 2026
b529611
Merge pull request #4433 from dell/pub/q2_dev
abhishek-sa1 May 14, 2026
b736df6
Fix lint issue
Katakam-Rakesh May 14, 2026
0631a3d
Merge pull request #4434 from Katakam-Rakesh/pub/q2_upgrade
snarthan May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ansible-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- pub/build_stream
- pub/q2_dev
- pub/telemetry
- pub/q2_upgrade

jobs:
build:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- pub/build_stream
- pub/q2_dev
- pub/telemetry
- pub/q2_upgrade

jobs:
build:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -1809,24 +1817,34 @@ 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:
with open(software_config_file_path, 'r', encoding='utf-8') as scf:
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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", ""
)
Expand All @@ -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", {}
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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"
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,24 +252,34 @@ 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:
with open(software_config_file_path, 'r', encoding='utf-8') as scf:
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 {
Expand Down
14 changes: 12 additions & 2 deletions common/library/module_utils/local_repo/software_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---

- name: Upgrade OIM tasks
hosts: localhost
connection: local
roles:
- role: ../utils/roles/include_input_dir
- role: upgrade_oim
"""
Upgrade Module Utilities

This package contains utilities for managing upgrade operations:
- Hop chain calculations
- Software configuration updates
- Component JSON repository updates
"""
Loading
Loading