mas-cli 23.7.0__tar.gz → 23.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mas_cli-23.7.0/python/src/mas_cli.egg-info → mas_cli-23.7.2}/PKG-INFO +1 -1
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/__init__.py +1 -1
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/cli.py +1 -1
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/app.py +21 -1
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/app.py +382 -5
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/argParser.py +2 -2
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/config.py +48 -36
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/ibm-mas-tekton.yaml +165 -139
- {mas_cli-23.7.0 → mas_cli-23.7.2/python/src/mas_cli.egg-info}/PKG-INFO +1 -1
- {mas_cli-23.7.0 → mas_cli-23.7.2}/LICENSE +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/README.md +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/pyproject.toml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/README.md +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/__main__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/argBuilder.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/params.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/summarizer.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/displayMixins.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/gencfg.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/argBuilder.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/catalogs.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/facilities/agents.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/params.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/additionalConfigs.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/aiSettings.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/db2Settings.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/kafkaSettings.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/manageSettings.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/mongodbSettings.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/summarizer.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/instance.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/pipelines.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/tenant.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/arg_parser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/argo/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/argo/applications.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/collection_plan.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/coreapi.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/crd_processor.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/parallel.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/pod_exec.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/pods.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/reconcile_logs.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/resources.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/secrets.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/task_generation.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/thread_safe_client.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/amlen.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/cert_manager.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/cp4d.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/db2.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/grafana.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/kafka.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/mongodb.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/rhoai.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/sls.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/utils.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/apps.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/core.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/licensing.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/manage.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/network_tests.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/pipelines.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/version.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/airgap.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/cluster.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/marketplace.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/nodes.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/output.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/parallel_executor.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/licensing.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/nodes.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/subscriptions.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/suite.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/timer.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/__main__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/templates/viewer.html +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/rbac_utils.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/aicfg.yml.j2 +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/app.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/argParser.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/settings/__init__.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/validators.py +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/SOURCES.txt +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/dependency_links.txt +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/entry_points.txt +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/requires.txt +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/top_level.txt +0 -0
- {mas_cli-23.7.0 → mas_cli-23.7.2}/setup.cfg +0 -0
|
@@ -126,7 +126,7 @@ class BaseApp(PrintMixin, PromptMixin):
|
|
|
126
126
|
logging.getLogger("urllib3").setLevel(logging.INFO)
|
|
127
127
|
|
|
128
128
|
# Supports extended semver, unlike mas.cli.__version__
|
|
129
|
-
self.version: str = "23.7.
|
|
129
|
+
self.version: str = "23.7.2"
|
|
130
130
|
self.h1count: int = 0
|
|
131
131
|
self.h2count: int = 0
|
|
132
132
|
|
|
@@ -662,7 +662,11 @@ class InstallApp(
|
|
|
662
662
|
self.configOperationMode()
|
|
663
663
|
self.configCATrust()
|
|
664
664
|
self.configDNSAndCerts()
|
|
665
|
-
|
|
665
|
+
|
|
666
|
+
# temporarily disabiliing configuring routing mode
|
|
667
|
+
# self.configRoutingMode()
|
|
668
|
+
self.setParam("mas_routing_mode", "subdomain")
|
|
669
|
+
|
|
666
670
|
self.configServiceMesh()
|
|
667
671
|
self.configSSOProperties()
|
|
668
672
|
self.configSpecialCharacters()
|
|
@@ -2762,6 +2766,22 @@ class InstallApp(
|
|
|
2762
2766
|
]
|
|
2763
2767
|
)
|
|
2764
2768
|
|
|
2769
|
+
# Currently no 9.2.x patch support path based routing as that changes this will need to change
|
|
2770
|
+
# to filter on the specific patch version
|
|
2771
|
+
if self.getParam("mas_routing_mode") == "path":
|
|
2772
|
+
self.fatalError(
|
|
2773
|
+
"\n".join(
|
|
2774
|
+
[
|
|
2775
|
+
"Path based routing mode not supported",
|
|
2776
|
+
"========================================================================",
|
|
2777
|
+
"Path based routing is not currently supported",
|
|
2778
|
+
"",
|
|
2779
|
+
"Use subdomain routing mode:",
|
|
2780
|
+
" mas install --routing subdomain ...",
|
|
2781
|
+
]
|
|
2782
|
+
)
|
|
2783
|
+
)
|
|
2784
|
+
|
|
2765
2785
|
# Validate IngressController configuration for path-based routing (non-interactive mode only)
|
|
2766
2786
|
if not self.isInteractiveMode and self.getParam("mas_routing_mode") == "path":
|
|
2767
2787
|
ingressControllerName = None
|
|
@@ -10,12 +10,14 @@
|
|
|
10
10
|
# *****************************************************************************
|
|
11
11
|
|
|
12
12
|
import base64
|
|
13
|
+
import glob
|
|
13
14
|
import json
|
|
14
15
|
import logging
|
|
15
16
|
import re
|
|
16
17
|
import selectors
|
|
17
18
|
import shutil
|
|
18
19
|
import subprocess
|
|
20
|
+
import tempfile
|
|
19
21
|
import yaml
|
|
20
22
|
import urllib.request
|
|
21
23
|
import urllib.error
|
|
@@ -30,7 +32,7 @@ from mas.devops.data import getCatalog, NoSuchCatalogError
|
|
|
30
32
|
|
|
31
33
|
from ..cli import BaseApp
|
|
32
34
|
from .argParser import mirrorArgParser
|
|
33
|
-
from .config import PACKAGE_CONFIGS
|
|
35
|
+
from .config import PACKAGE_CONFIGS, HELM_ONLY_CHART_CONFIGS
|
|
34
36
|
|
|
35
37
|
logger = logging.getLogger(__name__)
|
|
36
38
|
|
|
@@ -596,6 +598,289 @@ def mirrorCatalog(
|
|
|
596
598
|
return _executeMirror(configPath, displayName, workspacePath, mode, targetRegistry, ocMirrorPath, authFilePath, rootDir, destTlsVerify, imageTimeout)
|
|
597
599
|
|
|
598
600
|
|
|
601
|
+
def getChartMetadata(caseName: str, caseVersion: str) -> str:
|
|
602
|
+
"""
|
|
603
|
+
Get the chart metadata file for a CPD CASE bundle, downloading from GitHub if missing.
|
|
604
|
+
|
|
605
|
+
The metadata file lives at:
|
|
606
|
+
~/.ibm-mas/image-set-configs/charts/<caseName>/<major.minor>/<caseName>-<version>.yaml
|
|
607
|
+
|
|
608
|
+
If not present locally it is fetched from:
|
|
609
|
+
https://raw.githubusercontent.com/ibm-mas/image-set-configs/master/charts/...
|
|
610
|
+
|
|
611
|
+
Args:
|
|
612
|
+
caseName: CASE bundle name (e.g., "ibm-wsl")
|
|
613
|
+
caseVersion: CASE version stripped of build metadata (e.g., "11.0.0")
|
|
614
|
+
|
|
615
|
+
Returns:
|
|
616
|
+
Full local path to the chart metadata YAML file
|
|
617
|
+
|
|
618
|
+
Raises:
|
|
619
|
+
FileNotFoundError: If the file does not exist locally and cannot be downloaded
|
|
620
|
+
"""
|
|
621
|
+
versionParts = caseVersion.split(".")
|
|
622
|
+
if len(versionParts) < 2:
|
|
623
|
+
raise FileNotFoundError(f"Cannot resolve chart metadata path: invalid version '{caseVersion}' for {caseName}")
|
|
624
|
+
|
|
625
|
+
majorMinor = f"{versionParts[0]}.{versionParts[1]}"
|
|
626
|
+
relativeConfigPath = f"charts/{caseName}/{majorMinor}/{caseName}-{caseVersion}.yaml"
|
|
627
|
+
return getISC(relativeConfigPath)
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
@dataclass
|
|
631
|
+
class ChartMirrorResult:
|
|
632
|
+
"""Result of a helm chart mirror operation for one CASE bundle."""
|
|
633
|
+
|
|
634
|
+
caseName: str
|
|
635
|
+
total: int
|
|
636
|
+
mirrored: int
|
|
637
|
+
failed: List[str] = field(default_factory=list)
|
|
638
|
+
|
|
639
|
+
@property
|
|
640
|
+
def success(self) -> bool:
|
|
641
|
+
"""
|
|
642
|
+
Determine if all charts were mirrored successfully.
|
|
643
|
+
|
|
644
|
+
Returns:
|
|
645
|
+
True if total > 0 and all charts mirrored without error
|
|
646
|
+
"""
|
|
647
|
+
return self.total > 0 and self.mirrored == self.total
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
def _helmLogin(registry: str, username: str, password: str) -> bool:
|
|
651
|
+
"""
|
|
652
|
+
Log in to an OCI Helm registry.
|
|
653
|
+
|
|
654
|
+
Uses HELM_REGISTRY_CA_FILE environment variable for TLS verification if set,
|
|
655
|
+
otherwise falls back to --insecure.
|
|
656
|
+
|
|
657
|
+
Args:
|
|
658
|
+
registry: Registry hostname (and optional port), e.g. "myregistry:5000"
|
|
659
|
+
username: Registry username
|
|
660
|
+
password: Registry password
|
|
661
|
+
|
|
662
|
+
Returns:
|
|
663
|
+
True on success, False on failure
|
|
664
|
+
"""
|
|
665
|
+
cmd = ["helm", "registry", "login", registry, "--username", username, "--password", password]
|
|
666
|
+
caFile = environ.get("HELM_REGISTRY_CA_FILE", "")
|
|
667
|
+
if caFile:
|
|
668
|
+
cmd += ["--ca-file", caFile]
|
|
669
|
+
logger.info(f"Logging in to Helm OCI registry: {registry} (using CA file: {caFile})")
|
|
670
|
+
else:
|
|
671
|
+
cmd.append("--insecure")
|
|
672
|
+
logger.info(f"Logging in to Helm OCI registry: {registry} (insecure — set HELM_REGISTRY_CA_FILE to use a custom CA)")
|
|
673
|
+
try:
|
|
674
|
+
result = subprocess.run(cmd, capture_output=True, text=True)
|
|
675
|
+
if result.returncode != 0:
|
|
676
|
+
logger.error(f"helm registry login failed: {result.stderr.strip()}")
|
|
677
|
+
return False
|
|
678
|
+
logger.info("Helm registry login successful")
|
|
679
|
+
return True
|
|
680
|
+
except Exception as e:
|
|
681
|
+
logger.error(f"helm registry login error: {e}")
|
|
682
|
+
return False
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
def mirrorCharts(
|
|
686
|
+
caseName: str,
|
|
687
|
+
caseVersion: str,
|
|
688
|
+
mode: str,
|
|
689
|
+
targetRegistry: str = "",
|
|
690
|
+
registryUsername: str = "",
|
|
691
|
+
registryPassword: str = "",
|
|
692
|
+
rootDir: str = "",
|
|
693
|
+
) -> ChartMirrorResult:
|
|
694
|
+
"""
|
|
695
|
+
Mirror Helm charts for a CPD CASE bundle to/from a target OCI registry.
|
|
696
|
+
|
|
697
|
+
Mirrors only bundles listed in the chart metadata files in the ibm-mas/image-set-configs
|
|
698
|
+
charts/ directory (ibm-wsl, ibm-wml-cpd, ibm-analyticsengine, ibm-datarefinery,
|
|
699
|
+
ibm-wsl-runtimes). Skips silently for bundles with no chart metadata.
|
|
700
|
+
|
|
701
|
+
Mode behaviour mirrors the Ansible mirror_helm.yml logic:
|
|
702
|
+
- m2m: helm pull each chart into a temp dir, then helm push to target OCI registry
|
|
703
|
+
- m2d: helm pull each chart into <rootDir>/charts/<caseName>/<caseVersion>/
|
|
704
|
+
- d2m: helm push each .tgz from <rootDir>/charts/<caseName>/<caseVersion>/ to target registry
|
|
705
|
+
|
|
706
|
+
Args:
|
|
707
|
+
caseName: CASE bundle name (e.g., "ibm-wsl")
|
|
708
|
+
caseVersion: CASE bundle version from catalog (e.g., "11.0.0+20250521.202913.73")
|
|
709
|
+
mode: Mirror mode ("m2m", "m2d", or "d2m")
|
|
710
|
+
targetRegistry: Target OCI registry for m2m and d2m (e.g., "myregistry:5000/cpd/charts")
|
|
711
|
+
registryUsername: Registry username for helm registry login
|
|
712
|
+
registryPassword: Registry password for helm registry login
|
|
713
|
+
rootDir: Root directory for disk operations (m2d destination, d2m source)
|
|
714
|
+
|
|
715
|
+
Returns:
|
|
716
|
+
ChartMirrorResult with counts of attempted and successfully mirrored charts
|
|
717
|
+
"""
|
|
718
|
+
# Strip build metadata suffix for file/path lookups
|
|
719
|
+
fileVersion = caseVersion.split("+")[0]
|
|
720
|
+
|
|
721
|
+
# Try to load chart metadata; skip gracefully if not found
|
|
722
|
+
try:
|
|
723
|
+
metadataPath = getChartMetadata(caseName, fileVersion)
|
|
724
|
+
except FileNotFoundError:
|
|
725
|
+
logger.info(f"No chart metadata found for {caseName} {fileVersion} — skipping helm chart mirror")
|
|
726
|
+
return ChartMirrorResult(caseName=caseName, total=0, mirrored=0)
|
|
727
|
+
|
|
728
|
+
with open(metadataPath, "r") as f:
|
|
729
|
+
metadata = yaml.safe_load(f)
|
|
730
|
+
|
|
731
|
+
helmRepo = metadata.get("helm_repo", "https://raw.githubusercontent.com/IBM/charts/master/repo/ibm-helm")
|
|
732
|
+
charts = metadata.get("charts", [])
|
|
733
|
+
|
|
734
|
+
if not charts:
|
|
735
|
+
logger.info(f"No charts listed in metadata for {caseName} — skipping")
|
|
736
|
+
return ChartMirrorResult(caseName=caseName, total=0, mirrored=0)
|
|
737
|
+
|
|
738
|
+
# Register the Helm repo so helm pull can resolve chart names via an alias.
|
|
739
|
+
# Passing a raw GitHub URL directly to helm pull is not valid — it requires
|
|
740
|
+
# either an OCI ref or a registered repo alias backed by an index.yaml.
|
|
741
|
+
helmRepoAlias = f"ibm-mas-charts-{caseName}"
|
|
742
|
+
repoAddCmd = ["helm", "repo", "add", helmRepoAlias, helmRepo, "--force-update"]
|
|
743
|
+
logger.info(f"Registering Helm repo: {helmRepo} as {helmRepoAlias}")
|
|
744
|
+
repoAddResult = subprocess.run(repoAddCmd, capture_output=True, text=True)
|
|
745
|
+
if repoAddResult.returncode != 0:
|
|
746
|
+
logger.error(f"helm repo add failed: {repoAddResult.stderr.strip()}")
|
|
747
|
+
failed = [f"{c['name']}:{c['version']}" for c in charts]
|
|
748
|
+
return ChartMirrorResult(caseName=caseName, total=len(charts), mirrored=0, failed=failed)
|
|
749
|
+
subprocess.run(["helm", "repo", "update", helmRepoAlias], capture_output=True, text=True)
|
|
750
|
+
|
|
751
|
+
# Registry hostname only (strip any path after the first /) — used for helm registry login
|
|
752
|
+
registryHost = targetRegistry.split("/")[0] if targetRegistry else ""
|
|
753
|
+
|
|
754
|
+
# Login to OCI registry for push modes
|
|
755
|
+
if mode in ["m2m", "d2m"] and registryHost and registryUsername:
|
|
756
|
+
if not _helmLogin(registryHost, registryUsername, registryPassword):
|
|
757
|
+
failed = [f"{c['name']}:{c['version']}" for c in charts]
|
|
758
|
+
return ChartMirrorResult(caseName=caseName, total=len(charts), mirrored=0, failed=failed)
|
|
759
|
+
|
|
760
|
+
result = ChartMirrorResult(caseName=caseName, total=len(charts), mirrored=0)
|
|
761
|
+
|
|
762
|
+
if mode == "m2m":
|
|
763
|
+
# Pull each chart into a temp dir, then push to OCI registry
|
|
764
|
+
with tempfile.TemporaryDirectory() as tmpDir:
|
|
765
|
+
for chart in charts:
|
|
766
|
+
chartName = chart["name"]
|
|
767
|
+
chartVersion = chart["version"]
|
|
768
|
+
displayLabel = f"{chartName}:{chartVersion}"
|
|
769
|
+
|
|
770
|
+
pullCmd = [
|
|
771
|
+
"helm",
|
|
772
|
+
"pull",
|
|
773
|
+
f"{helmRepoAlias}/{chartName}",
|
|
774
|
+
"--version",
|
|
775
|
+
chartVersion,
|
|
776
|
+
"--destination",
|
|
777
|
+
tmpDir,
|
|
778
|
+
]
|
|
779
|
+
logger.info(f"Pulling chart: {displayLabel}")
|
|
780
|
+
pullResult = subprocess.run(pullCmd, capture_output=True, text=True)
|
|
781
|
+
if pullResult.returncode != 0:
|
|
782
|
+
logger.error(f"helm pull failed for {displayLabel}: {pullResult.stderr.strip()}")
|
|
783
|
+
result.failed.append(displayLabel)
|
|
784
|
+
continue
|
|
785
|
+
|
|
786
|
+
# Find the downloaded .tgz (helm names it <chart>-<version>.tgz)
|
|
787
|
+
tgzPattern = path.join(tmpDir, f"{chartName}-{chartVersion}.tgz")
|
|
788
|
+
tgzFiles = glob.glob(tgzPattern)
|
|
789
|
+
if not tgzFiles:
|
|
790
|
+
# Fallback: any .tgz in tmpDir matching chart name
|
|
791
|
+
tgzFiles = glob.glob(path.join(tmpDir, f"{chartName}-*.tgz"))
|
|
792
|
+
if not tgzFiles:
|
|
793
|
+
logger.error(f"Downloaded chart archive not found for {displayLabel} in {tmpDir}")
|
|
794
|
+
result.failed.append(displayLabel)
|
|
795
|
+
continue
|
|
796
|
+
|
|
797
|
+
pushCmd = ["helm", "push", tgzFiles[0], f"oci://{targetRegistry}", "--insecure-skip-tls-verify"]
|
|
798
|
+
logger.info(f"Pushing chart: {displayLabel} → oci://{targetRegistry}")
|
|
799
|
+
pushResult = subprocess.run(pushCmd, capture_output=True, text=True)
|
|
800
|
+
if pushResult.returncode != 0:
|
|
801
|
+
logger.error(f"helm push failed for {displayLabel}: {pushResult.stderr.strip()}")
|
|
802
|
+
result.failed.append(displayLabel)
|
|
803
|
+
continue
|
|
804
|
+
|
|
805
|
+
logger.info(f"Successfully mirrored chart: {displayLabel}")
|
|
806
|
+
result.mirrored += 1
|
|
807
|
+
|
|
808
|
+
elif mode == "m2d":
|
|
809
|
+
# Pull each chart into the disk working directory
|
|
810
|
+
diskDir = path.join(rootDir, "charts", caseName, fileVersion)
|
|
811
|
+
makedirs(diskDir, exist_ok=True)
|
|
812
|
+
|
|
813
|
+
for chart in charts:
|
|
814
|
+
chartName = chart["name"]
|
|
815
|
+
chartVersion = chart["version"]
|
|
816
|
+
displayLabel = f"{chartName}:{chartVersion}"
|
|
817
|
+
|
|
818
|
+
tgzDest = path.join(diskDir, f"{chartName}-{chartVersion}.tgz")
|
|
819
|
+
if path.exists(tgzDest):
|
|
820
|
+
logger.info(f"Chart archive already exists, skipping pull: {tgzDest}")
|
|
821
|
+
result.mirrored += 1
|
|
822
|
+
continue
|
|
823
|
+
|
|
824
|
+
pullCmd = [
|
|
825
|
+
"helm",
|
|
826
|
+
"pull",
|
|
827
|
+
f"{helmRepoAlias}/{chartName}",
|
|
828
|
+
"--version",
|
|
829
|
+
chartVersion,
|
|
830
|
+
"--destination",
|
|
831
|
+
diskDir,
|
|
832
|
+
]
|
|
833
|
+
logger.info(f"Pulling chart to disk: {displayLabel} → {diskDir}")
|
|
834
|
+
pullResult = subprocess.run(pullCmd, capture_output=True, text=True)
|
|
835
|
+
if pullResult.returncode != 0:
|
|
836
|
+
logger.error(f"helm pull failed for {displayLabel}: {pullResult.stderr.strip()}")
|
|
837
|
+
result.failed.append(displayLabel)
|
|
838
|
+
continue
|
|
839
|
+
|
|
840
|
+
logger.info(f"Successfully pulled chart to disk: {displayLabel}")
|
|
841
|
+
result.mirrored += 1
|
|
842
|
+
|
|
843
|
+
elif mode == "d2m":
|
|
844
|
+
# Push each .tgz from the disk working directory to the OCI registry
|
|
845
|
+
diskDir = path.join(rootDir, "charts", caseName, fileVersion)
|
|
846
|
+
if not path.exists(diskDir):
|
|
847
|
+
logger.warning(f"Chart disk directory not found for {caseName}: {diskDir}")
|
|
848
|
+
failed = [f"{c['name']}:{c['version']}" for c in charts]
|
|
849
|
+
return ChartMirrorResult(caseName=caseName, total=len(charts), mirrored=0, failed=failed)
|
|
850
|
+
|
|
851
|
+
for chart in charts:
|
|
852
|
+
chartName = chart["name"]
|
|
853
|
+
chartVersion = chart["version"]
|
|
854
|
+
displayLabel = f"{chartName}:{chartVersion}"
|
|
855
|
+
|
|
856
|
+
tgzPattern = path.join(diskDir, f"{chartName}-{chartVersion}.tgz")
|
|
857
|
+
tgzFiles = glob.glob(tgzPattern)
|
|
858
|
+
if not tgzFiles:
|
|
859
|
+
tgzFiles = glob.glob(path.join(diskDir, f"{chartName}-*.tgz"))
|
|
860
|
+
if not tgzFiles:
|
|
861
|
+
logger.error(f"Chart archive not found on disk for {displayLabel} in {diskDir}")
|
|
862
|
+
result.failed.append(displayLabel)
|
|
863
|
+
continue
|
|
864
|
+
|
|
865
|
+
pushCmd = ["helm", "push", tgzFiles[0], f"oci://{targetRegistry}", "--insecure-skip-tls-verify"]
|
|
866
|
+
logger.info(f"Pushing chart from disk: {displayLabel} → oci://{targetRegistry}")
|
|
867
|
+
pushResult = subprocess.run(pushCmd, capture_output=True, text=True)
|
|
868
|
+
if pushResult.returncode != 0:
|
|
869
|
+
logger.error(f"helm push failed for {displayLabel}: {pushResult.stderr.strip()}")
|
|
870
|
+
result.failed.append(displayLabel)
|
|
871
|
+
continue
|
|
872
|
+
|
|
873
|
+
logger.info(f"Successfully pushed chart: {displayLabel}")
|
|
874
|
+
result.mirrored += 1
|
|
875
|
+
|
|
876
|
+
else:
|
|
877
|
+
logger.error(f"Unsupported mode for chart mirroring: {mode}")
|
|
878
|
+
failed = [f"{c['name']}:{c['version']}" for c in charts]
|
|
879
|
+
return ChartMirrorResult(caseName=caseName, total=len(charts), mirrored=0, failed=failed)
|
|
880
|
+
|
|
881
|
+
return result
|
|
882
|
+
|
|
883
|
+
|
|
599
884
|
def validateEnvironmentVariables(mode: str, targetRegistry: str) -> None:
|
|
600
885
|
"""
|
|
601
886
|
Validate that required environment variables are set based on the mirror mode.
|
|
@@ -810,7 +1095,7 @@ class MirrorApp(BaseApp):
|
|
|
810
1095
|
|
|
811
1096
|
# Mirror each package with common parameters using shared configuration
|
|
812
1097
|
currentGroup = None
|
|
813
|
-
for group, argName, packageName, catalogKey in PACKAGE_CONFIGS:
|
|
1098
|
+
for group, argName, packageName, catalogKey, has_HelmCharts in PACKAGE_CONFIGS:
|
|
814
1099
|
# Print section header when group changes
|
|
815
1100
|
if group != currentGroup:
|
|
816
1101
|
self.printH1(group)
|
|
@@ -883,6 +1168,80 @@ class MirrorApp(BaseApp):
|
|
|
883
1168
|
if not packageResult.success:
|
|
884
1169
|
failedMirrors.append(packageResult)
|
|
885
1170
|
|
|
1171
|
+
# Mirror Helm charts for CPD packages (CPD 5.2.0+ only).
|
|
1172
|
+
# Derived from PACKAGE_CONFIGS (has_HelmCharts=True) plus HELM_ONLY_CHART_CONFIGS
|
|
1173
|
+
# for bundles that have charts but no standalone ISC image files.
|
|
1174
|
+
# To add/remove a CASE from helm chart mirroring, update config.py only.
|
|
1175
|
+
seen: set = set()
|
|
1176
|
+
CHART_CASE_CATALOG_KEYS = []
|
|
1177
|
+
for _section, argName, packageName, catalogKey, has_HelmCharts in PACKAGE_CONFIGS:
|
|
1178
|
+
if has_HelmCharts and packageName not in seen:
|
|
1179
|
+
CHART_CASE_CATALOG_KEYS.append((packageName, catalogKey, argName))
|
|
1180
|
+
seen.add(packageName)
|
|
1181
|
+
for packageName, catalogKey, argName in HELM_ONLY_CHART_CONFIGS:
|
|
1182
|
+
if packageName not in seen:
|
|
1183
|
+
CHART_CASE_CATALOG_KEYS.append((packageName, catalogKey, argName))
|
|
1184
|
+
seen.add(packageName)
|
|
1185
|
+
|
|
1186
|
+
# Gate: only run if cpd_product_version_default >= 5.2.0
|
|
1187
|
+
cpdVersionRaw = catalog.get("cpd_product_version_default", "")
|
|
1188
|
+
cpdHelmEligible = False
|
|
1189
|
+
failedChartMirrors: List[ChartMirrorResult] = []
|
|
1190
|
+
try:
|
|
1191
|
+
cpdMajor, cpdMinor = str(cpdVersionRaw).split(".")[:2]
|
|
1192
|
+
cpdHelmEligible = (int(cpdMajor), int(cpdMinor)) >= (5, 2)
|
|
1193
|
+
except (ValueError, AttributeError):
|
|
1194
|
+
pass
|
|
1195
|
+
|
|
1196
|
+
if cpdHelmEligible:
|
|
1197
|
+
# Collect registry credentials for helm registry login
|
|
1198
|
+
registryUsername = environ.get("REGISTRY_USERNAME", "")
|
|
1199
|
+
registryPassword = environ.get("REGISTRY_PASSWORD", "")
|
|
1200
|
+
|
|
1201
|
+
self.printH1("Cloud Pak for Data - Helm Charts")
|
|
1202
|
+
|
|
1203
|
+
for caseName, catalogKey, argName in CHART_CASE_CATALOG_KEYS:
|
|
1204
|
+
# Only mirror if the corresponding image flag was set
|
|
1205
|
+
flagAttr = argName.replace("-", "_")
|
|
1206
|
+
chartFlag = mirrorAll or getattr(args, flagAttr, False)
|
|
1207
|
+
if not chartFlag:
|
|
1208
|
+
displayName = f"{caseName} (helm charts)"
|
|
1209
|
+
print(f"{displayName.ljust(50)} ⏭️ {EMPTY_PROGRESS_BAR} Mirroring disabled by user")
|
|
1210
|
+
continue
|
|
1211
|
+
|
|
1212
|
+
caseVersion = catalog.get(catalogKey, "")
|
|
1213
|
+
# ibm-wsl-runtimes falls back to wsl_version if wsl_runtimes_version absent
|
|
1214
|
+
if not caseVersion and catalogKey == "wsl_runtimes_version":
|
|
1215
|
+
caseVersion = catalog.get("wsl_version", "")
|
|
1216
|
+
|
|
1217
|
+
if not caseVersion:
|
|
1218
|
+
logger.info(f"No catalog version for {caseName} ({catalogKey}) — skipping charts")
|
|
1219
|
+
displayName = f"{caseName} (helm charts)"
|
|
1220
|
+
print(f"{displayName.ljust(50)} ⏭️ {EMPTY_PROGRESS_BAR} No catalog version available")
|
|
1221
|
+
continue
|
|
1222
|
+
|
|
1223
|
+
displayName = f"{caseName} (helm charts)"
|
|
1224
|
+
print(f"Mirroring Helm charts: {displayName}")
|
|
1225
|
+
chartResult = mirrorCharts(
|
|
1226
|
+
caseName=caseName,
|
|
1227
|
+
caseVersion=caseVersion,
|
|
1228
|
+
mode=mode,
|
|
1229
|
+
targetRegistry=f"{targetRegistry}/charts",
|
|
1230
|
+
registryUsername=registryUsername,
|
|
1231
|
+
registryPassword=registryPassword,
|
|
1232
|
+
rootDir=rootDir,
|
|
1233
|
+
)
|
|
1234
|
+
|
|
1235
|
+
if chartResult.total == 0:
|
|
1236
|
+
print(f"{displayName.ljust(50)} ⏭️ {EMPTY_PROGRESS_BAR} No chart metadata found")
|
|
1237
|
+
elif chartResult.success:
|
|
1238
|
+
print(f"{displayName.ljust(50)} ✅ {chartResult.mirrored}/{chartResult.total} charts mirrored")
|
|
1239
|
+
else:
|
|
1240
|
+
print(f"{displayName.ljust(50)} ⚠️ {chartResult.mirrored}/{chartResult.total} charts mirrored")
|
|
1241
|
+
failedChartMirrors.append(chartResult)
|
|
1242
|
+
else:
|
|
1243
|
+
logger.info(f"CPD version {cpdVersionRaw!r} < 5.2.0 or not set — skipping Helm chart mirroring")
|
|
1244
|
+
|
|
886
1245
|
# Report final status
|
|
887
1246
|
if len(failedMirrors) > 0:
|
|
888
1247
|
failedImages = totalImages - mirroredImages
|
|
@@ -894,10 +1253,28 @@ class MirrorApp(BaseApp):
|
|
|
894
1253
|
if result.failed_images:
|
|
895
1254
|
for failed_image in result.failed_images:
|
|
896
1255
|
print_formatted_text(HTML(f"<ansired> - {failed_image}</ansired>"))
|
|
1256
|
+
|
|
1257
|
+
if cpdHelmEligible and failedChartMirrors:
|
|
1258
|
+
for chartResult in failedChartMirrors:
|
|
1259
|
+
print_formatted_text(
|
|
1260
|
+
HTML(f"<ansired>- {chartResult.caseName} (helm charts) - {len(chartResult.failed)}/{chartResult.total} charts failed</ansired>")
|
|
1261
|
+
)
|
|
1262
|
+
for fc in chartResult.failed:
|
|
1263
|
+
print_formatted_text(HTML(f"<ansired> - {fc}</ansired>"))
|
|
897
1264
|
else:
|
|
898
|
-
|
|
899
|
-
if
|
|
900
|
-
print_formatted_text(HTML(
|
|
1265
|
+
allChartsOk = not cpdHelmEligible or not failedChartMirrors
|
|
1266
|
+
if allChartsOk:
|
|
1267
|
+
print_formatted_text(HTML("\n<B>✅ Mirror operation completed successfully</B>"))
|
|
1268
|
+
if totalImages > 0:
|
|
1269
|
+
print_formatted_text(HTML(f"Successfully mirrored {mirroredImages} images"))
|
|
1270
|
+
else:
|
|
1271
|
+
print_formatted_text(HTML("\n<B>⚠️ Mirror operation completed with Helm chart failures</B>"))
|
|
1272
|
+
if totalImages > 0:
|
|
1273
|
+
print_formatted_text(HTML(f"Successfully mirrored {mirroredImages} images"))
|
|
1274
|
+
for chartResult in failedChartMirrors:
|
|
1275
|
+
print_formatted_text(
|
|
1276
|
+
HTML(f"<ansired>- {chartResult.caseName} (helm charts) - {len(chartResult.failed)}/{chartResult.total} charts failed</ansired>")
|
|
1277
|
+
)
|
|
901
1278
|
|
|
902
1279
|
def _isUnsupportedPackage(self, version: str, packageName: str) -> bool:
|
|
903
1280
|
unsupported = False
|
|
@@ -82,7 +82,7 @@ mainGroup.add_argument(
|
|
|
82
82
|
|
|
83
83
|
# Group configs by (groupName, argName) to deduplicate and aggregate packages
|
|
84
84
|
arg_map = defaultdict(list)
|
|
85
|
-
for group, argName, packageName, versionKey in PACKAGE_CONFIGS:
|
|
85
|
+
for group, argName, packageName, versionKey, has_HelmCharts in PACKAGE_CONFIGS:
|
|
86
86
|
arg_map[(group, argName)].append(packageName)
|
|
87
87
|
|
|
88
88
|
# Now create arguments with deduplicated argNames and aggregated package lists
|
|
@@ -91,7 +91,7 @@ for groupName, groupItems in groupby(PACKAGE_CONFIGS, key=lambda x: x[0]):
|
|
|
91
91
|
# Track which argNames we've already added to this group
|
|
92
92
|
added_args = set()
|
|
93
93
|
|
|
94
|
-
for group, argName, packageName, _ in groupItems:
|
|
94
|
+
for group, argName, packageName, _, _has_HelmCharts in groupItems:
|
|
95
95
|
if argName not in added_args:
|
|
96
96
|
added_args.add(argName)
|
|
97
97
|
# Get all package names for this argName
|
|
@@ -8,41 +8,53 @@
|
|
|
8
8
|
#
|
|
9
9
|
# *****************************************************************************
|
|
10
10
|
|
|
11
|
+
# Each tuple: (section, argName, packageName, catalogKey, has_HelmCharts)
|
|
12
|
+
# has_HelmCharts=True for CPD CASE bundles that also ship Helm charts.
|
|
13
|
+
# These drive both image mirroring (via oc-mirror) and helm chart mirroring.
|
|
11
14
|
PACKAGE_CONFIGS = [
|
|
12
|
-
("Required Dependencies", "sls", "ibm-sls", "sls_version"),
|
|
13
|
-
("Required Dependencies", "tsm", "ibm-truststore-mgr", "tsm_version"),
|
|
14
|
-
("Optional Dependencies", "amlen", "amlen", "amlen_extras_version"),
|
|
15
|
-
("Optional Dependencies", "aiservice", "ibm-aiservice", "aiservice_version"),
|
|
16
|
-
("Optional Dependencies", "aiservice", "ibm-aiservice-tenant", "aiservice_tenant_version"),
|
|
17
|
-
("Optional Dependencies", "aiservice", "opendatahub", "odh_version"),
|
|
18
|
-
("Optional Dependencies", "aiservice", "minio", "minio_extras_version"),
|
|
19
|
-
("Optional Dependencies", "data-dictionary", "ibm-data-dictionary", "dd_version"),
|
|
20
|
-
("Optional Dependencies", "db2u-s11", "ibm-db2uoperator-s11", "db2u_version"),
|
|
21
|
-
("Optional Dependencies", "db2u-s12", "ibm-db2uoperator-s12", "db2u_version"),
|
|
22
|
-
("Optional Dependencies", "mongodb-ce", "mongodb-ce", "mongo_extras_version_default"),
|
|
23
|
-
("Maximo Application Suite", "core", "ibm-mas", "mas_core_version"),
|
|
24
|
-
("Maximo Application Suite", "assist", "ibm-mas-assist", "mas_assist_version"),
|
|
25
|
-
("Maximo Application Suite", "assist", "ibm-couchdb", "couchdb_version"),
|
|
26
|
-
("Maximo Application Suite", "iot", "ibm-mas-iot", "mas_iot_version"),
|
|
27
|
-
("Maximo Application Suite", "facilities", "ibm-mas-facilities", "mas_facilities_version"),
|
|
28
|
-
("Maximo Application Suite", "manage", "ibm-mas-manage", "mas_manage_version"),
|
|
29
|
-
("Maximo Application Suite", "manage-icd", "ibm-mas-manage-icd", "mas_manage_version"),
|
|
30
|
-
("Maximo Application Suite", "monitor", "ibm-mas-monitor", "mas_monitor_version"),
|
|
31
|
-
("Maximo Application Suite", "predict", "ibm-mas-predict", "mas_predict_version"),
|
|
32
|
-
("Maximo Application Suite", "optimizer", "ibm-mas-optimizer", "mas_optimizer_version"),
|
|
33
|
-
("Maximo Application Suite", "visualinspection", "ibm-mas-visualinspection", "mas_visualinspection_version"),
|
|
34
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cp-common-services", "common_svcs_version"),
|
|
35
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-zen", "ibm_zen_version"),
|
|
36
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cp-datacore", "cp4d_platform_version"),
|
|
37
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-licensing", "ibm_licensing_version"),
|
|
38
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-ccs", "ccs_build"),
|
|
39
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cloud-native-postgresql", "postgress_version"),
|
|
40
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-datarefinery", "datarefinery_version"),
|
|
41
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-elasticsearch-operator", "elasticsearch_version"),
|
|
42
|
-
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-opensearch-operator", "opensearch_version"),
|
|
43
|
-
("Cloud Pak for Data - WSL", "cp4d-wsl", "ibm-wsl", "wsl_version"),
|
|
44
|
-
("Cloud Pak for Data - WSL", "cp4d-wsl", "ibm-wsl-runtimes", "wsl_runtimes_version"),
|
|
45
|
-
("Cloud Pak for Data - WML", "cp4d-wml", "ibm-wml-cpd", "wml_version"),
|
|
46
|
-
("Cloud Pak for Data -
|
|
47
|
-
("Cloud Pak for Data -
|
|
15
|
+
("Required Dependencies", "sls", "ibm-sls", "sls_version", False),
|
|
16
|
+
("Required Dependencies", "tsm", "ibm-truststore-mgr", "tsm_version", False),
|
|
17
|
+
("Optional Dependencies", "amlen", "amlen", "amlen_extras_version", False),
|
|
18
|
+
("Optional Dependencies", "aiservice", "ibm-aiservice", "aiservice_version", False),
|
|
19
|
+
("Optional Dependencies", "aiservice", "ibm-aiservice-tenant", "aiservice_tenant_version", False),
|
|
20
|
+
("Optional Dependencies", "aiservice", "opendatahub", "odh_version", False),
|
|
21
|
+
("Optional Dependencies", "aiservice", "minio", "minio_extras_version", False),
|
|
22
|
+
("Optional Dependencies", "data-dictionary", "ibm-data-dictionary", "dd_version", False),
|
|
23
|
+
("Optional Dependencies", "db2u-s11", "ibm-db2uoperator-s11", "db2u_version", False),
|
|
24
|
+
("Optional Dependencies", "db2u-s12", "ibm-db2uoperator-s12", "db2u_version", False),
|
|
25
|
+
("Optional Dependencies", "mongodb-ce", "mongodb-ce", "mongo_extras_version_default", False),
|
|
26
|
+
("Maximo Application Suite", "core", "ibm-mas", "mas_core_version", False),
|
|
27
|
+
("Maximo Application Suite", "assist", "ibm-mas-assist", "mas_assist_version", False),
|
|
28
|
+
("Maximo Application Suite", "assist", "ibm-couchdb", "couchdb_version", False),
|
|
29
|
+
("Maximo Application Suite", "iot", "ibm-mas-iot", "mas_iot_version", False),
|
|
30
|
+
("Maximo Application Suite", "facilities", "ibm-mas-facilities", "mas_facilities_version", False),
|
|
31
|
+
("Maximo Application Suite", "manage", "ibm-mas-manage", "mas_manage_version", False),
|
|
32
|
+
("Maximo Application Suite", "manage-icd", "ibm-mas-manage-icd", "mas_manage_version", False),
|
|
33
|
+
("Maximo Application Suite", "monitor", "ibm-mas-monitor", "mas_monitor_version", False),
|
|
34
|
+
("Maximo Application Suite", "predict", "ibm-mas-predict", "mas_predict_version", False),
|
|
35
|
+
("Maximo Application Suite", "optimizer", "ibm-mas-optimizer", "mas_optimizer_version", False),
|
|
36
|
+
("Maximo Application Suite", "visualinspection", "ibm-mas-visualinspection", "mas_visualinspection_version", False),
|
|
37
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cp-common-services", "common_svcs_version", False),
|
|
38
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-zen", "ibm_zen_version", False),
|
|
39
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cp-datacore", "cp4d_platform_version", True),
|
|
40
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-licensing", "ibm_licensing_version", False),
|
|
41
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-ccs", "ccs_build", True),
|
|
42
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-cloud-native-postgresql", "postgress_version", False),
|
|
43
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-datarefinery", "datarefinery_version", True),
|
|
44
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-elasticsearch-operator", "elasticsearch_version", False),
|
|
45
|
+
("Cloud Pak for Data - Platform", "cp4d-platform", "ibm-opensearch-operator", "opensearch_version", False),
|
|
46
|
+
("Cloud Pak for Data - WSL", "cp4d-wsl", "ibm-wsl", "wsl_version", True),
|
|
47
|
+
("Cloud Pak for Data - WSL", "cp4d-wsl", "ibm-wsl-runtimes", "wsl_runtimes_version", True),
|
|
48
|
+
("Cloud Pak for Data - WML", "cp4d-wml", "ibm-wml-cpd", "wml_version", True),
|
|
49
|
+
("Cloud Pak for Data - WML", "cp4d-wml", "ibm-redis-cp", "redis_version", True),
|
|
50
|
+
("Cloud Pak for Data - Spark", "cp4d-spark", "ibm-analyticsengine", "spark_version", True),
|
|
51
|
+
("Cloud Pak for Data - Cognos", "cp4d-cognos", "ibm-cognos-analytics-prod", "cognos_version", True),
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
# Helm-chart-only CASE bundles: no standalone ISC image files exist for these.
|
|
55
|
+
# Their images are bundled inside their parent CASE (e.g. ibm-opencontent-opensearch
|
|
56
|
+
# images come with ibm-opensearch-operator).
|
|
57
|
+
# Each tuple: (caseName, catalogKey, argName)
|
|
58
|
+
HELM_ONLY_CHART_CONFIGS = [
|
|
59
|
+
("ibm-opencontent-opensearch", "opensearch_version", "cp4d-platform"),
|
|
48
60
|
]
|