mas-cli 14.1.0__py3-none-any.whl → 15.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mas-cli might be problematic. Click here for more details.

mas/cli/__init__.py CHANGED
@@ -8,4 +8,4 @@
8
8
  #
9
9
  # *****************************************************************************
10
10
 
11
- __version__ = "14.1.0" # Python module compatible semver
11
+ __version__ = "15.0.0" # Python module compatible semver
@@ -32,9 +32,9 @@ from .params import requiredParams, optionalParams
32
32
 
33
33
  from ...install.catalogs import supportedCatalogs
34
34
 
35
- # AiService relies on SLS, which in turn depends on MongoDB.
35
+ # AI Service relies on SLS, which in turn depends on MongoDB.
36
36
  # SLS will utilize the shared MongoDB resource that would be used by MAS if it were deployed within the same OpenShift cluster.
37
- # AiService utilizes two distinct databases: DB2 is employed by the AiBroker component, while MariaDB supports OpenDataHub (ODH).
37
+ # AI Service utilizes two distinct databases: DB2 is employed by the AiBroker component.
38
38
  # By default, AiService will deploy DB2 within the same namespace as MAS (db2u), but it will be configured as a separate DB2 instance.
39
39
 
40
40
  from ...install.settings.mongodbSettings import MongoDbSettingsMixin
@@ -56,10 +56,10 @@ from mas.devops.data import getCatalog
56
56
  from mas.devops.tekton import (
57
57
  installOpenShiftPipelines,
58
58
  updateTektonDefinitions,
59
- preparePipelinesNamespace,
59
+ prepareAiServicePipelinesNamespace,
60
60
  prepareInstallSecrets,
61
61
  testCLI,
62
- launchInstallPipelineForAiservice
62
+ launchAiServiceInstallPipeline
63
63
  )
64
64
 
65
65
  logger = logging.getLogger(__name__)
@@ -80,7 +80,7 @@ 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": "mas_aibroker_version",
83
+ "Aibroker": "aiservice_version",
84
84
  }
85
85
 
86
86
  self.catalogReleases = {}
@@ -96,9 +96,6 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
96
96
  for application, key in applications.items():
97
97
  # Add 9.1-feature channel based off 9.0 to those apps that have not onboarded yet
98
98
  tempChosenCatalog = self.chosenCatalog[key].copy()
99
- if '9.1.x-feature' not in tempChosenCatalog:
100
- tempChosenCatalog.update({"9.1.x-feature": tempChosenCatalog["9.0.x"]})
101
-
102
99
  self.catalogTable.append({"": application} | {key.replace(".x", ""): value for key, value in sorted(tempChosenCatalog.items(), reverse=True)})
103
100
 
104
101
  if self.architecture == "s390x":
@@ -132,10 +129,10 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
132
129
  " - Must start with a lowercase letter",
133
130
  " - Must end with a lowercase letter or a number"
134
131
  ])
135
- self.promptForString("Instance ID", "aibroker_instance_id", validator=InstanceIDFormatValidator())
132
+ self.promptForString("Instance ID", "aiservice_instance_id", validator=InstanceIDFormatValidator())
136
133
 
137
134
  if self.slsMode == 2 and not self.getParam("sls_namespace"):
138
- self.setParam("sls_namespace", f"mas-{self.getParam('aibroker_instance_id')}-sls")
135
+ self.setParam("sls_namespace", f"mas-{self.getParam('aiservice_instance_id')}-sls")
139
136
 
140
137
  self.configOperationMode()
141
138
 
@@ -145,18 +142,6 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
145
142
  self.interactiveMode = True
146
143
 
147
144
  self.storageClassProvider = "custom"
148
- self.installAssist = False
149
- self.installIoT = False
150
- self.installMonitor = False
151
- self.installManage = False
152
- self.installPredict = False
153
- self.installInspection = False
154
- self.installOptimizer = False
155
- self.installFacilities = False
156
- self.installAiBroker = True
157
- self.deployCP4D = False
158
- self.db2SetAffinity = False
159
- self.db2SetTolerations = False
160
145
  self.slsLicenseFileLocal = None
161
146
 
162
147
  if simplified:
@@ -185,7 +170,9 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
185
170
  if self.devMode:
186
171
  self.configAppChannel("aibroker")
187
172
 
188
- self.aibrokerSettings()
173
+ self.aiServiceSettings()
174
+ self.aiServiceTenantSettings()
175
+ self.aiServiceIntegrations()
189
176
 
190
177
  # Dependencies
191
178
  self.configMongoDb()
@@ -201,18 +188,6 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
201
188
  self.setParam("mongodb_action", "install")
202
189
 
203
190
  self.storageClassProvider = "custom"
204
- self.installAssist = False
205
- self.installIoT = False
206
- self.installMonitor = False
207
- self.installManage = False
208
- self.installPredict = False
209
- self.installInspection = False
210
- self.installFacilities = False
211
- self.installOptimizer = False
212
- self.installAiBroker = True
213
- self.deployCP4D = False
214
- self.db2SetAffinity = False
215
- self.db2SetTolerations = False
216
191
  self.slsLicenseFileLocal = None
217
192
 
218
193
  self.approvals = {
@@ -233,6 +208,54 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
233
208
  if value is not None:
234
209
  self.setParam(key, value)
235
210
 
211
+ elif key == "install_minio_aiservice":
212
+ incompatibleWithMinioInstall = [
213
+ "aiservice_storage_provider",
214
+ "aiservice_storage_accesskey",
215
+ "aiservice_storage_secretkey",
216
+ "aiservice_storage_host",
217
+ "aiservice_storage_port",
218
+ "aiservice_storage_ssl",
219
+ "aiservice_s3_endpoint_url",
220
+ "aiservice_storage_region",
221
+ "aiservice_tenant_s3_access_key",
222
+ "aiservice_tenant_s3_secret_key",
223
+ "aiservice_tenant_s3_endpoint_url",
224
+ "aiservice_tenant_s3_region"
225
+ ]
226
+ if value is None:
227
+ for uKey in incompatibleWithMinioInstall:
228
+ if vars(self.args)[uKey] is None:
229
+ self.fatalError(f"Parameter is required when --install-minio is not set: {uKey}")
230
+ elif value is not None and value == "true":
231
+ # If user is installing Minio in-cluster then we know how to connect to it already
232
+ for uKey in incompatibleWithMinioInstall:
233
+ if vars(self.args)[uKey] is not None:
234
+ self.fatalError(f"Unsupported parameter for --install-minio: {uKey}")
235
+ for rKey in ["minio_root_user", "minio_root_password"]:
236
+ if vars(self.args)[rKey] is None:
237
+ self.fatalError(f"Missing required parameter for --install-minio: {rKey}")
238
+
239
+ self.setParam("aiservice_storage_provider", "minio")
240
+
241
+ self.setParam("aiservice_storage_accesskey", self.args.minio_root_user)
242
+ self.setParam("aiservice_storage_secretkey", self.args.minio_root_password)
243
+
244
+ # TODO: Duplication -- we already have the URL, why do we need all the individual parts,
245
+ # especially when we don't need them for the tenant?
246
+ self.setParam("aiservice_storage_host", "minio-service.minio.svc.cluster.local")
247
+ self.setParam("aiservice_storage_port", "9000")
248
+ self.setParam("aiservice_storage_ssl", "false")
249
+ self.setParam("aiservice_s3_endpoint_url", "http://minio-service.minio.svc.cluster.local:9000")
250
+ self.setParam("aiservice_storage_region", "none")
251
+
252
+ self.setParam("aiservice_tenant_s3_access_key", self.args.minio_root_user)
253
+ self.setParam("aiservice_tenant_s3_secret_key", self.args.minio_root_password)
254
+ self.setParam("aiservice_tenant_s3_endpoint_url", "http://minio-service.minio.svc.cluster.local:9000")
255
+ self.setParam("aiservice_tenant_s3_region", "none")
256
+ else:
257
+ self.fatalError(f"Unsupported value for --install-minio: {value}")
258
+
236
259
  elif key == "non_prod":
237
260
  if not value:
238
261
  self.operationalMode = 1
@@ -258,18 +281,10 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
258
281
 
259
282
  # We check for both None and "" values for the application channel parameters
260
283
  # value = None means the parameter wasn't set at all
261
- # value = "" means the paramerter was explicitly set to "don't install this application"
262
- elif key == "aibroker_channel":
284
+ # value = "" means the parameter was explicitly set to "don't install this application"
285
+ elif key == "aiservice_channel":
263
286
  if value is not None and value != "":
264
- self.setParam("mas_app_channel_aibroker", value)
265
- self.installAiBroker = True
266
-
267
- # Manage advanced settings that need extra processing
268
- elif key == "mas_app_settings_server_bundle_size":
269
- if value is not None:
270
- self.setParam(key, value)
271
- if value in ["jms", "snojms"]:
272
- self.setParam("mas_app_settings_persistent_volumes_flag", "true")
287
+ self.setParam("aiservice_channel", value)
273
288
 
274
289
  # MongoDB
275
290
  elif key == "mongodb_namespace":
@@ -284,7 +299,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
284
299
  self.setParam("sls_action", "install")
285
300
  elif key == "dedicated_sls":
286
301
  if value:
287
- self.setParam("sls_namespace", f"mas-{self.args.aibroker_instance_id}-sls")
302
+ self.setParam("sls_namespace", f"mas-{self.args.aiservice_instance_id}-sls")
288
303
 
289
304
  # These settings are used by the CLI rather than passed to the PipelineRun
290
305
  elif key == "storage_accessmode":
@@ -337,8 +352,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
337
352
 
338
353
  # License file is only optional for existing SLS instance
339
354
  if self.slsLicenseFileLocal is None:
340
- if self.getParam("install_sls_aiservice") != "false":
341
- self.fatalError("--license-file must be set for new SLS install")
355
+ self.fatalError("--license-file must be set for new SLS install")
342
356
 
343
357
  # Once we've processed the inputs, we should validate the catalog source & prompt to accept the license terms
344
358
  if not self.devMode:
@@ -354,7 +368,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
354
368
 
355
369
  # We use the presence of --mas-instance-id to determine whether
356
370
  # the CLI is being started in interactive mode or not
357
- instanceId = args.aibroker_instance_id
371
+ instanceId = args.aiservice_instance_id
358
372
 
359
373
  # Properties for arguments that control the behavior of the CLI
360
374
  self.noConfirm = args.no_confirm
@@ -401,6 +415,9 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
401
415
  # UDS install has not been supported since the January 2024 catalog update
402
416
  self.setParam("uds_action", "install-dro")
403
417
 
418
+ # Install Db2 for AI Service
419
+ self.setParam("db2_action_aiservice", "install")
420
+
404
421
  # User must either provide the configuration via numerous command line arguments, or the interactive prompts
405
422
  if instanceId is None:
406
423
  self.interactiveMode(simplified=args.simplified, advanced=args.advanced)
@@ -432,7 +449,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
432
449
  self.createTektonFileWithDigest()
433
450
 
434
451
  self.printH1("Launch Install")
435
- pipelinesNamespace = f"mas-{self.getParam('aibroker_instance_id')}-pipelines"
452
+ pipelinesNamespace = f"aiservice-{self.getParam('aiservice_instance_id')}-pipelines"
436
453
 
437
454
  if not self.noConfirm:
438
455
  self.printDescription(["If you are using storage classes that utilize 'WaitForFirstConsumer' binding mode choose 'No' at the prompt below"])
@@ -446,9 +463,9 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
446
463
 
447
464
  with Halo(text=f'Preparing namespace ({pipelinesNamespace})', spinner=self.spinner) as h:
448
465
  createNamespace(self.dynamicClient, pipelinesNamespace)
449
- preparePipelinesNamespace(
466
+ prepareAiServicePipelinesNamespace(
450
467
  dynClient=self.dynamicClient,
451
- instanceId=self.getParam("aibroker_instance_id"),
468
+ instanceId=self.getParam("aiservice_instance_id"),
452
469
  storageClass=self.pipelineStorageClass,
453
470
  accessMode=self.pipelineStorageAccessMode,
454
471
  waitForBind=wait,
@@ -456,7 +473,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
456
473
  )
457
474
  prepareInstallSecrets(
458
475
  dynClient=self.dynamicClient,
459
- instanceId=self.getParam("aibroker_instance_id"),
476
+ namespace=pipelinesNamespace,
460
477
  slsLicenseFile=self.slsLicenseFileSecret,
461
478
  additionalConfigs=self.additionalConfigsSecret,
462
479
  podTemplates=self.podTemplatesSecret,
@@ -475,13 +492,13 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
475
492
  updateTektonDefinitions(pipelinesNamespace, self.tektonDefsPath)
476
493
  h.stop_and_persist(symbol=self.successIcon, text=f"Latest Tekton definitions are installed (v{self.version})")
477
494
 
478
- with Halo(text=f"Submitting PipelineRun for {self.getParam('aibroker_instance_id')} install", spinner=self.spinner) as h:
479
- pipelineURL = launchInstallPipelineForAiservice(dynClient=self.dynamicClient, params=self.params)
495
+ with Halo(text=f"Submitting PipelineRun for {self.getParam('aiservice_instance_id')} install", spinner=self.spinner) as h:
496
+ pipelineURL = launchAiServiceInstallPipeline(dynClient=self.dynamicClient, params=self.params)
480
497
  if pipelineURL is not None:
481
- h.stop_and_persist(symbol=self.successIcon, text=f"PipelineRun for {self.getParam('aibroker_instance_id')} install submitted")
498
+ h.stop_and_persist(symbol=self.successIcon, text=f"PipelineRun for {self.getParam('aiservice_instance_id')} install submitted")
482
499
  print_formatted_text(HTML(f"\nView progress:\n <Cyan><u>{pipelineURL}</u></Cyan>\n"))
483
500
  else:
484
- h.stop_and_persist(symbol=self.failureIcon, text=f"Failed to submit PipelineRun for {self.getParam('aibroker_instance_id')} install, see log file for details")
501
+ h.stop_and_persist(symbol=self.failureIcon, text=f"Failed to submit PipelineRun for {self.getParam('aiservice_instance_id')} install, see log file for details")
485
502
  print()
486
503
 
487
504
  @logMethodCall
@@ -499,81 +516,140 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
499
516
 
500
517
  @logMethodCall
501
518
  def chooseInstallFlavour(self) -> None:
502
- # We don't have any configuration as Advanced options right now in Aibroker settings
503
- # we can remove this chooseInstallFlavour - if we want...
504
- self.printH1("Choose Install Mode")
519
+ self.showAdvancedOptions = False
520
+
521
+ def aiServiceSettings(self) -> None:
522
+ self.printH1("AI Service Settings")
523
+
524
+ # Ask about MinIO installation FIRST (moved from aiServiceDependencies)
525
+ self.printH2("Storage Configuration")
526
+ self.printDescription(["AI Service requires object storage for pipelines, tenants, and templates. You can either install MinIO in-cluster or connect to external storage."])
527
+
528
+ if self.yesOrNo("Install Minio"):
529
+ # Only ask for MinIO credentials
530
+ self.promptForString("minio root username", "minio_root_user")
531
+ self.promptForString("minio root password", "minio_root_password", isPassword=True)
532
+
533
+ # Auto-set MinIO storage defaults (same as non-interactive mode)
534
+ self._setMinioStorageDefaults()
535
+ else:
536
+ # Ask for external storage configuration
537
+ self.printDescription(["Configure your external object storage (S3-compatible) connection details:"])
538
+ self.promptForString("Storage provider", "aiservice_storage_provider")
539
+ self.promptForString("Storage access key", "aiservice_storage_accesskey")
540
+ self.promptForString("Storage secret key", "aiservice_storage_secretkey", isPassword=True)
541
+ self.promptForString("Storage host", "aiservice_storage_host")
542
+ self.promptForString("Storage port", "aiservice_storage_port")
543
+ self.promptForString("Storage ssl", "aiservice_storage_ssl")
544
+ self.promptForString("Storage region", "aiservice_storage_region")
545
+ self.promptForString("Storage pipelines bucket", "aiservice_storage_pipelines_bucket")
546
+ self.promptForString("Storage tenants bucket", "aiservice_storage_tenants_bucket")
547
+ self.promptForString("Storage templates bucket", "aiservice_storage_templates_bucket")
548
+
549
+ # S3 parameters are now auto-derived from storage configuration
550
+ self._deriveS3ParametersFromStorage()
551
+
552
+ def aiServiceTenantSettings(self) -> None:
553
+ self.printH1("AI Service Tenant Settings")
554
+ self.promptForString("Tenant entitlement type", "tenant_entitlement_type")
555
+ self.promptForString("Tenant start date", "tenant_entitlement_start_date")
556
+ self.promptForString("Tenant end date", "tenant_entitlement_end_date")
557
+
558
+ def _deriveS3ParametersFromStorage(self) -> None:
559
+ """
560
+ Auto-derive S3 and tenant S3 parameters from the aiservice_storage_* parameters.
561
+ This reuses the values provided for kmodel object storage to avoid redundant prompts.
562
+ """
563
+ storage_provider = self.getParam("aiservice_storage_provider")
564
+ storage_host = self.getParam("aiservice_storage_host")
565
+ storage_port = self.getParam("aiservice_storage_port")
566
+ storage_ssl = self.getParam("aiservice_storage_ssl")
567
+ storage_region = self.getParam("aiservice_storage_region")
568
+ storage_accesskey = self.getParam("aiservice_storage_accesskey")
569
+ storage_secretkey = self.getParam("aiservice_storage_secretkey")
570
+
571
+ # Build endpoint URL from storage configuration
572
+ protocol = "https" if storage_ssl == "true" else "http"
573
+
574
+ if storage_provider == "minio":
575
+ endpoint_url = f"{protocol}://{storage_host}:{storage_port}"
576
+ elif storage_provider == "s3":
577
+ # For AWS S3, construct proper endpoint
578
+ if storage_region and storage_region != "none":
579
+ endpoint_url = f"{protocol}://s3.{storage_region}.amazonaws.com"
580
+ else:
581
+ endpoint_url = f"{protocol}://s3.amazonaws.com"
582
+ else:
583
+ # For other providers, construct basic endpoint
584
+ endpoint_url = f"{protocol}://{storage_host}:{storage_port}" if storage_port else f"{protocol}://{storage_host}"
585
+
586
+ # Set S3 parameters (reusing storage configuration)
587
+ self.setParam("aiservice_s3_bucket_prefix", "aiservice") # Default prefix
588
+ if endpoint_url:
589
+ self.setParam("aiservice_s3_endpoint_url", endpoint_url)
590
+ self.setParam("aiservice_s3_region", storage_region if storage_region else "none")
591
+
592
+ # Set tenant S3 parameters (reusing same storage configuration)
593
+ self.setParam("aiservice_tenant_s3_bucket_prefix", "tenant") # Default tenant prefix
594
+ self.setParam("aiservice_tenant_s3_access_key", storage_accesskey)
595
+ self.setParam("aiservice_tenant_s3_secret_key", storage_secretkey)
596
+ if endpoint_url:
597
+ self.setParam("aiservice_tenant_s3_endpoint_url", endpoint_url)
598
+ self.setParam("aiservice_tenant_s3_region", storage_region if storage_region else "none")
599
+
600
+ def _setMinioStorageDefaults(self) -> None:
601
+ """
602
+ Set MinIO storage defaults when MinIO is being installed in-cluster.
603
+ This mirrors the logic from non-interactive mode.
604
+ """
605
+ self.setParam("aiservice_storage_provider", "minio")
606
+ self.setParam("aiservice_storage_accesskey", self.getParam("minio_root_user"))
607
+ self.setParam("aiservice_storage_secretkey", self.getParam("minio_root_password"))
608
+ self.setParam("aiservice_storage_host", "minio-service.minio.svc.cluster.local")
609
+ self.setParam("aiservice_storage_port", "9000")
610
+ self.setParam("aiservice_storage_ssl", "false")
611
+ self.setParam("aiservice_storage_region", "none")
612
+
613
+ # Set default bucket names
614
+ self.setParam("aiservice_storage_pipelines_bucket", "km-pipelines")
615
+ self.setParam("aiservice_storage_tenants_bucket", "km-tenants")
616
+ self.setParam("aiservice_storage_templates_bucket", "km-templates")
617
+
618
+ def aiServiceIntegrations(self) -> None:
619
+ self.printH1("WatsonX Integration")
620
+ self.printDescription([
621
+ "This CLI section configures the integration between the AI Service and IBM watsonx.ai. AI Service",
622
+ "uses watsonx for model deployment and inferencing.",
623
+ "",
624
+ "The WatsonX API key must be a **platform API key** associated with a user that has at least:",
625
+ "- **Editor permission** for the project",
626
+ "- **Viewer permission** for the space",
627
+ "You can generate this key by following IBM's documentation: https://www.ibm.com/docs/en/watsonx/w-and-w/2.2.0?topic=tutorials-generating-api-keys#api-keys__platform__title__1",
628
+ "",
629
+ "The endpoint URL is your WatsonX Machine Learning service URL. It can be found in the watsonx.ai",
630
+ "documentation: https://cloud.ibm.com/apidocs/watsonx-ai-cp/watsonx-ai-cp-2.2.0#endpoint-url",
631
+ "",
632
+ "The project ID refers to your specific watsonx.ai project where your ML models and assets are stored.",
633
+ "",
634
+ ])
635
+ self.promptForString("Watsonxai api key", "aiservice_watsonxai_apikey", isPassword=True)
636
+ self.promptForString("Watsonxai machine learning url", "aiservice_watsonxai_url")
637
+ self.promptForString("Watsonxai project id", "aiservice_watsonxai_project_id")
638
+
639
+ self.printH1("RSL Integration")
505
640
  self.printDescription([
506
- "There are two flavours of the interactive install to choose from: <u>Simplified</u> and <u>Advanced</u>. The simplified option will present fewer dialogs, but you lose the ability to configure the following aspects of the installation:",
507
- " - Configure dedicated License (AppPoints)"
641
+ "RSL (Reliable Strategy Library) connects to strategic asset management via STRATEGIZEAPI.",
642
+ "",
643
+ "RSL URL: https://api.rsl-service.suite.maximo.com (standard for all customers)",
644
+ "Org ID: Get from MAS Manage > System Properties > 'mxe.rs.rslorgid'",
645
+ "Token: Use your IBM entitlement key (same as MAS installation)",
646
+ "",
647
+ "Note: Future versions will auto-configure these from MAS Manage.",
648
+ ""
508
649
  ])
509
- self.showAdvancedOptions = self.yesOrNo("Show advanced installation options")
510
-
511
- def aibrokerSettings(self) -> None:
512
- if self.installAiBroker:
513
- self.printH2("AI Service Settings - Storage, WatsonX, MariaDB details")
514
- self.printDescription(["Customise AI Broker details"])
515
- self.promptForString("Storage provider", "mas_aibroker_storage_provider")
516
- self.promptForString("Storage access key", "mas_aibroker_storage_accesskey")
517
- self.promptForString("Storage secret key", "mas_aibroker_storage_secretkey", isPassword=True)
518
- self.promptForString("Storage host", "mas_aibroker_storage_host")
519
- self.promptForString("Storage port", "mas_aibroker_storage_port")
520
- self.promptForString("Storage ssl", "mas_aibroker_storage_ssl")
521
- self.promptForString("Storage region", "mas_aibroker_storage_region")
522
- self.promptForString("Storage pipelines bucket", "mas_aibroker_storage_pipelines_bucket")
523
- self.promptForString("Storage tenants bucket", "mas_aibroker_storage_tenants_bucket")
524
- self.promptForString("Storage templates bucket", "mas_aibroker_storage_templates_bucket")
525
-
526
- self.promptForString("Watsonxai api key", "mas_aibroker_watsonxai_apikey", isPassword=True)
527
- self.promptForString("Watsonxai machine learning url", "mas_aibroker_watsonxai_url")
528
- self.promptForString("Watsonxai project id", "mas_aibroker_watsonxai_project_id")
529
-
530
- self.promptForString("Database host", "mas_aibroker_db_host")
531
- self.promptForString("Database port", "mas_aibroker_db_port")
532
- self.promptForString("Database user", "mas_aibroker_db_user")
533
- self.promptForString("Database name", "mas_aibroker_db_database")
534
- self.promptForString("Database Secretname", "mas_aibroker_db_secret_name", isPassword=True)
535
- self.promptForString("Database password", "mas_aibroker_db_secret_value", isPassword=True)
536
-
537
- if self.getParam("mas_app_channel_aibroker") != "9.0.x":
538
- self.promptForString("Mariadb username", "mariadb_user")
539
- self.promptForString("Mariadb password", "mariadb_password", isPassword=True)
540
- self.promptForString("Tenant entitlement type", "tenant_entitlement_type")
541
- self.promptForString("Tenant start date", "tenant_entitlement_start_date")
542
- self.promptForString("Tenant end date", "tenant_entitlement_end_date")
543
- self.promptForString("S3 bucket prefix", "mas_aibroker_s3_bucket_prefix")
544
- self.promptForString("S3 endpoint url", "mas_aibroker_s3_endpoint_url")
545
- self.promptForString("S3 bucket prefix (tenant level)", "mas_aibroker_tenant_s3_bucket_prefix")
546
- self.promptForString("S3 region (tenant level)", "mas_aibroker_tenant_s3_region")
547
- self.promptForString("S3 endpoint url (tenant level)", "mas_aibroker_tenant_s3_endpoint_url")
548
- self.promptForString("S3 access key (tenant level)", "mas_aibroker_tenant_s3_access_key", isPassword=True)
549
- self.promptForString("S3 secret key (tenant level)", "mas_aibroker_tenant_s3_secret_key", isPassword=True)
550
- self.promptForString("RSL url", "rsl_url")
551
- self.promptForString("ORG Id of RSL", "rsl_org_id")
552
- self.promptForString("Token for RSL", "rsl_token", isPassword=True)
553
- self.yesOrNo("Install minio", "install_minio_aiservice")
554
- if self.getParam("install_minio_aiservice") == "true":
555
- self.promptForString("minio root username", "minio_root_user")
556
- self.promptForString("minio root password", "minio_root_password", isPassword=True)
557
- self.yesOrNo("Install SLS", "install_sls_aiservice")
558
- if self.getParam("install_sls_aiservice") != "true":
559
- self.promptForString("SLS secret name", "mas_aibroker_sls_secret_name")
560
- self.promptForString("SLS registration key", "mas_aibroker_sls_registration_key")
561
- self.promptForString("SLS URL", "mas_aibroker_sls_url")
562
- self.promptForString("SLS CA certificate", "mas_aibroker_sls_ca_cert")
563
- self.yesOrNo("Install DRO", "install_dro_aiservice")
564
- if self.getParam("install_dro_aiservice") != "true":
565
- self.promptForString("DRO secret name", "mas_aibroker_dro_secret_name")
566
- self.promptForString("DRO API key", "mas_aibroker_dro_api_key")
567
- self.promptForString("DRO URL", "mas_aibroker_dro_url")
568
- self.promptForString("DRO CA certificate", "mas_aibroker_dro_ca_cert")
569
- self.yesOrNo("Install DB2", "install_db2_aiservice")
570
- if self.getParam("install_db2_aiservice") != "true":
571
- self.promptForString("DB2 username", "mas_aibroker_db2_username")
572
- self.promptForString("DB2 password", "mas_aibroker_db2_password")
573
- self.promptForString("DB2 JDBC URL", "mas_aibroker_db2_jdbc_url")
574
- self.promptForString("DB2 SSL enabled (yes/no)", "mas_aibroker_db2_ssl_enabled")
575
- self.promptForString("DB2 CA certificate", "mas_aibroker_db2_ca_cert")
576
- # self.promptForString("Environment type", "environment_type")
650
+ self.promptForString("RSL url", "rsl_url")
651
+ self.promptForString("ORG Id of RSL", "rsl_org_id")
652
+ self.promptForString("Token for RSL", "rsl_token", isPassword=True)
577
653
 
578
654
  # These are all candidates to centralise in a new mixin used by both install and aiservice-install
579
655
 
@@ -656,7 +732,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
656
732
  releaseCompleter = WordCompleter(sorted(self.catalogReleases, reverse=True))
657
733
  releaseSelection = self.promptForString("Select release", completer=releaseCompleter)
658
734
 
659
- self.setParam("mas_app_channel_aibroker", self.catalogReleases[releaseSelection])
735
+ self.setParam("aiservice_channel", self.catalogReleases[releaseSelection])
660
736
 
661
737
  @logMethodCall
662
738
  def validateCatalogSource(self):
@@ -688,7 +764,7 @@ class AiServiceInstallApp(BaseApp, aiServiceInstallArgBuilderMixin, aiServiceIns
688
764
  self.printH1("License Terms")
689
765
  self.printDescription([
690
766
  "To continue with the installation, you must accept the license terms:",
691
- self.licenses[f"aibroker-{self.getParam('mas_app_channel_aibroker')}"]
767
+ self.licenses[f"aibroker-{self.getParam('aiservice_channel')}"]
692
768
  ])
693
769
 
694
770
  if self.noConfirm: