Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
55e3ad4
[minor] add cli support for mas without cluster role
Apr 3, 2026
9ed0461
[patch] add ansible and python devops tar
Apr 3, 2026
76b9ab4
fix the pre-commit
Apr 3, 2026
33a0f46
fix the test cases
Apr 3, 2026
5e8cf94
add new role suite_rbac for pre-install
Apr 6, 2026
1508a07
fix the tekton task build error
Apr 6, 2026
cfa1d15
fix the tekton validation
Apr 6, 2026
88851d9
update ansible-devops
Apr 6, 2026
d87c58b
fix the suite-rbac issue
Apr 6, 2026
f5bf3c0
update the preinstall script
Apr 6, 2026
df29cfe
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 7, 2026
bdb911c
removed the unused var from the suite-rbac task:
Apr 7, 2026
8d43f2e
skip the permission mode configuration for old mas version
Apr 7, 2026
e813f96
fix the unittest
Apr 7, 2026
085f588
restrict the permission mode for older mas version
Apr 8, 2026
f2745dd
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 8, 2026
5052da7
fix the permissionMode issue for older mas version less than 9.2
Apr 8, 2026
60c0d44
update the ansible-devops
Apr 8, 2026
5256a74
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 13, 2026
4a7f6f9
move the permission mode in the advance option
Apr 15, 2026
e7b4a2b
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 15, 2026
b3751a3
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 15, 2026
2f93d94
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 16, 2026
cdc234a
use the latest changes for ansible-devops for the cross namespace sco…
Apr 16, 2026
021a193
update the ansible-devops
Apr 16, 2026
8fb6305
update ansible-devops
Apr 17, 2026
4de36a4
update the pre install based on latest file structure in pre-install
Apr 17, 2026
8a3369d
update ansible-devops with new structure
Apr 20, 2026
fcea2fe
update ansible devops
Apr 23, 2026
c0b29fe
add the mas selected params
Apr 24, 2026
425c8f4
add summary for the selected add
Apr 24, 2026
292db5f
[patch] fix the failure task error
Apr 24, 2026
5a68cb2
[patch] add python devops
Apr 25, 2026
9c61d6c
update ansible-devops
Apr 25, 2026
8b37463
update ansible-devops
Apr 25, 2026
31780e2
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 27, 2026
ec9b863
[patch] fix the pre-commit failure
Apr 27, 2026
a5c81b1
update the ansible-devops and python-devops
Apr 27, 2026
c4fd69c
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 28, 2026
a14ab7e
[patch] update the permissionModes name
Apr 29, 2026
493d7b4
[patch] update ansible-devops
Apr 29, 2026
8386f30
[patch] update the ansible-devops
Apr 29, 2026
7d9451c
update ansible-devops
Apr 30, 2026
9ee865a
Update comment numbering in test_no_catalog.py
dixitgsathwara Apr 30, 2026
c4f8927
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 30, 2026
d9ec0ba
add permission mode limitation
Apr 30, 2026
f5dee01
update the errors message
Apr 30, 2026
4132b32
Merge branch 'master' into ds.rbac
dixitgsathwara Apr 30, 2026
18761a7
[patch] improve the error messages
Apr 30, 2026
c6cb4c5
changes the order
Apr 30, 2026
f8ba216
improve the user message
Apr 30, 2026
978f08f
Merge branch 'master' into ds.rbac
IanBoden May 1, 2026
465f487
[patch] update the python-devops and anisble-devops
May 1, 2026
0a15809
remove the suite-rbac task and add new cli command setup-preinstall-rbac
May 2, 2026
9bd2d27
fix the test cases
May 2, 2026
7f31d6a
update the python devops and preinstall cli command
May 2, 2026
e6bbfa0
update the comments message
May 2, 2026
7a57b24
update the user prompt
May 2, 2026
2b5317f
update the condition for the issuer/clusterissuer
May 3, 2026
5c81d4f
renaming setup-preinstall-rbac commas
May 3, 2026
9817a7e
fix the test cases
May 3, 2026
01afad6
handle some of the edge cases
May 3, 2026
c17342c
add permission mode in ai service installation
May 3, 2026
fdc36ab
add the skip preinstall rbac
May 3, 2026
d887042
fix the skip-preinstall-rbac flag failure
May 4, 2026
68323ec
improve prmopt
May 4, 2026
713a7eb
add app verification in pre-install
May 4, 2026
a80c81b
improve prompts
May 4, 2026
9161f71
fix the summary
May 4, 2026
692a5cd
rename preinstall file
May 4, 2026
06c942b
[patch] remove the redhat-operator catalog
May 4, 2026
3a72be2
Merge branch 'master' into ds.rbac
dixitgsathwara May 4, 2026
41d86e6
remove unsued function
May 4, 2026
68047d1
update the python-devops
May 4, 2026
8f3124b
remove the permission mode from the installation pipeline
May 5, 2026
ceed0a9
[patch] update the vars name and remove the permissionMode from the spec
May 5, 2026
35f8ecd
update the test cases
May 5, 2026
db7a58c
Merge master
May 5, 2026
63ce516
[patch] use the latest python devops and ansible-devops
May 5, 2026
35588c6
Delete image/cli/install/ibm-mas_devops.tar.gz
durera May 5, 2026
b0f8f35
Delete image/cli/install/mas_devops.tar.gz
durera May 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions image/cli/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ ENV ANSIBLE_COLLECTIONS_PATH=/opt/app-root/lib64/python3.12/site-packages/ansibl

# 3. Install Python packages
# 4. Install Ansible collections
# 5. Disable ibmcloud cli's new version check
# 6. Set file permissions to be developer (hack) friendly
# 5. Install Pre-Install RBAC files
# 6. Disable ibmcloud cli's new version check
# 7. Set file permissions to be developer (hack) friendly
COPY install /tmp/install
RUN --mount=type=secret,id=ARTIFACTORY_TOKEN \
--mount=type=secret,id=ARTIFACTORY_GENERIC_RELEASE_URL \
Expand All @@ -37,6 +38,7 @@ RUN --mount=type=secret,id=ARTIFACTORY_TOKEN \
ls /tmp/install && \
bash /tmp/install/install-python-packages.sh && \
bash /tmp/install/install-ansible-collections.sh && \
bash /tmp/install/pre-install-rbac.sh && \
bash /tmp/install/permissions-updates.sh && \
ibmcloud config --check-version=false && \
ln -s /opt/app-root/lib/python3.12/site-packages /mascli/site-packages && \
Expand Down
1 change: 1 addition & 0 deletions image/cli/app-root/src/.bashrc
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ if [ $arch != "s390x" ] && [ $arch != "ppc64le" ]; then
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas provision-rosa${TEXT_RESET} to provision an OCP cluster on AWS Red Hat OpenShift Service (ROSA)"
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas provision-fyre${TEXT_RESET} to provision an OCP cluster on IBM DevIT Fyre (internal)"
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas setup-rbac${TEXT_RESET} to setup RBAC resources for MAS installation in a cluster"
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas pre-install${TEXT_RESET} to set up pre-install RBAC for MAS installation in a cluster"
echo "AI Service (Standalone) Management:"
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas aiservice-install${TEXT_RESET} to install a new AI Service instance"
echo " - ${TEXT_BOLD}${COLOR_GREEN}mas aiservice-upgrade${TEXT_RESET} to upgrade a existing AI Service instance"
Expand Down
110 changes: 110 additions & 0 deletions image/cli/install/pre-install-rbac.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/bin/bash

set -e

# This script clones the pre-install repository and copies operator RBAC files
# into the CLI image during build time in a single RBAC root.
#
# Structures in pre-install:
# catalogs/maximo-operator-catalog/operators/<operator>/rbac/<mas_version>/*.yml
# openshift-platform/operators/<operator>/rbac/<mas_version>/*.yml
#
# Structure in CLI image:
# /opt/app-root/rbac/maximo-operator-catalog/operators/<operator>/rbac/<mas_version>/*.yml
# /opt/app-root/rbac/openshift-platform/operators/<operator>/rbac/<mas_version>/*.yml
export GITHUB_REF_NAME="${GITHUB_REF_NAME:-ds.rbac}"
export GITHUB_REF_TYPE="${GITHUB_REF_TYPE:-branch}"
echo "========================================"
echo "Installing Operator RBAC Files"
echo "========================================"
echo "GitHub reference = ${GITHUB_REF_TYPE}/${GITHUB_REF_NAME}"
echo "Contents of /tmp/install/:"
ls -l /tmp/install/
echo ""

# Destination root directory in CLI image
RBAC_DEST="/opt/app-root/rbac"

# Create destination directory
mkdir -p "$RBAC_DEST"

# If the local tar.gz file is present, extract and use it
# Otherwise, clone from GitHub
if [[ -e /tmp/install/pre-install.tar.gz ]]; then
echo "Installing local build of pre-install from archive"
cd /tmp/install
tar -xzf pre-install.tar.gz
PREINSTALL_SOURCE="/tmp/install/pre-install"
else
# Clone pre-install repository
echo "Cloning pre-install repository from GitHub..."

# Determine which branch/tag to use
if [[ "$GITHUB_REF_TYPE" == "branch" ]]; then
PREINSTALL_BRANCH="${GITHUB_REF_NAME}"
echo "Attempting to clone matching branch: ${PREINSTALL_BRANCH}"
else
# For tag builds, use main branch
PREINSTALL_BRANCH="main"
echo "Using main branch for tag build"
fi

# Clone the repository
cd /tmp/install
if git clone --depth 1 --branch "${PREINSTALL_BRANCH}" https://github.com/ibm-mas/pre-install.git 2>/dev/null; then
echo "Successfully cloned pre-install repository (branch: ${PREINSTALL_BRANCH})"
else
echo "Branch ${PREINSTALL_BRANCH} not found, falling back to main branch"
git clone --depth 1 --branch main https://github.com/ibm-mas/pre-install.git
fi

PREINSTALL_SOURCE="/tmp/install/pre-install"
fi

MAXIMO_OPERATORS_SOURCE="$PREINSTALL_SOURCE/catalogs/maximo-operator-catalog/operators"
OPENSHIFT_PLATFORM_OPERATORS_SOURCE="$PREINSTALL_SOURCE/openshift-platform/operators"

echo "Copying RBAC files into $RBAC_DEST"

VERSIONS_COPIED=()
COPIED_SOURCE_ROOTS=()

copy_operator_rbac() {
local SOURCE_ROOT="$1"
local DEST_ROOT="$2"

if [ ! -d "$SOURCE_ROOT" ]; then
echo "Skipping missing source: $SOURCE_ROOT"
return
fi

COPIED_SOURCE_ROOTS+=("$SOURCE_ROOT")

for OPERATOR_DIR in "$SOURCE_ROOT"/*/; do
if [ -d "$OPERATOR_DIR" ] && [ -d "$OPERATOR_DIR/rbac" ]; then
OPERATOR_NAME=$(basename "$OPERATOR_DIR")
DEST_PATH="$DEST_ROOT/$OPERATOR_NAME/rbac"
mkdir -p "$DEST_PATH"

if compgen -G "$OPERATOR_DIR/rbac/*" > /dev/null; then
cp -r "$OPERATOR_DIR/rbac"/* "$DEST_PATH/"
fi

for VERSION_DIR in "$OPERATOR_DIR/rbac"/*/; do
if [ -d "$VERSION_DIR" ]; then
VERSION_NAME=$(basename "$VERSION_DIR")
if [[ "$VERSION_NAME" =~ ^[0-9]+\.[0-9]+$ ]]; then
VERSIONS_COPIED+=("$VERSION_NAME")
fi
fi
done
fi
done
}

copy_operator_rbac "$MAXIMO_OPERATORS_SOURCE" "$RBAC_DEST/maximo-operator-catalog/operators"
copy_operator_rbac "$OPENSHIFT_PLATFORM_OPERATORS_SOURCE" "$RBAC_DEST/openshift-platform/operators"

VERSIONS_COPIED=($(printf "%s\n" "${VERSIONS_COPIED[@]}" | sort -u))
echo "RBAC files copied successfully from: ${COPIED_SOURCE_ROOTS[*]}"
echo "RBAC files copied successfully for versions: ${VERSIONS_COPIED[*]}"
2 changes: 2 additions & 0 deletions image/cli/mascli/functions/internal/save_config
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ export MAS_DOMAIN=$MAS_DOMAIN
export CLUSTER_ISSUER_SELECTION=$CLUSTER_ISSUER_SELECTION
export MAS_CLUSTER_ISSUER=$MAS_CLUSTER_ISSUER

export MAS_PERMISSION_MODE=$MAS_PERMISSION_MODE

export MAS_ROUTING_MODE=$MAS_ROUTING_MODE
export MAS_INGRESS_CONTROLLER_NAME=$MAS_INGRESS_CONTROLLER_NAME
export MAS_CONFIGURE_INGRESS=$MAS_CONFIGURE_INGRESS
Expand Down
9 changes: 9 additions & 0 deletions image/cli/mascli/mas
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,15 @@ case $1 in
mas-cli setup-rbac "$@"
;;

pre-install)
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOGFILE
echo "!! pre-install !!" >> $LOGFILE
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> $LOGFILE
# Take the first parameter off (it will be "pre-install")
shift
# Run the new Python-based pre-install command
mas-cli pre-install "$@"
;;

gitops)
echo "${TEXT_UNDERLINE}IBM Maximo Application Suite GitOps Functions (v${VERSION})${TEXT_RESET}"
Expand Down
5 changes: 5 additions & 0 deletions python/src/mas-cli
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ from mas.cli.backup.app import BackupApp
from mas.cli.restore.app import RestoreApp
from mas.cli.mirror.app import MirrorApp
from mas.cli.setup_rbac.app import SetupRBACApp
from mas.cli.pre_install.app import SetupPreinstallRBACApp

from prompt_toolkit import HTML, print_formatted_text
from urllib3.exceptions import MaxRetryError
Expand Down Expand Up @@ -50,6 +51,7 @@ def usage():
+ " - <ForestGreen>mas-cli uninstall</ForestGreen> Remove MAS from the cluster\n" # noqa: W503
+ " - <ForestGreen>mas-cli mirror</ForestGreen> Mirror container images \n" # noqa: W503
+ " - <ForestGreen>mas-cli setup-rbac</ForestGreen> Set up RBAC resources for MAS installation\n" # noqa: W503
+ " - <ForestGreen>mas-cli pre-install</ForestGreen> Set up pre-install RBAC for MAS\n" # noqa: W503
))
print_formatted_text(HTML("For usage information run <ForestGreen>mas-cli [action] --help</ForestGreen>\n"))

Expand Down Expand Up @@ -89,6 +91,9 @@ if __name__ == '__main__':
elif function == "setup-rbac":
app = SetupRBACApp()
app.setupRBAC(argv[2:])
elif function == "pre-install":
app = SetupPreinstallRBACApp()
app.setupPreinstallRBAC(argv[2:])
elif function in ["-h", "--help"]:
usage()
exit(0)
Expand Down
96 changes: 95 additions & 1 deletion python/src/mas/cli/aiservice/install/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
testCLI,
launchInstallPipeline
)
from mas.devops.pre_install import applyPreInstallMASRBAC, permissionCheckForRBAC
from mas.devops.utils import isVersionEqualOrAfter

logger = logging.getLogger(__name__)

Expand All @@ -74,6 +76,72 @@ def wrapper(self, *args, **kwargs):


class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceInstallSummarizerMixin, InstallSettingsMixin, ConfigGeneratorMixin):

def evaluatePreInstallRBACAccess(self) -> None:
self.applyPreInstallMASRBAC = False

if not isVersionEqualOrAfter('9.2.0', self.getParam("aiservice_channel")):
return

if self.getParam("skip_preinstall_rbac") == "true":
return

permissionResults = permissionCheckForRBAC(self.dynamicClient)
hasPreInstallRBACAccess = all(result["allowed"] for result in permissionResults)

if hasPreInstallRBACAccess:
self.applyPreInstallMASRBAC = True
return

if self.isInteractiveMode:
self.printDescription([
"",
f"You selected the '{self.getParam('permission_mode')}' permission mode.",
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
"This step must be completed by an OpenShift cluster administrator before AI Service installation can continue.",
"Ask your OpenShift administrator to run 'mas pre-install' for this AI Service instance.",
"If that has already been done, you can continue the installation without applying it again."
])

if not self.yesOrNo("Has your OpenShift administrator already run 'mas pre-install' for this AI Service installation"):
self.fatalError("Installation aborted. Ask your OpenShift administrator to run 'mas pre-install' for this AI Service installation and then run 'mas aiservice-install' again with --skip-preinstall-rbac.")
else:
self.fatalError(
"\n".join([
f"You selected the '{self.getParam('permission_mode')}' permission mode.",
"The pre-install RBAC required for this permission mode has not been applied by your current cluster login.",
"This step must be completed by an OpenShift cluster administrator before AI Service installation can continue.",
"Ask your OpenShift administrator to run 'mas pre-install' for this installation and then rerun 'mas aiservice-install' with --skip-preinstall-rbac."
])
)

def configPermissionMode(self) -> None:
if self.showAdvancedOptions:
self.printH1("Configure Permission Mode")
self.printDescription([
"Choose how AI Service should be installed with respect to permissions:",
"",
" 1. <b>cluster</b> - Install with ClusterRoles (default)",
" - AI Service has cluster-level access to manage its resources across the cluster",
" - CLI pre-installs ClusterRoles to grant delegated admin permissions to AI Service service accounts",
"",
" 2. <b>namespaced</b> - Install with namespace-scoped Roles only",
" - No ClusterRoles are installed in this mode",
" - CLI pre-installs namespace-scoped Roles in prepared namespaces to grant delegated admin permissions",
" - AI Service can manage resources only in namespaces prepared by the OpenShift admin",
"",
" 3. <b>minimal</b> - Install with essential namespace-scoped Roles only",
" - No ClusterRoles are installed in this mode",
" - Only essential permissions required for AI Service are applied",
" - AI Service can manage only the resources covered by these essential permissions"
])

permissionModeInt = self.promptForInt("Permission Mode", default=1, min=1, max=3)
permissionModeMap = {1: "cluster", 2: "namespaced", 3: "minimal"}
self.setParam("permission_mode", permissionModeMap[permissionModeInt])
elif self.getParam("permission_mode") == "":
self.setParam("permission_mode", "cluster")

@logMethodCall
def processCatalogChoice(self) -> list:
self.catalogDigest = self.chosenCatalog["catalog_digest"]
Expand Down Expand Up @@ -175,6 +243,9 @@ def interactiveMode(self, simplified: bool, advanced: bool) -> None:
self.configMongoDb()
self.setDB2DefaultChannel()
self.setDB2DefaultSettings()
# Permission mode prompt (especially in dev mode)
if isVersionEqualOrAfter('9.2.0', self.getParam("aiservice_channel")):
self.configPermissionMode()

@logMethodCall
def nonInteractiveMode(self) -> None:
Expand Down Expand Up @@ -334,7 +405,7 @@ def nonInteractiveMode(self) -> None:
self.fatalError(f"Unsupported format for {key} ({value}). Expected int:int:boolean")

# Arguments that we don't need to do anything with
elif key in ["accept_license", "dev_mode", "skip_pre_check", "skip_grafana_install", "no_confirm", "help", "advanced", "simplified"]:
elif key in ["accept_license", "dev_mode", "skip_pre_check", "skip_preinstall_rbac", "skip_grafana_install", "no_confirm", "help", "advanced", "simplified"]:
pass

elif key == "manual_certificates":
Expand Down Expand Up @@ -370,6 +441,13 @@ def nonInteractiveMode(self) -> None:
self.validateCatalogSource()
self.licensePrompt()

if self.getParam("permission_mode") != "" and not isVersionEqualOrAfter('9.2.0', self.getParam("aiservice_channel")):
self.fatalError("--permission-mode is supported only for AI Service releases aligned to MAS 9.2.0 and later")

# Set default permission_mode for 9.2.0+ if not provided
if isVersionEqualOrAfter('9.2.0', self.getParam("aiservice_channel")) and self.getParam("permission_mode") == "":
self.setParam("permission_mode", "cluster")

@logMethodCall
def install(self, argv):
"""
Expand Down Expand Up @@ -409,6 +487,9 @@ def install(self, argv):
if args.skip_pre_check:
self.setParam("skip_pre_check", "true")

if hasattr(args, 'skip_preinstall_rbac') and args.skip_preinstall_rbac:
self.setParam("skip_preinstall_rbac", "true")

if instanceId is None:
self.printH1("Set Target OpenShift Cluster")
# Connect to the target cluster
Expand Down Expand Up @@ -450,6 +531,8 @@ def install(self, argv):
else:
self.nonInteractiveMode()

self.evaluatePreInstallRBACAccess()

# Set up the sls license file
self.slsLicenseFile()

Expand Down Expand Up @@ -511,6 +594,17 @@ def install(self, argv):

h.stop_and_persist(symbol=self.successIcon, text=f"Namespace is ready ({pipelinesNamespace})")

if self.applyPreInstallMASRBAC:
with Halo(text=f"Setting up pre-install RBAC for AI Service instance {self.getParam('aiservice_instance_id')}...", spinner=self.spinner) as h:
applyPreInstallMASRBAC(
dynClient=self.dynamicClient,
masVersion=".".join(self.getParam("aiservice_channel").split(".")[:2]),
masInstanceId=self.getParam("aiservice_instance_id"),
permissionMode=self.getParam("permission_mode"),
selectedApps=["aiservice"]
)
h.stop_and_persist(symbol=self.successIcon, text=f"Pre-install RBAC for AI Service is ready for {self.getParam('aiservice_instance_id')}")

with Halo(text='Testing availability of MAS CLI image in cluster', spinner=self.spinner) as h:
testCLI()
h.stop_and_persist(symbol=self.successIcon, text="MAS CLI image deployment test completed")
Expand Down
4 changes: 4 additions & 0 deletions python/src/mas/cli/aiservice/install/argBuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ def buildCommand(self) -> str:
command += f" --dev-mode{newline}"
if self.getParam('skip_pre_check') is True:
command += f" --skip-pre-check{newline}"
if self.getParam('permission_mode') != "":
command += f" --permission-mode \"{self.getParam('permission_mode')}\"{newline}"
if self.getParam('skip_preinstall_rbac') != "":
command += f" --skip-preinstall-rbac{newline}"
if self.getParam('image_pull_policy') != "":
command += f" --image-pull-policy {self.getParam('image_pull_policy')}{newline}"
if self.getParam('service_account_name') != "":
Expand Down
14 changes: 14 additions & 0 deletions python/src/mas/cli/aiservice/install/argParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,20 @@ def isValidFile(parser, arg) -> str:
required=False,
help="Provide the name of the Issuer to configure AI Service to issue certificates",
)
aiserviceAdvancedArgGroup.add_argument(
"--permission-mode",
dest="permission_mode",
required=False,
choices=["cluster", "namespaced", "minimal"],
help="The permission mode used to determine which pre-install RBAC manifests are applied for AI Service (MAS 9.2+ advanced option)"
)
aiserviceAdvancedArgGroup.add_argument(
"--skip-preinstall-rbac",
dest="skip_preinstall_rbac",
required=False,
action="store_true",
help="Skip pre-install RBAC setup (non-interactive mode only)"
)
aiserviceAdvancedArgGroup.add_argument(
"--enable-ipv6",
dest="enable_ipv6",
Expand Down
3 changes: 3 additions & 0 deletions python/src/mas/cli/aiservice/install/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
# Certificate Issuer
"aiservice_certificate_issuer",

# permission mode
"permission_mode",

# Enable IPv6 networking
"enable_ipv6",

Expand Down
3 changes: 3 additions & 0 deletions python/src/mas/cli/aiservice/install/summarizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ def aiServiceSummary(self) -> None:
self.printParamSummary("Release", "aiservice_channel")
self.printParamSummary("Instance ID", "aiservice_instance_id")
self.printParamSummary("Environment Type", "environment_type")
if self.getParam("permission_mode") not in [None, ""]:
self.printParamSummary("Permission Mode", "permission_mode")
self.printSummary("Skip Pre-Install RBAC", "Yes" if self.getParam('skip_preinstall_rbac') == "true" else "No")

if "aiservice_certificate_issuer" in self.params:
self.printParamSummary("Certificate Issuer", "aiservice_certificate_issuer")
Expand Down
Loading
Loading