From 9eb71c2e840ccc3ab57ba17ea6934306b8dd54df Mon Sep 17 00:00:00 2001 From: i325261 Date: Mon, 23 Feb 2026 11:34:06 +0100 Subject: [PATCH 1/4] [Fix] Improve validation for service parameters in MtaTransformer and correct error logging in util --- bin/cap-op-plugin.js | 4 ++-- lib/mta-transformer.js | 24 ++++++++++++++++++++---- lib/util.js | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/bin/cap-op-plugin.js b/bin/cap-op-plugin.js index 30dbd6a..3aa734f 100755 --- a/bin/cap-op-plugin.js +++ b/bin/cap-op-plugin.js @@ -36,7 +36,7 @@ async function capOperatorPlugin(cmd, option, yamlPath) { if (option === '--with-input-yaml' && !yamlPath) return _usage(`Input yaml path is missing.`) - if (option === '--with-input-yaml' && !yamlPath && cds.utils.exists(cds.utils.path.join(cds.root, yamlPath))) + if (option === '--with-input-yaml' && yamlPath && !cds.utils.exists(cds.utils.path.join(cds.root, yamlPath))) return _usage(`Input yaml path ${yamlPath} does not exist.`) await generateRuntimeValues(option, yamlPath) @@ -46,7 +46,7 @@ async function capOperatorPlugin(cmd, option, yamlPath) { if (option === '--with-runtime-yaml' && !yamlPath) return _usage(`Input runtime yaml path is missing.`) - if (option === '--with-runtime-yaml' && !yamlPath && cds.utils.exists(cds.utils.path.join(cds.root, yamlPath))) + if (option === '--with-runtime-yaml' && yamlPath && !cds.utils.exists(cds.utils.path.join(cds.root, yamlPath))) return _usage(`Input runtime yaml path ${yamlPath} does not exist.`) await convertToconfigurableTemplateChart(option, yamlPath) diff --git a/lib/mta-transformer.js b/lib/mta-transformer.js index 26dbf31..c44428e 100644 --- a/lib/mta-transformer.js +++ b/lib/mta-transformer.js @@ -100,13 +100,29 @@ module.exports = class MtaTransformer { let managedSvcs = this.mergedMta?.resources.filter(r => r.type === 'org.cloudfoundry.managed-service') || [] for(let svc of managedSvcs) { + // Validate required parameters exist + if (!svc.parameters) { + console.warn(`⚠️ Service ${svc.name} is missing parameters. Skipping.`) + continue + } + + const service = svc.parameters["service"] + const servicePlan = svc.parameters["service-plan"] + + if (!service || !servicePlan) { + console.warn(`⚠️ Service ${svc.name} is missing 'service' or 'service-plan' parameters. Skipping.`) + continue + } + + const serviceInstanceKey = convertHypenNameToCamelcase(service + "-" + servicePlan) + this.serviceInstances.set( - svc.parameters["service"] && svc.parameters["service-plan"] ? convertHypenNameToCamelcase(svc.parameters["service"] + "-" +svc.parameters["service-plan"]) : null, + serviceInstanceKey, { name: svc.name, - serviceOfferingName: svc.parameters["service"] ? svc.parameters["service"] : null, - servicePlanName: svc.parameters["service-plan"] ? svc.parameters["service-plan"] : null, - parameters: svc.parameters["config"] ? svc.parameters["config"] : {} + serviceOfferingName: service, + servicePlanName: servicePlan, + parameters: svc.parameters["config"] || {} } ) } diff --git a/lib/util.js b/lib/util.js index bbd3336..6ae3f41 100644 --- a/lib/util.js +++ b/lib/util.js @@ -137,7 +137,7 @@ function extractAndReplaceHanaInstanceId(env, valuesYaml) { env[index].value = JSON.stringify(cdsConfig) } } catch (err) { - console.warn(`Failed to parse CDS_CONFIG: ${error.message}`) + console.warn(`Failed to parse CDS_CONFIG: ${err.message}`) } } From ae9a912797a50b0840a88b757807a7599db90e72 Mon Sep 17 00:00:00 2001 From: i325261 Date: Tue, 24 Feb 2026 14:21:32 +0100 Subject: [PATCH 2/4] [Fix] Rename service parameter to serviceOffering for clarity in MtaTransformer --- lib/mta-transformer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mta-transformer.js b/lib/mta-transformer.js index c44428e..65fd71e 100644 --- a/lib/mta-transformer.js +++ b/lib/mta-transformer.js @@ -106,10 +106,10 @@ module.exports = class MtaTransformer { continue } - const service = svc.parameters["service"] + const serviceOffering = svc.parameters["service"] const servicePlan = svc.parameters["service-plan"] - if (!service || !servicePlan) { + if (!serviceOffering || !servicePlan) { console.warn(`⚠️ Service ${svc.name} is missing 'service' or 'service-plan' parameters. Skipping.`) continue } @@ -120,7 +120,7 @@ module.exports = class MtaTransformer { serviceInstanceKey, { name: svc.name, - serviceOfferingName: service, + serviceOfferingName: serviceOffering, servicePlanName: servicePlan, parameters: svc.parameters["config"] || {} } From 9fe13af77ef3e76d4b167e9348aab8a1c5f1633a Mon Sep 17 00:00:00 2001 From: i325261 Date: Tue, 24 Feb 2026 14:42:34 +0100 Subject: [PATCH 3/4] [Fix] Update serviceInstanceKey construction to use serviceOffering for consistency --- lib/mta-transformer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mta-transformer.js b/lib/mta-transformer.js index 65fd71e..0facd20 100644 --- a/lib/mta-transformer.js +++ b/lib/mta-transformer.js @@ -114,7 +114,7 @@ module.exports = class MtaTransformer { continue } - const serviceInstanceKey = convertHypenNameToCamelcase(service + "-" + servicePlan) + const serviceInstanceKey = convertHypenNameToCamelcase(serviceOffering + "-" + servicePlan) this.serviceInstances.set( serviceInstanceKey, From 08848927da41349ce049a151f72d82b3104ee5e1 Mon Sep 17 00:00:00 2001 From: i325261 Date: Wed, 25 Feb 2026 09:39:42 +0100 Subject: [PATCH 4/4] [Fix] Refactor code for consistency and readability in MtaTransformer --- lib/mta-transformer.js | 81 ++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 46 deletions(-) diff --git a/lib/mta-transformer.js b/lib/mta-transformer.js index 0facd20..aa95512 100644 --- a/lib/mta-transformer.js +++ b/lib/mta-transformer.js @@ -23,16 +23,16 @@ module.exports = class MtaTransformer { async readMtaExtensions() { let mtaExtensions = [] - for(let file of this.mtaExtensionPaths) { - let mtaExt = cds.parse.yaml(await cds.utils.read(cds.utils.path.join(cds.root, file))) - if (mtaExt && mtaExt["_schema-version"].split(".")[0] === this.mta["_schema-version"].split(".")[0] && mtaExt["extends"] === this.mta["ID"]) { - mtaExtensions.push(mtaExt) - } else { - console.log(`⚠️ ${file} is not a valid mta extension file. _schema major version or extends doesn't match. Skipping...`) - } + for (let file of this.mtaExtensionPaths) { + let mtaExt = cds.parse.yaml(await cds.utils.read(cds.utils.path.join(cds.root, file))) + if (mtaExt && mtaExt["_schema-version"].split(".")[0] === this.mta["_schema-version"].split(".")[0] && mtaExt["extends"] === this.mta["ID"]) { + mtaExtensions.push(mtaExt) + } else { + console.log(`⚠️ ${file} is not a valid mta extension file. _schema major version or extends doesn't match. Skipping...`) + } } return mtaExtensions - } + } async getMta() { this.mta = cds.parse.yaml(await cds.utils.read(join(cds.root, this.mtaFilePath))) @@ -41,7 +41,7 @@ module.exports = class MtaTransformer { this.mergedMta = this.merge(this.mta, this.mtaExtensions) - if (this.mergedMta.parameters){ + if (this.mergedMta.parameters) { this.mergedMta.modules = replacePlaceholders(this.mergedMta.modules, this.mergedMta.parameters) this.mergedMta.resources = replacePlaceholders(this.mergedMta.resources, this.mergedMta.parameters) } @@ -78,7 +78,7 @@ module.exports = class MtaTransformer { merge(mta, mtaExtensions) { let mergedMta = mta - for(let mtaExtension of mtaExtensions) { + for (let mtaExtension of mtaExtensions) { // Merge parameters mergedMta.parameters = mergeObj(mergedMta.parameters, mtaExtension.parameters) @@ -94,37 +94,26 @@ module.exports = class MtaTransformer { } async getServiceInstances() { - if(this.serviceInstances.size !== 0) return this.serviceInstances + if (this.serviceInstances.size !== 0) return this.serviceInstances - if(!this.mergedMta) await this.getMta() + if (!this.mergedMta) await this.getMta() let managedSvcs = this.mergedMta?.resources.filter(r => r.type === 'org.cloudfoundry.managed-service') || [] - for(let svc of managedSvcs) { - // Validate required parameters exist - if (!svc.parameters) { - console.warn(`⚠️ Service ${svc.name} is missing parameters. Skipping.`) - continue - } - - const serviceOffering = svc.parameters["service"] - const servicePlan = svc.parameters["service-plan"] - - if (!serviceOffering || !servicePlan) { - console.warn(`⚠️ Service ${svc.name} is missing 'service' or 'service-plan' parameters. Skipping.`) + for (let svc of managedSvcs) { + try { + this.serviceInstances.set( + convertHypenNameToCamelcase(svc.parameters["service"] + "-" + svc.parameters["service-plan"]), + { + name: svc.name, + serviceOfferingName: svc.parameters["service"], + servicePlanName: svc.parameters["service-plan"], + parameters: svc.parameters["config"] || {} + } + ) + } catch (err) { + console.warn(`⚠️ Error processing service instance ${svc.name} - ${err.message}. Skipping...`) continue } - - const serviceInstanceKey = convertHypenNameToCamelcase(serviceOffering + "-" + servicePlan) - - this.serviceInstances.set( - serviceInstanceKey, - { - name: svc.name, - serviceOfferingName: serviceOffering, - servicePlanName: servicePlan, - parameters: svc.parameters["config"] || {} - } - ) } // for xsuaa service instance, remove oauth2-configuration -> redirect-uris as it is filled by service-instance.yaml template @@ -167,7 +156,7 @@ module.exports = class MtaTransformer { async getServiceBindings() { if (this.serviceBindings.size !== 0) return this.serviceBindings - if (this.workloads.size === 0 ) await this.getWorkloads() + if (this.workloads.size === 0) await this.getWorkloads() return this.serviceBindings } @@ -197,9 +186,9 @@ module.exports = class MtaTransformer { serviceInstanceName: consumedBTPService.name, } if (this.serviceBindings.has(serviceBindingNameKey) && - md5(JSON.stringify(this.serviceBindings.get(serviceBindingNameKey))) !== md5(JSON.stringify(serviceBindingValue))) { + md5(JSON.stringify(this.serviceBindings.get(serviceBindingNameKey))) !== md5(JSON.stringify(serviceBindingValue))) { - let serviceBindingNewName = consumedBTPService.name +"-"+ module.name + this.serviceBindingNameSuffix + let serviceBindingNewName = consumedBTPService.name + "-" + module.name + this.serviceBindingNameSuffix let serviceBindingNewNameKey = convertHypenNameToCamelcase(serviceBindingNewName) this.serviceBindings.set(serviceBindingNewNameKey, { name: serviceBindingNewName, @@ -210,14 +199,14 @@ module.exports = class MtaTransformer { }) workloadServiceBindings.push(serviceBindingNewName) } else if (this.serviceBindings.has(serviceBindingNameKey) && - md5(JSON.stringify(this.serviceBindings.get(serviceBindingNameKey))) === md5(JSON.stringify(serviceBindingValue))) { + md5(JSON.stringify(this.serviceBindings.get(serviceBindingNameKey))) === md5(JSON.stringify(serviceBindingValue))) { workloadServiceBindings.push(serviceBindingName) continue } else { workloadServiceBindings.push(serviceBindingName) - this.serviceBindings.set(serviceBindingNameKey,serviceBindingValue) + this.serviceBindings.set(serviceBindingNameKey, serviceBindingValue) } } return workloadServiceBindings @@ -228,7 +217,7 @@ module.exports = class MtaTransformer { for (const [key, value] of Object.entries(properties)) { env.push({ name: key, - value: typeof value === 'string'? value : JSON.stringify(value) + value: typeof value === 'string' ? value : JSON.stringify(value) }) } return env @@ -247,7 +236,7 @@ module.exports = class MtaTransformer { } if (module.path?.includes("gen/mtx/sidecar") || module.type === 'com.sap.application.content') { workload.jobDefinition = { - type: module.type === 'com.sap.application.content'? "Content": "TenantOperation", + type: module.type === 'com.sap.application.content' ? "Content" : "TenantOperation", image: null } } else if (module.path?.includes("gen/srv")) { @@ -271,9 +260,9 @@ module.exports = class MtaTransformer { // delete existing TENANT_HOST_PATTERN if any; Handled in cap-operator-cro.yaml template if (workload.deploymentDefinition?.type == "Router") { if (workload.deploymentDefinition.env) { - const index = workload.deploymentDefinition.env.findIndex(e => e.name === "TENANT_HOST_PATTERN") - if (index != -1) - workload.deploymentDefinition.env.splice(index, 1) + const index = workload.deploymentDefinition.env.findIndex(e => e.name === "TENANT_HOST_PATTERN") + if (index != -1) + workload.deploymentDefinition.env.splice(index, 1) } }