mas-cli 11.9.3__py3-none-any.whl → 11.10.0__py3-none-any.whl

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.

mas/cli/__init__.py CHANGED
@@ -8,4 +8,4 @@
8
8
  #
9
9
  # *****************************************************************************
10
10
 
11
- __version__ = "11.9.3" # Python module compatible semver
11
+ __version__ = "11.10.0" # Python module compatible semver
mas/cli/cli.py CHANGED
@@ -25,7 +25,7 @@ from kubernetes.client import api_client, Configuration
25
25
  from openshift.dynamic import DynamicClient
26
26
  from openshift.dynamic.exceptions import NotFoundError
27
27
 
28
- from prompt_toolkit import prompt, print_formatted_text, HTML
28
+ from prompt_toolkit import prompt, print_formatted_text, HTML, PromptSession
29
29
 
30
30
  from mas.devops.mas import isAirgapInstall
31
31
  from mas.devops.ocp import connect, isSNO, getNodes
@@ -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 = "11.9.3"
120
+ self.version = "11.10.0"
121
121
  self.h1count = 0
122
122
  self.h2count = 0
123
123
 
@@ -173,6 +173,7 @@ class BaseApp(PrintMixin, PromptMixin):
173
173
  "visualinspection": ["8.8.x", "8.7.x"]
174
174
  }
175
175
  }
176
+ self.promptSession = PromptSession()
176
177
 
177
178
  self.spinner = {
178
179
  "interval": 80,
@@ -184,9 +185,9 @@ class BaseApp(PrintMixin, PromptMixin):
184
185
  self._dynClient = None
185
186
 
186
187
  self.printTitle(f"\nIBM Maximo Application Suite Admin CLI v{self.version}")
187
- print_formatted_text(HTML("Powered by <DarkGoldenRod><u>https://github.com/ibm-mas/ansible-devops/</u></DarkGoldenRod> and <DarkGoldenRod><u>https://tekton.dev/</u></DarkGoldenRod>\n"))
188
+ print_formatted_text(HTML("Powered by <Orange><u>https://github.com/ibm-mas/ansible-devops/</u></Orange> and <Orange><u>https://tekton.dev/</u></Orange>\n"))
188
189
  if which("kubectl") is None:
189
- self.fatalError("Could not find kubectl on the path, see <DarkGoldenRod><u>https://kubernetes.io/docs/tasks/tools/#kubectl</u></DarkGoldenRod> for installation instructions")
190
+ self.fatalError("Could not find kubectl on the path, see <Orange><u>https://kubernetes.io/docs/tasks/tools/#kubectl</u></Orange> for installation instructions")
190
191
 
191
192
  @logMethodCall
192
193
  def createTektonFileWithDigest(self) -> None:
mas/cli/displayMixins.py CHANGED
@@ -90,7 +90,11 @@ class PromptMixin():
90
90
  if param is not None and default == "":
91
91
  default = getenv(param.upper(), default="")
92
92
 
93
- response = prompt(masPromptValue(message), is_password=isPassword, default=default, completer=completer, validator=validator, validate_while_typing=False)
93
+ if completer is not None:
94
+ response = self.promptSession.prompt(masPromptValue(message), is_password=isPassword, default=default, completer=completer, validator=validator, validate_while_typing=False, pre_run=self.promptSession.default_buffer.start_completion)
95
+ else:
96
+ response = self.promptSession.prompt(masPromptValue(message), is_password=isPassword, default=default, completer=completer, validator=validator, validate_while_typing=False)
97
+
94
98
  if param is not None:
95
99
  self.params[param] = response
96
100
  return response
mas/cli/install/app.py CHANGED
@@ -14,10 +14,12 @@ import logging.handlers
14
14
  from sys import exit
15
15
  from os import path, getenv
16
16
  import re
17
+ import calendar
17
18
 
18
19
  from openshift.dynamic.exceptions import NotFoundError
19
20
 
20
21
  from prompt_toolkit import prompt, print_formatted_text, HTML
22
+ from prompt_toolkit.completion import WordCompleter
21
23
 
22
24
  from tabulate import tabulate
23
25
 
@@ -30,7 +32,7 @@ from .argParser import installArgParser
30
32
  from .settings import InstallSettingsMixin
31
33
  from .summarizer import InstallSummarizerMixin
32
34
  from .params import requiredParams, optionalParams
33
- from .catalogs import catalogChoices
35
+ from .catalogs import supportedCatalogs
34
36
 
35
37
  from mas.cli.validators import (
36
38
  InstanceIDFormatValidator,
@@ -41,7 +43,9 @@ from mas.cli.validators import (
41
43
  OptimizerInstallPlanValidator
42
44
  )
43
45
 
44
- from mas.devops.ocp import createNamespace, getStorageClass, getStorageClasses
46
+ from mas.devops.ocp import createNamespace, getStorageClasses
47
+ from mas.devops.mas import getCurrentCatalog, getDefaultStorageClasses
48
+ from mas.devops.data import getCatalog
45
49
  from mas.devops.tekton import (
46
50
  installOpenShiftPipelines,
47
51
  updateTektonDefinitions,
@@ -102,17 +106,17 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
102
106
  self.fatalError(
103
107
  "\n".join([
104
108
  "Unable to proceed with installation of Maximo Manage. Could not detect the required \"image-registry\" service in the openshift-image-registry namespace",
105
- "For more information refer to <u>https://www.ibm.com/docs/en/masv-and-l/continuous-delivery?topic=installing-enabling-openshift-internal-image-registry</u>"
109
+ "For more information refer to <Orange><u>https://www.ibm.com/docs/en/masv-and-l/continuous-delivery?topic=installing-enabling-openshift-internal-image-registry</u></Orange>"
106
110
  ])
107
111
  )
108
112
 
109
113
  @logMethodCall
110
114
  def licensePrompt(self):
111
115
  licenses = {
112
- "8.9.x": " - <u>https://ibm.biz/MAS89-License</u>",
113
- "8.10.x": " - <u>https://ibm.biz/MAS810-License</u>",
114
- "8.11.x": " - <u>https://ibm.biz/MAS811-License</u>\n - <u>https://ibm.biz/MAXIT81-License</u>",
115
- "9.0.x": " - <u>https://ibm.biz/MAS90-License</u>\n - <u>https://ibm.biz/MaximoIT90-License</u>\n - <u>https://ibm.biz/MAXArcGIS90-License</u>"
116
+ "8.9.x": " - <Orange><u>https://ibm.biz/MAS89-License</u></Orange>",
117
+ "8.10.x": " - <Orange><u>https://ibm.biz/MAS810-License</u></Orange>",
118
+ "8.11.x": " - <Orange><u>https://ibm.biz/MAS811-License</u></Orange>\n - <Orange><u>https://ibm.biz/MAXIT81-License</u></Orange>",
119
+ "9.0.x": " - <Orange><u>https://ibm.biz/MAS90-License</u></Orange>\n - <Orange><u>https://ibm.biz/MaximoIT90-License</u></Orange>\n - <Orange><u>https://ibm.biz/MAXArcGIS90-License</u></Orange>"
116
120
  }
117
121
 
118
122
  if not self.licenseAccepted:
@@ -153,6 +157,87 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
153
157
  self.setParam("cert_manager_provider", "redhat")
154
158
  self.setParam("cert_manager_action", "install")
155
159
 
160
+ def formatCatalog(self, name: str) -> str:
161
+ # Convert "v9-241107-amd64" into "November 2024 Update (v9-241107-amd64)"
162
+ date = name.split("-")[1]
163
+ month = int(date[2:4])
164
+ monthName = calendar.month_name[month]
165
+ year = date[:2]
166
+ return f" - {monthName} 20{year} Update\n <Orange><u>https://ibm-mas.github.io/cli/catalogs/{name}</u></Orange>"
167
+
168
+ def formatRelease(self, release: str) -> str:
169
+ return f"{release} ... {self.catalogReleases[release]['core']}"
170
+
171
+ @logMethodCall
172
+ def processCatalogChoice(self) -> list:
173
+ self.catalogDigest = self.chosenCatalog["catalog_digest"]
174
+ self.catalogCp4dVersion = self.chosenCatalog["cpd_product_version_default"]
175
+ self.catalogMongoDbVersion = self.chosenCatalog["mongo_extras_version_default"]
176
+
177
+ self.catalogReleases = ["9.0.x", "8.11.x", "8.10.x"]
178
+
179
+ self.catalogTable = [
180
+ {
181
+ "": "Core",
182
+ "9.0.x": self.chosenCatalog["mas_core_version"]["9.0.x"],
183
+ "8.11.x": self.chosenCatalog["mas_core_version"]["8.11.x"],
184
+ "8.10.x": self.chosenCatalog["mas_core_version"]["8.10.x"]
185
+ },
186
+ {
187
+ "": "Manage",
188
+ "9.0.x": self.chosenCatalog["mas_manage_version"]["9.0.x"],
189
+ "8.11.x": self.chosenCatalog["mas_manage_version"]["8.11.x"],
190
+ "8.10.x": self.chosenCatalog["mas_manage_version"]["8.10.x"]
191
+ },
192
+ {
193
+ "": "IoT",
194
+ "9.0.x": self.chosenCatalog["mas_iot_version"]["9.0.x"],
195
+ "8.11.x": self.chosenCatalog["mas_iot_version"]["8.11.x"],
196
+ "8.10.x": self.chosenCatalog["mas_iot_version"]["8.10.x"]
197
+ },
198
+ {
199
+ "": "Monitor",
200
+ "9.0.x": self.chosenCatalog["mas_monitor_version"]["9.0.x"],
201
+ "8.11.x": self.chosenCatalog["mas_monitor_version"]["8.11.x"],
202
+ "8.10.x": self.chosenCatalog["mas_monitor_version"]["8.10.x"]
203
+ },
204
+ {
205
+ "": "Assist",
206
+ "9.0.x": self.chosenCatalog["mas_assist_version"]["9.0.x"],
207
+ "8.11.x": self.chosenCatalog["mas_assist_version"]["8.11.x"],
208
+ "8.10.x": self.chosenCatalog["mas_assist_version"]["8.10.x"]
209
+ },
210
+ {
211
+ "": "Optimizer",
212
+ "9.0.x": self.chosenCatalog["mas_optimizer_version"]["9.0.x"],
213
+ "8.11.x": self.chosenCatalog["mas_optimizer_version"]["8.11.x"],
214
+ "8.10.x": self.chosenCatalog["mas_optimizer_version"]["8.10.x"]
215
+ },
216
+ {
217
+ "": "Predict",
218
+ "9.0.x": self.chosenCatalog["mas_predict_version"]["9.0.x"],
219
+ "8.11.x": self.chosenCatalog["mas_predict_version"]["8.11.x"],
220
+ "8.10.x": self.chosenCatalog["mas_predict_version"]["8.10.x"]
221
+ },
222
+ {
223
+ "": "Inspection",
224
+ "9.0.x": self.chosenCatalog["mas_visualinspection_version"]["9.0.x"],
225
+ "8.11.x": self.chosenCatalog["mas_visualinspection_version"]["8.11.x"],
226
+ "8.10.x": self.chosenCatalog["mas_visualinspection_version"]["8.10.x"]
227
+ }
228
+ ]
229
+
230
+ summary = [
231
+ "",
232
+ "<u>Catalog Details</u>",
233
+ f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
234
+ f"Catalog Digest: {self.catalogDigest}",
235
+ f"MAS Releases: {', '.join(self.catalogReleases)}",
236
+ f"Cloud Pak for Data: {self.catalogCp4dVersion}",
237
+ f"MongoDb: {self.catalogMongoDbVersion}",
238
+ ]
239
+ return summary
240
+
156
241
  @logMethodCall
157
242
  def configCatalog(self):
158
243
  self.printH1("IBM Maximo Operator Catalog Selection")
@@ -160,11 +245,48 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
160
245
  self.promptForString("Select catalog source", "mas_catalog_version", default="v9-master-amd64")
161
246
  self.promptForString("Select channel", "mas_channel", default="9.1.x-dev")
162
247
  else:
163
- print(tabulate(self.installOptions, headers="keys", tablefmt="simple_grid"))
164
- catalogSelection = self.promptForInt("Select catalog and release", default=1)
248
+ catalogInfo = getCurrentCatalog(self.dynamicClient)
249
+
250
+ if catalogInfo is None:
251
+ self.printDescription([
252
+ "The catalog you choose dictates the version of everything that is installed, with Maximo Application Suite this is the only version you need to remember; all other versions are determined by this choice.",
253
+ "Older catalogs can still be used, but we recommend using an older version of the CLI that aligns with the release date of the catalog.",
254
+ " - Learn more: <Orange><u>https://ibm-mas.github.io/cli/catalogs/</u></Orange>",
255
+ ""
256
+ ])
257
+ print("Supported Catalogs:")
258
+ for catalog in self.catalogOptions:
259
+ catalogString = self.formatCatalog(catalog)
260
+ print_formatted_text(HTML(f"{catalogString}"))
261
+ print()
262
+
263
+ catalogCompleter = WordCompleter(self.catalogOptions)
264
+ catalogSelection = self.promptForString("Select catalog", completer=catalogCompleter)
265
+ self.setParam("mas_catalog_version", catalogSelection)
266
+
267
+ self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
268
+ else:
269
+ self.printDescription([
270
+ f"The IBM Maximo Operator Catalog is already installed in this cluster ({catalogInfo['catalogId']}). If you wish to install MAS using a newer version of the catalog please first update the catalog using mas update."
271
+ ])
272
+ self.setParam("mas_catalog_version", catalogInfo["catalogId"])
273
+
274
+ self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
275
+ catalogSummary = self.processCatalogChoice()
276
+ self.printDescription(catalogSummary)
277
+ self.printDescription([
278
+ "",
279
+ "Multiple releases of Maximo Application Suite are available, each is supported under IBM's standard 3+1+3 support model.",
280
+ "Choose the release of IBM Maximo Application Suite that you want to use for this installation from the table below:",
281
+ ""
282
+ ])
283
+
284
+ print(tabulate(self.catalogTable, headers="keys", tablefmt="simple_grid"))
285
+
286
+ releaseCompleter = WordCompleter(self.catalogReleases)
287
+ releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
165
288
 
166
- self.setParam("mas_catalog_version", self.installOptions[catalogSelection - 1]["catalog"])
167
- self.setParam("mas_channel", self.installOptions[catalogSelection - 1]["release"])
289
+ self.setParam("mas_channel", releaseSelection)
168
290
 
169
291
  @logMethodCall
170
292
  def configSLS(self) -> None:
@@ -219,12 +341,12 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
219
341
 
220
342
  @logMethodCall
221
343
  def configCP4D(self):
222
- if self.getParam("mas_catalog_version") in ["v9-240625-amd64", "v9-240730-amd64", "v9-240827-amd64", "v9-241003-amd64", "v9-241107-amd64"]:
344
+ if self.getParam("mas_catalog_version") in self.catalogOptions:
223
345
  logger.debug(f"Using automatic CP4D product version: {self.getParam('cpd_product_version')}")
224
- self.setParam("cpd_product_version", "4.8.0")
346
+ self.setParam("cpd_product_version", self.catalogInfo["cpd_product_version_default"])
225
347
  elif self.getParam("cpd_product_version") == "":
226
348
  if self.noConfirm:
227
- self.fatalError("Cloud Pak for Data version must be set manually, but --no-confirm flag has been set")
349
+ self.fatalError("Cloud Pak for Data version must be set manually, but --no-confirm has been set without setting --cp4d-version")
228
350
  self.printDescription([
229
351
  f"Unknown catalog {self.getParam('mas_catalog_version')}, please manually select the version of Cloud Pak for Data to use"
230
352
  ])
@@ -522,46 +644,14 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
522
644
  " - ReadWriteMany volumes can be mounted as read-write by multiple pods across many nodes.",
523
645
  ""
524
646
  ])
525
- # 1. ROKS
526
- if getStorageClass(self.dynamicClient, "ibmc-file-gold-gid") is not None:
527
- print_formatted_text(HTML("<MediumSeaGreen>Storage provider auto-detected: IBMCloud ROKS</MediumSeaGreen>"))
528
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteOnce): ibmc-block-gold</LightSlateGrey>"))
529
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteMany): ibmc-file-gold-gid</LightSlateGrey>"))
530
- self.storageClassProvider = "ibmc"
531
- self.params["storage_class_rwo"] = "ibmc-block-gold"
532
- self.params["storage_class_rwx"] = "ibmc-file-gold-gid"
533
- # 2. OCS
534
- elif getStorageClass(self.dynamicClient, "ocs-storagecluster-cephfs") is not None:
535
- print_formatted_text(HTML("<MediumSeaGreen>Storage provider auto-detected: OpenShift Container Storage</MediumSeaGreen>"))
536
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteOnce): ocs-storagecluster-ceph-rbd</LightSlateGrey>"))
537
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteMany): ocs-storagecluster-cephfs</LightSlateGrey>"))
538
- self.storageClassProvider = "ocs"
539
- self.params["storage_class_rwo"] = "ocs-storagecluster-ceph-rbd"
540
- self.params["storage_class_rwx"] = "ocs-storagecluster-cephfs"
541
- # 3. NFS Client
542
- elif getStorageClass(self.dynamicClient, "nfs-client") is not None:
543
- print_formatted_text(HTML("<MediumSeaGreen>Storage provider auto-detected: NFS Client</MediumSeaGreen>"))
544
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteOnce): nfs-client</LightSlateGrey>"))
545
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteMany): nfs-client</LightSlateGrey>"))
546
- self.storageClassProvider = "nfs"
547
- self.params["storage_class_rwo"] = "nfs-client"
548
- self.params["storage_class_rwx"] = "nfs-client"
549
- # 4. Azure
550
- elif getStorageClass(self.dynamicClient, "managed-premium") is not None:
551
- print_formatted_text(HTML("<MediumSeaGreen>Storage provider auto-detected: Azure Managed</MediumSeaGreen>"))
552
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteOnce): managed-premium</LightSlateGrey>"))
553
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteMany): azurefiles-premium</LightSlateGrey>"))
554
- self.storageClassProvider = "azure"
555
- self.params["storage_class_rwo"] = "managed-premium"
556
- self.params["storage_class_rwx"] = "azurefiles-premium"
557
- # 5. AWS
558
- elif getStorageClass(self.dynamicClient, "gp2") is not None:
559
- print_formatted_text(HTML("<MediumSeaGreen>Storage provider auto-detected: AWS gp2</MediumSeaGreen>"))
560
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteOnce): gp2</LightSlateGrey>"))
561
- print_formatted_text(HTML("<LightSlateGrey> - Storage class (ReadWriteMany): efs</LightSlateGrey>"))
562
- self.storageClassProvider = "aws"
563
- self.params["storage_class_rwo"] = "gp2"
564
- self.params["storage_class_rwx"] = "efs"
647
+ defaultStorageClasses = getDefaultStorageClasses(self.dynamicClient)
648
+ if defaultStorageClasses.provider is not None:
649
+ print_formatted_text(HTML(f"<MediumSeaGreen>Storage provider auto-detected: {defaultStorageClasses.providerName}</MediumSeaGreen>"))
650
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteOnce): {defaultStorageClasses.rwo}</LightSlateGrey>"))
651
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteMany): {defaultStorageClasses.rwx}</LightSlateGrey>"))
652
+ self.storageClassProvider = defaultStorageClasses.provider
653
+ self.params["storage_class_rwo"] = defaultStorageClasses.rwo
654
+ self.params["storage_class_rwx"] = defaultStorageClasses.rwx
565
655
 
566
656
  overrideStorageClasses = False
567
657
  if "storage_class_rwx" in self.params and self.params["storage_class_rwx"] != "":
@@ -925,7 +1015,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
925
1015
  exit(1)
926
1016
 
927
1017
  # Configure the installOptions for the appropriate architecture
928
- self.installOptions = catalogChoices[self.architecture]
1018
+ self.catalogOptions = supportedCatalogs[self.architecture]
929
1019
 
930
1020
  # Basic settings before the user provides any input
931
1021
  self.configICR()
@@ -7,135 +7,13 @@
7
7
  # http://www.eclipse.org/legal/epl-v10.html
8
8
  #
9
9
  # *****************************************************************************
10
-
11
- catalogChoices = {
10
+ supportedCatalogs = {
12
11
  "amd64": [
13
- {
14
- "#": 1,
15
- "catalog": "v9-241107-amd64",
16
- "release": "9.0.x",
17
- "core": "9.0.5",
18
- "assist": "9.0.2",
19
- "iot": "9.0.4",
20
- "manage": "9.0.5",
21
- "monitor": "9.0.4",
22
- "optimizer": "9.0.4",
23
- "predict": "9.0.2",
24
- "inspection": "9.0.4",
25
- "aibroker": "9.0.3"
26
- },
27
- {
28
- "#": 2,
29
- "catalog": "v9-241107-amd64",
30
- "release": "8.11.x",
31
- "core": "8.11.16",
32
- "assist": "8.8.6",
33
- "iot": "8.8.14",
34
- "manage": "8.7.13",
35
- "monitor": "8.11.12",
36
- "optimizer": "8.5.10",
37
- "predict": "8.9.5",
38
- "inspection": "8.9.7"
39
- },
40
- {
41
- "#": 3,
42
- "catalog": "v9-241107-amd64",
43
- "release": "8.10.x",
44
- "core": "8.10.19",
45
- "assist": "8.7.7",
46
- "iot": "8.7.18",
47
- "manage": "8.6.19",
48
- "monitor": "8.10.14",
49
- "optimizer": "8.4.11",
50
- "predict": "8.8.4",
51
- "inspection": "8.8.4"
52
- },
53
- {
54
- "#": 4,
55
- "catalog": "v9-241003-amd64",
56
- "release": "9.0.x",
57
- "core": "9.0.3",
58
- "assist": "9.0.2",
59
- "iot": "9.0.3",
60
- "manage": "9.0.3",
61
- "monitor": "9.0.3",
62
- "optimizer": "9.0.3",
63
- "predict": "9.0.2",
64
- "inspection": "9.0.3"
65
- },
66
- {
67
- "#": 5,
68
- "catalog": "v9-241003-amd64",
69
- "release": "8.11.x",
70
- "core": "8.11.15",
71
- "assist": "8.8.6",
72
- "iot": "8.8.13",
73
- "manage": "8.7.12",
74
- "monitor": "8.11.11",
75
- "optimizer": "8.5.9",
76
- "predict": "8.9.5",
77
- "inspection": "8.9.6"
78
- },
79
- {
80
- "#": 6,
81
- "catalog": "v9-241003-amd64",
82
- "release": "8.10.x",
83
- "core": "8.10.18",
84
- "assist": "8.7.7",
85
- "iot": "8.7.17",
86
- "manage": "8.6.18",
87
- "monitor": "8.10.14",
88
- "optimizer": "8.4.10",
89
- "predict": "8.8.3",
90
- "inspection": "8.8.4"
91
- },
92
- {
93
- "#": 7,
94
- "catalog": "v9-240827-amd64",
95
- "release": "9.0.x",
96
- "core": "9.0.2",
97
- "assist": "9.0.2",
98
- "iot": "9.0.2",
99
- "manage": "9.0.2",
100
- "monitor": "9.0.2",
101
- "optimizer": "9.0.2",
102
- "predict": "9.0.1",
103
- "inspection": "9.0.2"
104
- },
105
- {
106
- "#": 8,
107
- "catalog": "v9-240827-amd64",
108
- "release": "8.11.x",
109
- "core": "8.11.14",
110
- "assist": "8.8.6",
111
- "iot": "8.8.12",
112
- "manage": "8.7.11",
113
- "monitor": "8.11.10",
114
- "optimizer": "8.5.8",
115
- "predict": "8.9.3",
116
- "inspection": "8.9.5"
117
- },
118
- {
119
- "#": 9,
120
- "catalog": "v9-240827-amd64",
121
- "release": "8.10.x",
122
- "core": "8.10.17",
123
- "assist": "8.7.7",
124
- "iot": "8.7.16",
125
- "manage": "8.6.17",
126
- "monitor": "8.10.13",
127
- "optimizer": "8.4.9",
128
- "predict": "8.8.3",
129
- "inspection": "8.8.4"
130
- }
12
+ "v9-241107-amd64",
13
+ "v9-241003-amd64",
14
+ "v9-240827-amd64"
131
15
  ],
132
16
  "s390x": [
133
- {
134
- "#": 1,
135
- "catalog": "v9-241107-s390x",
136
- "release": "9.0.x",
137
- "core": "9.0.5",
138
- "manage": "9.0.5"
139
- }
17
+ "v9-241107-s390x"
140
18
  ]
141
19
  }
@@ -67,7 +67,7 @@ class AdditionalConfigsMixin():
67
67
  self.printH1("Configure Pod Templates")
68
68
  self.printDescription([
69
69
  "The CLI supports two pod template profiles out of the box that allow you to reconfigure MAS for either a guaranteed or best effort QoS level",
70
- "For more information about the Kubernetes quality of service (QoS) levels, see https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/",
70
+ "For more information about the Kubernetes quality of service (QoS) levels, see <Orange><u>https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/</u></Orange>",
71
71
  "You may also choose to use your own customized pod template definitions"
72
72
  ])
73
73
 
@@ -164,8 +164,8 @@ class Db2SettingsMixin():
164
164
  "Note that the same settings are applied to both the IoT and Manage Db2 instances",
165
165
  "Use existing node labels and taints to control scheduling of the Db2 workload in your cluster",
166
166
  "For more information refer to the Red Hat documentation:",
167
- " - <u>https://docs.openshift.com/container-platform/4.12/nodes/scheduling/nodes-scheduler-node-affinity.html</u>",
168
- " - <u>https://docs.openshift.com/container-platform/4.12/nodes/scheduling/nodes-scheduler-taints-tolerations.html</u>"
167
+ " - <Orange><u>https://docs.openshift.com/container-platform/4.12/nodes/scheduling/nodes-scheduler-node-affinity.html</u></Orange>",
168
+ " - <Orange><u>https://docs.openshift.com/container-platform/4.12/nodes/scheduling/nodes-scheduler-taints-tolerations.html</u></Orange>"
169
169
  ])
170
170
 
171
171
  if self.yesOrNo("Configure node affinity"):
@@ -73,7 +73,7 @@ class KafkaSettingsMixin():
73
73
  "While provisioning the AWS MSK instance, you will be required to provide the AWS Virtual Private Cloud ID and subnet details",
74
74
  "where your instance will be deployed to properly configure inbound and outbound connectivity.",
75
75
  "You should be able to find these information inside your VPC and subnet configurations in the target AWS account.",
76
- "For more details about AWS subnet/CIDR configuration, refer: https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html"
76
+ "For more details about AWS subnet/CIDR configuration, refer: <Orange><u>https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html</u></Orange>"
77
77
  ])
78
78
  self.promptForString("AWS Access Key ID", "aws_access_key_id", isPassword=True)
79
79
  self.promptForString("AWS Secret Access Key" "aws_secret_access_key", isPassword=True)
@@ -32,7 +32,7 @@ class ManageSettingsMixin():
32
32
  "",
33
33
  "IBM Maximo Location Services for Esri License Terms",
34
34
  "For information about your IBM Maximo Location Services for Esri License visit: ",
35
- " <u>https://ibm.biz/MAXArcGIS90-License</u>",
35
+ " - <Orange><u>https://ibm.biz/MAXArcGIS90-License</u></Orange>",
36
36
  "To continue with the installation, you must accept these additional license terms"
37
37
  ])
38
38
 
@@ -117,7 +117,7 @@ class ManageSettingsMixin():
117
117
  if ",icd=" in self.params["mas_appws_components"]:
118
118
  self.printH2("Maximo IT License Terms")
119
119
  self.printDescription([
120
- "For information about your Maximo IT License, see https://ibm.biz/MAXIT81-License",
120
+ "For information about your Maximo IT License, see <Orange><u>https://ibm.biz/MAXIT81-License</u></Orange>",
121
121
  "To continue with the installation, you must accept these additional license terms"
122
122
  ])
123
123
 
@@ -217,7 +217,7 @@ class ManageSettingsMixin():
217
217
  self.printDescription([
218
218
  "Define the additional languages to be configured in Maximo Manage. provide a comma-separated list of supported languages codes, for example: 'JA,DE,AR'",
219
219
  "A complete list of available language codes is available online:",
220
- " <u>https://www.ibm.com/docs/en/mas-cd/mhmpmh-and-p-u/continuous-delivery?topic=deploy-language-support</u>"
220
+ " <Orange><u>https://www.ibm.com/docs/en/mas-cd/mhmpmh-and-p-u/continuous-delivery?topic=deploy-language-support</u></Orange>"
221
221
  ])
222
222
 
223
223
  self.promptForString("Secondary languages", "mas_app_settings_secondary_langs")
@@ -226,7 +226,7 @@ class ManageSettingsMixin():
226
226
  if self.getParam("mas_app_channel_manage") in ["8.7.x", "9.0.x"] and self.showAdvancedOptions:
227
227
  self.printDescription([
228
228
  "Integration with Cognos Analytics provides additional support for reporting features in Maximo Manage, for more information refer to the documentation online: ",
229
- " <u>https://ibm.biz/BdMuxs</u>"
229
+ " - <Orange><u>https://ibm.biz/BdMuxs</u></Orange>"
230
230
  ])
231
231
  self.yesOrNo("Enable integration with Cognos Analytics", "cpd_install_cognos")
232
232
  self.yesOrNo("Enable integration with Watson Studio Local", "mas_appws_bindings_health_flag")
@@ -18,7 +18,7 @@ class TurbonomicSettingsMixin():
18
18
  self.printH1("Configure Turbonomic")
19
19
  self.printDescription([
20
20
  "The IBM Turbonomic hybrid cloud cost optimization platform allows you to eliminate this guesswork with solutions that save time and optimize costs",
21
- " - Learn more: <u>https://www.ibm.com/products/turbonomic</u>"
21
+ " - Learn more: <Orange><u>https://www.ibm.com/products/turbonomic</u></Orange>"
22
22
  ])
23
23
 
24
24
  if isAirgapInstall(self.dynamicClient):