mas-cli 21.3.0__tar.gz → 21.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mas_cli-21.3.0/src/mas_cli.egg-info → mas_cli-21.4.1}/PKG-INFO +1 -1
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/__init__.py +1 -1
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/app.py +13 -22
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/argBuilder.py +3 -9
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/argParser.py +1 -3
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/params.py +0 -3
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/summarizer.py +3 -7
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/cli.py +71 -23
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/app.py +48 -36
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/argBuilder.py +8 -9
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/argParser.py +10 -3
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/params.py +0 -3
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/summarizer.py +13 -10
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/mirror/app.py +1 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/mirror/config.py +2 -1
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/pre_install/app.py +68 -54
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/pre_install/argParser.py +3 -3
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/ibm-mas-tekton.yaml +331 -493
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/upgrade/app.py +81 -1
- {mas_cli-21.3.0 → mas_cli-21.4.1/src/mas_cli.egg-info}/PKG-INFO +1 -1
- {mas_cli-21.3.0 → mas_cli-21.4.1}/MANIFEST.in +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/README.md +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/setup.cfg +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/setup.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/install/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/upgrade/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/upgrade/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/aiservice/upgrade/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/backup/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/backup/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/backup/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/displayMixins.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/gencfg.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/catalogs.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/additionalConfigs.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/aiSettings.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/db2Settings.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/kafkaSettings.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/manageSettings.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/install/settings/mongodbSettings.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/mirror/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/mirror/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/pre_install/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/restore/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/restore/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/restore/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/setup_rbac/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/setup_rbac/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/setup_rbac/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/aicfg.yml.j2 +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/facilities-configs.yml.j2 +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/jdbccfg.yml.j2 +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-data-dictionary-assetdatadictionary.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-bascfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-coreidp.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-actions.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-auth.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-datapower.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-devops.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dm.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-dsc.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-edgeconfig.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-fpl.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-guardian.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-iot.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mbgx.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-mfgx.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-monitor.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-orgmgmt.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-provision.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-registry.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-state.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-iot-webui.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextaccelerator.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-healthextworkspace.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-imagestitching.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageaccelerators.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageapp.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-manageworkspace.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-manage-slackproxy.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-pushnotificationcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-scimcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-slscfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-smtpcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-suite.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-mas-visualinspection.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/best-effort/ibm-sls-licenseservice.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-data-dictionary-assetdatadictionary.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-bascfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-coreidp.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-actions.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-auth.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-datapower.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-devops.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dm.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-dsc.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-edgeconfig.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-fpl.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-guardian.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-iot.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mbgx.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-mfgx.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-monitor.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-orgmgmt.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-provision.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-registry.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-state.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-iot-webui.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextaccelerator.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-healthextworkspace.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-imagestitching.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageaccelerators.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageapp.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-manageworkspace.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-manage-slackproxy.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-pushnotificationcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-scimcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-slscfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-smtpcfg.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-suite.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-mas-visualinspection.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/pod-templates/guaranteed/ibm-sls-licenseservice.yml +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/templates/suite_mongocfg.yml.j2 +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/uninstall/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/uninstall/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/uninstall/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/update/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/update/app.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/update/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/upgrade/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/upgrade/argParser.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/upgrade/settings/__init__.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas/cli/validators.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas-cli +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas_cli.egg-info/SOURCES.txt +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas_cli.egg-info/dependency_links.txt +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas_cli.egg-info/requires.txt +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/src/mas_cli.egg-info/top_level.txt +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/test/test_baseapp.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/test/test_help.py +0 -0
- {mas_cli-21.3.0 → mas_cli-21.4.1}/test/test_slack_params.py +0 -0
|
@@ -77,7 +77,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
77
77
|
if not isVersionEqualOrAfter("9.2.0", self.getParam("aiservice_channel")):
|
|
78
78
|
return
|
|
79
79
|
|
|
80
|
-
if self.
|
|
80
|
+
if self.skip_preinstall_rbac:
|
|
81
81
|
return
|
|
82
82
|
|
|
83
83
|
permissionResults = permissionCheckForRBAC(self.dynamicClient)
|
|
@@ -91,7 +91,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
91
91
|
self.printDescription(
|
|
92
92
|
[
|
|
93
93
|
"",
|
|
94
|
-
f"You selected the '{self.
|
|
94
|
+
f"You selected the '{self.permission_mode}' permission mode.",
|
|
95
95
|
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
|
|
96
96
|
"This step must be completed by an OpenShift cluster administrator before AI Service installation can continue.",
|
|
97
97
|
"Ask your OpenShift administrator to run 'mas pre-install' for this AI Service instance.",
|
|
@@ -107,7 +107,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
107
107
|
self.fatalError(
|
|
108
108
|
"\n".join(
|
|
109
109
|
[
|
|
110
|
-
f"You selected the '{self.
|
|
110
|
+
f"You selected the '{self.permission_mode}' permission mode.",
|
|
111
111
|
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
|
|
112
112
|
"This step must be completed by an OpenShift cluster administrator before AI Service installation can continue.",
|
|
113
113
|
"Ask your OpenShift administrator to run 'mas pre-install' for this installation and then rerun 'mas aiservice-install' with --skip-preinstall-rbac.",
|
|
@@ -140,9 +140,9 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
140
140
|
|
|
141
141
|
permissionModeInt = self.promptForInt("Permission Mode", default=1, min=1, max=3)
|
|
142
142
|
permissionModeMap = {1: "cluster", 2: "namespaced", 3: "minimal"}
|
|
143
|
-
self.
|
|
144
|
-
elif self.
|
|
145
|
-
self.
|
|
143
|
+
self.permission_mode = permissionModeMap[permissionModeInt]
|
|
144
|
+
elif self.permission_mode == "":
|
|
145
|
+
self.permission_mode = "cluster"
|
|
146
146
|
|
|
147
147
|
@logMethodCall
|
|
148
148
|
def processCatalogChoice(self) -> list:
|
|
@@ -466,12 +466,12 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
466
466
|
self.validateCatalogSource()
|
|
467
467
|
self.licensePrompt()
|
|
468
468
|
|
|
469
|
-
if self.
|
|
469
|
+
if self.permission_mode != "" and not isVersionEqualOrAfter("9.2.0", self.getParam("aiservice_channel")):
|
|
470
470
|
self.fatalError("--permission-mode is supported only for AI Service releases aligned to MAS 9.2.0 and later")
|
|
471
471
|
|
|
472
472
|
# Set default permission_mode for 9.2.0+ if not provided
|
|
473
|
-
if isVersionEqualOrAfter("9.2.0", self.getParam("aiservice_channel")) and self.
|
|
474
|
-
self.
|
|
473
|
+
if isVersionEqualOrAfter("9.2.0", self.getParam("aiservice_channel")) and self.permission_mode == "":
|
|
474
|
+
self.permission_mode = "cluster"
|
|
475
475
|
|
|
476
476
|
@logMethodCall
|
|
477
477
|
def install(self, argv):
|
|
@@ -487,6 +487,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
487
487
|
self.noConfirm = args.no_confirm
|
|
488
488
|
self.licenseAccepted = args.accept_license
|
|
489
489
|
self.devMode = args.dev_mode
|
|
490
|
+
self.permission_mode = args.permission_mode if args.permission_mode else ""
|
|
490
491
|
|
|
491
492
|
self.printDescription(
|
|
492
493
|
[
|
|
@@ -514,8 +515,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
514
515
|
if args.skip_pre_check:
|
|
515
516
|
self.setParam("skip_pre_check", "true")
|
|
516
517
|
|
|
517
|
-
|
|
518
|
-
self.setParam("skip_preinstall_rbac", "true")
|
|
518
|
+
self.skip_preinstall_rbac = hasattr(args, "skip_preinstall_rbac") and args.skip_preinstall_rbac
|
|
519
519
|
|
|
520
520
|
if instanceId is None:
|
|
521
521
|
self.printH1("Set Target OpenShift Cluster")
|
|
@@ -625,7 +625,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
625
625
|
dynClient=self.dynamicClient,
|
|
626
626
|
masVersion=".".join(self.getParam("aiservice_channel").split(".")[:2]),
|
|
627
627
|
masInstanceId=self.getParam("aiservice_instance_id"),
|
|
628
|
-
permissionMode=self.
|
|
628
|
+
permissionMode=self.permission_mode,
|
|
629
629
|
selectedApps=["aiservice"],
|
|
630
630
|
)
|
|
631
631
|
h.stop_and_persist(symbol=self.successIcon, text=f"Pre-install RBAC for AI Service is ready for {self.getParam('aiservice_instance_id')}")
|
|
@@ -812,20 +812,11 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
|
|
|
812
812
|
[
|
|
813
813
|
"RSL (Reliable Strategy Library) connects to strategic asset management via STRATEGIZEAPI.",
|
|
814
814
|
"",
|
|
815
|
-
"RSL URL: https://api.rsl-service.suite.maximo.com (standard for all customers)",
|
|
816
|
-
"Org ID: Get from MAS Manage > System Properties > 'mxe.rs.rslorgid'",
|
|
817
|
-
"Token: Use your IBM entitlement key (same as MAS installation)",
|
|
818
|
-
"",
|
|
819
815
|
"Note: Future versions will auto-configure these from MAS Manage.",
|
|
820
816
|
"",
|
|
821
817
|
]
|
|
822
818
|
)
|
|
823
|
-
|
|
824
|
-
self.promptForString("ORG Id of RSL", "rsl_org_id")
|
|
825
|
-
rslToken = self.promptForString("Token for RSL", isPassword=True)
|
|
826
|
-
if not rslToken.startswith("Bearer "):
|
|
827
|
-
rslToken = "Bearer " + rslToken
|
|
828
|
-
self.setParam("rsl_token", rslToken)
|
|
819
|
+
|
|
829
820
|
if self.yesOrNo("Does the RSL API use a self-signed certificate?"):
|
|
830
821
|
self.promptForString("RSL CA certificate (PEM format)", "rsl_ca_crt")
|
|
831
822
|
|
|
@@ -96,9 +96,9 @@ class aiServiceInstallArgBuilderMixin:
|
|
|
96
96
|
command += f" --dev-mode{newline}"
|
|
97
97
|
if self.getParam("skip_pre_check") is True:
|
|
98
98
|
command += f" --skip-pre-check{newline}"
|
|
99
|
-
if self.
|
|
100
|
-
command += f
|
|
101
|
-
if self.
|
|
99
|
+
if self.permission_mode != "":
|
|
100
|
+
command += f' --permission-mode "{self.permission_mode}"{newline}'
|
|
101
|
+
if self.skip_preinstall_rbac:
|
|
102
102
|
command += f" --skip-preinstall-rbac{newline}"
|
|
103
103
|
if self.getParam("image_pull_policy") != "":
|
|
104
104
|
command += f" --image-pull-policy {self.getParam('image_pull_policy')}{newline}"
|
|
@@ -179,12 +179,6 @@ class aiServiceInstallArgBuilderMixin:
|
|
|
179
179
|
if self.aiserviceTenantSchedulingConfigFileLocal:
|
|
180
180
|
command += f' --tenant-scheduling-config-file "{self.aiserviceTenantSchedulingConfigFileLocal}"{newline}'
|
|
181
181
|
|
|
182
|
-
if self.getParam("rsl_url") != "":
|
|
183
|
-
command += f" --rsl-url \"{self.getParam('rsl_url')}\"{newline}"
|
|
184
|
-
if self.getParam("rsl_org_id") != "":
|
|
185
|
-
command += f" --rsl-org-id \"{self.getParam('rsl_org_id')}\"{newline}"
|
|
186
|
-
if self.getParam("rsl_token") != "":
|
|
187
|
-
command += f" --rsl-token \"{self.getParam('rsl_token')}\"{newline}"
|
|
188
182
|
if self.getParam("rsl_ca_crt") != "":
|
|
189
183
|
command += f" --rsl-ca-crt \"{self.getParam('rsl_ca_crt')}\"{newline}"
|
|
190
184
|
|
|
@@ -187,9 +187,7 @@ aiServiceArgGroup.add_argument(
|
|
|
187
187
|
)
|
|
188
188
|
aiServiceArgGroup.add_argument("--tenant-entitlement-start-date", dest="tenant_entitlement_start_date", required=False, help="Start date for AI Service tenant")
|
|
189
189
|
aiServiceArgGroup.add_argument("--tenant-entitlement-end-date", dest="tenant_entitlement_end_date", required=False, help="End date for AI Service tenant")
|
|
190
|
-
|
|
191
|
-
aiServiceArgGroup.add_argument("--rsl-org-id", dest="rsl_org_id", required=False, help="org id for rsl")
|
|
192
|
-
aiServiceArgGroup.add_argument("--rsl-token", dest="rsl_token", required=False, help="token for rsl")
|
|
190
|
+
|
|
193
191
|
aiServiceArgGroup.add_argument(
|
|
194
192
|
"--rsl-ca-crt", dest="rsl_ca_crt", required=False, help="CA certificate for RSL API (PEM format, optional, only if using self-signed certs)"
|
|
195
193
|
)
|
|
@@ -46,9 +46,9 @@ class aiServiceInstallSummarizerMixin:
|
|
|
46
46
|
self.printParamSummary("Release", "aiservice_channel")
|
|
47
47
|
self.printParamSummary("Instance ID", "aiservice_instance_id")
|
|
48
48
|
self.printParamSummary("Environment Type", "environment_type")
|
|
49
|
-
if self.
|
|
50
|
-
self.
|
|
51
|
-
self.printSummary("Skip Pre-Install RBAC", "Yes" if self.
|
|
49
|
+
if self.permission_mode not in [None, ""]:
|
|
50
|
+
self.printSummary("Permission Mode", self.permission_mode)
|
|
51
|
+
self.printSummary("Skip Pre-Install RBAC", "Yes" if self.skip_preinstall_rbac else "No")
|
|
52
52
|
|
|
53
53
|
if "aiservice_certificate_issuer" in self.params:
|
|
54
54
|
self.printParamSummary("Certificate Issuer", "aiservice_certificate_issuer")
|
|
@@ -80,10 +80,6 @@ class aiServiceInstallSummarizerMixin:
|
|
|
80
80
|
self.printParamSummary("URL", "aiservice_watsonxai_url")
|
|
81
81
|
self.printParamSummary("Project ID", "aiservice_watsonxai_project_id")
|
|
82
82
|
|
|
83
|
-
self.printH2("RSL")
|
|
84
|
-
self.printParamSummary("URL", "rsl_url")
|
|
85
|
-
self.printParamSummary("Organization ID", "rsl_org_id")
|
|
86
|
-
|
|
87
83
|
def db2Summary(self) -> None:
|
|
88
84
|
self.printH2("IBM Db2 Univeral Operator Configuration")
|
|
89
85
|
self.printParamSummary("Action", "db2_action_aiservice")
|
|
@@ -119,7 +119,7 @@ class BaseApp(PrintMixin, PromptMixin):
|
|
|
119
119
|
logging.getLogger("asyncio").setLevel(logging.INFO)
|
|
120
120
|
|
|
121
121
|
# Supports extended semver, unlike mas.cli.__version__
|
|
122
|
-
self.version: str = "21.
|
|
122
|
+
self.version: str = "21.4.1"
|
|
123
123
|
self.h1count: int = 0
|
|
124
124
|
self.h2count: int = 0
|
|
125
125
|
|
|
@@ -147,6 +147,8 @@ class BaseApp(PrintMixin, PromptMixin):
|
|
|
147
147
|
|
|
148
148
|
self._isSNO: bool | None = None
|
|
149
149
|
self._isAirgap: bool | None = None
|
|
150
|
+
self.useCliDigest: bool = False
|
|
151
|
+
self.cliDigest: str | None = None
|
|
150
152
|
|
|
151
153
|
# Until we connect to the cluster we don't know what architecture it's worker nodes are
|
|
152
154
|
self.architecture: str | None = None
|
|
@@ -255,44 +257,90 @@ class BaseApp(PrintMixin, PromptMixin):
|
|
|
255
257
|
if path.exists(self.tektonDefsWithDigestPath):
|
|
256
258
|
logger.debug(f"We have already generated {self.tektonDefsWithDigestPath}")
|
|
257
259
|
self.tektonDefsPath = self.tektonDefsWithDigestPath
|
|
258
|
-
elif isAirgapInstall(self.dynamicClient):
|
|
259
|
-
# We need to modify the tekton definitions to
|
|
260
|
+
elif isAirgapInstall(self.dynamicClient) or self.useCliDigest:
|
|
261
|
+
# We need to modify the tekton definitions to use image digest
|
|
260
262
|
imageWithoutDigest = f"quay.io/ibmmas/cli:{self.version}"
|
|
261
|
-
|
|
262
|
-
self.
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
263
|
+
|
|
264
|
+
if self.useCliDigest:
|
|
265
|
+
self.printH1("CLI Digest Preparation")
|
|
266
|
+
self.printDescription(
|
|
267
|
+
[f"Converting Tekton pipeline definitions to use {imageWithoutDigest} image digest instead of tag to avoid registry QPS issues"]
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
# Check if user provided a specific digest
|
|
271
|
+
if self.cliDigest:
|
|
272
|
+
logger.info(f"Using user-provided CLI image digest: {self.cliDigest}")
|
|
273
|
+
cliImageDigest = self.cliDigest
|
|
274
|
+
else:
|
|
275
|
+
logger.info(f"--use-cli-digest flag is set, will lookup digest for {imageWithoutDigest}")
|
|
276
|
+
# Auto-lookup the digest
|
|
277
|
+
cmdArray = ["skopeo", "inspect", f"docker://{imageWithoutDigest}"]
|
|
278
|
+
logger.info(f"Skopeo inspect command: {' '.join(cmdArray)}")
|
|
279
|
+
skopeoResult = runCmd(cmdArray)
|
|
280
|
+
if skopeoResult.successful():
|
|
281
|
+
skopeoData = json.loads(skopeoResult.out)
|
|
282
|
+
logger.debug(f"Skopeo Data for {imageWithoutDigest}: {skopeoData}")
|
|
283
|
+
if "Digest" not in skopeoData:
|
|
284
|
+
self.fatalError("Recieved bad data inspecting CLI manifest to determine digest")
|
|
285
|
+
cliImageDigest = skopeoData["Digest"]
|
|
286
|
+
logger.info(f"Successfully retrieved CLI image digest: {cliImageDigest}")
|
|
287
|
+
else:
|
|
288
|
+
warning = f"Unable to retrieve image digest for {imageWithoutDigest} ({skopeoResult.rc})"
|
|
289
|
+
self.printWarning(warning)
|
|
290
|
+
logger.warning(warning)
|
|
291
|
+
logger.warning(skopeoResult.err)
|
|
292
|
+
if self.noConfirm:
|
|
293
|
+
self.fatalError("Unable to automatically determine CLI image digest and --no-confirm flag has been set")
|
|
294
|
+
else:
|
|
295
|
+
cliImageDigest = self.promptForString(f"Enter {imageWithoutDigest} image digest")
|
|
296
|
+
logger.info(f"User provided CLI image digest: {cliImageDigest}")
|
|
274
297
|
else:
|
|
275
|
-
|
|
276
|
-
self.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
298
|
+
# Airgap install
|
|
299
|
+
self.printH1("Disconnected OpenShift Preparation")
|
|
300
|
+
self.printDescription(
|
|
301
|
+
[
|
|
302
|
+
f"Unless the {imageWithoutDigest} image is accessible from your cluster the MAS CLI container image must be present in your mirror registry"
|
|
303
|
+
]
|
|
304
|
+
)
|
|
305
|
+
logger.info(f"Airgap install detected, will lookup digest for {imageWithoutDigest}")
|
|
306
|
+
|
|
307
|
+
cmdArray = ["skopeo", "inspect", f"docker://{imageWithoutDigest}"]
|
|
308
|
+
logger.info(f"Skopeo inspect command: {' '.join(cmdArray)}")
|
|
309
|
+
skopeoResult = runCmd(cmdArray)
|
|
310
|
+
if skopeoResult.successful():
|
|
311
|
+
skopeoData = json.loads(skopeoResult.out)
|
|
312
|
+
logger.debug(f"Skopeo Data for {imageWithoutDigest}: {skopeoData}")
|
|
313
|
+
if "Digest" not in skopeoData:
|
|
314
|
+
self.fatalError("Recieved bad data inspecting CLI manifest to determine digest")
|
|
315
|
+
cliImageDigest = skopeoData["Digest"]
|
|
316
|
+
logger.info(f"Successfully retrieved CLI image digest: {cliImageDigest}")
|
|
281
317
|
else:
|
|
282
|
-
|
|
318
|
+
warning = f"Unable to retrieve image digest for {imageWithoutDigest} ({skopeoResult.rc})"
|
|
319
|
+
self.printWarning(warning)
|
|
320
|
+
logger.warning(warning)
|
|
321
|
+
logger.warning(skopeoResult.err)
|
|
322
|
+
if self.noConfirm:
|
|
323
|
+
self.fatalError("Unable to automatically determine CLI image digest and --no-confirm flag has been set")
|
|
324
|
+
else:
|
|
325
|
+
cliImageDigest = self.promptForString(f"Enter {imageWithoutDigest} image digest")
|
|
326
|
+
logger.info(f"User provided CLI image digest: {cliImageDigest}")
|
|
283
327
|
|
|
284
328
|
# Overwrite the tekton definitions with one that uses the looked up image digest
|
|
285
329
|
imageWithDigest = f"quay.io/ibmmas/cli@{cliImageDigest}"
|
|
286
330
|
self.printHighlight(f"\nConverting Tekton definitions to use {imageWithDigest}")
|
|
331
|
+
logger.info(f"Converting from tag-based image ({imageWithoutDigest}) to digest-based image ({imageWithDigest})")
|
|
332
|
+
|
|
287
333
|
with open(self.tektonDefsPath, "r") as file:
|
|
288
334
|
tektonDefsWithoutDigest = file.read()
|
|
289
335
|
|
|
290
336
|
tektonDefsWithDigest = tektonDefsWithoutDigest.replace(imageWithoutDigest, imageWithDigest)
|
|
291
337
|
|
|
338
|
+
logger.info(f"Writing Tekton definitions with digest to {self.tektonDefsWithDigestPath}")
|
|
292
339
|
with open(self.tektonDefsWithDigestPath, "w") as file:
|
|
293
340
|
file.write(tektonDefsWithDigest)
|
|
294
341
|
|
|
295
342
|
self.tektonDefsPath = self.tektonDefsWithDigestPath
|
|
343
|
+
logger.info("Successfully created Tekton definitions with CLI digest")
|
|
296
344
|
|
|
297
345
|
@logMethodCall
|
|
298
346
|
def getCompatibleVersions(self, coreChannel: str, appId: str) -> List[str]:
|
|
@@ -123,12 +123,10 @@ class InstallApp(
|
|
|
123
123
|
if not isVersionEqualOrAfter("9.2.0", self.getParam("mas_channel")):
|
|
124
124
|
return
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
# if self.getParam("mas_permission_mode") == "minimal":
|
|
129
|
-
# return
|
|
126
|
+
if self.mas_permission_mode == "minimal":
|
|
127
|
+
return
|
|
130
128
|
|
|
131
|
-
if self.
|
|
129
|
+
if self.skip_preinstall_rbac:
|
|
132
130
|
return
|
|
133
131
|
|
|
134
132
|
permissionResults = permissionCheckForRBAC(self.dynamicClient)
|
|
@@ -142,26 +140,26 @@ class InstallApp(
|
|
|
142
140
|
self.printDescription(
|
|
143
141
|
[
|
|
144
142
|
"",
|
|
145
|
-
f"You selected the '{self.
|
|
143
|
+
f"You selected the '{self.mas_permission_mode}' permission mode.",
|
|
146
144
|
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
|
|
147
145
|
"This step must be completed by an OpenShift cluster administrator before MAS installation can continue.",
|
|
148
|
-
"Ask your OpenShift administrator to run 'mas pre-install' for this MAS instance, MAS
|
|
146
|
+
"Ask your OpenShift administrator to run 'mas pre-install' for this MAS instance, MAS channel, permission mode, and selected apps.",
|
|
149
147
|
"If that has already been done, you can continue the installation without applying it again.",
|
|
150
148
|
]
|
|
151
149
|
)
|
|
152
150
|
|
|
153
151
|
if not self.yesOrNo("Has your OpenShift administrator already run 'mas pre-install' for this installation"):
|
|
154
152
|
self.fatalError(
|
|
155
|
-
"Installation aborted. Ask your OpenShift administrator to run 'mas pre-install' for this installation and then run mas install again with --skip-preinstall-rbac."
|
|
153
|
+
"Installation aborted. Ask your OpenShift administrator to run 'mas pre-install' for this installation and then run 'mas install' again with --skip-preinstall-rbac using the same permission mode that was used in 'mas pre-install'."
|
|
156
154
|
)
|
|
157
155
|
else:
|
|
158
156
|
self.fatalError(
|
|
159
157
|
"\n".join(
|
|
160
158
|
[
|
|
161
|
-
f"You selected the '{self.
|
|
159
|
+
f"You selected the '{self.mas_permission_mode}' permission mode.",
|
|
162
160
|
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
|
|
163
161
|
"This step must be completed by an OpenShift cluster administrator before MAS installation can continue.",
|
|
164
|
-
"Ask your OpenShift administrator to run 'mas pre-install' for this installation and then rerun 'mas install' with --skip-preinstall-rbac.",
|
|
162
|
+
"Ask your OpenShift administrator to run 'mas pre-install' for this installation and then rerun 'mas install' with --skip-preinstall-rbac using the same permission mode that was used in 'mas pre-install'.",
|
|
165
163
|
]
|
|
166
164
|
)
|
|
167
165
|
)
|
|
@@ -776,9 +774,9 @@ class InstallApp(
|
|
|
776
774
|
|
|
777
775
|
permissionModeInt = self.promptForInt("Permission Mode", default=1, min=1, max=3)
|
|
778
776
|
permissionModeMap = {1: "cluster", 2: "namespaced", 3: "minimal"}
|
|
779
|
-
self.
|
|
777
|
+
self.mas_permission_mode = permissionModeMap[permissionModeInt]
|
|
780
778
|
|
|
781
|
-
if self.
|
|
779
|
+
if self.mas_permission_mode in ["namespaced", "minimal"]:
|
|
782
780
|
self.setParam("mas_issuer_kind", "Issuer")
|
|
783
781
|
else:
|
|
784
782
|
self.printDescription(
|
|
@@ -795,18 +793,18 @@ class InstallApp(
|
|
|
795
793
|
)
|
|
796
794
|
issuerKindChoice = self.promptForInt("Certificate issuer kind", min=1, max=2, default=2)
|
|
797
795
|
self.setParam("mas_issuer_kind", "ClusterIssuer" if issuerKindChoice == 2 else "Issuer")
|
|
798
|
-
elif self.
|
|
799
|
-
self.
|
|
796
|
+
elif self.mas_permission_mode == "":
|
|
797
|
+
self.mas_permission_mode = "cluster"
|
|
800
798
|
self.setParam("mas_issuer_kind", "ClusterIssuer")
|
|
801
799
|
|
|
802
800
|
def _handleDNSIntegrationRestriction(self):
|
|
803
801
|
if not isVersionEqualOrAfter("9.2.0", self.getParam("mas_channel")):
|
|
804
802
|
return False
|
|
805
803
|
|
|
806
|
-
if self.
|
|
804
|
+
if self.mas_permission_mode in ["namespaced", "minimal"]:
|
|
807
805
|
self.printDescription(
|
|
808
806
|
[
|
|
809
|
-
f"You are using the {self.
|
|
807
|
+
f"You are using the {self.mas_permission_mode} permission mode.",
|
|
810
808
|
"DNS integration is not available in this mode.",
|
|
811
809
|
"If you use a custom domain, you need to configure DNS manually.",
|
|
812
810
|
]
|
|
@@ -1870,20 +1868,11 @@ class InstallApp(
|
|
|
1870
1868
|
[
|
|
1871
1869
|
"RSL (Reliable Strategy Library) connects to strategic asset management via STRATEGIZEAPI.",
|
|
1872
1870
|
"",
|
|
1873
|
-
"RSL URL: https://api.rsl-service.suite.maximo.com (standard for all customers)",
|
|
1874
|
-
"Org ID: Get from MAS Manage > System Properties > 'mxe.rs.rslorgid'",
|
|
1875
|
-
"Token: Use your IBM entitlement key (same as MAS installation)",
|
|
1876
|
-
"",
|
|
1877
1871
|
"Note: Future versions will auto-configure these from MAS Manage.",
|
|
1878
1872
|
"",
|
|
1879
1873
|
]
|
|
1880
1874
|
)
|
|
1881
|
-
|
|
1882
|
-
self.promptForString("ORG Id of RSL", "rsl_org_id")
|
|
1883
|
-
rslToken = self.promptForString("Token for RSL", isPassword=True)
|
|
1884
|
-
if not rslToken.startswith("Bearer "):
|
|
1885
|
-
rslToken = "Bearer " + rslToken
|
|
1886
|
-
self.setParam("rsl_token", rslToken)
|
|
1875
|
+
|
|
1887
1876
|
if self.yesOrNo("Does the RSL API use a self-signed certificate?"):
|
|
1888
1877
|
self.promptForString("RSL CA certificate (PEM format)", "rsl_ca_crt")
|
|
1889
1878
|
|
|
@@ -2235,6 +2224,7 @@ class InstallApp(
|
|
|
2235
2224
|
"advanced",
|
|
2236
2225
|
"simplified",
|
|
2237
2226
|
"mas_configure_ingress",
|
|
2227
|
+
"use_cli_digest",
|
|
2238
2228
|
]:
|
|
2239
2229
|
pass
|
|
2240
2230
|
|
|
@@ -2349,17 +2339,17 @@ class InstallApp(
|
|
|
2349
2339
|
if self.getParam("mas_issuer_kind") != "" and not isVersionEqualOrAfter("9.2.0", self.getParam("mas_channel")):
|
|
2350
2340
|
self.fatalError(f"--mas-issuer-kind is only supported for MAS 9.2+ (selected channel: {self.getParam('mas_channel')})")
|
|
2351
2341
|
|
|
2352
|
-
if self.
|
|
2342
|
+
if self.mas_permission_mode != "":
|
|
2353
2343
|
if not isVersionEqualOrAfter("9.2.0", self.getParam("mas_channel")):
|
|
2354
2344
|
self.fatalError(f"--permission-mode is only supported for MAS 9.2+ (selected channel: {self.getParam('mas_channel')})")
|
|
2355
2345
|
else:
|
|
2356
2346
|
if self.getParam("mas_issuer_kind") == "":
|
|
2357
|
-
if self.
|
|
2347
|
+
if self.mas_permission_mode == "cluster":
|
|
2358
2348
|
self.setParam("mas_issuer_kind", "ClusterIssuer")
|
|
2359
2349
|
else:
|
|
2360
2350
|
self.setParam("mas_issuer_kind", "Issuer")
|
|
2361
2351
|
|
|
2362
|
-
if self.getParam("mas_issuer_kind") == "ClusterIssuer" and self.
|
|
2352
|
+
if self.getParam("mas_issuer_kind") == "ClusterIssuer" and self.mas_permission_mode != "cluster":
|
|
2363
2353
|
self.fatalError(
|
|
2364
2354
|
"\n".join(
|
|
2365
2355
|
[
|
|
@@ -2370,21 +2360,21 @@ class InstallApp(
|
|
|
2370
2360
|
)
|
|
2371
2361
|
|
|
2372
2362
|
if self.getParam("dns_provider") != "":
|
|
2373
|
-
if self.
|
|
2363
|
+
if self.mas_permission_mode in [
|
|
2374
2364
|
"namespaced",
|
|
2375
2365
|
"minimal",
|
|
2376
2366
|
]:
|
|
2377
2367
|
self.fatalError(
|
|
2378
2368
|
"\n".join(
|
|
2379
2369
|
[
|
|
2380
|
-
f"Invalid configuration for permission mode '{self.
|
|
2370
|
+
f"Invalid configuration for permission mode '{self.mas_permission_mode}'",
|
|
2381
2371
|
"DNS integration is not available in this mode.",
|
|
2382
2372
|
"Remove DNS integration option --dns-provider, or switch to --permission-mode cluster and use --mas-issuer-kind ClusterIssuer.",
|
|
2383
2373
|
]
|
|
2384
2374
|
)
|
|
2385
2375
|
)
|
|
2386
2376
|
|
|
2387
|
-
if self.
|
|
2377
|
+
if self.mas_permission_mode == "cluster" and self.getParam("mas_issuer_kind") == "Issuer":
|
|
2388
2378
|
self.fatalError(
|
|
2389
2379
|
"\n".join(
|
|
2390
2380
|
[
|
|
@@ -2395,7 +2385,7 @@ class InstallApp(
|
|
|
2395
2385
|
)
|
|
2396
2386
|
)
|
|
2397
2387
|
elif isVersionEqualOrAfter("9.2.0", self.getParam("mas_channel")):
|
|
2398
|
-
self.
|
|
2388
|
+
self.mas_permission_mode = "cluster"
|
|
2399
2389
|
if self.getParam("mas_issuer_kind") == "":
|
|
2400
2390
|
self.setParam("mas_issuer_kind", "ClusterIssuer")
|
|
2401
2391
|
|
|
@@ -2473,6 +2463,7 @@ class InstallApp(
|
|
|
2473
2463
|
self.licenseAccepted = args.accept_license
|
|
2474
2464
|
self.devMode = args.dev_mode
|
|
2475
2465
|
self.skipGrafanaInstall = args.skip_grafana_install
|
|
2466
|
+
self.mas_permission_mode = args.mas_permission_mode if args.mas_permission_mode else ""
|
|
2476
2467
|
|
|
2477
2468
|
# Set image_pull_policy of the CLI in interactive mode
|
|
2478
2469
|
if args.image_pull_policy and args.image_pull_policy != "":
|
|
@@ -2487,8 +2478,29 @@ class InstallApp(
|
|
|
2487
2478
|
if args.skip_pre_check:
|
|
2488
2479
|
self.setParam("skip_pre_check", "true")
|
|
2489
2480
|
|
|
2490
|
-
|
|
2491
|
-
|
|
2481
|
+
self.skip_preinstall_rbac = hasattr(args, "skip_preinstall_rbac") and args.skip_preinstall_rbac
|
|
2482
|
+
|
|
2483
|
+
# Handle --use-cli-digest parameter which can be:
|
|
2484
|
+
# - False (not provided)
|
|
2485
|
+
# - True (provided without value, auto-lookup digest)
|
|
2486
|
+
# - "sha256:..." (provided with specific digest value)
|
|
2487
|
+
if hasattr(args, "use_cli_digest"):
|
|
2488
|
+
use_cli_digest_value = args.use_cli_digest
|
|
2489
|
+
if use_cli_digest_value is False:
|
|
2490
|
+
# Flag not provided
|
|
2491
|
+
self.useCliDigest = False
|
|
2492
|
+
self.cliDigest = None
|
|
2493
|
+
elif use_cli_digest_value is True:
|
|
2494
|
+
# Flag provided without value - auto-lookup digest
|
|
2495
|
+
self.useCliDigest = True
|
|
2496
|
+
self.cliDigest = None
|
|
2497
|
+
else:
|
|
2498
|
+
# Flag provided with digest value
|
|
2499
|
+
self.useCliDigest = True
|
|
2500
|
+
self.cliDigest = use_cli_digest_value
|
|
2501
|
+
else:
|
|
2502
|
+
self.useCliDigest = False
|
|
2503
|
+
self.cliDigest = None
|
|
2492
2504
|
|
|
2493
2505
|
if hasattr(args, "mas_configure_ingress") and args.mas_configure_ingress:
|
|
2494
2506
|
self.setParam("mas_configure_ingress", "true")
|
|
@@ -2696,7 +2708,7 @@ class InstallApp(
|
|
|
2696
2708
|
dynClient=self.dynamicClient,
|
|
2697
2709
|
masVersion=".".join(self.getParam("mas_channel").split(".")[:2]),
|
|
2698
2710
|
masInstanceId=self.getParam("mas_instance_id"),
|
|
2699
|
-
permissionMode=self.
|
|
2711
|
+
permissionMode=self.mas_permission_mode,
|
|
2700
2712
|
selectedApps=self.getSelectedApps(),
|
|
2701
2713
|
)
|
|
2702
2714
|
h.stop_and_persist(symbol=self.successIcon, text="Pre-install MAS RBAC applied")
|
|
@@ -92,8 +92,8 @@ class installArgBuilderMixin:
|
|
|
92
92
|
if self.operationalMode == 2:
|
|
93
93
|
command += f" --non-prod{newline}"
|
|
94
94
|
|
|
95
|
-
if self.
|
|
96
|
-
command += f" --permission-mode {self.
|
|
95
|
+
if self.mas_permission_mode != "":
|
|
96
|
+
command += f" --permission-mode {self.mas_permission_mode}{newline}"
|
|
97
97
|
|
|
98
98
|
if self.getParam("mas_trust_default_cas").lower() == "false":
|
|
99
99
|
command += f" --disable-ca-trust{newline}"
|
|
@@ -427,12 +427,6 @@ class installArgBuilderMixin:
|
|
|
427
427
|
if self.aiserviceTenantSchedulingConfigFileLocal:
|
|
428
428
|
command += f' --tenant-scheduling-config-file "{self.aiserviceTenantSchedulingConfigFileLocal}"{newline}'
|
|
429
429
|
|
|
430
|
-
if self.getParam("rsl_url") != "":
|
|
431
|
-
command += f" --rsl-url \"{self.getParam('rsl_url')}\"{newline}"
|
|
432
|
-
if self.getParam("rsl_org_id") != "":
|
|
433
|
-
command += f" --rsl-org-id \"{self.getParam('rsl_org_id')}\"{newline}"
|
|
434
|
-
if self.getParam("rsl_token") != "":
|
|
435
|
-
command += f" --rsl-token \"{self.getParam('rsl_token')}\"{newline}"
|
|
436
430
|
if self.getParam("rsl_ca_crt") != "":
|
|
437
431
|
command += f" --rsl-ca-crt \"{self.getParam('rsl_ca_crt')}\"{newline}"
|
|
438
432
|
|
|
@@ -614,12 +608,17 @@ class installArgBuilderMixin:
|
|
|
614
608
|
command += f" --dev-mode{newline}"
|
|
615
609
|
if self.getParam("skip_pre_check") is True:
|
|
616
610
|
command += f" --skip-pre-check{newline}"
|
|
617
|
-
if self.
|
|
611
|
+
if self.skip_preinstall_rbac:
|
|
618
612
|
command += f" --skip-preinstall-rbac{newline}"
|
|
619
613
|
if self.getParam("image_pull_policy") != "":
|
|
620
614
|
command += f" --image-pull-policy {self.getParam('image_pull_policy')}{newline}"
|
|
621
615
|
if self.getParam("service_account_name") != "":
|
|
622
616
|
command += f" --service-account {self.getParam('service_account_name')}{newline}"
|
|
617
|
+
if self.useCliDigest:
|
|
618
|
+
if self.cliDigest:
|
|
619
|
+
command += f" --use-cli-digest {self.cliDigest}{newline}"
|
|
620
|
+
else:
|
|
621
|
+
command += f" --use-cli-digest{newline}"
|
|
623
622
|
|
|
624
623
|
command += " --accept-license --no-confirm"
|
|
625
624
|
return command
|
|
@@ -1040,9 +1040,7 @@ aiServiceTenantArgGroup.add_argument(
|
|
|
1040
1040
|
required=False,
|
|
1041
1041
|
help="End date for AI Service tenant",
|
|
1042
1042
|
)
|
|
1043
|
-
|
|
1044
|
-
aiServiceTenantArgGroup.add_argument("--rsl-org-id", dest="rsl_org_id", required=False, help="org id for rsl")
|
|
1045
|
-
aiServiceTenantArgGroup.add_argument("--rsl-token", dest="rsl_token", required=False, help="token for rsl")
|
|
1043
|
+
|
|
1046
1044
|
aiServiceTenantArgGroup.add_argument(
|
|
1047
1045
|
"--rsl-ca-crt",
|
|
1048
1046
|
dest="rsl_ca_crt",
|
|
@@ -1573,5 +1571,14 @@ otherArgGroup.add_argument(
|
|
|
1573
1571
|
required=False,
|
|
1574
1572
|
help="Custom service account for install pipeline (disables default 'pipeline' service account creation)",
|
|
1575
1573
|
)
|
|
1574
|
+
otherArgGroup.add_argument(
|
|
1575
|
+
"--use-cli-digest",
|
|
1576
|
+
dest="use_cli_digest",
|
|
1577
|
+
required=False,
|
|
1578
|
+
nargs="?",
|
|
1579
|
+
const=True,
|
|
1580
|
+
default=False,
|
|
1581
|
+
help="Use CLI image digest instead of tag in Tekton pipelines. Optionally provide a specific digest (e.g., sha256:abc123...), or omit the value to auto-lookup the digest.",
|
|
1582
|
+
)
|
|
1576
1583
|
|
|
1577
1584
|
otherArgGroup.add_argument("-h", "--help", action="help", default=False, help="Show this help message and exit")
|