mas-cli 13.1.1__tar.gz → 13.3.0__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.

Potentially problematic release.


This version of mas-cli might be problematic. Click here for more details.

Files changed (115) hide show
  1. {mas_cli-13.1.1 → mas_cli-13.3.0}/PKG-INFO +1 -1
  2. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/__init__.py +1 -1
  3. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/cli.py +3 -2
  4. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/app.py +117 -43
  5. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/argBuilder.py +18 -3
  6. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/argParser.py +39 -0
  7. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/catalogs.py +2 -1
  8. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/params.py +4 -0
  9. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/additionalConfigs.py +14 -1
  10. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/summarizer.py +10 -2
  11. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/ibm-mas-tekton.yaml +315 -114
  12. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/update/app.py +8 -6
  13. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas_cli.egg-info/PKG-INFO +1 -1
  14. {mas_cli-13.1.1 → mas_cli-13.3.0}/MANIFEST.in +0 -0
  15. {mas_cli-13.1.1 → mas_cli-13.3.0}/README.rst +0 -0
  16. {mas_cli-13.1.1 → mas_cli-13.3.0}/pyproject.toml +0 -0
  17. {mas_cli-13.1.1 → mas_cli-13.3.0}/setup.cfg +0 -0
  18. {mas_cli-13.1.1 → mas_cli-13.3.0}/setup.py +0 -0
  19. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/displayMixins.py +0 -0
  20. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/gencfg.py +0 -0
  21. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/__init__.py +0 -0
  22. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/__init__.py +0 -0
  23. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/db2Settings.py +0 -0
  24. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/kafkaSettings.py +0 -0
  25. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/manageSettings.py +0 -0
  26. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/mongodbSettings.py +0 -0
  27. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/install/settings/turbonomicSettings.py +0 -0
  28. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
  29. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  30. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
  31. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
  32. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
  33. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
  34. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
  35. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
  36. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
  37. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
  38. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
  39. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
  40. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
  41. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
  42. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
  43. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
  44. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
  45. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
  46. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
  47. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
  48. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
  49. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
  50. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
  51. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
  52. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
  53. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
  54. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
  55. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
  56. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
  57. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
  58. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
  59. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
  60. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
  61. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
  62. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
  63. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
  64. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  65. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
  66. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
  67. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
  68. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
  69. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
  70. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
  71. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
  72. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
  73. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
  74. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
  75. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
  76. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
  77. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
  78. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
  79. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
  80. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
  81. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
  82. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
  83. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
  84. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
  85. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
  86. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
  87. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
  88. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
  89. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
  90. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
  91. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
  92. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
  93. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
  94. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
  95. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
  96. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
  97. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
  98. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
  99. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
  100. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/uninstall/__init__.py +0 -0
  101. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/uninstall/app.py +0 -0
  102. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/uninstall/argParser.py +0 -0
  103. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/update/__init__.py +0 -0
  104. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/update/argParser.py +0 -0
  105. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/upgrade/__init__.py +0 -0
  106. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/upgrade/app.py +0 -0
  107. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/upgrade/argParser.py +0 -0
  108. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas/cli/validators.py +0 -0
  109. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas-cli +0 -0
  110. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas_cli.egg-info/SOURCES.txt +0 -0
  111. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas_cli.egg-info/dependency_links.txt +0 -0
  112. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas_cli.egg-info/requires.txt +0 -0
  113. {mas_cli-13.1.1 → mas_cli-13.3.0}/src/mas_cli.egg-info/top_level.txt +0 -0
  114. {mas_cli-13.1.1 → mas_cli-13.3.0}/test/test_help.py +0 -0
  115. {mas_cli-13.1.1 → mas_cli-13.3.0}/test/test_install.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mas-cli
3
- Version: 13.1.1
3
+ Version: 13.3.0
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__ = "13.1.1" # Python module compatible semver
11
+ __version__ = "13.3.0" # Python module compatible semver
@@ -117,7 +117,7 @@ class BaseApp(PrintMixin, PromptMixin):
117
117
  logging.getLogger('asyncio').setLevel(logging.INFO)
118
118
 
119
119
  # Supports extended semver, unlike mas.cli.__version__
120
- self.version = "13.1.1"
120
+ self.version = "13.3.0"
121
121
  self.h1count = 0
122
122
  self.h2count = 0
123
123
 
@@ -132,9 +132,10 @@ class BaseApp(PrintMixin, PromptMixin):
132
132
  # Initialize the dictionary that will hold the parameters we pass to a PipelineRun
133
133
  self.params = dict()
134
134
 
135
- # These dicts will hold the additional-configs, pod-templates and manual certificates secrets
135
+ # These dicts will hold the additional-configs, pod-templates, sls license file and manual certificates secrets
136
136
  self.additionalConfigsSecret = None
137
137
  self.podTemplatesSecret = None
138
+ self.slsLicenseFileSecret = None
138
139
  self.certsSecret = None
139
140
 
140
141
  self._isSNO = None
@@ -45,6 +45,7 @@ from mas.cli.validators import (
45
45
 
46
46
  from mas.devops.ocp import createNamespace, getStorageClasses
47
47
  from mas.devops.mas import getCurrentCatalog, getDefaultStorageClasses
48
+ from mas.devops.sls import findSLSByNamespace
48
49
  from mas.devops.data import getCatalog
49
50
  from mas.devops.tekton import (
50
51
  installOpenShiftPipelines,
@@ -158,47 +159,67 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
158
159
  year = date[:2]
159
160
  return f" - {monthName} 20{year} Update\n <Orange><u>https://ibm-mas.github.io/cli/catalogs/{name}</u></Orange>"
160
161
 
161
- def formatRelease(self, release: str) -> str:
162
- return f"{release} ... {self.catalogReleases[release]['core']}"
163
-
164
162
  @logMethodCall
165
163
  def processCatalogChoice(self) -> list:
166
164
  self.catalogDigest = self.chosenCatalog["catalog_digest"]
167
- self.catalogCp4dVersion = self.chosenCatalog["cpd_product_version_default"]
168
165
  self.catalogMongoDbVersion = self.chosenCatalog["mongo_extras_version_default"]
166
+ if self.architecture != "s390x":
167
+ self.catalogCp4dVersion = self.chosenCatalog["cpd_product_version_default"]
168
+
169
+ applications = {
170
+ "Core": "mas_core_version",
171
+ "Manage": "mas_manage_version",
172
+ "IoT": "mas_iot_version",
173
+ "Monitor": "mas_monitor_version",
174
+ "Assist": "mas_assist_version",
175
+ "Optimizer": "mas_optimizer_version",
176
+ "Predict": "mas_predict_version",
177
+ "Inspection": "mas_visualinspection_version",
178
+ }
179
+ else:
180
+ applications = {
181
+ "Core": "mas_core_version",
182
+ "Manage": "mas_manage_version",
183
+ }
169
184
 
170
- self.catalogReleases = []
185
+ self.catalogReleases = {}
171
186
  self.catalogTable = []
172
187
 
173
- applications = {
174
- "Core": "mas_core_version",
175
- "Manage": "mas_manage_version",
176
- "IoT": "mas_iot_version",
177
- "Monitor": "mas_monitor_version",
178
- "Assist": "mas_assist_version",
179
- "Optimizer": "mas_optimizer_version",
180
- "Predict": "mas_predict_version",
181
- "Inspection": "mas_visualinspection_version",
182
- }
183
-
184
188
  # Dynamically fetch the channels from the chosen catalog
185
189
  # based on mas core
186
190
  for channel in self.chosenCatalog["mas_core_version"]:
187
- self.catalogReleases.append(channel)
191
+ # {"9.1-feature": "9.1.x-feature"}
192
+ self.catalogReleases.update({channel.replace('.x', ''): channel})
188
193
 
189
194
  # Generate catalogTable
190
195
  for application, key in applications.items():
191
- self.catalogTable.append({"": application} | self.chosenCatalog[key])
196
+ # Add 9.1-feature channel based off 9.0 to those apps that have not onboarded yet
197
+ tempChosenCatalog = self.chosenCatalog[key].copy()
198
+ if '9.1.x-feature' not in tempChosenCatalog:
199
+ tempChosenCatalog.update({"9.1.x-feature": tempChosenCatalog["9.0.x"]})
200
+
201
+ self.catalogTable.append({"": application} | {key.replace(".x", ""): value for key, value in sorted(tempChosenCatalog.items(), reverse=True)})
202
+
203
+ if self.architecture == "s390x":
204
+ summary = [
205
+ "",
206
+ "<u>Catalog Details</u>",
207
+ f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
208
+ f"Catalog Digest: {self.catalogDigest}",
209
+ f"MAS Releases: {', '.join(sorted(self.catalogReleases, reverse=True))}",
210
+ f"MongoDb: {self.catalogMongoDbVersion}",
211
+ ]
212
+ else:
213
+ summary = [
214
+ "",
215
+ "<u>Catalog Details</u>",
216
+ f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
217
+ f"Catalog Digest: {self.catalogDigest}",
218
+ f"MAS Releases: {', '.join(sorted(self.catalogReleases, reverse=True))}",
219
+ f"Cloud Pak for Data: {self.catalogCp4dVersion}",
220
+ f"MongoDb: {self.catalogMongoDbVersion}",
221
+ ]
192
222
 
193
- summary = [
194
- "",
195
- "<u>Catalog Details</u>",
196
- f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
197
- f"Catalog Digest: {self.catalogDigest}",
198
- f"MAS Releases: {', '.join(self.catalogReleases)}",
199
- f"Cloud Pak for Data: {self.catalogCp4dVersion}",
200
- f"MongoDb: {self.catalogMongoDbVersion}",
201
- ]
202
223
  return summary
203
224
 
204
225
  @logMethodCall
@@ -237,28 +258,64 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
237
258
  self.printDescription(catalogSummary)
238
259
  self.printDescription([
239
260
  "",
240
- "Multiple releases of Maximo Application Suite are available, each is supported under IBM's standard 3+1+3 support model.",
241
- "Choose the release of IBM Maximo Application Suite that you want to use for this installation from the table below:",
261
+ "Two types of release are available:",
262
+ " - GA releases of Maximo Application Suite are supported under IBM's standard 3+1+3 support lifecycle policy.",
263
+ " - 'Feature' releases allow early access to new features for evaluation in non-production environments and are only supported through to the next GA release.",
242
264
  ""
243
265
  ])
244
266
 
245
267
  print(tabulate(self.catalogTable, headers="keys", tablefmt="simple_grid"))
246
268
 
247
- releaseCompleter = WordCompleter(self.catalogReleases)
269
+ releaseCompleter = WordCompleter(sorted(self.catalogReleases, reverse=True))
248
270
  releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
249
271
 
250
- self.setParam("mas_channel", releaseSelection)
272
+ self.setParam("mas_channel", self.catalogReleases[releaseSelection])
251
273
 
252
274
  @logMethodCall
253
275
  def configSLS(self) -> None:
254
- self.printH1("Configure Product License")
276
+ self.printH1("Configure AppPoint Licensing")
277
+ self.printDescription(
278
+ [
279
+ "By default the MAS instance will be configured to use a cluster-shared License, this provides a shared pool of AppPoints available to all MAS instances on the cluster.",
280
+ "",
281
+ ]
282
+ )
283
+
284
+ self.slsMode = 1
285
+ self.slsLicenseFileLocal = None
286
+
287
+ if self.showAdvancedOptions:
288
+ self.printDescription(
289
+ [
290
+ "Alternatively you may choose to install using a dedicated license only available to this MAS instance.",
291
+ " 1. Install MAS with Cluster-Shared License (AppPoints)",
292
+ " 2. Install MAS with Dedicated License (AppPoints)",
293
+ ]
294
+ )
295
+ self.slsMode = self.promptForInt("SLS Mode", default=1)
296
+
297
+ if self.slsMode not in [1, 2]:
298
+ self.fatalError(f"Invalid selection: {self.slsMode}")
299
+
300
+ if not (self.slsMode == 2 and not self.getParam("sls_namespace")):
301
+ sls_namespace = "ibm-sls" if self.slsMode == 1 else self.getParam("sls_namespace")
302
+ if findSLSByNamespace(sls_namespace, dynClient=self.dynamicClient):
303
+ print_formatted_text(HTML(f"<MediumSeaGreen>SLS auto-detected: {sls_namespace}</MediumSeaGreen>"))
304
+ print()
305
+ if not self.yesOrNo("Upload/Replace the license file"):
306
+ self.setParam("sls_action", "gencfg")
307
+ return
308
+
255
309
  self.slsLicenseFileLocal = self.promptForFile("License file", mustExist=True, envVar="SLS_LICENSE_FILE_LOCAL")
310
+ self.setParam("sls_action", "install")
311
+
312
+ @logMethodCall
313
+ def configDRO(self) -> None:
256
314
  self.promptForString("Contact e-mail address", "uds_contact_email")
257
315
  self.promptForString("Contact first name", "uds_contact_firstname")
258
316
  self.promptForString("Contact last name", "uds_contact_lastname")
259
317
 
260
318
  if self.showAdvancedOptions:
261
- self.promptForString("IBM Suite License Services (SLS) Namespace", "sls_namespace", default="ibm-sls")
262
319
  self.promptForString("IBM Data Reporter Operator (DRO) Namespace", "dro_namespace", default="redhat-marketplace")
263
320
 
264
321
  @logMethodCall
@@ -379,6 +436,9 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
379
436
  ])
380
437
  self.promptForString("Workspace name", "mas_workspace_name", validator=WorkspaceNameFormatValidator())
381
438
 
439
+ if self.slsMode == 2 and not self.getParam("sls_namespace"):
440
+ self.setParam("sls_namespace", f"mas-{self.getParam('mas_instance_id')}-sls")
441
+
382
442
  self.configOperationMode()
383
443
  self.configCATrust()
384
444
  self.configDNSAndCerts()
@@ -730,6 +790,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
730
790
 
731
791
  # Licensing (SLS and DRO)
732
792
  self.configSLS()
793
+ self.configDRO()
733
794
  self.configICRCredentials()
734
795
 
735
796
  # MAS Core
@@ -778,6 +839,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
778
839
  self.deployCP4D = False
779
840
  self.db2SetAffinity = False
780
841
  self.db2SetTolerations = False
842
+ self.slsLicenseFileLocal = None
781
843
 
782
844
  self.approvals = {
783
845
  "approval_core": {"id": "suite-verify"}, # After Core Platform verification has completed
@@ -886,6 +948,14 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
886
948
  self.setParam(key, value)
887
949
  if value in ["jms", "snojms"]:
888
950
  self.setParam("mas_app_settings_persistent_volumes_flag", "true")
951
+ # SLS
952
+ elif key == "license_file":
953
+ if value is not None and value != "":
954
+ self.slsLicenseFileLocal = value
955
+ self.setParam("sls_action", "install")
956
+ elif key == "dedicated_sls":
957
+ if value:
958
+ self.setParam("sls_namespace", f"mas-{self.args.mas_instance_id}-sls")
889
959
 
890
960
  # These settings are used by the CLI rather than passed to the PipelineRun
891
961
  elif key == "storage_accessmode":
@@ -896,10 +966,6 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
896
966
  if value is None:
897
967
  self.fatalError(f"{key} must be set")
898
968
  self.pipelineStorageClass = value
899
- elif key == "license_file":
900
- if value is None:
901
- self.fatalError(f"{key} must be set")
902
- self.slsLicenseFileLocal = value
903
969
 
904
970
  elif key.startswith("approval_"):
905
971
  if key not in self.approvals:
@@ -937,6 +1003,13 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
937
1003
  # Load the catalog information
938
1004
  self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
939
1005
 
1006
+ # License file is only optional for existing SLS instance
1007
+ if self.slsLicenseFileLocal is None:
1008
+ if findSLSByNamespace(self.getParam("sls_namespace"), dynClient=self.dynamicClient):
1009
+ self.setParam("sls_action", "gencfg")
1010
+ else:
1011
+ self.fatalError("--license-file must be set for new SLS install")
1012
+
940
1013
  # Once we've processed the inputs, we should validate the catalog source & prompt to accept the license terms
941
1014
  if not self.devMode:
942
1015
  self.validateCatalogSource()
@@ -960,6 +1033,10 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
960
1033
  self.devMode = args.dev_mode
961
1034
  self.skipGrafanaInstall = args.skip_grafana_install
962
1035
 
1036
+ # Set image_pull_policy of the CLI in interactive mode
1037
+ if args.image_pull_policy and args.image_pull_policy != "":
1038
+ self.setParam("image_pull_policy", args.image_pull_policy)
1039
+
963
1040
  self.approvals = {}
964
1041
 
965
1042
  # Store all args
@@ -1007,13 +1084,10 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
1007
1084
  if self.deployCP4D:
1008
1085
  self.configCP4D()
1009
1086
 
1010
- # The entitlement file for SLS is mounted as a secret in /workspace/entitlement
1011
- entitlementFileBaseName = path.basename(self.slsLicenseFileLocal)
1012
- self.setParam("sls_entitlement_file", f"/workspace/entitlement/{entitlementFileBaseName}")
1013
-
1014
- # Set up the secrets for additional configs, podtemplates and manual certificates
1087
+ # Set up the secrets for additional configs, podtemplates, sls license file and manual certificates
1015
1088
  self.additionalConfigs()
1016
1089
  self.podTemplates()
1090
+ self.slsLicenseFile()
1017
1091
  self.manualCertificates()
1018
1092
 
1019
1093
  # Show a summary of the installation configuration
@@ -1065,7 +1139,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
1065
1139
  prepareInstallSecrets(
1066
1140
  dynClient=self.dynamicClient,
1067
1141
  instanceId=self.getParam("mas_instance_id"),
1068
- slsLicenseFile=self.slsLicenseFileLocal,
1142
+ slsLicenseFile=self.slsLicenseFileSecret,
1069
1143
  additionalConfigs=self.additionalConfigsSecret,
1070
1144
  podTemplates=self.podTemplatesSecret,
1071
1145
  certs=self.certsSecret
@@ -122,9 +122,15 @@ class installArgBuilderMixin():
122
122
 
123
123
  # IBM Suite License Service
124
124
  # -----------------------------------------------------------------------------
125
- command += f" --license-file \"{self.slsLicenseFileLocal}\"{newline}"
126
- if self.getParam("sls_namespace") != "ibm-sls":
127
- command += f" --sls-namespace \"{self.getParam('sls_namespace')}\"{newline}"
125
+ if self.getParam("sls_namespace") and self.getParam("sls_namespace") != "ibm-sls":
126
+ if self.getParam("mas_instance_id") and self.getParam("sls_namespace") == f"mas-{self.getParam('mas_instance_id')}-sls":
127
+ command += " --dedicated-sls"
128
+ else:
129
+ command += f" --sls-namespace \"{self.getParam('sls_namespace')}\""
130
+ if self.slsLicenseFileLocal:
131
+ command += f" --license-file \"{self.slsLicenseFileLocal}\""
132
+ if self.getParam("sls_namespace") and self.getParam("sls_namespace") != "ibm-sls" or self.slsLicenseFileLocal:
133
+ command += newline
128
134
 
129
135
  # IBM Data Reporting Operator (DRO)
130
136
  # -----------------------------------------------------------------------------
@@ -222,6 +228,9 @@ class installArgBuilderMixin():
222
228
  if self.getParam('mas_manage_attachment_configuration_mode') != "":
223
229
  command += f" --manage-attachments-mode \"{self.getParam('mas_manage_attachment_configuration_mode')}\"{newline}"
224
230
 
231
+ if self.getParam('mas_appws_bindings_health_wsl_flag') == "true":
232
+ command += f" --manage-health-wsl{newline}"
233
+
225
234
  # IBM Cloud Pak for Data
226
235
  # -----------------------------------------------------------------------------
227
236
  if self.getParam('cpd_product_version') != "":
@@ -232,6 +241,12 @@ class installArgBuilderMixin():
232
241
  command += " --cp4d-install-openscal"
233
242
  if self.getParam('cpd_install_cognos') == "install":
234
243
  command += " --cp4d-install-cognos"
244
+ if self.getParam('cpd_install_ws') == "install":
245
+ command += " --cp4d-install-ws"
246
+ if self.getParam('cpd_install_wml') == "install":
247
+ command += " --cp4d-install-wml"
248
+ if self.getParam('cpd_install_ae') == "install":
249
+ command += " --cp4d-install-ae"
235
250
  command += newline
236
251
 
237
252
  # IBM Db2 Universal Operator
@@ -263,6 +263,12 @@ slsArgGroup.add_argument(
263
263
  help="Customize the SLS install namespace",
264
264
  default="ibm-sls"
265
265
  )
266
+ slsArgGroup.add_argument(
267
+ "--dedicated-sls",
268
+ action="store_true",
269
+ default=False,
270
+ help="Set the SLS namespace to mas-<instanceid>-sls"
271
+ )
266
272
 
267
273
  # IBM Data Reporting Operator (DRO)
268
274
  # -----------------------------------------------------------------------------
@@ -562,6 +568,15 @@ manageArgGroup.add_argument(
562
568
  default="base=latest,health=latest"
563
569
  )
564
570
 
571
+ manageArgGroup.add_argument(
572
+ "--manage-health-wsl",
573
+ dest="mas_appws_bindings_health_wsl_flag",
574
+ required=False,
575
+ help="Set boolean value indicating if Watson Studio must be bound to Manage. It is expected a system level WatsonStudioCfg applied in the cluster.",
576
+ action="store_const",
577
+ const="true"
578
+ )
579
+
565
580
  manageArgGroup.add_argument(
566
581
  "--manage-customization-archive-name",
567
582
  dest="mas_app_settings_customization_archive_name",
@@ -707,6 +722,30 @@ cpdAppsArgGroup.add_argument(
707
722
  action="store_const",
708
723
  const="install"
709
724
  )
725
+ cpdAppsArgGroup.add_argument(
726
+ "--cp4d-install-ws",
727
+ dest="cpd_install_ws",
728
+ required=False,
729
+ help="Add Watson Studio as part of Cloud Pak for Data",
730
+ action="store_const",
731
+ const="install"
732
+ )
733
+ cpdAppsArgGroup.add_argument(
734
+ "--cp4d-install-wml",
735
+ dest="cpd_install_wml",
736
+ required=False,
737
+ help="Add Watson Machine Learning as part of Cloud Pak for Data",
738
+ action="store_const",
739
+ const="install"
740
+ )
741
+ cpdAppsArgGroup.add_argument(
742
+ "--cp4d-install-ae",
743
+ dest="cpd_install_ae",
744
+ required=False,
745
+ help="Add Spark Analytics Engine as part of Cloud Pak for Data",
746
+ action="store_const",
747
+ const="install"
748
+ )
710
749
 
711
750
  # IBM Db2 Universal Operator
712
751
  # -----------------------------------------------------------------------------
@@ -9,12 +9,13 @@
9
9
  # *****************************************************************************
10
10
  supportedCatalogs = {
11
11
  "amd64": [
12
+ "v9-250206-amd64",
12
13
  "v9-250109-amd64",
13
14
  "v9-241205-amd64",
14
15
  "v9-241107-amd64",
15
- "v9-241003-amd64",
16
16
  ],
17
17
  "s390x": [
18
+ "v9-250206-s390x",
18
19
  "v9-250109-s390x",
19
20
  "v9-241205-s390x",
20
21
  "v9-241107-s390x",
@@ -57,6 +57,7 @@ optionalParams = [
57
57
  "mas_app_settings_server_timezone",
58
58
  "mas_appws_bindings_jdbc_manage",
59
59
  "mas_appws_components",
60
+ "mas_appws_bindings_health_wsl_flag",
60
61
  "mas_domain",
61
62
  # SLS
62
63
  "sls_namespace",
@@ -98,6 +99,9 @@ optionalParams = [
98
99
  "cpd_install_cognos",
99
100
  "cpd_install_openscale",
100
101
  "cpd_install_spss",
102
+ "cpd_install_ws",
103
+ "cpd_install_wml",
104
+ "cpd_install_ae",
101
105
  # Kafka
102
106
  "kafka_namespace",
103
107
  "kafka_version",
@@ -89,7 +89,7 @@ class AdditionalConfigsMixin():
89
89
  elif podTemplateChoice == 2:
90
90
  self.setParam("mas_pod_templates_dir", path.join(self.templatesDir, "pod-templates", "best-effort"))
91
91
  elif podTemplateChoice == 3:
92
- self.promptForDir("Pod templates directory", "mas_pod_templates_dir", mustExist=True)
92
+ self.setParam("mas_pod_templates_dir", self.promptForDir("Pod templates directory", mustExist=True))
93
93
  else:
94
94
  self.fatalError(f"Invalid selection: {podTemplateChoice}")
95
95
 
@@ -182,6 +182,19 @@ class AdditionalConfigsMixin():
182
182
 
183
183
  self.certsSecret = certsSecret
184
184
 
185
+ def slsLicenseFile(self) -> None:
186
+ if self.slsLicenseFileLocal:
187
+ slsLicenseFileSecret = {
188
+ "apiVersion": "v1",
189
+ "kind": "Secret",
190
+ "type": "Opaque",
191
+ "metadata": {
192
+ "name": "pipeline-sls-entitlement"
193
+ }
194
+ }
195
+ self.setParam("sls_entitlement_file", f"/workspace/entitlement/{path.basename(self.slsLicenseFileLocal)}")
196
+ self.slsLicenseFileSecret = self.addFilesToSecret(slsLicenseFileSecret, self.slsLicenseFileLocal, '')
197
+
185
198
  def addFilesToSecret(self, secretDict: dict, configPath: str, extension: str, keyPrefix: str = '') -> dict:
186
199
  """
187
200
  Add file (or files) to pipeline-additional-configs
@@ -252,6 +252,11 @@ class InstallSummarizerMixin():
252
252
  self.printSummary("Watson Studio Local", "Install (Required by Maximo Predict)")
253
253
  self.printSummary("Watson Machine Learning", "Install (Required by Maximo Predict)")
254
254
  self.printSummary("Analytics Engine", "Install (Required by Maximo Predict)")
255
+ else:
256
+ self.printSummary("Watson Studio Local", "Install" if self.getParam("cpd_install_ws") == "true" else "Do Not Install")
257
+ self.printSummary("Watson Machine Learning", "Install" if self.getParam("cpd_install_wml") == "true" else "Do Not Install")
258
+ self.printSummary("Analytics Engine", "Install" if self.getParam("cpd_install_ae") == "true" else "Do Not Install")
259
+
255
260
  self.printSummary("Watson Openscale", "Install" if self.getParam("cpd_install_openscale") == "true" else "Do Not Install")
256
261
  self.printSummary("SPSS Modeler", "Install" if self.getParam("cpd_install_spss") == "true" else "Do Not Install")
257
262
  self.printSummary("Cognos Analytics", "Install" if self.getParam("cpd_install_cognos") == "true" else "Do Not Install")
@@ -265,9 +270,12 @@ class InstallSummarizerMixin():
265
270
 
266
271
  def slsSummary(self) -> None:
267
272
  self.printH2("IBM Suite License Service")
268
- self.printSummary("License File", self.slsLicenseFileLocal)
269
- self.printParamSummary("IBM Open Registry", "sls_icr_cpopen")
270
273
  self.printParamSummary("Namespace", "sls_namespace")
274
+ if self.getParam("sls_action") == "install":
275
+ self.printSummary("Subscription Channel", "3.x")
276
+ self.printParamSummary("IBM Open Registry", "sls_icr_cpopen")
277
+ if self.slsLicenseFileLocal:
278
+ self.printSummary("License File", self.slsLicenseFileLocal)
271
279
 
272
280
  def cosSummary(self) -> None:
273
281
  self.printH2("Cloud Object Storage")