mas-cli 13.24.0__py3-none-any.whl → 13.25.1__py3-none-any.whl

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

Potentially problematic release.


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

mas/cli/__init__.py CHANGED
@@ -8,4 +8,4 @@
8
8
  #
9
9
  # *****************************************************************************
10
10
 
11
- __version__ = "13.24.0" # Python module compatible semver
11
+ __version__ = "13.25.1" # Python module compatible semver
mas/cli/cli.py CHANGED
@@ -117,7 +117,7 @@ class BaseApp(PrintMixin, PromptMixin):
117
117
  logging.getLogger('asyncio').setLevel(logging.INFO)
118
118
 
119
119
  # Supports extended semver, unlike mas.cli.__version__
120
- self.version = "13.24.0"
120
+ self.version = "13.25.1"
121
121
  self.h1count = 0
122
122
  self.h2count = 0
123
123
 
@@ -145,6 +145,9 @@ class BaseApp(PrintMixin, PromptMixin):
145
145
  self.architecture = None
146
146
 
147
147
  self.compatibilityMatrix = {
148
+ "9.1.x": {
149
+ "facilities": ["9.1.x"]
150
+ },
148
151
  "9.1.x-feature": {
149
152
  "assist": ["9.0.x"],
150
153
  "iot": ["9.0.x"],
mas/cli/install/app.py CHANGED
@@ -44,7 +44,11 @@ from mas.cli.validators import (
44
44
  )
45
45
 
46
46
  from mas.devops.ocp import createNamespace, getStorageClasses
47
- from mas.devops.mas import getCurrentCatalog, getDefaultStorageClasses
47
+ from mas.devops.mas import (
48
+ getCurrentCatalog,
49
+ getDefaultStorageClasses,
50
+ isVersionEqualOrAfter
51
+ )
48
52
  from mas.devops.sls import findSLSByNamespace
49
53
  from mas.devops.data import getCatalog
50
54
  from mas.devops.tekton import (
@@ -175,6 +179,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
175
179
  "Optimizer": "mas_optimizer_version",
176
180
  "Predict": "mas_predict_version",
177
181
  "Inspection": "mas_visualinspection_version",
182
+ "Facilities": "mas_facilities_version",
178
183
  }
179
184
  else:
180
185
  applications = {
@@ -194,11 +199,12 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
194
199
  # Generate catalogTable
195
200
  for application, key in applications.items():
196
201
  # Add 9.1-feature channel based off 9.0 to those apps that have not onboarded yet
197
- tempChosenCatalog = self.chosenCatalog[key].copy()
198
- if '9.1.x-feature' not in tempChosenCatalog:
199
- tempChosenCatalog.update({"9.1.x-feature": tempChosenCatalog["9.0.x"]})
202
+ if key in self.chosenCatalog:
203
+ tempChosenCatalog = self.chosenCatalog[key].copy()
204
+ if '9.1.x-feature' not in tempChosenCatalog:
205
+ tempChosenCatalog.update({"9.1.x-feature": tempChosenCatalog["9.0.x"]})
200
206
 
201
- self.catalogTable.append({"": application} | {key.replace(".x", ""): value for key, value in sorted(tempChosenCatalog.items(), reverse=True)})
207
+ self.catalogTable.append({"": application} | {key.replace(".x", ""): value for key, value in sorted(tempChosenCatalog.items(), reverse=True)})
202
208
 
203
209
  if self.architecture == "s390x" or self.architecture == "ppc64le":
204
210
  summary = [
@@ -644,7 +650,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
644
650
  self.configAppChannel("predict")
645
651
 
646
652
  # Assist is only installable on MAS 9.0.x due to withdrawal of support for Watson Discovery in our managed dependency stack and the inability of Assist 8.x to support this
647
- if not self.getParam("mas_channel").startswith("8."):
653
+ if isVersionEqualOrAfter('9.0.0', self.getParam("mas_channel")):
648
654
  self.installAssist = self.yesOrNo("Install Assist")
649
655
  if self.installAssist:
650
656
  self.configAppChannel("assist")
@@ -663,6 +669,13 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
663
669
  if self.installAiBroker:
664
670
  self.configAppChannel("aibroker")
665
671
 
672
+ if isVersionEqualOrAfter('9.1.0', self.getParam("mas_channel")) and self.getParam("mas_channel") != '9.1.x-feature':
673
+ self.installFacilities = self.yesOrNo("Install Real Estate and Facilities")
674
+ if self.installFacilities:
675
+ self.configAppChannel("facilities")
676
+ else:
677
+ self.installFacilities = False
678
+
666
679
  @logMethodCall
667
680
  def configAppChannel(self, appId):
668
681
  versions = self.getCompatibleVersions(self.params["mas_channel"], appId)
@@ -756,6 +769,71 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
756
769
  self.promptForString("IBM Cloud API Key", "cos_apikey", isPassword=True)
757
770
  self.promptForString("IBM Cloud Resource Group", "cos_resourcegroup")
758
771
 
772
+ @logMethodCall
773
+ # TODO: Fix type for storage sizes and max conn pool size
774
+ def facilitiesSettings(self) -> None:
775
+ if self.installFacilities:
776
+ self.printH1("Configure Maximo Real Estate and Facilities")
777
+ self.printDescription([
778
+ "Real Estate and Facilities custom configurations"
779
+ ])
780
+ self.printDescription([
781
+ "Maximo Real Estate and Facilities Size:",
782
+ " 1. Small",
783
+ " 2. Medium",
784
+ " 3. Large"
785
+ ])
786
+ self.promptForListSelect("Select the size:", ["small", "medium", "large"], "mas_ws_facilities_size")
787
+
788
+ if self.showAdvancedOptions:
789
+ if self.yesOrNo("Supply extra XML tags for Real Estate and Facilities server.xml"):
790
+ self.promptForString("Real Estate and Facilities Liberty Extension Secret Name", "mas_ws_facilities_liberty_extension_XML")
791
+ if self.yesOrNo("Supply custom AES Encryption Password"):
792
+ self.promptForString("Real Estate and Facilities AES Vault Secret Name", "mas_ws_facilities_vault_secret")
793
+
794
+ self.promptForString("Set Real Estate and Facilities Routes Timeout:", "mas_ws_facilities_routes_timeout", default="600s")
795
+ # self.promptForInt("Set Facilities maximum connection poll size:", default=200)
796
+
797
+ self.printDescription(["Real Estate and Facilities Persistent Volume Storage Configuration"])
798
+ defaultStorageClasses = getDefaultStorageClasses(self.dynamicClient)
799
+ notUseAutodetectedStorageClasses = False
800
+ if defaultStorageClasses.provider is not None:
801
+ self.storageClassProvider = defaultStorageClasses.provider
802
+ print_formatted_text(HTML(f"<MediumSeaGreen>Storage provider auto-detected: {defaultStorageClasses.providerName}</MediumSeaGreen>"))
803
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteMany): {defaultStorageClasses.rwx}</LightSlateGrey>"))
804
+ print_formatted_text(HTML(f"<LightSlateGrey> - Storage class (ReadWriteOnce): {defaultStorageClasses.rwo}</LightSlateGrey>"))
805
+ if self.yesOrNo("Use the auto-detected storage classes"):
806
+ self.printDescription([
807
+ "Storage Mode for Userfiles PVC:",
808
+ " 1. ReadWriteMany",
809
+ " 2. ReadWriteOnce"
810
+ ])
811
+ storageMode = self.promptForListSelect("Select the storage mode for user files PVC:", ["ReadWriteMany", "ReadWriteOnce"], "mas_ws_facilities_storage_userfiles_mode", default=1)
812
+ _ = self.setParam("mas_ws_facilities_storage_userfiles_class", defaultStorageClasses.rwx) if storageMode == "ReadWriteMany" else self.setParam("mas_ws_facilities_storage_userfiles_class", defaultStorageClasses.rwo)
813
+ # self.promptForInt("User file PVC size (Gb):", "mas_ws_facilities_storage_userfiles_size", default=50)
814
+ storageMode = self.promptForListSelect("Select the storage mode for log PVC:", ["ReadWriteMany", "ReadWriteOnce"], "mas_ws_facilities_storage_log_mode", default=1)
815
+ _ = self.setParam("mas_ws_facilities_storage_log_class", defaultStorageClasses.rwx) if storageMode == "ReadWriteMany" else self.setParam("mas_ws_facilities_storage_log_class", defaultStorageClasses.rwo)
816
+ # self.promptForInt("Log PVC size (Gb):", "mas_ws_facilities_storage_log_size", default=30)
817
+ else:
818
+ notUseAutodetectedStorageClasses = True
819
+ if defaultStorageClasses.provider is None or notUseAutodetectedStorageClasses:
820
+ for storageClass in getStorageClasses(self.dynamicClient):
821
+ print_formatted_text(HTML(f"<LightSlateGrey> - {storageClass.metadata.name}</LightSlateGrey>"))
822
+ self.promptForString("Select storage class for user files PVC:", "mas_ws_facilities_storage_userfiles_class")
823
+ self.promptForString("Select storage class for log PVC:", "mas_ws_facilities_storage_log_class")
824
+ self.printDescription([
825
+ "Storage Mode for Userfiles PVC:",
826
+ " 1. ReadWriteMany",
827
+ " 2. ReadWriteOnce"
828
+ ])
829
+ self.promptForListSelect("Select the storage mode for user files PVC:", ["ReadWriteMany", "ReadWriteOnce"], "mas_ws_facilities_storage_userfiles_mode", default=1)
830
+ self.promptForListSelect("Select the storage mode for log PVC:", ["ReadWriteMany", "ReadWriteOnce"], "mas_ws_facilities_storage_log_mode", default=1)
831
+ # self.promptForInt("User file PVC size (Gb):", "mas_ws_facilities_storage_userfiles_size", default=50)
832
+ # self.promptForInt("Log PVC size (Gb):", "mas_ws_facilities_storage_log_size", default=30)
833
+
834
+ if self.yesOrNo("Supply configuration for dedicated workflow agents"):
835
+ self.promptForString("Dedicated Workflow Agent JSON:")
836
+
759
837
  @logMethodCall
760
838
  def chooseInstallFlavour(self) -> None:
761
839
  self.printH1("Choose Install Mode")
@@ -773,6 +851,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
773
851
  " - Enable optional Maximo Manage integration Cognos Analytics and Watson Studio Local",
774
852
  " - Enable optional Maximo Predict integration with SPSS",
775
853
  " - Enable optional IBM Turbonomic integration",
854
+ " - Enable optional Real Estate and Facilities configurations",
776
855
  " - Customize Db2 node affinity and tolerations, memory, cpu, and storage settings (when using the IBM Db2 Universal Operator)",
777
856
  " - Choose alternative Apache Kafka providers (default to Strimzi)",
778
857
  " - Customize Grafana storage settings"
@@ -819,6 +898,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
819
898
  self.predictSettings()
820
899
  self.assistSettings()
821
900
  self.aibrokerSettings()
901
+ self.facilitiesSettings()
822
902
 
823
903
  # Dependencies
824
904
  self.configMongoDb()
@@ -849,6 +929,7 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
849
929
  self.installInspection = False
850
930
  self.installOptimizer = False
851
931
  self.installAiBroker = False
932
+ self.installFacilities = False
852
933
  self.deployCP4D = False
853
934
  self.db2SetAffinity = False
854
935
  self.db2SetTolerations = False
@@ -862,7 +943,8 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
862
943
  "approval_monitor": {"id": "app-cfg-monitor"}, # After Monitor workspace has been configured
863
944
  "approval_optimizer": {"id": "app-cfg-optimizer"}, # After Optimizer workspace has been configured
864
945
  "approval_predict": {"id": "app-cfg-predict"}, # After Predict workspace has been configured
865
- "approval_visualinspection": {"id": "app-cfg-visualinspection"} # After Visual Inspection workspace has been configured
946
+ "approval_visualinspection": {"id": "app-cfg-visualinspection"}, # After Visual Inspection workspace has been configured
947
+ "approval_facilities": {"id": "app-cfg-facilities"}, # After Facilities workspace has been configured 
866
948
  }
867
949
 
868
950
  self.configGrafana()
@@ -956,6 +1038,10 @@ class InstallApp(BaseApp, InstallSettingsMixin, InstallSummarizerMixin, ConfigGe
956
1038
  elif key == "optimizer_plan":
957
1039
  if value is not None and value != "":
958
1040
  self.setParam("mas_app_plan_optimizer", value)
1041
+ elif key == "facilities_channel":
1042
+ if value is not None and value != "":
1043
+ self.setParam("mas_app_channel_facilities", value)
1044
+ self.installFacilities = True
959
1045
 
960
1046
  # Manage advanced settings that need extra processing
961
1047
  elif key == "mas_app_settings_server_bundle_size":
@@ -171,6 +171,8 @@ class installArgBuilderMixin():
171
171
  command += f" --predict-channel \"{self.getParam('mas_app_channel_predict')}\"{newline}"
172
172
  if self.installInspection:
173
173
  command += f" --visualinspection-channel \"{self.getParam('mas_app_channel_visualinspection')}\"{newline}"
174
+ if self.installFacilities:
175
+ command += f" --facilities-channel \"{self.getParam('mas_app_channel_facilities')}\"{newline}"
174
176
 
175
177
  # Arcgis
176
178
  # -----------------------------------------------------------------------------
@@ -235,6 +237,45 @@ class installArgBuilderMixin():
235
237
  if self.getParam('mas_appws_bindings_health_wsl_flag') == "true":
236
238
  command += f" --manage-health-wsl{newline}"
237
239
 
240
+ # Facilities Advanced Settings
241
+ # -----------------------------------------------------------------------------
242
+ # TODO: Fix type for storage sizes and max conn pool size
243
+ if self.installFacilities:
244
+ if self.getParam('mas_ws_facilities_size') != "":
245
+ command += f" --facilities-size \"{self.getParam('mas_ws_facilities_size')}\"{newline}"
246
+
247
+ if self.getParam('mas_ws_facilities_pull_policy') != "":
248
+ command += f" --facilities-pull-policy \"{self.getParam('mas_ws_facilities_pull_policy')}\"{newline}"
249
+
250
+ if self.getParam('mas_ws_facilities_routes_timeout') != "":
251
+ command += f" --facilities-routes-timeout \"{self.getParam('mas_ws_facilities_routes_timeout')}\"{newline}"
252
+
253
+ if self.getParam('mas_ws_facilities_liberty_extension_XML') != "":
254
+ command += f" --facilities-xml-extension \"{self.getParam('mas_ws_facilities_liberty_extension_XML')}\"{newline}"
255
+
256
+ if self.getParam('mas_ws_facilities_vault_secret') != "":
257
+ command += f" --facilities-vault-secret \"{self.getParam('mas_ws_facilities_vault_secret')}\"{newline}"
258
+
259
+ # if self.getParam('mas_ws_facilities_dwfagents') != "":
260
+ # command += f" --facilities-dwfagent \"{self.getParam('mas_ws_facilities_dwfagents')}\"{newline}"
261
+
262
+ # if self.getParam('mas_ws_facilities_db_maxconnpoolsize') != "":
263
+ # command += f" --facilities-maxconnpoolsize \"{self.getParam('mas_ws_facilities_db_maxconnpoolsize')}\"{newline}"
264
+
265
+ if self.getParam('mas_ws_facilities_storage_log_class') != "":
266
+ command += f" --facilities-log-storage-class \"{self.getParam('mas_ws_facilities_storage_log_class')}\"{newline}"
267
+ if self.getParam('mas_ws_facilities_storage_log_mode') != "":
268
+ command += f" --facilities-log-storage-mode \"{self.getParam('mas_ws_facilities_storage_log_mode')}\"{newline}"
269
+ # if self.getParam('mas_ws_facilities_storage_log_size') != "":
270
+ # command += f" --facilities-log-storage-size \"{self.getParam('mas_ws_facilities_storage_log_size')}\"{newline}"
271
+
272
+ if self.getParam('mas_ws_facilities_storage_userfiles_class') != "":
273
+ command += f" --facilities-userfiles-storage-class \"{self.getParam('mas_ws_facilities_storage_userfiles_class')}\"{newline}"
274
+ if self.getParam('mas_ws_facilities_storage_userfiles_mode') != "":
275
+ command += f" --facilities-userfiles-storage-mode \"{self.getParam('mas_ws_facilities_storage_userfiles_mode')}\"{newline}"
276
+ # if self.getParam('mas_ws_facilities_storage_userfiles_size') != "":
277
+ # command += f" --facilities-userfiles-storage-size \"{self.getParam('mas_ws_facilities_storage_userfiles_size')}\"{newline}"
278
+
238
279
  # IBM Cloud Pak for Data
239
280
  # -----------------------------------------------------------------------------
240
281
  if self.getParam('cpd_product_version') != "":
@@ -253,11 +294,13 @@ class installArgBuilderMixin():
253
294
 
254
295
  # IBM Db2 Universal Operator
255
296
  # -----------------------------------------------------------------------------
256
- if self.getParam('db2_action_system') == "install" or self.getParam('db2_action_manage') == "install":
297
+ if self.getParam('db2_action_system') == "install" or self.getParam('db2_action_manage') == "install" or self.getParam('db2_action_facilities') == "install":
257
298
  if self.getParam('db2_action_system') == "install":
258
299
  command += f" --db2-system{newline}"
259
300
  if self.getParam('db2_action_manage') == "install":
260
301
  command += f" --db2-manage{newline}"
302
+ if self.getParam('db2_action_facilities') == "install":
303
+ command += f" --db2-facilities{newline}"
261
304
 
262
305
  if self.getParam('db2_channel') != "":
263
306
  command += f" --db2-channel \"{self.getParam('db2_channel')}\"{newline}"
@@ -398,6 +441,8 @@ class installArgBuilderMixin():
398
441
  command += f" --approval-predict \"{self.getParam('approval_predict')}\"{newline}"
399
442
  if self.getParam('approval_visualinspection') != "":
400
443
  command += f" --approval-visualinspection \"{self.getParam('approval_visualinspection')}\"{newline}"
444
+ if self.getParam('approval_facilities') != "":
445
+ command += f" --approval-facilities \"{self.getParam('approval_facilities')}\"{newline}"
401
446
 
402
447
  # More Options
403
448
  # -----------------------------------------------------------------------------
@@ -378,6 +378,11 @@ masAppsArgGroup.add_argument(
378
378
  required=False,
379
379
  help="Subscription channel for Maximo Ai Broker"
380
380
  )
381
+ masAppsArgGroup.add_argument(
382
+ "--facilities-channel",
383
+ required=False,
384
+ help="Subscription channel for Maximo Real Estate and Facilities"
385
+ )
381
386
 
382
387
  # AI Broker
383
388
  # -----------------------------------------------------------------------------
@@ -704,6 +709,92 @@ manageArgGroup.add_argument(
704
709
  choices=["cr", "db"]
705
710
  )
706
711
 
712
+ # Facilities Advanced Settings
713
+ # TODO: Fix type for storage sizes and max conn pool size
714
+ facilitiesArgGroup = installArgParser.add_argument_group("Facilities Advanced Configuration")
715
+ facilitiesArgGroup.add_argument(
716
+ "--facilities-size",
717
+ dest="mas_ws_facilities_size",
718
+ required=False,
719
+ help="Defines the size of Facilities deployment",
720
+ choices=['small', 'medium', 'large'],
721
+ )
722
+ facilitiesArgGroup.add_argument(
723
+ "--facilities-pull-policy",
724
+ dest="mas_ws_facilities_pull_policy",
725
+ required=False,
726
+ help="Defines the pull policy for the images",
727
+ choices=["IfNotPresent", "Always"],
728
+ )
729
+ facilitiesArgGroup.add_argument(
730
+ "--facilities-routes-timeout",
731
+ dest="mas_ws_facilities_routes_timeout",
732
+ required=False,
733
+ help="Defines the timeout for the routes",
734
+ default="600s",
735
+ )
736
+ facilitiesArgGroup.add_argument(
737
+ "--facilities-xml-extension",
738
+ dest="mas_ws_facilities_liberty_extension_XML",
739
+ required=False,
740
+ help="Defines the name of the secret that holds the extensions for Liberty server",
741
+ )
742
+ facilitiesArgGroup.add_argument(
743
+ "--facilities-vault-secret",
744
+ dest="mas_ws_facilities_vault_secret",
745
+ required=False,
746
+ help="Defines the name of the secret that holds the AES Encryption password",
747
+ )
748
+ # facilitiesArgGroup.add_argument(
749
+ # "--facilities-dwfagent",
750
+ # dest="mas_ws_facilities_dwfagents",
751
+ # required=False,
752
+ # help="Defines the list of dedicates workflow agents",
753
+ # )
754
+ # facilitiesArgGroup.add_argument(
755
+ # "--facilities-maxconnpoolsize",
756
+ # dest="mas_ws_facilities_db_maxconnpoolsize",
757
+ # required=False,
758
+ # help="Defines the maximum connection pool size",
759
+ # default=200,
760
+ # )
761
+ facilitiesArgGroup.add_argument(
762
+ "--facilities-log-storage-class",
763
+ dest="mas_ws_facilities_storage_log_class",
764
+ required=False,
765
+ help="Defines the log storage class",
766
+ )
767
+ facilitiesArgGroup.add_argument(
768
+ "--facilities-log-storage-mode",
769
+ dest="mas_ws_facilities_storage_log_mode",
770
+ required=False,
771
+ help="Defines the log storage mode",
772
+ )
773
+ # facilitiesArgGroup.add_argument(
774
+ # "--facilities-log-storage-size",
775
+ # dest="mas_ws_facilities_storage_log_size",
776
+ # required=False,
777
+ # help="Defines the logs storage size",
778
+ # )
779
+ facilitiesArgGroup.add_argument(
780
+ "--facilities-userfiles-storage-class",
781
+ dest="mas_ws_facilities_storage_userfiles_class",
782
+ required=False,
783
+ help="Defines the user files storage class",
784
+ )
785
+ facilitiesArgGroup.add_argument(
786
+ "--facilities-userfiles-storage-mode",
787
+ dest="mas_ws_facilities_storage_userfiles_mode",
788
+ required=False,
789
+ help="Defines the user files storage mode",
790
+ )
791
+ # facilitiesArgGroup.add_argument(
792
+ # "--facilities-userfiles-storage-size",
793
+ # dest="mas_ws_facilities_storage_userfiles_size",
794
+ # required=False,
795
+ # help="Defines the user files storage size",
796
+ # )
797
+
707
798
  # IBM Cloud Pak for Data
708
799
  # -----------------------------------------------------------------------------
709
800
  cpdAppsArgGroup = installArgParser.add_argument_group("IBM Cloud Pak for Data")
@@ -783,6 +874,14 @@ db2ArgGroup.add_argument(
783
874
  action="store_const",
784
875
  const="install"
785
876
  )
877
+ db2ArgGroup.add_argument(
878
+ "--db2-facilities",
879
+ dest="db2_action_facilities",
880
+ required=False,
881
+ help="Install a dedicated Db2u instance for Maximo Real Estate and Facilities (supported by Facilities)",
882
+ action="store_const",
883
+ const="install"
884
+ )
786
885
  db2ArgGroup.add_argument(
787
886
  "--db2-type",
788
887
  required=False,
@@ -1132,6 +1231,11 @@ approvalsGroup.add_argument(
1132
1231
  default="",
1133
1232
  help="Require approval after the Maximo Visual Inspection workspace has been configured"
1134
1233
  )
1234
+ approvalsGroup.add_argument(
1235
+ "--approval-facilities",
1236
+ default="",
1237
+ help="Require approval after the Maximo Real Estate and Facilities workspace has been configured"
1238
+ )
1135
1239
 
1136
1240
 
1137
1241
  # More Options
mas/cli/install/params.py CHANGED
@@ -78,6 +78,7 @@ optionalParams = [
78
78
  # Db2
79
79
  "db2_action_system",
80
80
  "db2_action_manage",
81
+ "db2_action_facilities",
81
82
  "db2_type",
82
83
  "db2_timezone",
83
84
  "db2_namespace",
@@ -175,6 +176,20 @@ optionalParams = [
175
176
  "mas_aibroker_db_secret_name",
176
177
  "mas_aibroker_db_secret_key",
177
178
  "mas_aibroker_db_secret_value",
179
+ # Facilities
180
+ "mas_ws_facilities_size",
181
+ "mas_ws_facilities_routes_timeout",
182
+ "mas_ws_facilities_liberty_extension_XML",
183
+ "mas_ws_facilities_vault_secret",
184
+ "mas_ws_facilities_pull_policy",
185
+ "mas_ws_facilities_storage_log_class",
186
+ "mas_ws_facilities_storage_log_mode",
187
+ # "mas_ws_facilities_storage_log_size",
188
+ "mas_ws_facilities_storage_userfiles_class",
189
+ "mas_ws_facilities_storage_userfiles_mode",
190
+ # "mas_ws_facilities_storage_userfiles_size",
191
+ # "mas_ws_facilities_dwfagents",
192
+ # "mas_ws_facilities_db_maxconnpoolsize",
178
193
  # Special chars
179
194
  "mas_special_characters"
180
195
  ]
@@ -163,6 +163,10 @@ class AdditionalConfigsMixin():
163
163
  "mas_app_channel_optimizer": {
164
164
  "dir": self.manualCertsDir + "/optimizer/",
165
165
  "keyPrefix": "optimizer."
166
+ },
167
+ "mas_app_channel_facilities": {
168
+ "dir": self.manualCertsDir + "/facilities/",
169
+ "keyPrefix": "facilities."
166
170
  }
167
171
  }
168
172
 
@@ -21,12 +21,12 @@ class Db2SettingsMixin():
21
21
  # The channel used for Db2 used has not changed since the January 2024 catalog update
22
22
  self.params["db2_channel"] = "v110509.0"
23
23
 
24
- # If neither Iot or Manage is being installed, we have nothing to do
25
- if not self.installIoT and not self.installManage:
26
- if not silentMode:
27
- print_formatted_text("No applications have been selected that require a Db2 installation")
28
- self.setParam("db2_action_system", "none")
29
- self.setParam("db2_action_manage", "none")
24
+ # If neither Iot, Manage or Facilities is being installed, we have nothing to do
25
+ if not self.installIoT and not self.installManage and not self.installFacilities:
26
+ print_formatted_text("No applications have been selected that require a Db2 installation")
27
+ self.setParam("db2_action_system", "none")
28
+ self.setParam("db2_action_manage", "none")
29
+ self.setParam("db2_action_facilities", "none")
30
30
  return
31
31
 
32
32
  # For now we are limiting users to bring your own database for Manage on s390x & ppc64le
@@ -55,10 +55,10 @@ class Db2SettingsMixin():
55
55
  return
56
56
 
57
57
  # Proceed as normal
58
- # We know we are installing either IoT or Manage, and on amd64 target architecture
58
+ # We know we are installing either IoT, Manage or Facilities, and on amd64 target architecture
59
59
  if not silentMode:
60
60
  self.printDescription([
61
- f"The installer can setup one or more IBM Db2 instances in your OpenShift cluster for the use of applications that require a JDBC datasource (IoT, {self.manageAppName}, Monitor, &amp; Predict) or you may choose to configure MAS to use an existing database"
61
+ f"The installer can setup one or more IBM Db2 instances in your OpenShift cluster for the use of applications that require a JDBC datasource (IoT, {self.manageAppName}, Monitor, &amp; Predict, Real Estate and Facilities) or you may choose to configure MAS to use an existing database"
62
62
  ])
63
63
 
64
64
  self.setDB2DefaultSettings()
@@ -146,8 +146,31 @@ class Db2SettingsMixin():
146
146
  else:
147
147
  self.setParam("db2_action_manage", "none")
148
148
 
149
+ # Do we need to create and configure a Db2 for Facilities ?
150
+ if self.installFacilities:
151
+ self.printH2("Database Configuration for Maximo Real Estate and Facilities")
152
+ if self.yesOrNo("Create Real Estate and Facilities dedicated Db2 instance using the IBM Db2 Universal Operator"):
153
+ self.setParam("db2_action_facilities", "install")
154
+ else:
155
+ self.setParam("db2_action_facilities", "none")
156
+ instanceId = self.getParam('mas_instance_id')
157
+ workspaceId = self.getParam("mas_workspace_id")
158
+ self.selectLocalConfigDir()
159
+
160
+ # Check if a configuration already exists before creating a new one
161
+ jdbcCfgFile = path.join(self.localConfigDir, f"jdbc-{instanceId}-facilities.yaml")
162
+ print_formatted_text(f"Searching for Real Estate and Facilities database configuration file in {jdbcCfgFile} ...")
163
+ if path.exists(jdbcCfgFile):
164
+ if self.yesOrNo(f"Real Estate and Facilities database configuration file 'jdbc-{instanceId}-facilities.yaml' already exists. Do you want to generate a new one"):
165
+ self.generateJDBCCfg(instanceId=instanceId, scope="workspace-application", workspaceId=workspaceId, appId="facilities", destination=jdbcCfgFile)
166
+ else:
167
+ print_formatted_text(f"Expected file ({jdbcCfgFile}) was not found, generating a valid Real Estate and Facilities database configuration file now ...")
168
+ self.generateJDBCCfg(instanceId=instanceId, scope="workspace-application", workspaceId=workspaceId, appId="facilities", destination=jdbcCfgFile)
169
+ else:
170
+ self.setParam("db2_action_facilities", "none")
171
+
149
172
  # Do we need to configure Db2u?
150
- if self.getParam("db2_action_system") == "install" or self.getParam("db2_action_manage") == "install":
173
+ if self.getParam("db2_action_system") == "install" or self.getParam("db2_action_manage") == "install" or self.getParam("db2_action_facilities") == "install":
151
174
  if self.showAdvancedOptions:
152
175
  self.printH2("Installation Namespace")
153
176
  self.promptForString("Install namespace", "db2_namespace", default="db2u")
@@ -217,6 +217,30 @@ class InstallSummarizerMixin():
217
217
  else:
218
218
  self.printSummary("Manage", "Do Not Install")
219
219
 
220
+ def facilitiesSummary(self) -> None:
221
+ # TODO: Fix type for storage sizes and max conn pool size
222
+ if self.installFacilities:
223
+ self.printSummary("Facilities", self.params["mas_app_channel_facilities"])
224
+ print_formatted_text(HTML(" <SkyBlue>+ Maximo Real Estate and Facilities Settings</SkyBlue>"))
225
+ self.printParamSummary(" + Size", "mas_ws_facilities_size")
226
+ self.printParamSummary(" + Routes Timeout", "mas_ws_facilities_routes_timeout")
227
+ self.printParamSummary(" + XML Extension", "mas_ws_facilities_liberty_extension_XML")
228
+ self.printParamSummary(" + AES vault secret name", "mas_ws_facilities_vault_secret")
229
+ # self.printParamSummary(" + Dedicated Workflow Agents", "mas_ws_facilities_dwfagents")
230
+ # self.printParamSummary(" + Maximum pool size connection ", "mas_ws_facilities_db_maxconnpoolsize")
231
+ self.printParamSummary(" + Log Storage Class ", "mas_ws_facilities_storage_log_class")
232
+ self.printParamSummary(" + Log Storage Mode", "mas_ws_facilities_storage_log_mode")
233
+ # self.printParamSummary(" + Log Storage Size", "mas_ws_facilities_storage_log_size")
234
+ self.printParamSummary(" + Userfiles Storage Class ", "mas_ws_facilities_storage_userfiles_class")
235
+ self.printParamSummary(" + User files Storage Mode", "mas_ws_facilities_storage_userfiles_mode")
236
+ # self.printParamSummary(" + User files Storage Size", "mas_ws_facilities_storage_userfiles_size")
237
+ if self.getParam("db2_action_facilities") == 'none':
238
+ self.printParamSummary(" + Dedicated DB2 Database", "No")
239
+ else:
240
+ self.printParamSummary(" + Dedicated DB2 Database", "db2_action_facilities")
241
+ else:
242
+ self.printSummary("Facilities", "Do Not Install")
243
+
220
244
  def db2Summary(self) -> None:
221
245
  if self.getParam("db2_action_system") == "install" or self.getParam("db2_action_manage") == "install":
222
246
  self.printH2("IBM Db2 Univeral Operator Configuration")
@@ -379,6 +403,7 @@ class InstallSummarizerMixin():
379
403
  self.assistSummary()
380
404
  self.inspectionSummary()
381
405
  self.aibrokerSummary()
406
+ self.facilitiesSummary()
382
407
 
383
408
  # Application Dependencies
384
409
  self.mongoSummary()