mas-cli 19.4.0__tar.gz → 19.5.1__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 (135) hide show
  1. {mas_cli-19.4.0 → mas_cli-19.5.1}/PKG-INFO +1 -1
  2. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/__init__.py +1 -1
  3. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/cli.py +1 -1
  4. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/app.py +92 -5
  5. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/argBuilder.py +1 -1
  6. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/db2Settings.py +26 -6
  7. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/kafkaSettings.py +9 -2
  8. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/ibm-mas-tekton.yaml +645 -221
  9. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/upgrade/app.py +40 -0
  10. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas_cli.egg-info/PKG-INFO +1 -1
  11. {mas_cli-19.4.0 → mas_cli-19.5.1}/MANIFEST.in +0 -0
  12. {mas_cli-19.4.0 → mas_cli-19.5.1}/README.rst +0 -0
  13. {mas_cli-19.4.0 → mas_cli-19.5.1}/pyproject.toml +0 -0
  14. {mas_cli-19.4.0 → mas_cli-19.5.1}/setup.cfg +0 -0
  15. {mas_cli-19.4.0 → mas_cli-19.5.1}/setup.py +0 -0
  16. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/__init__.py +0 -0
  17. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/app.py +0 -0
  18. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/argBuilder.py +0 -0
  19. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/argParser.py +0 -0
  20. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/params.py +0 -0
  21. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/install/summarizer.py +0 -0
  22. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/upgrade/__init__.py +0 -0
  23. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/upgrade/app.py +0 -0
  24. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/aiservice/upgrade/argParser.py +0 -0
  25. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/backup/__init__.py +0 -0
  26. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/backup/app.py +0 -0
  27. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/backup/argParser.py +0 -0
  28. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/displayMixins.py +0 -0
  29. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/gencfg.py +0 -0
  30. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/__init__.py +0 -0
  31. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/argParser.py +0 -0
  32. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/catalogs.py +0 -0
  33. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/params.py +0 -0
  34. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/__init__.py +0 -0
  35. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/additionalConfigs.py +0 -0
  36. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/manageSettings.py +0 -0
  37. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/settings/mongodbSettings.py +0 -0
  38. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/install/summarizer.py +0 -0
  39. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/mirror/__init__.py +0 -0
  40. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/mirror/app.py +0 -0
  41. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/mirror/argParser.py +0 -0
  42. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/mirror/config.py +0 -0
  43. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/restore/__init__.py +0 -0
  44. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/restore/app.py +0 -0
  45. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/restore/argParser.py +0 -0
  46. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
  47. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
  48. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  49. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
  50. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
  51. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
  52. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
  53. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
  54. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
  55. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
  56. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
  57. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
  58. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
  59. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
  60. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
  61. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
  62. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
  63. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
  64. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
  65. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
  66. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
  67. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
  68. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
  69. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
  70. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
  71. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
  72. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
  73. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
  74. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
  75. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
  76. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
  77. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
  78. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
  79. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
  80. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
  81. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
  82. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
  83. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  84. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
  85. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
  86. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
  87. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
  88. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
  89. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
  90. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
  91. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
  92. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
  93. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
  94. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
  95. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
  96. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
  97. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
  98. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
  99. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
  100. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
  101. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
  102. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
  103. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
  104. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
  105. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
  106. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
  107. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
  108. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
  109. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
  110. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
  111. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
  112. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
  113. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
  114. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
  115. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
  116. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
  117. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
  118. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
  119. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/uninstall/__init__.py +0 -0
  120. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/uninstall/app.py +0 -0
  121. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/uninstall/argParser.py +0 -0
  122. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/update/__init__.py +0 -0
  123. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/update/app.py +0 -0
  124. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/update/argParser.py +0 -0
  125. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/upgrade/__init__.py +0 -0
  126. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/upgrade/argParser.py +0 -0
  127. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/upgrade/settings/__init__.py +0 -0
  128. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas/cli/validators.py +0 -0
  129. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas-cli +0 -0
  130. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas_cli.egg-info/SOURCES.txt +0 -0
  131. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas_cli.egg-info/dependency_links.txt +0 -0
  132. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas_cli.egg-info/requires.txt +0 -0
  133. {mas_cli-19.4.0 → mas_cli-19.5.1}/src/mas_cli.egg-info/top_level.txt +0 -0
  134. {mas_cli-19.4.0 → mas_cli-19.5.1}/test/test_baseapp.py +0 -0
  135. {mas_cli-19.4.0 → mas_cli-19.5.1}/test/test_help.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mas-cli
3
- Version: 19.4.0
3
+ Version: 19.5.1
4
4
  Summary: Python Admin CLI for Maximo Application Suite
5
5
  Home-page: https://github.com/ibm-mas/cli
6
6
  Author: David Parker
@@ -8,4 +8,4 @@
8
8
  #
9
9
  # *****************************************************************************
10
10
 
11
- __version__ = "19.4.0" # Python module compatible semver
11
+ __version__ = "19.5.1" # Python module compatible semver
@@ -120,7 +120,7 @@ class BaseApp(PrintMixin, PromptMixin):
120
120
  logging.getLogger('asyncio').setLevel(logging.INFO)
121
121
 
122
122
  # Supports extended semver, unlike mas.cli.__version__
123
- self.version: str = "19.4.0"
123
+ self.version: str = "19.5.1"
124
124
  self.h1count: int = 0
125
125
  self.h2count: int = 0
126
126
 
@@ -978,20 +978,79 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
978
978
  @logMethodCall
979
979
  def configApps(self):
980
980
  self.printH1("Application Selection")
981
- self.installIoT = self.yesOrNo("Install IoT")
982
981
 
982
+ # For Monitor >= 9.2.0: Monitor and IoT are independent (no dependency)
983
+ # For Monitor < 9.2.0: Monitor depends on IoT (original behavior)
984
+ # For IoT >= 9.2.0: IoT depends on Monitor
985
+
986
+ self.installIoT = self.yesOrNo("Install IoT")
983
987
  if self.installIoT:
984
988
  self.configAppChannel("iot")
989
+ iotChannel = self.getParam("mas_app_channel_iot")
990
+
991
+ # Prompt for Monitor installation
985
992
  self.installMonitor = self.yesOrNo("Install Monitor")
993
+ if self.installMonitor:
994
+ self.configAppChannel("monitor")
995
+
996
+ # Validate version compatibility between IoT and Monitor
997
+ monitorChannel = self.getParam("mas_app_channel_monitor")
998
+ if iotChannel and monitorChannel:
999
+ iotIs920OrLater = isVersionEqualOrAfter('9.2.0', iotChannel)
1000
+ monitorIs920OrLater = isVersionEqualOrAfter('9.2.0', monitorChannel)
1001
+
1002
+ # IoT >= 9.2.0 requires Monitor >= 9.2.0
1003
+ if iotIs920OrLater and not monitorIs920OrLater:
1004
+ self.printDescription([
1005
+ "",
1006
+ "<Red>Error: IoT version 9.2.0 or later requires Monitor version 9.2.0 or later.</Red>",
1007
+ f"<Yellow>IoT channel: {iotChannel}, Monitor channel: {monitorChannel}</Yellow>",
1008
+ "<Yellow>Please select compatible versions for both applications.</Yellow>",
1009
+ ""
1010
+ ])
1011
+ self.fatalError("Incompatible IoT and Monitor versions selected")
1012
+
1013
+ # IoT < 9.2.0 requires Monitor < 9.2.0
1014
+ if not iotIs920OrLater and monitorIs920OrLater:
1015
+ self.printDescription([
1016
+ "",
1017
+ "<Red>Error: IoT version earlier than 9.2.0 requires Monitor version earlier than 9.2.0.</Red>",
1018
+ f"<Yellow>IoT channel: {iotChannel}, Monitor channel: {monitorChannel}</Yellow>",
1019
+ "<Yellow>Please select compatible versions for both applications.</Yellow>",
1020
+ ""
1021
+ ])
1022
+ self.fatalError("Incompatible IoT and Monitor versions selected")
1023
+ else:
1024
+ # User declined Monitor installation
1025
+ # Validate: IoT >= 9.2.0 requires Monitor
1026
+ if iotChannel and isVersionEqualOrAfter('9.2.0', iotChannel):
1027
+ self.printDescription([
1028
+ "",
1029
+ "<Red>Error: IoT version 9.2.0 or later requires Monitor to be installed.</Red>",
1030
+ "<Yellow>Please install Monitor to proceed with IoT 9.2.0+ installation.</Yellow>",
1031
+ ""
1032
+ ])
1033
+ self.fatalError("IoT 9.2.0+ requires Monitor to be installed")
1034
+ # For IoT < 9.2.0, Monitor is optional
986
1035
  else:
987
- self.installMonitor = False
1036
+ # If IoT not selected, check Monitor version to determine if standalone is allowed
1037
+ self.installMonitor = self.yesOrNo("Install Monitor")
1038
+ if self.installMonitor:
1039
+ self.configAppChannel("monitor")
1040
+ monitorChannel = self.getParam("mas_app_channel_monitor")
1041
+ # For Monitor < 9.2.0, Monitor requires IoT
1042
+ if monitorChannel and not isVersionEqualOrAfter('9.2.0', monitorChannel):
1043
+ self.printDescription([
1044
+ "",
1045
+ "<Red>Error: Monitor version earlier than 9.2.0 requires IoT to be installed.</Red>",
1046
+ "<Yellow>Please install IoT first, or choose Monitor 9.2.0+ for standalone installation.</Yellow>",
1047
+ ""
1048
+ ])
1049
+ self.installMonitor = False
988
1050
 
989
1051
  # Initialize ArcGIS flag (will be set to True later in arcgisSettings() if needed)
990
1052
  self.installArcgis = False
991
1053
 
992
- if self.installMonitor:
993
- self.configAppChannel("monitor")
994
-
995
1054
  self.manageAppName = "Manage"
996
1055
  self.isManageFoundation = False
997
1056
  self.installManage = self.yesOrNo(f"Install {self.manageAppName}")
@@ -1009,6 +1068,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
1009
1068
  if self.installManage:
1010
1069
  self.configAppChannel("manage")
1011
1070
 
1071
+ # Predict requires IoT + Manage (original behavior maintained)
1012
1072
  if self.installIoT and self.installManage:
1013
1073
  self.installPredict = self.yesOrNo("Install Predict")
1014
1074
  else:
@@ -1106,6 +1166,32 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
1106
1166
  self.setParam("mas_app_settings_iot_fpl_pvc_storage_class", self.getParam("storage_class_rwo"))
1107
1167
  self.setParam("mas_app_settings_iot_mqttbroker_pvc_storage_class", self.getParam("storage_class_rwo"))
1108
1168
 
1169
+ @logMethodCall
1170
+ def setMonitorInstallOrder(self) -> None:
1171
+ """
1172
+ Determine the installation order for Monitor relative to IoT based on Monitor version.
1173
+ Monitor >= 9.2.0 installs before IoT (new behavior)
1174
+ Monitor < 9.2.0 installs after IoT (legacy behavior)
1175
+ """
1176
+ if self.installMonitor and self.installIoT:
1177
+ from mas.devops.utils import isVersionEqualOrAfter
1178
+ monitorChannel = self.getParam("mas_app_channel_monitor")
1179
+
1180
+ if monitorChannel and isVersionEqualOrAfter('9.2.0', monitorChannel):
1181
+ # Monitor >= 9.2.0: Install Monitor before IoT
1182
+ self.setParam("mas_monitor_install_order", "before-iot")
1183
+ logger.debug(f"Monitor channel {monitorChannel} >= 9.2.0: Monitor will install before IoT")
1184
+ else:
1185
+ # Monitor < 9.2.0: Install Monitor after IoT (legacy)
1186
+ self.setParam("mas_monitor_install_order", "after-iot")
1187
+ logger.debug(f"Monitor channel {monitorChannel} < 9.2.0: Monitor will install after IoT (legacy behavior)")
1188
+ elif self.installMonitor:
1189
+ # Only Monitor, no IoT - order doesn't matter but set default
1190
+ self.setParam("mas_monitor_install_order", "before-iot")
1191
+ else:
1192
+ # No Monitor installed - set default
1193
+ self.setParam("mas_monitor_install_order", "after-iot")
1194
+
1109
1195
  @logMethodCall
1110
1196
  def optimizerSettings(self) -> None:
1111
1197
  if self.installOptimizer:
@@ -1866,6 +1952,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
1866
1952
 
1867
1953
  # After we've configured the basic inputs, we can calculate these ones
1868
1954
  self.setIoTStorageClasses()
1955
+ self.setMonitorInstallOrder()
1869
1956
  if self.deployCP4D:
1870
1957
  self.configCP4D()
1871
1958
 
@@ -62,7 +62,7 @@ class installArgBuilderMixin():
62
62
  command += f" --mas-workspace-name \"{self.getParam('mas_workspace_name')}\"{newline}"
63
63
 
64
64
  if self.getParam('mas_special_characters') == "true":
65
- command += f" --allow-special-chars \"{newline}"
65
+ command += f" --allow-special-chars {newline}"
66
66
 
67
67
  # ECK Integration
68
68
  # -----------------------------------------------------------------------------
@@ -93,8 +93,9 @@ class Db2SettingsMixin():
93
93
 
94
94
  self.setDB2DefaultChannel() # Set default channel for Db2 if not already set
95
95
 
96
- # If neither Iot, Manage or Facilities is being installed, we have nothing to do
97
- if not self.installIoT and not self.installManage and not self.installFacilities:
96
+ # If neither Monitor, Manage or Facilities is being installed, we have nothing to do
97
+ # Note: For Monitor >= 9.2.0, Monitor requires Db2; for Monitor < 9.2.0, IoT requires Db2
98
+ if not self.installMonitor and not self.installIoT and not self.installManage and not self.installFacilities:
98
99
  print_formatted_text("No applications have been selected that require a Db2 installation")
99
100
  self.setParam("db2_action_system", "none")
100
101
  self.setParam("db2_action_manage", "none")
@@ -110,15 +111,34 @@ class Db2SettingsMixin():
110
111
 
111
112
  self.setDB2DefaultSettings()
112
113
 
114
+ # Determine which application requires the system database based on Monitor version
115
+ # For Monitor >= 9.2.0: Monitor requires system Db2
116
+ # For Monitor < 9.2.0: IoT requires system Db2 (original behavior)
117
+ from mas.devops.utils import isVersionEqualOrAfter
118
+ monitorChannel = self.getParam("mas_app_channel_monitor")
119
+ useNewDependency = monitorChannel and isVersionEqualOrAfter('9.2.0', monitorChannel)
113
120
  instanceId = self.getParam('mas_instance_id')
114
- # Do we need to set up an IoT database?
115
- if self.installIoT:
121
+ # Do we need to set up a system database?
122
+ if useNewDependency and self.installMonitor:
123
+ # New behavior: Monitor >= 9.2.0 requires system Db2
124
+ if not silentMode:
125
+ self.printH2("Database Configuration for Maximo Monitor")
126
+ self.printDescription([
127
+ "Maximo Monitor requires a shared system-scope Db2 instance because other applications in the suite require access to the same database source",
128
+ " - Only IBM Db2 is supported for this database"
129
+ ])
130
+ elif self.installIoT:
131
+ # Original behavior: IoT requires system Db2
116
132
  if not silentMode:
117
133
  self.printH2("Database Configuration for Maximo IoT")
118
134
  self.printDescription([
119
- "Maximo IoT requires a shared system-scope Db2 instance because others application in the suite require access to the same database source",
135
+ "Maximo IoT requires a shared system-scope Db2 instance because other applications in the suite require access to the same database source",
120
136
  " - Only IBM Db2 is supported for this database"
121
137
  ])
138
+ else:
139
+ self.setParam("db2_action_system", "none")
140
+
141
+ if (useNewDependency and self.installMonitor) or (not useNewDependency and self.installIoT):
122
142
  createSystemDb2UsingUniversalOperator = True
123
143
  if not silentMode:
124
144
  createSystemDb2UsingUniversalOperator = self.yesOrNo("Create system Db2 instance using the IBM Db2 Universal Operator")
@@ -153,7 +173,7 @@ class Db2SettingsMixin():
153
173
  ])
154
174
  # Determine whether to use the system or a dedicated database
155
175
  reuseSystemDb2 = False
156
- if self.installIoT:
176
+ if (useNewDependency and self.installMonitor) or (not useNewDependency and self.installIoT):
157
177
  if not silentMode:
158
178
  reuseSystemDb2 = self.yesOrNo(f"Re-use System Db2 instance for {self.manageAppName} application")
159
179
  if reuseSystemDb2:
@@ -11,6 +11,7 @@
11
11
  from typing import TYPE_CHECKING, Dict, List, NoReturn
12
12
  from os import path
13
13
  from prompt_toolkit import print_formatted_text
14
+ from mas.devops.utils import isVersionEqualOrAfter
14
15
 
15
16
 
16
17
  if TYPE_CHECKING:
@@ -23,6 +24,7 @@ class KafkaSettingsMixin():
23
24
  # Attributes from BaseApp and other mixins
24
25
  params: Dict[str, str]
25
26
  installIoT: bool
27
+ installMonitor: bool
26
28
  showAdvancedOptions: bool
27
29
  localConfigDir: str | None
28
30
 
@@ -72,10 +74,15 @@ class KafkaSettingsMixin():
72
74
  ...
73
75
 
74
76
  def configKafka(self) -> None:
75
- if self.installIoT:
77
+ # Check if we should use the new dependency (Monitor >= 9.2.0)
78
+ monitorChannel = self.getParam("mas_app_channel_monitor")
79
+ useNewDependency = monitorChannel and isVersionEqualOrAfter('9.2.0', monitorChannel)
80
+
81
+ if (useNewDependency and self.installMonitor) or (not useNewDependency and self.installIoT):
82
+ appName = "Monitor" if (useNewDependency and self.installMonitor) else "IoT"
76
83
  self.printH1("Configure Kafka")
77
84
  self.printDescription([
78
- "Maximo IoT requires a shared system-scope Kafka instance",
85
+ f"Maximo {appName} requires a shared system-scope Kafka instance",
79
86
  "Supported Kafka providers: Strimzi, Red Hat AMQ Streams, IBM Cloud Event Streams and AWS MSK",
80
87
  "You may also choose to configure MAS to use an existing Kafka instance by providing a pre-existing configuration file"
81
88
  ])