mas-cli 21.7.0__tar.gz → 21.8.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-21.7.0/python/src/mas_cli.egg-info → mas_cli-21.8.2}/PKG-INFO +1 -1
  2. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/__init__.py +1 -1
  3. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/app.py +26 -1
  4. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/backup/app.py +34 -0
  5. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/backup/argParser.py +32 -0
  6. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/cli.py +97 -1
  7. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/app.py +60 -4
  8. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/argBuilder.py +12 -4
  9. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/argParser.py +11 -2
  10. mas_cli-21.8.2/python/src/mas/cli/install/facilities/agents.py +31 -0
  11. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/params.py +13 -0
  12. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/additionalConfigs.py +8 -5
  13. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/manageSettings.py +3 -3
  14. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/summarizer.py +20 -5
  15. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/app.py +237 -44
  16. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/arg_parser.py +9 -2
  17. mas_cli-21.8.2/python/src/mas/cli/must_gather/common/coreapi.py +84 -0
  18. mas_cli-21.8.2/python/src/mas/cli/must_gather/common/pod_exec.py +126 -0
  19. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/reconcile_logs.py +35 -0
  20. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/mas/apps.py +5 -0
  21. mas_cli-21.8.2/python/src/mas/cli/must_gather/mas/core.py +353 -0
  22. mas_cli-21.8.2/python/src/mas/cli/must_gather/mas/licensing.py +164 -0
  23. mas_cli-21.8.2/python/src/mas/cli/must_gather/mas/manage.py +94 -0
  24. mas_cli-21.8.2/python/src/mas/cli/must_gather/mas/network_tests.py +268 -0
  25. mas_cli-21.8.2/python/src/mas/cli/must_gather/mas/version.py +105 -0
  26. mas_cli-21.8.2/python/src/mas/cli/must_gather/ocp/nodes.py +534 -0
  27. mas_cli-21.8.2/python/src/mas/cli/must_gather/summarizer/licensing.py +396 -0
  28. mas_cli-21.8.2/python/src/mas/cli/must_gather/summarizer/nodes.py +112 -0
  29. mas_cli-21.8.2/python/src/mas/cli/must_gather/summarizer/suite.py +676 -0
  30. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/restore/app.py +60 -1
  31. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/restore/argParser.py +32 -0
  32. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/ibm-mas-tekton.yaml +476 -204
  33. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/upgrade/app.py +1 -1
  34. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/validators.py +10 -0
  35. {mas_cli-21.7.0 → mas_cli-21.8.2/python/src/mas_cli.egg-info}/PKG-INFO +1 -1
  36. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas_cli.egg-info/SOURCES.txt +10 -0
  37. mas_cli-21.7.0/python/src/mas/cli/must_gather/mas/core.py +0 -163
  38. mas_cli-21.7.0/python/src/mas/cli/must_gather/ocp/nodes.py +0 -38
  39. {mas_cli-21.7.0 → mas_cli-21.8.2}/LICENSE +0 -0
  40. {mas_cli-21.7.0 → mas_cli-21.8.2}/README.md +0 -0
  41. {mas_cli-21.7.0 → mas_cli-21.8.2}/pyproject.toml +0 -0
  42. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/README.md +0 -0
  43. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/__main__.py +0 -0
  44. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/__init__.py +0 -0
  45. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/argBuilder.py +0 -0
  46. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/argParser.py +0 -0
  47. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/params.py +0 -0
  48. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/install/summarizer.py +0 -0
  49. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/upgrade/__init__.py +0 -0
  50. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/upgrade/app.py +0 -0
  51. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/aiservice/upgrade/argParser.py +0 -0
  52. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/backup/__init__.py +0 -0
  53. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/displayMixins.py +0 -0
  54. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/gencfg.py +0 -0
  55. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/__init__.py +0 -0
  56. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/catalogs.py +0 -0
  57. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/__init__.py +0 -0
  58. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/aiSettings.py +0 -0
  59. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/db2Settings.py +0 -0
  60. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/kafkaSettings.py +0 -0
  61. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/install/settings/mongodbSettings.py +0 -0
  62. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/mirror/__init__.py +0 -0
  63. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/mirror/app.py +0 -0
  64. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/mirror/argParser.py +0 -0
  65. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/mirror/config.py +0 -0
  66. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/__init__.py +0 -0
  67. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/aiservice/__init__.py +0 -0
  68. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/aiservice/instance.py +0 -0
  69. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/aiservice/pipelines.py +0 -0
  70. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/aiservice/tenant.py +0 -0
  71. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/argo/__init__.py +0 -0
  72. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/argo/applications.py +0 -0
  73. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/collection_plan.py +0 -0
  74. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/__init__.py +0 -0
  75. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/crd_processor.py +0 -0
  76. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/parallel.py +0 -0
  77. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/pods.py +0 -0
  78. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/resources.py +0 -0
  79. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/secrets.py +0 -0
  80. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/task_generation.py +0 -0
  81. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/common/thread_safe_client.py +0 -0
  82. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/__init__.py +0 -0
  83. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/cert_manager.py +0 -0
  84. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/cp4d.py +0 -0
  85. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/db2.py +0 -0
  86. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/grafana.py +0 -0
  87. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/kafka.py +0 -0
  88. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/mongodb.py +0 -0
  89. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/sls.py +0 -0
  90. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/dependencies/utils.py +0 -0
  91. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/mas/pipelines.py +0 -0
  92. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/ocp/__init__.py +0 -0
  93. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/ocp/airgap.py +0 -0
  94. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/ocp/cluster.py +0 -0
  95. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/ocp/marketplace.py +0 -0
  96. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/output.py +0 -0
  97. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/parallel_executor.py +0 -0
  98. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/summarizer/__init__.py +0 -0
  99. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/summarizer/subscriptions.py +0 -0
  100. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/timer.py +0 -0
  101. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/web_viewer/__init__.py +0 -0
  102. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/web_viewer/__main__.py +0 -0
  103. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/must_gather/web_viewer/templates/viewer.html +0 -0
  104. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/pre_install/__init__.py +0 -0
  105. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/pre_install/app.py +0 -0
  106. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/pre_install/argParser.py +0 -0
  107. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/rbac_utils.py +0 -0
  108. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/restore/__init__.py +0 -0
  109. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/setup_rbac/__init__.py +0 -0
  110. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/setup_rbac/app.py +0 -0
  111. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/setup_rbac/argParser.py +0 -0
  112. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/aicfg.yml.j2 +0 -0
  113. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
  114. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
  115. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  116. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
  117. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
  118. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
  119. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
  120. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
  121. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
  122. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
  123. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
  124. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
  125. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
  126. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
  127. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
  128. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
  129. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
  130. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
  131. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
  132. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
  133. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
  134. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
  135. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
  136. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
  137. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
  138. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
  139. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
  140. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
  141. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
  142. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
  143. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
  144. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
  145. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
  146. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
  147. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
  148. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
  149. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
  150. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  151. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
  152. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
  153. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
  154. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
  155. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
  156. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
  157. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
  158. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
  159. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
  160. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
  161. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
  162. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
  163. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
  164. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
  165. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
  166. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
  167. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
  168. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
  169. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
  170. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
  171. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
  172. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
  173. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
  174. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
  175. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
  176. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
  177. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
  178. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
  179. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
  180. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
  181. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
  182. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
  183. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
  184. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
  185. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
  186. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/uninstall/__init__.py +0 -0
  187. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/uninstall/app.py +0 -0
  188. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/uninstall/argParser.py +0 -0
  189. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/update/__init__.py +0 -0
  190. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/update/app.py +0 -0
  191. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/update/argParser.py +0 -0
  192. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/upgrade/__init__.py +0 -0
  193. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/upgrade/argParser.py +0 -0
  194. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas/cli/upgrade/settings/__init__.py +0 -0
  195. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas_cli.egg-info/dependency_links.txt +0 -0
  196. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas_cli.egg-info/entry_points.txt +0 -0
  197. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas_cli.egg-info/requires.txt +0 -0
  198. {mas_cli-21.7.0 → mas_cli-21.8.2}/python/src/mas_cli.egg-info/top_level.txt +0 -0
  199. {mas_cli-21.7.0 → mas_cli-21.8.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mas-cli
3
- Version: 21.7.0
3
+ Version: 21.8.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__ = "21.7.0" # Python module compatible semver
13
+ __version__ = "21.8.2" # Python module compatible semver
@@ -207,6 +207,31 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
207
207
  if key in requiredParams:
208
208
  if value is None:
209
209
  self.fatalError(f"{key} must be set")
210
+
211
+ # Special handling for ibm_entitlement_key: validate it
212
+ if key == "ibm_entitlement_key":
213
+ isValid = self.validateEntitlementKey(value)
214
+ if not isValid:
215
+ if self.noConfirm:
216
+ # Non-interactive with --no-confirm: warn but continue
217
+ self.printWarning("IBM entitlement key validation failed, but continuing due to --no-confirm flag")
218
+ else:
219
+ # Non-interactive without --no-confirm: offer options
220
+ self.printWarning("IBM entitlement key validation failed")
221
+ print()
222
+ self.printDescription(
223
+ [
224
+ "What would you like to do?",
225
+ " 1. Continue anyway (skip validation)",
226
+ " 2. Quit (exit the application)",
227
+ ]
228
+ )
229
+ choice = self.promptForInt("Select an option", min=1, max=2)
230
+ if choice == 2:
231
+ logger.info("User chose to quit due to invalid entitlement key")
232
+ exit(1)
233
+ # If choice == 1, continue with the invalid key
234
+
210
235
  self.setParam(key, value)
211
236
 
212
237
  # These fields we just pass straight through to the parameters
@@ -734,7 +759,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
734
759
  @logMethodCall
735
760
  def configICRCredentials(self):
736
761
  self.printH1("Configure IBM Container Registry")
737
- self.promptForString("IBM entitlement key", "ibm_entitlement_key", isPassword=True)
762
+ self.promptForEntitlementKey("IBM entitlement key", "ibm_entitlement_key")
738
763
  if self.devMode:
739
764
  self.promptForString("Artifactory username", "artifactory_username")
740
765
  self.promptForString("Artifactory token", "artifactory_token", isPassword=True)
@@ -76,6 +76,7 @@ class BackupApp(BaseApp):
76
76
  # Manage App Backup
77
77
  "manage_workspace_id",
78
78
  "backup_manage_app",
79
+ "backup_manage_include_pvc",
79
80
  "backup_manage_db",
80
81
  "manage_db2_namespace",
81
82
  "manage_db2_instance_name",
@@ -84,6 +85,7 @@ class BackupApp(BaseApp):
84
85
  # Facilities App Backup
85
86
  "facilities_workspace_id",
86
87
  "backup_facilities_app",
88
+ "backup_facilities_include_pvc",
87
89
  "backup_facilities_db",
88
90
  "facilities_db2_namespace",
89
91
  "facilities_db2_instance_name",
@@ -187,6 +189,7 @@ class BackupApp(BaseApp):
187
189
  self.printH2("Manage Application Backup")
188
190
  self.printSummary("Backup Manage App", "Yes")
189
191
  self.printSummary("Workspace ID", self.getParam("manage_workspace_id"))
192
+ self.printSummary("Include PVC Backup", "Yes" if self.getParam("backup_manage_include_pvc") == "true" else "No")
190
193
  self.printSummary("Backup Manage incluster Db2 Database", "Yes" if self.getParam("backup_manage_db") == "true" else "No")
191
194
  if self.getParam("backup_manage_db") == "true":
192
195
  self.printSummary("Db2 Namespace", self.getParam("manage_db2_namespace"))
@@ -197,6 +200,7 @@ class BackupApp(BaseApp):
197
200
  self.printH2("Facilities Application Backup")
198
201
  self.printSummary("Backup Facilities App", "Yes")
199
202
  self.printSummary("Workspace ID", self.getParam("facilities_workspace_id"))
203
+ self.printSummary("Include PVC Backup", "Yes" if self.getParam("backup_facilities_include_pvc") == "true" else "No")
200
204
  self.printSummary("Backup Facilities incluster Db2 Database", "Yes" if self.getParam("backup_facilities_db") == "true" else "No")
201
205
  if self.getParam("backup_facilities_db") == "true":
202
206
  self.printSummary("Db2 Namespace", self.getParam("facilities_db2_namespace"))
@@ -571,6 +575,21 @@ class BackupApp(BaseApp):
571
575
  workspaceId = self.promptForString("Enter Manage workspace ID")
572
576
  self.setParam("manage_workspace_id", workspaceId)
573
577
 
578
+ # Ask about PVC backup
579
+ self.printH2("Manage PVC Backup")
580
+ self.printDescription(
581
+ [
582
+ "The Manage application uses persistent volumes that can be backed up.",
583
+ "This will include PVC data in the backup.",
584
+ ]
585
+ )
586
+ backupPvc = self.yesOrNo("Do you want to include PVC backup for Manage")
587
+
588
+ if backupPvc:
589
+ self.setParam("backup_manage_include_pvc", "true")
590
+ else:
591
+ self.setParam("backup_manage_include_pvc", "false")
592
+
574
593
  # Ask about DB2 backup
575
594
  self.printH2("Manage Database Backup")
576
595
  self.printDescription(
@@ -657,6 +676,21 @@ class BackupApp(BaseApp):
657
676
  workspaceId = self.promptForString("Enter Facilities workspace ID")
658
677
  self.setParam("facilities_workspace_id", workspaceId)
659
678
 
679
+ # Ask about PVC backup
680
+ self.printH2("Facilities PVC Backup")
681
+ self.printDescription(
682
+ [
683
+ "The Facilities application uses persistent volumes that can be backed up.",
684
+ "This will include PVC data in the backup.",
685
+ ]
686
+ )
687
+ backupPvc = self.yesOrNo("Do you want to include PVC backup for Facilities")
688
+
689
+ if backupPvc:
690
+ self.setParam("backup_facilities_include_pvc", "true")
691
+ else:
692
+ self.setParam("backup_facilities_include_pvc", "false")
693
+
660
694
  # Ask about DB2 backup
661
695
  self.printH2("Facilities Database Backup")
662
696
  self.printDescription(
@@ -69,6 +69,22 @@ manageAppArgGroup.add_argument(
69
69
  "--backup-manage-app", dest="backup_manage_app", required=False, action="store_const", const="true", help="Backup the Manage application"
70
70
  )
71
71
  manageAppArgGroup.add_argument("--manage-workspace-id", dest="manage_workspace_id", required=False, help="Manage workspace ID")
72
+ manageAppArgGroup.add_argument(
73
+ "--backup-manage-include-pvc",
74
+ dest="backup_manage_include_pvc",
75
+ required=False,
76
+ action="store_const",
77
+ const="true",
78
+ help="Include PVC backup for Manage application",
79
+ )
80
+ manageAppArgGroup.add_argument(
81
+ "--backup-manage-exclude-pvc",
82
+ dest="backup_manage_include_pvc",
83
+ required=False,
84
+ action="store_const",
85
+ const="false",
86
+ help="Exclude PVC backup for Manage application",
87
+ )
72
88
  manageAppArgGroup.add_argument(
73
89
  "--backup-manage-db", dest="backup_manage_db", required=False, action="store_const", const="true", help="Backup the Manage application database (Db2)"
74
90
  )
@@ -87,6 +103,22 @@ facilitiesAppArgGroup.add_argument(
87
103
  "--backup-facilities-app", dest="backup_facilities_app", required=False, action="store_const", const="true", help="Backup the Facilities application"
88
104
  )
89
105
  facilitiesAppArgGroup.add_argument("--facilities-workspace-id", dest="facilities_workspace_id", required=False, help="Facilities workspace ID")
106
+ facilitiesAppArgGroup.add_argument(
107
+ "--backup-facilities-include-pvc",
108
+ dest="backup_facilities_include_pvc",
109
+ required=False,
110
+ action="store_const",
111
+ const="true",
112
+ help="Include PVC backup for Facilities application",
113
+ )
114
+ facilitiesAppArgGroup.add_argument(
115
+ "--backup-facilities-exclude-pvc",
116
+ dest="backup_facilities_include_pvc",
117
+ required=False,
118
+ action="store_const",
119
+ const="false",
120
+ help="Exclude PVC backup for Facilities application",
121
+ )
90
122
  facilitiesAppArgGroup.add_argument(
91
123
  "--backup-facilities-db",
92
124
  dest="backup_facilities_db",
@@ -32,6 +32,7 @@ from prompt_toolkit import prompt, print_formatted_text, HTML
32
32
 
33
33
  from mas.devops.mas import isAirgapInstall
34
34
  from mas.devops.ocp import connect, isSNO, getNodes
35
+ from mas.devops.utils import validateIBMEntitlementKey
35
36
 
36
37
  from .displayMixins import PrintMixin, PromptMixin
37
38
 
@@ -126,7 +127,7 @@ class BaseApp(PrintMixin, PromptMixin):
126
127
  logging.getLogger("urllib3").setLevel(logging.INFO)
127
128
 
128
129
  # Supports extended semver, unlike mas.cli.__version__
129
- self.version: str = "21.7.0"
130
+ self.version: str = "21.8.2"
130
131
  self.h1count: int = 0
131
132
  self.h2count: int = 0
132
133
 
@@ -509,3 +510,98 @@ class BaseApp(PrintMixin, PromptMixin):
509
510
  if self.localConfigDir is None:
510
511
  # You need to tell us where the configuration file can be found
511
512
  self.localConfigDir = self.promptForDir("Select Local configuration directory")
513
+
514
+ @logMethodCall
515
+ def validateEntitlementKey(self, entitlementKey: str, repository: str = "cp/mas/coreapi", timeout: int = 30) -> bool:
516
+ """
517
+ Validate IBM entitlement key using mas.devops.utils.validateIBMEntitlementKey.
518
+
519
+ Args:
520
+ entitlementKey: The entitlement key to validate
521
+ repository: Docker repository to test against. Defaults to "cp/mas/coreapi".
522
+ timeout: Timeout in seconds for validation. Defaults to 30.
523
+
524
+ Returns:
525
+ bool: True if valid, False if invalid
526
+ """
527
+ try:
528
+ logger.info(f"Validating IBM entitlement key against repository: {repository}")
529
+ isValid = validateIBMEntitlementKey(entitlementKey, repository, timeout)
530
+ if isValid:
531
+ logger.info("IBM entitlement key validation successful")
532
+ else:
533
+ logger.warning("IBM entitlement key validation failed")
534
+ return isValid
535
+ except Exception as e:
536
+ logger.error(f"Error validating IBM entitlement key: {e}")
537
+ logger.exception(e, stack_info=True)
538
+ return False
539
+
540
+ @logMethodCall
541
+ def promptForEntitlementKey(self, message: str, param: str, repository: str = "cp/mas/coreapi", timeout: int = 30) -> str:
542
+ """
543
+ Prompt for IBM entitlement key with validation.
544
+
545
+ In interactive mode:
546
+ - Validates the key after user input
547
+ - If invalid, offers: 1) Try again, 2) Continue anyway, 3) Quit
548
+ - Loops until valid key or user chooses to continue/quit
549
+
550
+ In non-interactive mode with --no-confirm:
551
+ - Validates but only warns if invalid, does not block
552
+
553
+ Args:
554
+ message: Prompt message to display
555
+ param: Parameter name to store the key
556
+ repository: Docker repository to test against
557
+ timeout: Timeout in seconds for validation
558
+
559
+ Returns:
560
+ str: The entitlement key (validated or user chose to continue anyway)
561
+ """
562
+ while True:
563
+ # Prompt for the entitlement key
564
+ entitlementKey = self.promptForString(message, param=None, isPassword=True)
565
+
566
+ # Validate the key
567
+ isValid = self.validateEntitlementKey(entitlementKey, repository, timeout)
568
+
569
+ if isValid:
570
+ # Key is valid, show success message and continue
571
+ self.printHighlight("✓ IBM entitlement key validated successfully")
572
+ self.setParam(param, entitlementKey)
573
+ return entitlementKey
574
+
575
+ # Key is invalid
576
+ if self.noConfirm:
577
+ # Non-interactive mode with --no-confirm: warn but continue
578
+ self.printWarning("IBM entitlement key validation failed, but continuing due to --no-confirm flag")
579
+ self.setParam(param, entitlementKey)
580
+ return entitlementKey
581
+
582
+ # Interactive mode or non-interactive without --no-confirm: offer options
583
+ self.printWarning("IBM entitlement key validation failed")
584
+ print()
585
+ self.printDescription(
586
+ [
587
+ "What would you like to do?",
588
+ " 1. Try again (re-enter the entitlement key)",
589
+ " 2. Continue anyway (skip validation)",
590
+ " 3. Quit (exit the application)",
591
+ ]
592
+ )
593
+
594
+ choice = self.promptForInt("Select an option", min=1, max=3)
595
+
596
+ if choice == 1:
597
+ # Try again - loop will continue
598
+ continue
599
+ elif choice == 2:
600
+ # Continue anyway
601
+ logger.warning("User chose to continue with invalid entitlement key")
602
+ self.setParam(param, entitlementKey)
603
+ return entitlementKey
604
+ else: # choice == 3
605
+ # Quit
606
+ logger.info("User chose to quit due to invalid entitlement key")
607
+ exit(1)
@@ -72,6 +72,7 @@ from mas.devops.tekton import (
72
72
  )
73
73
  from mas.devops.pre_install import applyPreInstallMASRBAC
74
74
  from ..rbac_utils import evaluatePreinstallRBACAccess
75
+ from .facilities.agents import facilitiesAgents, facilitiesAgentsDeploymentModes
75
76
 
76
77
  logger = logging.getLogger(__name__)
77
78
 
@@ -212,7 +213,7 @@ class InstallApp(
212
213
  @logMethodCall
213
214
  def configICRCredentials(self):
214
215
  self.printH1("Configure IBM Container Registry")
215
- self.promptForString("IBM entitlement key", "ibm_entitlement_key", isPassword=True)
216
+ self.promptForEntitlementKey("IBM entitlement key", "ibm_entitlement_key")
216
217
  if self.devMode:
217
218
  self.promptForString("Artifactory username", "artifactory_username")
218
219
  self.promptForString("Artifactory token", "artifactory_token", isPassword=True)
@@ -1474,6 +1475,9 @@ class InstallApp(
1474
1475
  )
1475
1476
 
1476
1477
  if self.showAdvancedOptions:
1478
+ # Check MAS version - Custom FACILITIES.properties and Agents Deployment Flexibility are only supported in MAS 9.2+
1479
+ mas_facilities_channel = self.getParam("mas_app_channel_facilities")
1480
+
1477
1481
  self.printH2("Maximo Real Estate and Facilities Settings - Advanced")
1478
1482
  self.printDescription(
1479
1483
  ["Advanced configurations for Real Estate and Facilities are added through an additional file called facilities-configs.yaml"]
@@ -1504,9 +1508,6 @@ class InstallApp(
1504
1508
  "mas_ws_facilities_vault_secret",
1505
1509
  )
1506
1510
 
1507
- # Check MAS version - Custom FACILITIES.properties is only supported in MAS 9.2+
1508
- mas_facilities_channel = self.getParam("mas_app_channel_facilities")
1509
-
1510
1511
  # Only prompt for custom FACILITIES.properties file if MAS 9.2+
1511
1512
  if mas_facilities_channel and isVersionEqualOrAfter("9.2.0", mas_facilities_channel):
1512
1513
  if self.yesOrNo("Upload custom FACILITIES.properties file"):
@@ -1670,6 +1671,32 @@ class InstallApp(
1670
1671
  validator=JsonValidator(),
1671
1672
  )
1672
1673
 
1674
+ # Only prompt for Agents Deployments Flexibility file if MAS 9.2+
1675
+ if mas_facilities_channel and isVersionEqualOrAfter("9.2.0", mas_facilities_channel):
1676
+ if self.yesOrNo("Configure Agents Deployments Flexibility"):
1677
+ self.printDescription(
1678
+ [
1679
+ "Define deployment mode for each Facilities Agents:",
1680
+ " 1. shared - the agent is activated in the shared multiagents POD",
1681
+ " 2. dedicated - the agent is activated in a dedicated POD",
1682
+ " 3. disabled - the agent is not activated at all (not applicable for wfagent and reportqueueagent)",
1683
+ ]
1684
+ )
1685
+ for agent in facilitiesAgents:
1686
+ self.promptForListSelect(
1687
+ f"Select {agent} deployment mode:",
1688
+ facilitiesAgentsDeploymentModes[agent][:-1],
1689
+ f"mas_ws_facilities_{agent}_deploymentmode",
1690
+ default=1,
1691
+ )
1692
+ else:
1693
+ for agent in facilitiesAgents:
1694
+ self.setParam(f"mas_ws_facilities_{agent}_deploymentmode", "")
1695
+ else:
1696
+ # For MAS 9.1 and earlier, skip the prompt and use default behavior
1697
+ for agent in facilitiesAgents:
1698
+ self.setParam(f"mas_ws_facilities_{agent}_deploymentmode", "")
1699
+
1673
1700
  # If advanced options is selected, we need to create a file to add props not supported by Tekton
1674
1701
  self.selectLocalConfigDir()
1675
1702
  if self.localConfigDir is not None:
@@ -1914,6 +1941,7 @@ class InstallApp(
1914
1941
  self.slsLicenseFileLocal = None
1915
1942
  self.db2LicenseFileLocal = None
1916
1943
  self.aiserviceTenantSchedulingConfigFileLocal = None
1944
+ self.facilitiesPropertiesFileLocal = None
1917
1945
 
1918
1946
  if simplified:
1919
1947
  self.showAdvancedOptions = False
@@ -2005,6 +2033,7 @@ class InstallApp(
2005
2033
  self.slsLicenseFileLocal = None
2006
2034
  self.db2LicenseFileLocal = None
2007
2035
  self.aiserviceTenantSchedulingConfigFileLocal = None
2036
+ self.facilitiesPropertiesFileLocal = None
2008
2037
 
2009
2038
  self.approvals: Dict[str, Dict[str, Any]] = {
2010
2039
  "approval_core": {"id": "suite-verify"}, # After Core Platform verification has completed
@@ -2028,6 +2057,31 @@ class InstallApp(
2028
2057
  if key in requiredParams:
2029
2058
  if value is None:
2030
2059
  self.fatalError(f"{key} must be set")
2060
+
2061
+ # Special handling for ibm_entitlement_key: validate it
2062
+ if key == "ibm_entitlement_key":
2063
+ isValid = self.validateEntitlementKey(value)
2064
+ if not isValid:
2065
+ if self.noConfirm:
2066
+ # Non-interactive with --no-confirm: warn but continue
2067
+ self.printWarning("IBM entitlement key validation failed, but continuing due to --no-confirm flag")
2068
+ else:
2069
+ # Non-interactive without --no-confirm: offer options
2070
+ self.printWarning("IBM entitlement key validation failed")
2071
+ print()
2072
+ self.printDescription(
2073
+ [
2074
+ "What would you like to do?",
2075
+ " 1. Continue anyway (skip validation)",
2076
+ " 2. Quit (exit the application)",
2077
+ ]
2078
+ )
2079
+ choice = self.promptForInt("Select an option", min=1, max=2)
2080
+ if choice == 2:
2081
+ logger.info("User chose to quit due to invalid entitlement key")
2082
+ exit(1)
2083
+ # If choice == 1, continue with the invalid key
2084
+
2031
2085
  self.setParam(key, value)
2032
2086
 
2033
2087
  # These fields we just pass straight through to the parameters
@@ -2082,11 +2136,13 @@ class InstallApp(
2082
2136
  elif key == "pod_templates":
2083
2137
  # For the named configurations we will convert into the path
2084
2138
  if value in ["best-effort", "guaranteed"]:
2139
+ self.podTemplatesKeyword = value
2085
2140
  self.setParam(
2086
2141
  "mas_pod_templates_dir",
2087
2142
  path.join(self.templatesDir, "pod-templates", value),
2088
2143
  )
2089
2144
  else:
2145
+ self.podTemplatesKeyword = None
2090
2146
  self.setParam("mas_pod_templates_dir", value)
2091
2147
 
2092
2148
  # We check for both None and "" values for the application channel parameters
@@ -8,6 +8,7 @@
8
8
  #
9
9
  # *****************************************************************************
10
10
 
11
+ from .facilities.agents import facilitiesAgents
11
12
  import logging
12
13
 
13
14
  logger = logging.getLogger(__name__)
@@ -86,8 +87,12 @@ class installArgBuilderMixin:
86
87
 
87
88
  if self.localConfigDir is not None:
88
89
  command += f' --additional-configs "{self.localConfigDir}"{newline}'
89
- if self.getParam("pod_templates") != "":
90
- command += f" --pod-templates \"{self.getParam('pod_templates')}\"{newline}"
90
+ if self.getParam("mas_pod_templates_dir") != "":
91
+ # Use keyword for built-in templates, otherwise use the full path
92
+ if hasattr(self, "podTemplatesKeyword") and self.podTemplatesKeyword is not None:
93
+ command += f' --pod-templates "{self.podTemplatesKeyword}"{newline}'
94
+ else:
95
+ command += f" --pod-templates \"{self.getParam('mas_pod_templates_dir')}\"{newline}"
91
96
 
92
97
  if self.operationalMode == 2:
93
98
  command += f" --non-prod{newline}"
@@ -351,11 +356,14 @@ class installArgBuilderMixin:
351
356
  if self.getParam("mas_ws_facilities_server_timezone") != "":
352
357
  command += f" --facilities-server-timezone \"{self.getParam('mas_ws_facilities_server_timezone')}\"{newline}"
353
358
 
354
- if self.getParam("mas_ws_facilities_properties_file_local") != "":
355
- command += f" --facilities-properties-file \"{self.getParam('mas_ws_facilities_properties_file_local')}\"{newline}"
359
+ if self.facilitiesPropertiesFileLocal:
360
+ command += f' --facilities-properties-file "{self.facilitiesPropertiesFileLocal}"{newline}'
356
361
  if self.getParam("mas_ws_facilities_properties_secret_name") != "":
357
362
  command += f" --facilities-properties-secret-name \"{self.getParam('mas_ws_facilities_properties_secret_name')}\"{newline}"
358
363
 
364
+ for agent in facilitiesAgents:
365
+ if self.getParam(f"mas_ws_facilities_{agent}_deploymentmode") != "":
366
+ command += f' --facilities-{agent}-deploymentmode "{self.getParam(f"mas_ws_facilities_{agent}_deploymentmode")}"{newline}'
359
367
  # AI Service Advanced Settings
360
368
  # -----------------------------------------------------------------------------
361
369
  if self.installAIService:
@@ -13,6 +13,7 @@ from os import path
13
13
 
14
14
  from .. import __version__ as packageVersion
15
15
  from ..cli import getHelpFormatter
16
+ from .facilities.agents import facilitiesAgents, facilitiesAgentsDeploymentModes
16
17
 
17
18
  # Constants for argument choices
18
19
  DNS_PROVIDERS = ["cloudflare", "cis", "route53"]
@@ -123,7 +124,7 @@ masAdvancedArgGroup.add_argument(
123
124
  masAdvancedArgGroup.add_argument(
124
125
  "--pod-templates",
125
126
  required=False,
126
- help="Path to directory containing custom podTemplates configuration files to be applied",
127
+ help="Pod templates to apply. Use 'guaranteed' or 'best-effort' for built-in templates, or provide a path to a directory containing custom podTemplates configuration files",
127
128
  )
128
129
  masAdvancedArgGroup.add_argument(
129
130
  "--non-prod",
@@ -839,7 +840,15 @@ facilitiesArgGroup.add_argument(
839
840
  help="Custom name for the Facilities properties secret (default: facilities-properties)",
840
841
  default="custom-facilities-properties",
841
842
  )
842
-
843
+ for agent in facilitiesAgents:
844
+ facilitiesArgGroup.add_argument(
845
+ f"--facilities-{agent}-deploymentmode",
846
+ dest=f"mas_ws_facilities_{agent}_deploymentmode",
847
+ required=False,
848
+ help=f"Facilities agent {agent} deployment mode",
849
+ default="",
850
+ choices=facilitiesAgentsDeploymentModes[agent],
851
+ )
843
852
  # Open Data Hub
844
853
  # -----------------------------------------------------------------------------
845
854
  odhArgGroup = installArgParser.add_argument_group("Open Data Hub")
@@ -0,0 +1,31 @@
1
+ # *****************************************************************************
2
+ # Copyright (c) 2024, 2026 IBM Corporation and other Contributors.
3
+ #
4
+ # All rights reserved. This program and the accompanying materials
5
+ # are made available under the terms of the Eclipse Public License v1.0
6
+ # which accompanies this distribution, and is available at
7
+ # http://www.eclipse.org/legal/epl-v10.html
8
+ #
9
+ # *****************************************************************************
10
+
11
+ _FACILITIES_AGENTS_DEPLOYMENT_MODES = ["shared", "dedicated", "disabled", ""]
12
+
13
+ _FACILITIES_AGENTS_DEPLOYMENT_MODES_NO_DISABLED = ["shared", "dedicated", ""]
14
+
15
+ facilitiesAgentsDeploymentModes = {
16
+ "dataconnectagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
17
+ "extendedformulaagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
18
+ "formularecalcagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
19
+ "incomingmailagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
20
+ "objectmigrationagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
21
+ "objectpublishagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
22
+ "maintenanceagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
23
+ "reportqueueagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES_NO_DISABLED,
24
+ "wfagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES_NO_DISABLED,
25
+ "wffutureagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
26
+ "wfnotificationagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
27
+ "reservesmtpagent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
28
+ "scheduleragent": _FACILITIES_AGENTS_DEPLOYMENT_MODES,
29
+ }
30
+
31
+ facilitiesAgents = list(facilitiesAgentsDeploymentModes.keys())
@@ -178,6 +178,19 @@ optionalParams = [
178
178
  "mas_ws_facilities_properties_file_local",
179
179
  "mas_ws_facilities_custom_properties",
180
180
  "mas_ws_facilities_properties_secret_name",
181
+ "mas_ws_facilities_dataconnectagent_deploymentmode",
182
+ "mas_ws_facilities_extendedformulaagent_deploymentmode",
183
+ "mas_ws_facilities_formularecalcagent_deploymentmode",
184
+ "mas_ws_facilities_incomingmailagent_deploymentmode",
185
+ "mas_ws_facilities_objectmigrationagent_deploymentmode",
186
+ "mas_ws_facilities_objectpublishagent_deploymentmode",
187
+ "mas_ws_facilities_maintenanceagent_deploymentmode",
188
+ "mas_ws_facilities_reportqueueagent_deploymentmode",
189
+ "mas_ws_facilities_wfagent_deploymentmode",
190
+ "mas_ws_facilities_wffutureagent_deploymentmode",
191
+ "mas_ws_facilities_wfnotificationagent_deploymentmode",
192
+ "mas_ws_facilities_reservesmtpagent_deploymentmode",
193
+ "mas_ws_facilities_scheduleragent_deploymentmode",
181
194
  # DB2 for Facilities
182
195
  "db2_facilities_timezone",
183
196
  # Special chars
@@ -137,10 +137,13 @@ class AdditionalConfigsMixin:
137
137
  podTemplateChoice = self.promptForInt("Select pod templates profile")
138
138
 
139
139
  if podTemplateChoice == 1:
140
+ self.podTemplatesKeyword = "guaranteed"
140
141
  self.setParam("mas_pod_templates_dir", path.join(self.templatesDir, "pod-templates", "guaranteed"))
141
142
  elif podTemplateChoice == 2:
143
+ self.podTemplatesKeyword = "best-effort"
142
144
  self.setParam("mas_pod_templates_dir", path.join(self.templatesDir, "pod-templates", "best-effort"))
143
145
  elif podTemplateChoice == 3:
146
+ self.podTemplatesKeyword = None
144
147
  self.setParam("mas_pod_templates_dir", self.promptForDir("Pod templates directory", mustExist=True))
145
148
  else:
146
149
  self.fatalError(f"Invalid selection: {podTemplateChoice}")
@@ -230,13 +233,13 @@ class AdditionalConfigsMixin:
230
233
  mas_facilities_channel = self.getParam("mas_app_channel_facilities")
231
234
 
232
235
  # Only process custom file if MAS 9.2+ and file is provided
233
- facilitiesPropertiesFileLocal = self.getParam("mas_ws_facilities_properties_file_local")
236
+ self.facilitiesPropertiesFileLocal = self.getParam("mas_ws_facilities_properties_file_local")
234
237
 
235
238
  if (
236
239
  mas_facilities_channel
237
240
  and isVersionEqualOrAfter("9.2.0", mas_facilities_channel)
238
- and facilitiesPropertiesFileLocal
239
- and facilitiesPropertiesFileLocal != ""
241
+ and self.facilitiesPropertiesFileLocal
242
+ and self.facilitiesPropertiesFileLocal != ""
240
243
  ):
241
244
  # Get custom secret name or use default
242
245
  secretName = self.getParam("mas_ws_facilities_properties_secret_name")
@@ -246,9 +249,9 @@ class AdditionalConfigsMixin:
246
249
  facilitiesPropertiesSecret = {"apiVersion": "v1", "kind": "Secret", "type": "Opaque", "metadata": {"name": "pipeline-facilities-properties"}}
247
250
 
248
251
  # Read the file from user's local path
249
- self.facilitiesPropertiesSecret = self.addFilesToSecret(facilitiesPropertiesSecret, facilitiesPropertiesFileLocal, "")
252
+ self.facilitiesPropertiesSecret = self.addFilesToSecret(facilitiesPropertiesSecret, self.facilitiesPropertiesFileLocal, "")
250
253
 
251
- # Now update the parameters
254
+ # Now update the parameters - set workspace path for pipeline use
252
255
  self.setParam("mas_ws_facilities_custom_properties", "true")
253
256
  self.setParam("mas_ws_facilities_properties_file_local", "/workspace/facilities/FACILITIES.properties")
254
257
  self.setParam("mas_ws_facilities_properties_secret_name", secretName)
@@ -10,7 +10,7 @@
10
10
 
11
11
  from typing import TYPE_CHECKING, Dict, List, NoReturn
12
12
  from prompt_toolkit.completion import WordCompleter
13
- from mas.cli.validators import LanguageValidator
13
+ from mas.cli.validators import CustomizationArchiveNameValidator, LanguageValidator
14
14
  from mas.devops.aiservice import listAiServiceTenantInstances, listAiServiceInstances
15
15
  from openshift.dynamic.exceptions import ResourceNotFoundError
16
16
  from ...validators import AiserviceTeanantIDValidator
@@ -280,7 +280,7 @@ class ManageSettingsMixin:
280
280
  self.printDescription([f"Provide a customization archive to be used in the {self.manageAppName} build process"])
281
281
 
282
282
  if self.yesOrNo("Include customization archive"):
283
- self.promptForString("Customization archive name", "mas_app_settings_customization_archive_name")
283
+ self.promptForString("Customization archive name", "mas_app_settings_customization_archive_name", validator=CustomizationArchiveNameValidator())
284
284
  self.promptForString("Customization archive path/url", "mas_app_settings_customization_archive_url")
285
285
  if self.yesOrNo("Provide authentication to access customization archive URL"):
286
286
  self.promptForString("Username", "mas_app_settings_customization_archive_username")
@@ -325,7 +325,7 @@ class ManageSettingsMixin:
325
325
  self.setParam("mas_app_settings_secondary_langs", secondaryLanguages.upper())
326
326
 
327
327
  def manageSettingsCP4D(self) -> None:
328
- if isVersionEqualOrAfter("8.7.0", self.getParam("mas_app_channel_manage")) and self.showAdvancedOptions:
328
+ if self.showAdvancedOptions:
329
329
  self.printDescription(
330
330
  [
331
331
  f"Integration with Cognos Analytics provides additional support for reporting features in Maximo {self.manageAppName}, for more information refer to the documentation online: ",