mas-cli 15.1.12__tar.gz → 15.2.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 (124) hide show
  1. {mas_cli-15.1.12 → mas_cli-15.2.0}/PKG-INFO +1 -1
  2. mas_cli-15.2.0/src/mas/cli/__init__.py +11 -0
  3. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/app.py +63 -122
  4. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/argBuilder.py +3 -2
  5. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/argParser.py +19 -15
  6. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/params.py +2 -1
  7. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/summarizer.py +18 -21
  8. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/cli.py +1 -1
  9. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/catalogs.py +3 -2
  10. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/ibm-mas-tekton.yaml +221 -162
  11. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/update/app.py +7 -6
  12. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/validators.py +11 -0
  13. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas_cli.egg-info/PKG-INFO +1 -1
  14. mas_cli-15.1.12/src/mas/cli/__init__.py +0 -11
  15. {mas_cli-15.1.12 → mas_cli-15.2.0}/MANIFEST.in +0 -0
  16. {mas_cli-15.1.12 → mas_cli-15.2.0}/README.rst +0 -0
  17. {mas_cli-15.1.12 → mas_cli-15.2.0}/pyproject.toml +0 -0
  18. {mas_cli-15.1.12 → mas_cli-15.2.0}/setup.cfg +0 -0
  19. {mas_cli-15.1.12 → mas_cli-15.2.0}/setup.py +0 -0
  20. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/aiservice/install/__init__.py +0 -0
  21. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/displayMixins.py +0 -0
  22. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/gencfg.py +0 -0
  23. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/__init__.py +0 -0
  24. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/app.py +0 -0
  25. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/argBuilder.py +0 -0
  26. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/argParser.py +0 -0
  27. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/params.py +0 -0
  28. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/__init__.py +0 -0
  29. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/additionalConfigs.py +0 -0
  30. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/db2Settings.py +0 -0
  31. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/kafkaSettings.py +0 -0
  32. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/manageSettings.py +0 -0
  33. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/mongodbSettings.py +0 -0
  34. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/settings/turbonomicSettings.py +0 -0
  35. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/install/summarizer.py +0 -0
  36. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
  37. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
  38. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  39. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
  40. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
  41. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
  42. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
  43. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
  44. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
  45. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
  46. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
  47. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
  48. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
  49. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
  50. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
  51. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
  52. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
  53. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
  54. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
  55. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
  56. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
  57. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
  58. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
  59. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
  60. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
  61. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
  62. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
  63. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
  64. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
  65. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
  66. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
  67. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
  68. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
  69. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
  70. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
  71. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
  72. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
  73. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
  74. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
  75. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
  76. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
  77. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
  78. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
  79. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
  80. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
  81. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
  82. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
  83. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
  84. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
  85. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
  86. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
  87. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
  88. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
  89. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
  90. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
  91. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
  92. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
  93. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
  94. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
  95. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
  96. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
  97. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
  98. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
  99. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
  100. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
  101. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
  102. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
  103. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
  104. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
  105. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
  106. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
  107. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
  108. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
  109. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/uninstall/__init__.py +0 -0
  110. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/uninstall/app.py +0 -0
  111. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/uninstall/argParser.py +0 -0
  112. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/update/__init__.py +0 -0
  113. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/update/argParser.py +0 -0
  114. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/upgrade/__init__.py +0 -0
  115. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/upgrade/app.py +0 -0
  116. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/upgrade/argParser.py +0 -0
  117. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas/cli/upgrade/settings/__init__.py +0 -0
  118. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas-cli +0 -0
  119. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas_cli.egg-info/SOURCES.txt +0 -0
  120. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas_cli.egg-info/dependency_links.txt +0 -0
  121. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas_cli.egg-info/requires.txt +0 -0
  122. {mas_cli-15.1.12 → mas_cli-15.2.0}/src/mas_cli.egg-info/top_level.txt +0 -0
  123. {mas_cli-15.1.12 → mas_cli-15.2.0}/test/test_help.py +0 -0
  124. {mas_cli-15.1.12 → mas_cli-15.2.0}/test/test_install.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mas-cli
3
- Version: 15.1.12
3
+ Version: 15.2.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
@@ -0,0 +1,11 @@
1
+ # *****************************************************************************
2
+ # Copyright (c) 2024 IBM Corporation and other Contributors.
3
+ #
4
+ # All rights reserved. This program and the accompanying materials
5
+ # are made available under the terms of the Eclipse Public License v1.0
6
+ # which accompanies this distribution, and is available at
7
+ # http://www.eclipse.org/legal/epl-v10.html
8
+ #
9
+ # *****************************************************************************
10
+
11
+ __version__ = "15.2.0" # Python module compatible semver
@@ -10,18 +10,17 @@
10
10
  # *****************************************************************************
11
11
 
12
12
  import logging
13
- from sys import exit
14
- from os import path, getenv
15
13
  import re
16
14
  import calendar
17
15
 
16
+ from datetime import datetime
17
+ from dateutil.relativedelta import relativedelta
18
+ from sys import exit
19
+ from os import path, getenv
18
20
  from openshift.dynamic.exceptions import NotFoundError
19
-
20
21
  from prompt_toolkit import prompt, print_formatted_text, HTML
21
22
  from prompt_toolkit.completion import WordCompleter
22
-
23
23
  from tabulate import tabulate
24
-
25
24
  from halo import Halo
26
25
 
27
26
  from ...cli import BaseApp
@@ -43,7 +42,8 @@ from ...install.settings.additionalConfigs import AdditionalConfigsMixin
43
42
 
44
43
  from mas.cli.validators import (
45
44
  InstanceIDFormatValidator,
46
- StorageClassValidator
45
+ StorageClassValidator,
46
+ BucketPrefixValidator
47
47
  )
48
48
 
49
49
  from mas.devops.ocp import createNamespace, getStorageClasses
@@ -80,42 +80,29 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
80
80
  self.catalogDigest = self.chosenCatalog["catalog_digest"]
81
81
  self.catalogMongoDbVersion = self.chosenCatalog["mongo_extras_version_default"]
82
82
  applications = {
83
- "Aibroker": "aiservice_version",
83
+ "AI Service": "aiservice_version",
84
84
  }
85
85
 
86
86
  self.catalogReleases = {}
87
87
  self.catalogTable = []
88
88
 
89
89
  # Dynamically fetch the channels from the chosen catalog
90
- # based on mas core
91
- for channel in self.chosenCatalog["mas_core_version"]:
92
- # {"9.1-feature": "9.1.x-feature"}
90
+ for channel in self.chosenCatalog["aiservice_version"]:
93
91
  self.catalogReleases.update({channel.replace('.x', ''): channel})
94
92
 
95
93
  # Generate catalogTable
96
94
  for application, key in applications.items():
97
- # Add 9.1-feature channel based off 9.0 to those apps that have not onboarded yet
98
95
  tempChosenCatalog = self.chosenCatalog[key].copy()
99
96
  self.catalogTable.append({"": application} | {key.replace(".x", ""): value for key, value in sorted(tempChosenCatalog.items(), reverse=True)})
100
97
 
101
- if self.architecture == "s390x":
102
- summary = [
103
- "",
104
- "<u>Catalog Details</u>",
105
- f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
106
- f"Catalog Digest: {self.catalogDigest}",
107
- f"MAS Releases: {', '.join(sorted(self.catalogReleases, reverse=True))}",
108
- f"MongoDb: {self.catalogMongoDbVersion}",
109
- ]
110
- else:
111
- summary = [
112
- "",
113
- "<u>Catalog Details</u>",
114
- f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
115
- f"Catalog Digest: {self.catalogDigest}",
116
- f"MAS Releases: {', '.join(sorted(self.catalogReleases, reverse=True))}",
117
- f"MongoDb: {self.catalogMongoDbVersion}",
118
- ]
98
+ summary = [
99
+ "",
100
+ "<u>Catalog Details</u>",
101
+ f"Catalog Image: icr.io/cpopen/ibm-maximo-operator-catalog:{self.getParam('mas_catalog_version')}",
102
+ f"Catalog Digest: {self.catalogDigest}",
103
+ f"AI Service Releases: {', '.join(sorted(self.catalogReleases, reverse=True))}",
104
+ f"MongoDb: {self.catalogMongoDbVersion}",
105
+ ]
119
106
 
120
107
  return summary
121
108
 
@@ -204,19 +191,13 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
204
191
 
205
192
  elif key == "install_minio_aiservice":
206
193
  incompatibleWithMinioInstall = [
207
- # "aiservice_s3_provider",
208
194
  "aiservice_s3_accesskey",
209
195
  "aiservice_s3_secretkey",
210
196
  "aiservice_s3_host",
211
197
  "aiservice_s3_port",
212
198
  "aiservice_s3_ssl",
213
199
  "aiservice_s3_bucket_prefix",
214
- # "aiservice_s3_endpoint_url",
215
- "aiservice_s3_region",
216
- # "aiservice_tenant_s3_access_key",
217
- # "aiservice_tenant_s3_secret_key",
218
- # "aiservice_tenant_s3_endpoint_url",
219
- # "aiservice_tenant_s3_region"
200
+ "aiservice_s3_region"
220
201
  ]
221
202
  if value is None:
222
203
  for uKey in incompatibleWithMinioInstall:
@@ -241,25 +222,25 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
241
222
  self.setParam("aiservice_s3_host", "minio-service.minio.svc.cluster.local")
242
223
  self.setParam("aiservice_s3_port", "9000")
243
224
  self.setParam("aiservice_s3_ssl", "false")
244
- # self.setParam("aiservice_s3_endpoint_url", "http://minio-service.minio.svc.cluster.local:9000")
245
225
  self.setParam("aiservice_s3_region", "none")
246
- self.setParam("aiservice_s3_bucket_prefix", "aiservice")
247
-
248
- # self.setParam("aiservice_tenant_s3_access_key", self.args.minio_root_user)
249
- # self.setParam("aiservice_tenant_s3_secret_key", self.args.minio_root_password)
250
- # self.setParam("aiservice_tenant_s3_endpoint_url", "http://minio-service.minio.svc.cluster.local:9000")
251
- # self.setParam("aiservice_tenant_s3_region", "none")
226
+ self.setParam("aiservice_s3_bucket_prefix", "s3-")
252
227
  else:
253
228
  self.fatalError(f"Unsupported value for --install-minio: {value}")
254
229
 
230
+ elif key == "aiservice_s3_bucket_prefix":
231
+ if len(value) == 0 or len(value) > 4:
232
+ self.fatalError(f"Unsupported value for --s3-bucket-prefix(Must be 1-4 characters long): {value}")
233
+
255
234
  elif key == "non_prod":
256
235
  if not value:
257
236
  self.operationalMode = 1
258
237
  self.setParam("environment_type", "production")
238
+ self.setParam("aiservice_odh_model_deployment_type", "raw")
259
239
  else:
260
240
  self.operationalMode = 2
261
241
  self.setParam("mas_annotations", "mas.ibm.com/operationalMode=nonproduction")
262
242
  self.setParam("environment_type", "non-production")
243
+ self.setParam("aiservice_odh_model_deployment_type", "serverless")
263
244
 
264
245
  elif key == "additional_configs":
265
246
  self.localConfigDir = value
@@ -383,14 +364,6 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
383
364
  "Note: Maximo AI Service 9.1 includes a limited-use license to watsonx.ai and incurs an additional AppPoint cost"
384
365
  ])
385
366
 
386
- if not self.devMode:
387
- self.printDescription([
388
- "",
389
- "<ForestGreen>Coming Soon! We are busy putting the finishing touches on Maximo AI Service 9.1 ahead of a re-launch planned for the 28 August 2025 catalog update</ForestGreen>",
390
- ""
391
- ])
392
- exit(1)
393
-
394
367
  # Set image_pull_policy of the CLI in interactive mode
395
368
  if args.image_pull_policy and args.image_pull_policy != "":
396
369
  self.setParam("image_pull_policy", args.image_pull_policy)
@@ -421,7 +394,14 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
421
394
  self.isAirgap()
422
395
 
423
396
  # Configure the installOptions for the appropriate architecture
424
- self.catalogOptions = supportedCatalogs[self.architecture]
397
+ # self.catalogOptions = supportedCatalogs[self.architecture]
398
+
399
+ # Once AI Service is supported by all supported catalogs we can remove this
400
+ # In the meantime we will need to update this as we go
401
+ self.catalogOptions = []
402
+ for option in supportedCatalogs[self.architecture]:
403
+ if option >= "v9-250828-amd64":
404
+ self.catalogOptions.append(option)
425
405
 
426
406
  # Basic settings before the user provides any input
427
407
  self.configICR()
@@ -546,69 +526,32 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
546
526
  else:
547
527
  # Ask for external storage configuration
548
528
  self.printDescription(["Configure your external object storage (S3-compatible) connection details:"])
549
- # s3_completer = WordCompleter(["aws", "minio"])
550
- # s3_provider = self.promptForString("Storage provider", completer=s3_completer)
551
- # self.setParam("aiservice_s3_provider", s3_provider)
552
529
  self.promptForString("Storage access key", "aiservice_s3_accesskey")
553
530
  self.promptForString("Storage secret key", "aiservice_s3_secretkey", isPassword=True)
554
531
  self.promptForString("Storage host", "aiservice_s3_host")
555
532
  self.promptForString("Storage port", "aiservice_s3_port")
556
533
  self.promptForString("Storage ssl", "aiservice_s3_ssl")
557
534
  self.promptForString("Storage region", "aiservice_s3_region")
558
- self.promptForString("Storage bucket prefix", "aiservice_s3_bucket_prefix")
535
+ self.printDescription([
536
+ "",
537
+ "Storage bucket prefix restrictions:",
538
+ " - Must be 1-4 characters long"
539
+ ])
540
+ self.promptForString("Storage bucket prefix", "aiservice_s3_bucket_prefix", validator=BucketPrefixValidator())
559
541
  self.promptForString("Storage tenants bucket", "aiservice_s3_tenants_bucket")
560
542
  self.promptForString("Storage templates bucket", "aiservice_s3_templates_bucket")
561
543
 
562
- # S3 parameters are now auto-derived from storage configuration
563
- # self._deriveS3ParametersFromStorage()
564
-
565
544
  def aiServiceTenantSettings(self) -> None:
566
545
  self.printH1("AI Service Tenant Settings")
567
- self.promptForString("Tenant entitlement type", "tenant_entitlement_type")
568
- self.promptForString("Tenant start date", "tenant_entitlement_start_date")
569
- self.promptForString("Tenant end date", "tenant_entitlement_end_date")
570
-
571
- # def _deriveS3ParametersFromStorage(self) -> None:
572
- # """
573
- # Auto-derive S3 and tenant S3 parameters from the aiservice_s3_* parameters.
574
- # This reuses the values provided for kmodel object storage to avoid redundant prompts.
575
- # """
576
- # storage_provider = self.getParam("aiservice_s3_provider")
577
- # storage_host = self.getParam("aiservice_s3_host")
578
- # storage_port = self.getParam("aiservice_s3_port")
579
- # storage_ssl = self.getParam("aiservice_s3_ssl")
580
- # storage_region = self.getParam("aiservice_s3_region")
581
- # storage_bucket_prefix = self.getParam("aiservice_s3_bucket_prefix")
582
- # storage_accesskey = self.getParam("aiservice_s3_accesskey")
583
- # storage_secretkey = self.getParam("aiservice_s3_secretkey")
584
-
585
- # # Build endpoint URL from storage configuration
586
- # protocol = "https" if storage_ssl == "true" else "http"
587
-
588
- # if storage_provider == "minio":
589
- # endpoint_url = f"{protocol}://{storage_host}:{storage_port}"
590
- # elif storage_provider == "aws":
591
- # # For AWS S3, construct proper endpoint
592
- # if storage_region and storage_region != "none":
593
- # endpoint_url = f"{protocol}://s3.{storage_region}.amazonaws.com"
594
- # else:
595
- # endpoint_url = f"{protocol}://s3.amazonaws.com"
596
- # else:
597
- # # For other providers, construct basic endpoint
598
- # endpoint_url = f"{protocol}://{storage_host}:{storage_port}" if storage_port else f"{protocol}://{storage_host}"
599
-
600
- # # Set S3 parameters (reusing storage configuration)
601
- # if endpoint_url:
602
- # self.setParam("aiservice_s3_endpoint_url", endpoint_url)
603
- # self.setParam("aiservice_s3_region", storage_region if storage_region else "none")
604
-
605
- # # Set tenant S3 parameters (reusing same storage configuration)
606
- # self.setParam("aiservice_tenant_s3_bucket_prefix", "tenant") # Default tenant prefix
607
- # self.setParam("aiservice_tenant_s3_access_key", storage_accesskey)
608
- # self.setParam("aiservice_tenant_s3_secret_key", storage_secretkey)
609
- # if endpoint_url:
610
- # self.setParam("aiservice_tenant_s3_endpoint_url", endpoint_url)
611
- # self.setParam("aiservice_tenant_s3_region", storage_region if storage_region else "none")
546
+ self.printDescription([
547
+ "AI Service will reserve AppPoints for a fixed period of time based on the values you enter:"
548
+ ])
549
+
550
+ today = datetime.today()
551
+ oneyear = datetime.today() + relativedelta(years=1)
552
+ self.setParam("tenant_entitlement_type", "standard")
553
+ self.setParam("tenant_entitlement_start_date", today.strftime('%Y-%m-%d'))
554
+ self.promptForString("Entitlement end date (YYYY-MM-DD)", "tenant_entitlement_end_date", default=oneyear.strftime('%Y-%m-%d'))
612
555
 
613
556
  def _setMinioStorageDefaults(self) -> None:
614
557
  """
@@ -622,7 +565,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
622
565
  self.setParam("aiservice_s3_port", "9000")
623
566
  self.setParam("aiservice_s3_ssl", "false")
624
567
  self.setParam("aiservice_s3_region", "none")
625
- self.setParam("aiservice_s3_bucket_prefix", "aiservice")
568
+ self.setParam("aiservice_s3_bucket_prefix", "s3-")
626
569
 
627
570
  # Set default bucket names
628
571
  self.setParam("aiservice_s3_tenants_bucket", "km-tenants")
@@ -662,7 +605,10 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
662
605
  ])
663
606
  self.promptForString("RSL url", "rsl_url")
664
607
  self.promptForString("ORG Id of RSL", "rsl_org_id")
665
- self.promptForString("Token for RSL", "rsl_token", isPassword=True)
608
+ rslToken = self.promptForString("Token for RSL", isPassword=True)
609
+ if not rslToken.startswith("Bearer "):
610
+ rslToken = "Bearer " + rslToken
611
+ self.setParam("rsl_token", rslToken)
666
612
  if self.yesOrNo("Does the RSL API use a self-signed certificate?"):
667
613
  self.promptForString("RSL CA certificate (PEM format)", "rsl_ca_crt")
668
614
 
@@ -734,20 +680,13 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
734
680
  self.chosenCatalog = getCatalog(self.getParam("mas_catalog_version"))
735
681
  catalogSummary = self.processCatalogChoice()
736
682
  self.printDescription(catalogSummary)
737
- self.printDescription([
738
- "",
739
- "Two types of release are available:",
740
- " - GA releases of Maximo Application Suite are supported under IBM's standard 3+1+3 support lifecycle policy.",
741
- " - 'Feature' releases allow early access to new features for evaluation in non-production environments and are only supported through to the next GA release.",
742
- ""
743
- ])
744
-
745
683
  print(tabulate(self.catalogTable, headers="keys", tablefmt="simple_grid"))
746
684
 
747
- releaseCompleter = WordCompleter(sorted(self.catalogReleases, reverse=True))
748
- releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
749
-
750
- self.setParam("aiservice_channel", self.catalogReleases[releaseSelection])
685
+ # There's only one release channel, the user doesn't need to be prompted!!
686
+ # releaseCompleter = WordCompleter(sorted(self.catalogReleases, reverse=True))
687
+ # releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
688
+ # self.setParam("aiservice_channel", self.catalogReleases[releaseSelection])
689
+ self.setParam("aiservice_channel", "9.1.x")
751
690
 
752
691
  @logMethodCall
753
692
  def validateCatalogSource(self):
@@ -837,7 +776,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
837
776
  self.printH1("Configure AppPoint Licensing")
838
777
  self.printDescription(
839
778
  [
840
- "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.",
779
+ "By default the AI Service instance will be configured to use a cluster-shared License, this provides a shared pool of AppPoints available to all MAS &amp; AI Service instances on the cluster.",
841
780
  "",
842
781
  ]
843
782
  )
@@ -848,9 +787,9 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
848
787
  if self.showAdvancedOptions:
849
788
  self.printDescription(
850
789
  [
851
- "Alternatively you may choose to install using a dedicated license only available to this MAS instance.",
852
- " 1. Install MAS with Cluster-Shared License (AppPoints)",
853
- " 2. Install MAS with Dedicated License (AppPoints)",
790
+ "Alternatively you may choose to install using a dedicated license only available to this AI Service instance.",
791
+ " 1. Install AI Service with Cluster-Shared License (AppPoints)",
792
+ " 2. Install AI Service with Dedicated License (AppPoints)",
854
793
  ]
855
794
  )
856
795
  self.slsMode = self.promptForInt("SLS Mode", default=1)
@@ -897,5 +836,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
897
836
  self.operationalMode = self.promptForInt("Operational Mode", default=1)
898
837
  if self.operationalMode == 1:
899
838
  self.setParam("environment_type", "production")
839
+ self.setParam("aiservice_odh_model_deployment_type", "raw")
900
840
  else:
901
841
  self.setParam("environment_type", "non-production")
842
+ self.setParam("aiservice_odh_model_deployment_type", "serverless")
@@ -105,8 +105,6 @@ class aiServiceInstallArgBuilderMixin():
105
105
 
106
106
  # AI Service Advanced Settings
107
107
  # -----------------------------------------------------------------------------
108
- # if self.getParam('aiservice_s3_provider') != "":
109
- # command += f" --s3-provider \"{self.getParam('aiservice_s3_provider')}\"{newline}"
110
108
  if self.getParam('aiservice_s3_accesskey') != "":
111
109
  command += f" --s3-accesskey \"{self.getParam('aiservice_s3_accesskey')}\"{newline}"
112
110
  if self.getParam('aiservice_s3_secretkey') != "":
@@ -126,6 +124,9 @@ class aiServiceInstallArgBuilderMixin():
126
124
  if self.getParam('aiservice_s3_templates_bucket') != "":
127
125
  command += f" --s3-templates-bucket \"{self.getParam('aiservice_s3_templates_bucket')}\"{newline}"
128
126
 
127
+ if self.getParam('aiservice_odh_model_deployment_type') != "":
128
+ command += f" --odh-model-deployment-type \"{self.getParam('aiservice_odh_model_deployment_type')}\"{newline}"
129
+
129
130
  if self.getParam('aiservice_watsonxai_apikey') != "":
130
131
  command += f" --watsonxai-apikey \"{self.getParam('aiservice_watsonxai_apikey')}\"{newline}"
131
132
  if self.getParam('aiservice_watsonxai_url') != "":
@@ -54,13 +54,13 @@ catArgGroup.add_argument(
54
54
  help="IBM entitlement key"
55
55
  )
56
56
 
57
- # Aibroker Basic Configuration
57
+ # AI Service Basic Configuration
58
58
  # -----------------------------------------------------------------------------
59
- masArgGroup = aiServiceinstallArgParser.add_argument_group("Aibroker Basic Configuration")
59
+ masArgGroup = aiServiceinstallArgParser.add_argument_group("AI Service Basic Configuration")
60
60
  masArgGroup.add_argument(
61
61
  "-i", "--aiservice-instance-id",
62
62
  required=False,
63
- help="Aibroker Instance ID"
63
+ help="AI Service Instance ID"
64
64
  )
65
65
 
66
66
  # MAS Advanced Configuration
@@ -171,21 +171,22 @@ masAppsArgGroup.add_argument(
171
171
  help="Subscription channel for Maximo AI Service"
172
172
  )
173
173
 
174
- # AI Service
174
+ # ODH
175
175
  # -----------------------------------------------------------------------------
176
- aiServiceArgGroup = aiServiceinstallArgParser.add_argument_group("Maximo AI Service")
176
+ odhArgGroup = aiServiceinstallArgParser.add_argument_group("Opendatahub")
177
+
178
+ odhArgGroup.add_argument(
179
+ "--odh-model-deployment-type",
180
+ dest="aiservice_odh_model_deployment_type",
181
+ required=False,
182
+ default="raw",
183
+ help="Model deployment type for ODH"
184
+ )
177
185
 
178
186
  # S3 - General
179
187
  # -----------------------------------------------------------------------------
180
188
  s3ArgGroup = aiServiceinstallArgParser.add_argument_group("S3 Storage")
181
189
 
182
- # s3ArgGroup.add_argument(
183
- # "--s3-provider",
184
- # dest="aiservice_s3_provider",
185
- # required=False,
186
- # help="S3 storage provider type (e.g., minio, aws)"
187
- # )
188
-
189
190
  # S3 - Minio
190
191
  # -----------------------------------------------------------------------------
191
192
  s3ArgGroup.add_argument(
@@ -304,23 +305,26 @@ watsonxArgGroup.add_argument(
304
305
 
305
306
  # AI Service
306
307
  # -----------------------------------------------------------------------------
308
+ aiServiceArgGroup = aiServiceinstallArgParser.add_argument_group("Maximo AI Service")
309
+
307
310
  aiServiceArgGroup.add_argument(
308
311
  "--tenant-entitlement-type",
309
312
  dest="tenant_entitlement_type",
310
313
  required=False,
311
- help="Type of aibroker tenant"
314
+ default="standard",
315
+ help="Entitlement type for AI Service tenant"
312
316
  )
313
317
  aiServiceArgGroup.add_argument(
314
318
  "--tenant-entitlement-start-date",
315
319
  dest="tenant_entitlement_start_date",
316
320
  required=False,
317
- help="Start date for Aibroker tenant"
321
+ help="Start date for AI Service tenant"
318
322
  )
319
323
  aiServiceArgGroup.add_argument(
320
324
  "--tenant-entitlement-end-date",
321
325
  dest="tenant_entitlement_end_date",
322
326
  required=False,
323
- help="End date for Aibroker tenant"
327
+ help="End date for AI Service tenant"
324
328
  )
325
329
  aiServiceArgGroup.add_argument(
326
330
  "--rsl-url",
@@ -57,8 +57,9 @@ optionalParams = [
57
57
  # Dev Mode
58
58
  "artifactory_username",
59
59
  "artifactory_token",
60
+ # ODH
61
+ "aiservice_odh_model_deployment_type",
60
62
  # AI Service
61
- # "aiservice_s3_provider",
62
63
  "aiservice_s3_accesskey",
63
64
  "aiservice_s3_secretkey",
64
65
  "aiservice_s3_host",
@@ -45,36 +45,33 @@ class aiServiceInstallSummarizerMixin():
45
45
  self.printH2("AI Service")
46
46
  self.printParamSummary("Release", "aiservice_channel")
47
47
  self.printParamSummary("Instance ID", "aiservice_instance_id")
48
- self.printParamSummary("Environment type", "environment_type")
48
+ self.printParamSummary("Environment Type", "environment_type")
49
+
50
+ self.printH2("AI Service Tenant Entitlement")
51
+ self.printParamSummary("Entitlement Type", "tenant_entitlement_type")
52
+ self.printParamSummary("Start Date", "tenant_entitlement_start_date")
53
+ self.printParamSummary("End Date", "tenant_entitlement_end_date")
49
54
 
50
55
  self.printH2("S3 Configuration")
51
56
  # self.printParamSummary("Storage provider", "aiservice_s3_provider")
52
57
  if self.getParam("minio_root_user") is not None and self.getParam("minio_root_user") != "":
53
- self.printParamSummary("minio root username", "minio_root_user")
54
- print()
55
- self.printParamSummary("Storage access key", "aiservice_s3_accesskey")
56
- self.printParamSummary("Storage host", "aiservice_s3_host")
57
- self.printParamSummary("Storage port", "aiservice_s3_port")
58
- self.printParamSummary("Storage ssl", "aiservice_s3_ssl")
59
- self.printParamSummary("Storage region", "aiservice_s3_region")
60
- self.printParamSummary("S3 bucket prefix", "aiservice_s3_bucket_prefix")
61
- self.printParamSummary("Storage tenants bucket", "aiservice_s3_tenants_bucket")
62
- self.printParamSummary("Storage templates bucket", "aiservice_s3_templates_bucket")
58
+ self.printParamSummary("Minio Root Username", "minio_root_user")
63
59
  print()
60
+ self.printParamSummary("Host", "aiservice_s3_host")
61
+ self.printParamSummary("Port", "aiservice_s3_port")
62
+ self.printParamSummary("SSL Enabled", "aiservice_s3_ssl")
63
+ self.printParamSummary("Region", "aiservice_s3_region")
64
+ self.printParamSummary("Bucket Prefix", "aiservice_s3_bucket_prefix")
65
+ self.printParamSummary("Templates Bucket Name", "aiservice_s3_templates_bucket")
66
+ self.printParamSummary("Tenants Bucket Name", "aiservice_s3_tenants_bucket")
64
67
 
65
68
  self.printH2("IBM WatsonX")
66
- self.printParamSummary("Watsonxai machine learning url", "aiservice_watsonxai_url")
67
- self.printParamSummary("Watsonxai project id", "aiservice_watsonxai_project_id")
68
-
69
- self.printH2("AI Service Tenant")
70
- self.printParamSummary("Tenant entitlement type", "tenant_entitlement_type")
71
- self.printParamSummary("Tenant start date", "tenant_entitlement_start_date")
72
- self.printParamSummary("Tenant end date", "tenant_entitlement_end_date")
69
+ self.printParamSummary("URL", "aiservice_watsonxai_url")
70
+ self.printParamSummary("Project ID", "aiservice_watsonxai_project_id")
73
71
 
74
72
  self.printH2("RSL")
75
- self.printParamSummary("RSL url", "rsl_url")
76
- self.printParamSummary("ORG Id of RSL", "rsl_org_id")
77
- self.printParamSummary("Token for RSL", "rsl_token")
73
+ self.printParamSummary("URL", "rsl_url")
74
+ self.printParamSummary("Organization ID", "rsl_org_id")
78
75
 
79
76
  def db2Summary(self) -> None:
80
77
  self.printH2("IBM Db2 Univeral Operator Configuration")
@@ -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 = "15.1.12"
120
+ self.version = "15.2.0"
121
121
  self.h1count = 0
122
122
  self.h2count = 0
123
123
 
@@ -9,18 +9,19 @@
9
9
  # *****************************************************************************
10
10
  supportedCatalogs = {
11
11
  "amd64": [
12
+ "v9-250828-amd64",
12
13
  "v9-250731-amd64",
13
14
  "v9-250624-amd64",
14
15
  "v9-250501-amd64",
15
- "v9-250403-amd64",
16
16
  ],
17
17
  "s390x": [
18
+ "v9-250828-s390x",
18
19
  "v9-250731-s390x",
19
20
  "v9-250624-s390x",
20
21
  "v9-250501-s390x",
21
- "v9-250403-s390x",
22
22
  ],
23
23
  "ppc64le": [
24
+ "v9-250828-ppc64le",
24
25
  "v9-250731-ppc64le",
25
26
  "v9-250624-ppc64le",
26
27
  ],