diff --git a/python/src/mas/cli/install/app.py b/python/src/mas/cli/install/app.py index dec3a882ade..13c38e73571 100644 --- a/python/src/mas/cli/install/app.py +++ b/python/src/mas/cli/install/app.py @@ -1541,6 +1541,35 @@ def facilitiesSettings(self) -> None: "mas_ws_facilities_vault_secret", ) + # Prompt for custom FACILITIES.properties file + if self.yesOrNo("Upload custom FACILITIES.properties file"): + self.printDescription( + [ + "Provide the path to your custom FACILITIES.properties file.", + "This file will be uploaded as a secret in OpenShift.", + "If you choose not to upload a custom file, the default FACILITIES.properties will be used.", + ] + ) + facilitiesPropertiesFile = self.promptForString( + "Path to FACILITIES.properties file", + "mas_ws_facilities_properties_file_local", + ) + if facilitiesPropertiesFile and path.exists(facilitiesPropertiesFile): + self.setParam("mas_ws_facilities_properties_file_local", facilitiesPropertiesFile) + self.setParam("mas_ws_facilities_custom_properties", "true") + + # Prompt for custom secret name (optional, with default) + customSecretName = self.promptForString("Specify the custom secret name", "mas_ws_facilities_properties_secret_name") + # Use default if not provided + if not customSecretName or customSecretName.strip() == "": + customSecretName = "custom-facilities-properties" + self.setParam("mas_ws_facilities_properties_secret_name", customSecretName) + else: + print_formatted_text(HTML("File not found. Default FACILITIES.properties will be used.")) + self.setParam("mas_ws_facilities_custom_properties", "false") + else: + self.setParam("mas_ws_facilities_custom_properties", "false") + self.promptForString( "Set Real Estate and Facilities Routes Timeout:", "mas_ws_facilities_routes_timeout", @@ -2551,6 +2580,7 @@ def install(self, argv): self.podTemplates() self.slsLicenseFile() self.db2LicenseFile() + self.facilitiesPropertiesFile() self.manualCertificates() self.aiserviceConfig() @@ -2757,6 +2787,7 @@ def install(self, argv): namespace=pipelinesNamespace, slsLicenseFile=self.slsLicenseFileSecret, db2LicenseFile=self.db2LicenseFileSecret, + facilitiesProperties=self.facilitiesPropertiesSecret, additionalConfigs=self.additionalConfigsSecret, podTemplates=self.podTemplatesSecret, certs=self.certsSecret, diff --git a/python/src/mas/cli/install/argBuilder.py b/python/src/mas/cli/install/argBuilder.py index 708ed8a11d3..5f064bd73c6 100644 --- a/python/src/mas/cli/install/argBuilder.py +++ b/python/src/mas/cli/install/argBuilder.py @@ -348,6 +348,11 @@ def buildCommand(self) -> str: if self.getParam("mas_ws_facilities_storage_userfiles_size") != "": command += f" --facilities-userfiles-storage-size \"{self.getParam('mas_ws_facilities_storage_userfiles_size')}\"{newline}" + if self.getParam("mas_ws_facilities_properties_file_local") != "": + command += f" --facilities-properties-file \"{self.getParam('mas_ws_facilities_properties_file_local')}\"{newline}" + if self.getParam("mas_ws_facilities_properties_secret_name") != "": + command += f" --facilities-properties-secret-name \"{self.getParam('mas_ws_facilities_properties_secret_name')}\"{newline}" + # AI Service Advanced Settings # ----------------------------------------------------------------------------- if self.installAIService: diff --git a/python/src/mas/cli/install/argParser.py b/python/src/mas/cli/install/argParser.py index 9c0799bb40c..a2ec07beea2 100644 --- a/python/src/mas/cli/install/argParser.py +++ b/python/src/mas/cli/install/argParser.py @@ -818,6 +818,19 @@ def isValidFile(parser: argparse.ArgumentParser, arg: str) -> str: help="Storage size for Facilities user files", default=50, ) +facilitiesArgGroup.add_argument( + "--facilities-properties-file", + dest="mas_ws_facilities_properties_file_local", + required=False, + help="Path to the custom FACILITIES.properties file to upload as secret", +) +facilitiesArgGroup.add_argument( + "--facilities-properties-secret-name", + dest="mas_ws_facilities_properties_secret_name", + required=False, + help="Custom name for the Facilities properties secret (default: facilities-properties)", + default="custom-facilities-properties", +) # Open Data Hub # ----------------------------------------------------------------------------- diff --git a/python/src/mas/cli/install/params.py b/python/src/mas/cli/install/params.py index b9ca498464d..4a945bc106d 100644 --- a/python/src/mas/cli/install/params.py +++ b/python/src/mas/cli/install/params.py @@ -174,6 +174,9 @@ "mas_ws_facilities_storage_userfiles_size", "mas_ws_facilities_dwfagents", "mas_ws_facilities_db_maxconnpoolsize", + "mas_ws_facilities_properties_file_local", + "mas_ws_facilities_custom_properties", + "mas_ws_facilities_properties_secret_name", # Special chars "mas_special_characters", # ODH diff --git a/python/src/mas/cli/install/settings/additionalConfigs.py b/python/src/mas/cli/install/settings/additionalConfigs.py index c97ac980d86..5178d560cf3 100644 --- a/python/src/mas/cli/install/settings/additionalConfigs.py +++ b/python/src/mas/cli/install/settings/additionalConfigs.py @@ -221,6 +221,31 @@ def db2LicenseFile(self) -> None: else: self.db2LicenseFileSecret = None + def facilitiesPropertiesFile(self) -> None: + """Handle Facilities properties file upload""" + self.facilitiesPropertiesSecret = None + facilitiesPropertiesFileLocal = self.getParam("mas_ws_facilities_properties_file_local") + + if facilitiesPropertiesFileLocal and facilitiesPropertiesFileLocal != "": + # Get custom secret name or use default + secretName = self.getParam("mas_ws_facilities_properties_secret_name") + if not secretName or secretName == "": + secretName = "custom-facilities-properties" + + facilitiesPropertiesSecret = {"apiVersion": "v1", "kind": "Secret", "type": "Opaque", "metadata": {"name": "pipeline-facilities-properties"}} + + # Read the file from user's local path + self.facilitiesPropertiesSecret = self.addFilesToSecret(facilitiesPropertiesSecret, facilitiesPropertiesFileLocal, "") + + # Now update the parameters + self.setParam("mas_ws_facilities_custom_properties", "true") + self.setParam("mas_ws_facilities_properties_file_local", "/workspace/facilities/FACILITIES.properties") + self.setParam("mas_ws_facilities_properties_secret_name", secretName) + else: + self.setParam("mas_ws_facilities_custom_properties", "false") + self.setParam("mas_ws_facilities_properties_file_local", "") + self.setParam("mas_ws_facilities_properties_secret_name", "") + def addFilesToSecret(self, secretDict: dict, configPath: str, extension: str, keyPrefix: str = "") -> dict: """ Add file (or files) to pipeline-additional-configs diff --git a/python/src/mas/cli/install/summarizer.py b/python/src/mas/cli/install/summarizer.py index f63beff8220..bcac2da664b 100644 --- a/python/src/mas/cli/install/summarizer.py +++ b/python/src/mas/cli/install/summarizer.py @@ -348,6 +348,9 @@ def facilitiesSummary(self) -> None: "mas_ws_facilities_storage_userfiles_mode", ) # self.printParamSummary(" + User files Storage Size", "mas_ws_facilities_storage_userfiles_size") + self.printParamSummary(" + Custom FACILITIES.properties", "mas_ws_facilities_custom_properties") + self.printParamSummary(" + Custom FACILITIES.properties File path", "mas_ws_facilities_properties_file_local") + self.printParamSummary(" + Custom FACILITIES.properties Secret Name", "mas_ws_facilities_properties_secret_name") if self.getParam("db2_action_facilities") == "none": self.printParamSummary(" + Dedicated DB2 Database", "No") else: diff --git a/tekton/src/params/install.yml.j2 b/tekton/src/params/install.yml.j2 index d372806b90f..33f14860896 100644 --- a/tekton/src/params/install.yml.j2 +++ b/tekton/src/params/install.yml.j2 @@ -770,6 +770,18 @@ description: ConfigMap with configurations not supported by Tekton type: string default: "" +- name: mas_ws_facilities_custom_properties + description: Flag indicating if custom FACILITIES.properties file is provided + type: string + default: "" +- name: mas_ws_facilities_properties_file_local + description: Path to custom FACILITIES.properties file in pipeline workspace + type: string + default: "" +- name: mas_ws_facilities_properties_secret_name + description: Name of the secret containing custom FACILITIES.properties + type: string + default: "" # AI Service Configuration # ----------------------------------------------------------------------------- diff --git a/tekton/src/pipelines/mas-install.yml.j2 b/tekton/src/pipelines/mas-install.yml.j2 index ebe18ca4480..22a98c1cb21 100644 --- a/tekton/src/pipelines/mas-install.yml.j2 +++ b/tekton/src/pipelines/mas-install.yml.j2 @@ -19,6 +19,9 @@ spec: - name: shared-db2 # AIService configurations. Contains Scheduling config file for AI workloads for tenant. - name: shared-aiservice-config + # Facilities Properties File + - name: shared-facilities-properties + optional: true params: # 1. Common Parameters diff --git a/tekton/src/pipelines/taskdefs/apps/facilities-app.yml.j2 b/tekton/src/pipelines/taskdefs/apps/facilities-app.yml.j2 index 154f5143a84..71d989ec03e 100644 --- a/tekton/src/pipelines/taskdefs/apps/facilities-app.yml.j2 +++ b/tekton/src/pipelines/taskdefs/apps/facilities-app.yml.j2 @@ -50,11 +50,19 @@ value: $(params.mas_ws_facilities_storage_userfiles_mode) - name: mas_ws_facilities_config_map_name value: $(params.mas_ws_facilities_config_map_name) + - name: mas_ws_facilities_custom_properties + value: $(params.mas_ws_facilities_custom_properties) + - name: mas_ws_facilities_properties_file_local + value: $(params.mas_ws_facilities_properties_file_local) + - name: mas_ws_facilities_properties_secret_name + value: $(params.mas_ws_facilities_properties_secret_name) workspaces: - name: configs workspace: shared-configs - name: pod-templates workspace: shared-pod-templates + - name: facilities + workspace: shared-facilities-properties when: - input: "$(params.mas_app_channel_facilities)" operator: notin diff --git a/tekton/src/tasks/suite-app-install.yml.j2 b/tekton/src/tasks/suite-app-install.yml.j2 index 9a822ba61ab..f4cfa6c6abb 100644 --- a/tekton/src/tasks/suite-app-install.yml.j2 +++ b/tekton/src/tasks/suite-app-install.yml.j2 @@ -353,6 +353,18 @@ spec: type: string description: ConfigMap with configurations not supported by Tekton default: "" + - name: mas_ws_facilities_custom_properties + type: string + description: Flag indicating if custom FACILITIES.properties file is provided + default: "" + - name: mas_ws_facilities_properties_file_local + type: string + description: Local path to custom FACILITIES.properties file in workspace + default: "" + - name: mas_ws_facilities_properties_secret_name + type: string + description: Name of the secret containing custom FACILITIES.properties + default: "" stepTemplate: image: quay.io/ibmmas/cli:latest @@ -572,6 +584,12 @@ spec: value: $(params.mas_ws_facilities_config_map_name) - name: MAS_FACILITIES_APP_OM_UPGRADE_MODE value: $(params.mas_ws_facilities_app_om_upgrade_mode) + - name: MAS_FACILITIES_CUSTOM_PROPERTIES + value: $(params.mas_ws_facilities_custom_properties) + - name: MAS_FACILITIES_PROPERTIES_FILE_LOCAL + value: $(params.mas_ws_facilities_properties_file_local) + - name: MAS_FACILITIES_PROPERTIES_SECRET_NAME + value: $(params.mas_ws_facilities_properties_secret_name) - name: app-wait-for-approval # If configmap/approval-app-cfg-$(params.mas_app_id) exists then set STATUS=pending and wait for it to be changed to "approved" @@ -609,3 +627,5 @@ spec: - name: configs - name: pod-templates optional: true + - name: facilities + optional: true