mas-cli 11.9.3__py3-none-any.whl → 11.10.1__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.1" # Python module compatible semver
mas/cli/cli.py CHANGED
@@ -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.1"
121
121
  self.h1count = 0
122
122
  self.h2count = 0
123
123
 
@@ -184,9 +184,9 @@ class BaseApp(PrintMixin, PromptMixin):
184
184
  self._dynClient = None
185
185
 
186
186
  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"))
187
+ 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
188
  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")
189
+ 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
190
 
191
191
  @logMethodCall
192
192
  def createTektonFileWithDigest(self) -> None:
mas/cli/displayMixins.py CHANGED
@@ -9,7 +9,7 @@
9
9
  # *****************************************************************************
10
10
 
11
11
  from os import getenv
12
- from prompt_toolkit import prompt, print_formatted_text, HTML
12
+ from prompt_toolkit import prompt, print_formatted_text, HTML, PromptSession
13
13
  from prompt_toolkit.completion import WordCompleter
14
14
  from prompt_toolkit.validation import Validator
15
15
 
@@ -90,7 +90,12 @@ 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
+ promptSession = PromptSession()
95
+ response = promptSession.prompt(masPromptValue(message), is_password=isPassword, default=default, completer=completer, validator=validator, validate_while_typing=False, pre_run=promptSession.default_buffer.start_completion)
96
+ else:
97
+ response = prompt(masPromptValue(message), is_password=isPassword, default=default, completer=completer, validator=validator, validate_while_typing=False)
98
+
94
99
  if param is not None:
95
100
  self.params[param] = response
96
101
  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,46 @@ 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
+ else:
267
+ self.printDescription([
268
+ 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."
269
+ ])
270
+ self.setParam("mas_catalog_version", catalogInfo["catalogId"])
271
+
272
+ self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
273
+ catalogSummary = self.processCatalogChoice()
274
+ self.printDescription(catalogSummary)
275
+ self.printDescription([
276
+ "",
277
+ "Multiple releases of Maximo Application Suite are available, each is supported under IBM's standard 3+1+3 support model.",
278
+ "Choose the release of IBM Maximo Application Suite that you want to use for this installation from the table below:",
279
+ ""
280
+ ])
281
+
282
+ print(tabulate(self.catalogTable, headers="keys", tablefmt="simple_grid"))
165
283
 
166
- self.setParam("mas_catalog_version", self.installOptions[catalogSelection - 1]["catalog"])
167
- self.setParam("mas_channel", self.installOptions[catalogSelection - 1]["release"])
284
+ releaseCompleter = WordCompleter(self.catalogReleases)
285
+ releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
286
+
287
+ self.setParam("mas_channel", releaseSelection)
168
288
 
169
289
  @logMethodCall
170
290
  def configSLS(self) -> None:
@@ -219,12 +339,13 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
219
339
 
220
340
  @logMethodCall
221
341
  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"]:
342
+ if self.getParam("mas_catalog_version") in self.catalogOptions:
343
+ # Note: this will override any version provided by the user (which is intentional!)
223
344
  logger.debug(f"Using automatic CP4D product version: {self.getParam('cpd_product_version')}")
224
- self.setParam("cpd_product_version", "4.8.0")
345
+ self.setParam("cpd_product_version", self.chosenCatalog["cpd_product_version_default"])
225
346
  elif self.getParam("cpd_product_version") == "":
226
347
  if self.noConfirm:
227
- self.fatalError("Cloud Pak for Data version must be set manually, but --no-confirm flag has been set")
348
+ self.fatalError("Cloud Pak for Data version must be set manually, but --no-confirm has been set without setting --cp4d-version")
228
349
  self.printDescription([
229
350
  f"Unknown catalog {self.getParam('mas_catalog_version')}, please manually select the version of Cloud Pak for Data to use"
230
351
  ])
@@ -522,46 +643,14 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
522
643
  " - ReadWriteMany volumes can be mounted as read-write by multiple pods across many nodes.",
523
644
  ""
524
645
  ])
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"
646
+ defaultStorageClasses = getDefaultStorageClasses(self.dynamicClient)
647
+ if defaultStorageClasses.provider is not None:
648
+ print_formatted_text(HTML(f"<MediumSeaGreen>Storage provider auto-detected: {defaultStorageClasses.providerName}</MediumSeaGreen>"))
649
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteOnce): {defaultStorageClasses.rwo}</LightSlateGrey>"))
650
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteMany): {defaultStorageClasses.rwx}</LightSlateGrey>"))
651
+ self.storageClassProvider = defaultStorageClasses.provider
652
+ self.params["storage_class_rwo"] = defaultStorageClasses.rwo
653
+ self.params["storage_class_rwx"] = defaultStorageClasses.rwx
565
654
 
566
655
  overrideStorageClasses = False
567
656
  if "storage_class_rwx" in self.params and self.params["storage_class_rwx"] != "":
@@ -880,6 +969,9 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
880
969
  print(f"Unknown option: {key} {value}")
881
970
  self.fatalError(f"Unknown option: {key} {value}")
882
971
 
972
+ # Load the catalog information
973
+ self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
974
+
883
975
  # Once we've processed the inputs, we should validate the catalog source & prompt to accept the license terms
884
976
  if not self.devMode:
885
977
  self.validateCatalogSource()
@@ -925,7 +1017,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
925
1017
  exit(1)
926
1018
 
927
1019
  # Configure the installOptions for the appropriate architecture
928
- self.installOptions = catalogChoices[self.architecture]
1020
+ self.catalogOptions = supportedCatalogs[self.architecture]
929
1021
 
930
1022
  # Basic settings before the user provides any input
931
1023
  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):