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.
Files changed (199) hide show
  1. {mas_cli-23.7.0/python/src/mas_cli.egg-info → mas_cli-23.7.2}/PKG-INFO +1 -1
  2. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/__init__.py +1 -1
  3. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/cli.py +1 -1
  4. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/app.py +21 -1
  5. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/app.py +382 -5
  6. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/argParser.py +2 -2
  7. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/config.py +48 -36
  8. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/ibm-mas-tekton.yaml +165 -139
  9. {mas_cli-23.7.0 → mas_cli-23.7.2/python/src/mas_cli.egg-info}/PKG-INFO +1 -1
  10. {mas_cli-23.7.0 → mas_cli-23.7.2}/LICENSE +0 -0
  11. {mas_cli-23.7.0 → mas_cli-23.7.2}/README.md +0 -0
  12. {mas_cli-23.7.0 → mas_cli-23.7.2}/pyproject.toml +0 -0
  13. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/README.md +0 -0
  14. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/__main__.py +0 -0
  15. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/__init__.py +0 -0
  16. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/app.py +0 -0
  17. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/argBuilder.py +0 -0
  18. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/argParser.py +0 -0
  19. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/params.py +0 -0
  20. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/install/summarizer.py +0 -0
  21. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/__init__.py +0 -0
  22. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/app.py +0 -0
  23. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/aiservice/upgrade/argParser.py +0 -0
  24. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/__init__.py +0 -0
  25. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/app.py +0 -0
  26. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/backup/argParser.py +0 -0
  27. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/displayMixins.py +0 -0
  28. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/gencfg.py +0 -0
  29. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/__init__.py +0 -0
  30. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/argBuilder.py +0 -0
  31. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/argParser.py +0 -0
  32. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/catalogs.py +0 -0
  33. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/facilities/agents.py +0 -0
  34. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/params.py +0 -0
  35. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/__init__.py +0 -0
  36. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/additionalConfigs.py +0 -0
  37. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/aiSettings.py +0 -0
  38. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/db2Settings.py +0 -0
  39. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/kafkaSettings.py +0 -0
  40. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/manageSettings.py +0 -0
  41. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/settings/mongodbSettings.py +0 -0
  42. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/install/summarizer.py +0 -0
  43. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/mirror/__init__.py +0 -0
  44. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/__init__.py +0 -0
  45. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/__init__.py +0 -0
  46. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/instance.py +0 -0
  47. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/pipelines.py +0 -0
  48. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/aiservice/tenant.py +0 -0
  49. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/app.py +0 -0
  50. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/arg_parser.py +0 -0
  51. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/argo/__init__.py +0 -0
  52. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/argo/applications.py +0 -0
  53. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/collection_plan.py +0 -0
  54. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/__init__.py +0 -0
  55. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/coreapi.py +0 -0
  56. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/crd_processor.py +0 -0
  57. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/parallel.py +0 -0
  58. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/pod_exec.py +0 -0
  59. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/pods.py +0 -0
  60. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/reconcile_logs.py +0 -0
  61. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/resources.py +0 -0
  62. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/secrets.py +0 -0
  63. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/task_generation.py +0 -0
  64. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/common/thread_safe_client.py +0 -0
  65. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/__init__.py +0 -0
  66. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/amlen.py +0 -0
  67. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/cert_manager.py +0 -0
  68. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/cp4d.py +0 -0
  69. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/db2.py +0 -0
  70. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/grafana.py +0 -0
  71. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/kafka.py +0 -0
  72. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/mongodb.py +0 -0
  73. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/rhoai.py +0 -0
  74. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/sls.py +0 -0
  75. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/dependencies/utils.py +0 -0
  76. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/apps.py +0 -0
  77. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/core.py +0 -0
  78. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/licensing.py +0 -0
  79. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/manage.py +0 -0
  80. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/network_tests.py +0 -0
  81. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/pipelines.py +0 -0
  82. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/mas/version.py +0 -0
  83. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/__init__.py +0 -0
  84. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/airgap.py +0 -0
  85. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/cluster.py +0 -0
  86. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/marketplace.py +0 -0
  87. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/ocp/nodes.py +0 -0
  88. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/output.py +0 -0
  89. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/parallel_executor.py +0 -0
  90. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/__init__.py +0 -0
  91. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/licensing.py +0 -0
  92. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/nodes.py +0 -0
  93. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/subscriptions.py +0 -0
  94. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/summarizer/suite.py +0 -0
  95. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/timer.py +0 -0
  96. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/__init__.py +0 -0
  97. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/__main__.py +0 -0
  98. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/must_gather/web_viewer/templates/viewer.html +0 -0
  99. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/__init__.py +0 -0
  100. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/app.py +0 -0
  101. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/pre_install/argParser.py +0 -0
  102. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/rbac_utils.py +0 -0
  103. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/__init__.py +0 -0
  104. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/app.py +0 -0
  105. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/restore/argParser.py +0 -0
  106. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/__init__.py +0 -0
  107. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/app.py +0 -0
  108. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/setup_rbac/argParser.py +0 -0
  109. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/aicfg.yml.j2 +0 -0
  110. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
  111. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
  149. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
  176. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
  177. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
  178. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
  179. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
  180. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
  181. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
  182. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
  183. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/__init__.py +0 -0
  184. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/app.py +0 -0
  185. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/uninstall/argParser.py +0 -0
  186. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/__init__.py +0 -0
  187. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/app.py +0 -0
  188. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/update/argParser.py +0 -0
  189. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/__init__.py +0 -0
  190. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/app.py +0 -0
  191. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/argParser.py +0 -0
  192. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/upgrade/settings/__init__.py +0 -0
  193. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas/cli/validators.py +0 -0
  194. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/SOURCES.txt +0 -0
  195. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/dependency_links.txt +0 -0
  196. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/entry_points.txt +0 -0
  197. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/requires.txt +0 -0
  198. {mas_cli-23.7.0 → mas_cli-23.7.2}/python/src/mas_cli.egg-info/top_level.txt +0 -0
  199. {mas_cli-23.7.0 → mas_cli-23.7.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mas-cli
3
- Version: 23.7.0
3
+ Version: 23.7.2
4
4
  Summary: Python Admin CLI for Maximo Application Suite
5
5
  Author-email: David Parker <parkerda@uk.ibm.com>
6
6
  License-Expression: EPL-1.0
@@ -10,4 +10,4 @@
10
10
 
11
11
  from .cli import BaseApp # noqa: F401
12
12
 
13
- __version__ = "23.7.0" # Python module compatible semver
13
+ __version__ = "23.7.2" # Python module compatible semver
@@ -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.0"
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
- self.configRoutingMode()
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
- print_formatted_text(HTML("\n<B>✅ Mirror operation completed successfully</B>"))
899
- if totalImages > 0:
900
- print_formatted_text(HTML(f"Successfully mirrored {mirroredImages} images"))
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 - Spark", "cp4d-spark", "ibm-analyticsengine", "spark_version"),
47
- ("Cloud Pak for Data - Cognos", "cp4d-cognos", "ibm-cognos-analytics-prod", "cognos_version"),
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
  ]