From c74b65952d6d8a6e36f31955534338134c22c25f Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 18:04:26 +0530 Subject: [PATCH 01/16] Updated outdated package version which was causing subscription failure due to a known bug in @sap/cds-mtxs --- .../cap-js-incidents-app/mtx/sidecar/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json index bf19c0fb..65ee5d7e 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -2,11 +2,11 @@ "name": "incidents-mtx", "dependencies": { "@cap-js/sdm": "../../../cap-js-sdm-1.10.0.tgz", - "@sap/cds": "^8", - "@sap/cds-hana": "^2", - "@sap/cds-mtxs": "^2", + "@sap/cds": "^9", + "@cap-js/hana": "^2", + "@sap/cds-mtxs": "^3", "@sap/xsenv": "^5", - "@sap/xssec": "^3", + "@sap/xssec": "^4", "express": "^4" }, "scripts": { From 8f710b0de97e320cf325ad24efb0a89028f63f8b Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 19:21:13 +0530 Subject: [PATCH 02/16] update versions in personal-space app --- .../cap-js-incidents-app/mtx/sidecar/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json index bf19c0fb..65ee5d7e 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -2,11 +2,11 @@ "name": "incidents-mtx", "dependencies": { "@cap-js/sdm": "../../../cap-js-sdm-1.10.0.tgz", - "@sap/cds": "^8", - "@sap/cds-hana": "^2", - "@sap/cds-mtxs": "^2", + "@sap/cds": "^9", + "@cap-js/hana": "^2", + "@sap/cds-mtxs": "^3", "@sap/xsenv": "^5", - "@sap/xssec": "^3", + "@sap/xssec": "^4", "express": "^4" }, "scripts": { From cf4c412dc5f32fcc2540725d42fbeac38c42299b Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 20:20:17 +0530 Subject: [PATCH 03/16] Fix tenant subscription failure caused by unguarded errors[0] access in cds-mtxs _pollError --- .../mtx/sidecar/package.json | 3 +- .../mtx/sidecar/patch-ctnr-mgr.js | 37 +++++++++++++++++++ .../mtx/sidecar/package.json | 3 +- .../mtx/sidecar/patch-ctnr-mgr.js | 37 +++++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js create mode 100644 app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json index 65ee5d7e..1ad9b15e 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -10,7 +10,8 @@ "express": "^4" }, "scripts": { - "start": "cds-serve" + "start": "cds-serve", + "postinstall": "node patch-ctnr-mgr.js" }, "cds": { "profile": "mtx-sidecar" diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js new file mode 100644 index 00000000..d150baca --- /dev/null +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -0,0 +1,37 @@ +/** + * Patches a null-safety bug in @sap/cds-mtxs ctnr-mgr-base.js. + * + * Buggy line (v3.x and v4.x): + * _pollError = (response) => response.data.errors[0] ?? response.data.errors + * + * When Service Manager returns a failed operation without an errors array, + * response.data.errors is undefined and [0] throws: + * TypeError: Cannot read properties of undefined (reading '0') + * This crashes the process and leaves a stuck HDI instance in Service Manager + * on every subscription attempt. + * + * Fix: use optional chaining so a missing errors array returns undefined + * instead of throwing, and cds-mtxs handles it as a generic error. + */ +const fs = require('fs'); +const path = require('path'); + +const filePath = path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'); + +try { + let content = fs.readFileSync(filePath, 'utf8'); + + const buggy = '_pollError = (response) => response.data.errors[0] ?? response.data.errors'; + const fixed = '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors'; + + if (!content.includes(buggy)) { + console.log('[patch-ctnr-mgr] Pattern not found — already patched or version changed, skipping.'); + process.exit(0); + } + + content = content.replace(buggy, fixed); + fs.writeFileSync(filePath, content, 'utf8'); + console.log('[patch-ctnr-mgr] Successfully patched ctnr-mgr-base.js.'); +} catch (e) { + console.warn('[patch-ctnr-mgr] Could not patch ctnr-mgr-base.js:', e.message); +} diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json index 65ee5d7e..1ad9b15e 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -10,7 +10,8 @@ "express": "^4" }, "scripts": { - "start": "cds-serve" + "start": "cds-serve", + "postinstall": "node patch-ctnr-mgr.js" }, "cds": { "profile": "mtx-sidecar" diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js new file mode 100644 index 00000000..d150baca --- /dev/null +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -0,0 +1,37 @@ +/** + * Patches a null-safety bug in @sap/cds-mtxs ctnr-mgr-base.js. + * + * Buggy line (v3.x and v4.x): + * _pollError = (response) => response.data.errors[0] ?? response.data.errors + * + * When Service Manager returns a failed operation without an errors array, + * response.data.errors is undefined and [0] throws: + * TypeError: Cannot read properties of undefined (reading '0') + * This crashes the process and leaves a stuck HDI instance in Service Manager + * on every subscription attempt. + * + * Fix: use optional chaining so a missing errors array returns undefined + * instead of throwing, and cds-mtxs handles it as a generic error. + */ +const fs = require('fs'); +const path = require('path'); + +const filePath = path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'); + +try { + let content = fs.readFileSync(filePath, 'utf8'); + + const buggy = '_pollError = (response) => response.data.errors[0] ?? response.data.errors'; + const fixed = '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors'; + + if (!content.includes(buggy)) { + console.log('[patch-ctnr-mgr] Pattern not found — already patched or version changed, skipping.'); + process.exit(0); + } + + content = content.replace(buggy, fixed); + fs.writeFileSync(filePath, content, 'utf8'); + console.log('[patch-ctnr-mgr] Successfully patched ctnr-mgr-base.js.'); +} catch (e) { + console.warn('[patch-ctnr-mgr] Could not patch ctnr-mgr-base.js:', e.message); +} From ad38d47787331e8fc8a7d0e4c93beefc78118927 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 22:39:53 +0530 Subject: [PATCH 04/16] Fix tenant subscription crash caused by undefined error object in cds-mtxs srv-mgr create() --- .../mtx/sidecar/patch-ctnr-mgr.js | 66 +++++++++++-------- .../mtx/sidecar/patch-ctnr-mgr.js | 66 +++++++++++-------- 2 files changed, 76 insertions(+), 56 deletions(-) diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index d150baca..388b7f16 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,37 +1,47 @@ /** - * Patches a null-safety bug in @sap/cds-mtxs ctnr-mgr-base.js. + * Patches two null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x): * - * Buggy line (v3.x and v4.x): - * _pollError = (response) => response.data.errors[0] ?? response.data.errors + * Bug 1 — ctnr-mgr-base.js _pollError: + * response.data.errors[0] crashes when SM returns a failed operation without an errors array. + * Fix: use optional chaining. * - * When Service Manager returns a failed operation without an errors array, - * response.data.errors is undefined and [0] throws: - * TypeError: Cannot read properties of undefined (reading '0') - * This crashes the process and leaves a stuck HDI instance in Service Manager - * on every subscription attempt. - * - * Fix: use optional chaining so a missing errors array returns undefined - * instead of throwing, and cds-mtxs handles it as a generic error. + * Bug 2 — srv-mgr.js create(): + * `const status = e.status ?? 500` crashes with "Cannot read properties of undefined + * (reading 'status')" when the caught error `e` is itself undefined (SM returned a + * sync 200/no Location header so _poll resolved instead of rejecting, and the + * resulting throw propagates as undefined). + * Fix: guard `e` before reading .status. */ const fs = require('fs'); const path = require('path'); -const filePath = path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'); - -try { - let content = fs.readFileSync(filePath, 'utf8'); - - const buggy = '_pollError = (response) => response.data.errors[0] ?? response.data.errors'; - const fixed = '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors'; - - if (!content.includes(buggy)) { - console.log('[patch-ctnr-mgr] Pattern not found — already patched or version changed, skipping.'); - process.exit(0); +function patch(filePath, buggy, fixed, label) { + try { + let content = fs.readFileSync(filePath, 'utf8'); + if (!content.includes(buggy)) { + console.log(`[patch-ctnr-mgr] ${label}: pattern not found — already patched or version changed, skipping.`); + return; + } + content = content.replace(buggy, fixed); + fs.writeFileSync(filePath, content, 'utf8'); + console.log(`[patch-ctnr-mgr] ${label}: patched successfully.`); + } catch (e) { + console.warn(`[patch-ctnr-mgr] ${label}: could not patch:`, e.message); } - - content = content.replace(buggy, fixed); - fs.writeFileSync(filePath, content, 'utf8'); - console.log('[patch-ctnr-mgr] Successfully patched ctnr-mgr-base.js.'); -} catch (e) { - console.warn('[patch-ctnr-mgr] Could not patch ctnr-mgr-base.js:', e.message); } + +// Bug 1: ctnr-mgr-base.js — _pollError reads .errors[0] without null guard +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), + '_pollError = (response) => response.data.errors[0] ?? response.data.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + 'ctnr-mgr-base.js _pollError' +); + +// Bug 2: srv-mgr.js create() — `e` can be undefined when caught from _poll +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), + 'const status = e.status ?? 500', + 'const status = e?.status ?? 500', + 'srv-mgr.js create() status' +); diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index d150baca..388b7f16 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,37 +1,47 @@ /** - * Patches a null-safety bug in @sap/cds-mtxs ctnr-mgr-base.js. + * Patches two null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x): * - * Buggy line (v3.x and v4.x): - * _pollError = (response) => response.data.errors[0] ?? response.data.errors + * Bug 1 — ctnr-mgr-base.js _pollError: + * response.data.errors[0] crashes when SM returns a failed operation without an errors array. + * Fix: use optional chaining. * - * When Service Manager returns a failed operation without an errors array, - * response.data.errors is undefined and [0] throws: - * TypeError: Cannot read properties of undefined (reading '0') - * This crashes the process and leaves a stuck HDI instance in Service Manager - * on every subscription attempt. - * - * Fix: use optional chaining so a missing errors array returns undefined - * instead of throwing, and cds-mtxs handles it as a generic error. + * Bug 2 — srv-mgr.js create(): + * `const status = e.status ?? 500` crashes with "Cannot read properties of undefined + * (reading 'status')" when the caught error `e` is itself undefined (SM returned a + * sync 200/no Location header so _poll resolved instead of rejecting, and the + * resulting throw propagates as undefined). + * Fix: guard `e` before reading .status. */ const fs = require('fs'); const path = require('path'); -const filePath = path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'); - -try { - let content = fs.readFileSync(filePath, 'utf8'); - - const buggy = '_pollError = (response) => response.data.errors[0] ?? response.data.errors'; - const fixed = '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors'; - - if (!content.includes(buggy)) { - console.log('[patch-ctnr-mgr] Pattern not found — already patched or version changed, skipping.'); - process.exit(0); +function patch(filePath, buggy, fixed, label) { + try { + let content = fs.readFileSync(filePath, 'utf8'); + if (!content.includes(buggy)) { + console.log(`[patch-ctnr-mgr] ${label}: pattern not found — already patched or version changed, skipping.`); + return; + } + content = content.replace(buggy, fixed); + fs.writeFileSync(filePath, content, 'utf8'); + console.log(`[patch-ctnr-mgr] ${label}: patched successfully.`); + } catch (e) { + console.warn(`[patch-ctnr-mgr] ${label}: could not patch:`, e.message); } - - content = content.replace(buggy, fixed); - fs.writeFileSync(filePath, content, 'utf8'); - console.log('[patch-ctnr-mgr] Successfully patched ctnr-mgr-base.js.'); -} catch (e) { - console.warn('[patch-ctnr-mgr] Could not patch ctnr-mgr-base.js:', e.message); } + +// Bug 1: ctnr-mgr-base.js — _pollError reads .errors[0] without null guard +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), + '_pollError = (response) => response.data.errors[0] ?? response.data.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + 'ctnr-mgr-base.js _pollError' +); + +// Bug 2: srv-mgr.js create() — `e` can be undefined when caught from _poll +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), + 'const status = e.status ?? 500', + 'const status = e?.status ?? 500', + 'srv-mgr.js create() status' +); From a4ed37122fe7bb478eb79f0aee70e1eb6bafeaa2 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 23:13:30 +0530 Subject: [PATCH 05/16] Fix incomplete null guard in cds-mtxs srv-mgr catch block causing subscription failure --- .../mtx/sidecar/patch-ctnr-mgr.js | 27 ++++++++++--------- .../mtx/sidecar/patch-ctnr-mgr.js | 27 ++++++++++--------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index 388b7f16..59414c44 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,16 +1,13 @@ /** - * Patches two null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x): + * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). * * Bug 1 — ctnr-mgr-base.js _pollError: * response.data.errors[0] crashes when SM returns a failed operation without an errors array. - * Fix: use optional chaining. * - * Bug 2 — srv-mgr.js create(): - * `const status = e.status ?? 500` crashes with "Cannot read properties of undefined - * (reading 'status')" when the caught error `e` is itself undefined (SM returned a - * sync 200/no Location header so _poll resolved instead of rejecting, and the - * resulting throw propagates as undefined). - * Fix: guard `e` before reading .status. + * Bug 2 — srv-mgr.js create() catch block: + * Multiple accesses to `e` (e.status, e.error, e.code, etc.) crash when the caught value + * is undefined — which happens when _poll resolves/rejects with no error object. + * Fix: add a single guard at the top of the catch block. */ const fs = require('fs'); const path = require('path'); @@ -38,10 +35,16 @@ patch( 'ctnr-mgr-base.js _pollError' ); -// Bug 2: srv-mgr.js create() — `e` can be undefined when caught from _poll +// Bug 2: srv-mgr.js — catch block accesses e.status, e.error, etc. but e can be undefined. +// Guard the entire catch block with a single early check instead of patching each access. patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - 'const status = e.status ?? 500', - 'const status = e?.status ?? 500', - 'srv-mgr.js create() status' + ` } catch (e) { + this.instanceLocations.delete(tenant) + const status = e.status ?? 500`, + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e.status ?? 500`, + 'srv-mgr.js create() catch block guard' ); diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index 388b7f16..59414c44 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,16 +1,13 @@ /** - * Patches two null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x): + * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). * * Bug 1 — ctnr-mgr-base.js _pollError: * response.data.errors[0] crashes when SM returns a failed operation without an errors array. - * Fix: use optional chaining. * - * Bug 2 — srv-mgr.js create(): - * `const status = e.status ?? 500` crashes with "Cannot read properties of undefined - * (reading 'status')" when the caught error `e` is itself undefined (SM returned a - * sync 200/no Location header so _poll resolved instead of rejecting, and the - * resulting throw propagates as undefined). - * Fix: guard `e` before reading .status. + * Bug 2 — srv-mgr.js create() catch block: + * Multiple accesses to `e` (e.status, e.error, e.code, etc.) crash when the caught value + * is undefined — which happens when _poll resolves/rejects with no error object. + * Fix: add a single guard at the top of the catch block. */ const fs = require('fs'); const path = require('path'); @@ -38,10 +35,16 @@ patch( 'ctnr-mgr-base.js _pollError' ); -// Bug 2: srv-mgr.js create() — `e` can be undefined when caught from _poll +// Bug 2: srv-mgr.js — catch block accesses e.status, e.error, etc. but e can be undefined. +// Guard the entire catch block with a single early check instead of patching each access. patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - 'const status = e.status ?? 500', - 'const status = e?.status ?? 500', - 'srv-mgr.js create() status' + ` } catch (e) { + this.instanceLocations.delete(tenant) + const status = e.status ?? 500`, + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e.status ?? 500`, + 'srv-mgr.js create() catch block guard' ); From f8072321c2faa96486df29e60fa04547afbb9a8b Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Wed, 1 Jul 2026 23:32:55 +0530 Subject: [PATCH 06/16] Ensure _pollError always returns a proper Error to surface real SM failure reason --- .../mtx/sidecar/patch-ctnr-mgr.js | 48 +++++++++++++++---- .../mtx/sidecar/patch-ctnr-mgr.js | 48 +++++++++++++++---- 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index 59414c44..e35de4b7 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,13 +1,20 @@ /** * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). * + * Root cause chain: + * 1. SM returns a failed operation without an errors array + * 2. _pollError returns `undefined` (both sides of ?? are undefined) + * 3. reject(undefined) is called inside _poll + * 4. The caller's catch(e) receives e = undefined + * 5. Any access to e.status / e.error etc. crashes + * * Bug 1 — ctnr-mgr-base.js _pollError: - * response.data.errors[0] crashes when SM returns a failed operation without an errors array. + * Must always return a proper Error. Current patch only adds optional chaining + * but still returns undefined when errors is absent. Fix: fall through to a + * meaningful Error so reject() always gets a real object. * * Bug 2 — srv-mgr.js create() catch block: - * Multiple accesses to `e` (e.status, e.error, e.code, etc.) crash when the caught value - * is undefined — which happens when _poll resolves/rejects with no error object. - * Fix: add a single guard at the top of the catch block. + * Guard e before any property access as a defensive safety net. */ const fs = require('fs'); const path = require('path'); @@ -27,16 +34,27 @@ function patch(filePath, buggy, fixed, label) { } } -// Bug 1: ctnr-mgr-base.js — _pollError reads .errors[0] without null guard +// Bug 1: _pollError must always return a proper Error, never undefined. +// Original: response.data.errors[0] ?? response.data.errors +// Previous partial patch: response.data?.errors?.[0] ?? response.data?.errors +// → still returns undefined when errors is absent → reject(undefined) → catch(e) gets undefined +// Fix: fall through to a real Error so reject() always has something to work with. patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), '_pollError = (response) => response.data.errors[0] ?? response.data.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', 'ctnr-mgr-base.js _pollError' ); -// Bug 2: srv-mgr.js — catch block accesses e.status, e.error, etc. but e can be undefined. -// Guard the entire catch block with a single early check instead of patching each access. +// Also handle the case where the previous partial patch was already applied +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', + 'ctnr-mgr-base.js _pollError (already partially patched)' +); + +// Bug 2: catch block guard — defensive safety net for any other undefined throw patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), ` } catch (e) { @@ -48,3 +66,17 @@ patch( const status = e.status ?? 500`, 'srv-mgr.js create() catch block guard' ); + +// Also handle already-partially-patched variant (e?.status from previous run) +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e?.status ?? 500`, + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e.status ?? 500`, + 'srv-mgr.js create() catch block guard (already partially patched)' +); diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js index 59414c44..e35de4b7 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js @@ -1,13 +1,20 @@ /** * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). * + * Root cause chain: + * 1. SM returns a failed operation without an errors array + * 2. _pollError returns `undefined` (both sides of ?? are undefined) + * 3. reject(undefined) is called inside _poll + * 4. The caller's catch(e) receives e = undefined + * 5. Any access to e.status / e.error etc. crashes + * * Bug 1 — ctnr-mgr-base.js _pollError: - * response.data.errors[0] crashes when SM returns a failed operation without an errors array. + * Must always return a proper Error. Current patch only adds optional chaining + * but still returns undefined when errors is absent. Fix: fall through to a + * meaningful Error so reject() always gets a real object. * * Bug 2 — srv-mgr.js create() catch block: - * Multiple accesses to `e` (e.status, e.error, e.code, etc.) crash when the caught value - * is undefined — which happens when _poll resolves/rejects with no error object. - * Fix: add a single guard at the top of the catch block. + * Guard e before any property access as a defensive safety net. */ const fs = require('fs'); const path = require('path'); @@ -27,16 +34,27 @@ function patch(filePath, buggy, fixed, label) { } } -// Bug 1: ctnr-mgr-base.js — _pollError reads .errors[0] without null guard +// Bug 1: _pollError must always return a proper Error, never undefined. +// Original: response.data.errors[0] ?? response.data.errors +// Previous partial patch: response.data?.errors?.[0] ?? response.data?.errors +// → still returns undefined when errors is absent → reject(undefined) → catch(e) gets undefined +// Fix: fall through to a real Error so reject() always has something to work with. patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), '_pollError = (response) => response.data.errors[0] ?? response.data.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', 'ctnr-mgr-base.js _pollError' ); -// Bug 2: srv-mgr.js — catch block accesses e.status, e.error, etc. but e can be undefined. -// Guard the entire catch block with a single early check instead of patching each access. +// Also handle the case where the previous partial patch was already applied +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', + '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', + 'ctnr-mgr-base.js _pollError (already partially patched)' +); + +// Bug 2: catch block guard — defensive safety net for any other undefined throw patch( path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), ` } catch (e) { @@ -48,3 +66,17 @@ patch( const status = e.status ?? 500`, 'srv-mgr.js create() catch block guard' ); + +// Also handle already-partially-patched variant (e?.status from previous run) +patch( + path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e?.status ?? 500`, + ` } catch (e) { + this.instanceLocations.delete(tenant) + if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') + const status = e.status ?? 500`, + 'srv-mgr.js create() catch block guard (already partially patched)' +); From 7b8d02d91f90cb492781d967b05d012e8144313e Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 09:15:55 +0530 Subject: [PATCH 07/16] Updated workflow to read DATABASE_ID from secrets and remove changes that are not needed --- .github/workflows/multiTenant_deploy.yml | 5 ++ ...ultiTenant_deploy_and_Integration_test.yml | 5 ++ .../mtx/sidecar/package.json | 3 +- .../mtx/sidecar/patch-ctnr-mgr.js | 82 ------------------- .../cap-js-incidents-app/package.json | 7 +- .../mtx/sidecar/package.json | 3 +- .../mtx/sidecar/patch-ctnr-mgr.js | 82 ------------------- .../cap-js-incidents-app/package.json | 7 +- 8 files changed, 24 insertions(+), 170 deletions(-) delete mode 100644 app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js delete mode 100644 app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index 36b66ffe..41f60f3e 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -59,6 +59,11 @@ jobs: yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}")' mta.yaml + - name: Inject DATABASE_ID into package.json + working-directory: app/multi-tenant/personal-space/cap-js-incidents-app + run: | + sed -i 's/\$DATABASE_ID/${{ secrets.DATABASE_ID }}/g' package.json + - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app run: | diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index c12f1219..7335882f 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -57,6 +57,11 @@ jobs: yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID_MT }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID_MT }}")' mta.yaml + - name: Inject DATABASE_ID into package.json + working-directory: app/multi-tenant/central-space/cap-js-incidents-app + run: | + sed -i 's/\$DATABASE_ID/${{ secrets.DATABASE_ID }}/g' package.json + - name: Build and deploy working-directory: app/multi-tenant/central-space/cap-js-incidents-app run: | diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json index 1ad9b15e..65ee5d7e 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -10,8 +10,7 @@ "express": "^4" }, "scripts": { - "start": "cds-serve", - "postinstall": "node patch-ctnr-mgr.js" + "start": "cds-serve" }, "cds": { "profile": "mtx-sidecar" diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js deleted file mode 100644 index e35de4b7..00000000 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). - * - * Root cause chain: - * 1. SM returns a failed operation without an errors array - * 2. _pollError returns `undefined` (both sides of ?? are undefined) - * 3. reject(undefined) is called inside _poll - * 4. The caller's catch(e) receives e = undefined - * 5. Any access to e.status / e.error etc. crashes - * - * Bug 1 — ctnr-mgr-base.js _pollError: - * Must always return a proper Error. Current patch only adds optional chaining - * but still returns undefined when errors is absent. Fix: fall through to a - * meaningful Error so reject() always gets a real object. - * - * Bug 2 — srv-mgr.js create() catch block: - * Guard e before any property access as a defensive safety net. - */ -const fs = require('fs'); -const path = require('path'); - -function patch(filePath, buggy, fixed, label) { - try { - let content = fs.readFileSync(filePath, 'utf8'); - if (!content.includes(buggy)) { - console.log(`[patch-ctnr-mgr] ${label}: pattern not found — already patched or version changed, skipping.`); - return; - } - content = content.replace(buggy, fixed); - fs.writeFileSync(filePath, content, 'utf8'); - console.log(`[patch-ctnr-mgr] ${label}: patched successfully.`); - } catch (e) { - console.warn(`[patch-ctnr-mgr] ${label}: could not patch:`, e.message); - } -} - -// Bug 1: _pollError must always return a proper Error, never undefined. -// Original: response.data.errors[0] ?? response.data.errors -// Previous partial patch: response.data?.errors?.[0] ?? response.data?.errors -// → still returns undefined when errors is absent → reject(undefined) → catch(e) gets undefined -// Fix: fall through to a real Error so reject() always has something to work with. -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), - '_pollError = (response) => response.data.errors[0] ?? response.data.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', - 'ctnr-mgr-base.js _pollError' -); - -// Also handle the case where the previous partial patch was already applied -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', - 'ctnr-mgr-base.js _pollError (already partially patched)' -); - -// Bug 2: catch block guard — defensive safety net for any other undefined throw -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - ` } catch (e) { - this.instanceLocations.delete(tenant) - const status = e.status ?? 500`, - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e.status ?? 500`, - 'srv-mgr.js create() catch block guard' -); - -// Also handle already-partially-patched variant (e?.status from previous run) -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e?.status ?? 500`, - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e.status ?? 500`, - 'srv-mgr.js create() catch block guard (already partially patched)' -); diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/package.json index a9cda489..6cfca521 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/package.json @@ -56,7 +56,12 @@ "cds": { "requires": { "cds.xt.DeploymentService": { - "preset": "in-sidecar" + "preset": "in-sidecar", + "hdi": { + "create": { + "database_id": "$DATABASE_ID" + } + } }, "auth": { "[development]": { diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json index 1ad9b15e..65ee5d7e 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -10,8 +10,7 @@ "express": "^4" }, "scripts": { - "start": "cds-serve", - "postinstall": "node patch-ctnr-mgr.js" + "start": "cds-serve" }, "cds": { "profile": "mtx-sidecar" diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js deleted file mode 100644 index e35de4b7..00000000 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/patch-ctnr-mgr.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Patches null-safety bugs in @sap/cds-mtxs (present in v3.x and v4.x). - * - * Root cause chain: - * 1. SM returns a failed operation without an errors array - * 2. _pollError returns `undefined` (both sides of ?? are undefined) - * 3. reject(undefined) is called inside _poll - * 4. The caller's catch(e) receives e = undefined - * 5. Any access to e.status / e.error etc. crashes - * - * Bug 1 — ctnr-mgr-base.js _pollError: - * Must always return a proper Error. Current patch only adds optional chaining - * but still returns undefined when errors is absent. Fix: fall through to a - * meaningful Error so reject() always gets a real object. - * - * Bug 2 — srv-mgr.js create() catch block: - * Guard e before any property access as a defensive safety net. - */ -const fs = require('fs'); -const path = require('path'); - -function patch(filePath, buggy, fixed, label) { - try { - let content = fs.readFileSync(filePath, 'utf8'); - if (!content.includes(buggy)) { - console.log(`[patch-ctnr-mgr] ${label}: pattern not found — already patched or version changed, skipping.`); - return; - } - content = content.replace(buggy, fixed); - fs.writeFileSync(filePath, content, 'utf8'); - console.log(`[patch-ctnr-mgr] ${label}: patched successfully.`); - } catch (e) { - console.warn(`[patch-ctnr-mgr] ${label}: could not patch:`, e.message); - } -} - -// Bug 1: _pollError must always return a proper Error, never undefined. -// Original: response.data.errors[0] ?? response.data.errors -// Previous partial patch: response.data?.errors?.[0] ?? response.data?.errors -// → still returns undefined when errors is absent → reject(undefined) → catch(e) gets undefined -// Fix: fall through to a real Error so reject() always has something to work with. -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), - '_pollError = (response) => response.data.errors[0] ?? response.data.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', - 'ctnr-mgr-base.js _pollError' -); - -// Also handle the case where the previous partial patch was already applied -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js'), - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors', - '_pollError = (response) => response.data?.errors?.[0] ?? response.data?.errors ?? new Error(`Service Manager operation failed with state: ${response.data?.state ?? \'unknown\'}`)', - 'ctnr-mgr-base.js _pollError (already partially patched)' -); - -// Bug 2: catch block guard — defensive safety net for any other undefined throw -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - ` } catch (e) { - this.instanceLocations.delete(tenant) - const status = e.status ?? 500`, - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e.status ?? 500`, - 'srv-mgr.js create() catch block guard' -); - -// Also handle already-partially-patched variant (e?.status from previous run) -patch( - path.join(__dirname, 'node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js'), - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e?.status ?? 500`, - ` } catch (e) { - this.instanceLocations.delete(tenant) - if (!e) throw new Error('HDI container creation failed with no error details from Service Manager') - const status = e.status ?? 500`, - 'srv-mgr.js create() catch block guard (already partially patched)' -); diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/package.json index a9cda489..6cfca521 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/package.json @@ -56,7 +56,12 @@ "cds": { "requires": { "cds.xt.DeploymentService": { - "preset": "in-sidecar" + "preset": "in-sidecar", + "hdi": { + "create": { + "database_id": "$DATABASE_ID" + } + } }, "auth": { "[development]": { From 9f0c48a03ffd6c8c6ee9e94b17547ee0402b50bf Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 09:37:56 +0530 Subject: [PATCH 08/16] Fix database_id injection to target mtx sidecar package.json --- .github/workflows/multiTenant_deploy.yml | 2 +- .../multiTenant_deploy_and_Integration_test.yml | 2 +- .../cap-js-incidents-app/mtx/sidecar/package.json | 11 ++++++++++- .../central-space/cap-js-incidents-app/package.json | 7 +------ .../cap-js-incidents-app/mtx/sidecar/package.json | 11 ++++++++++- .../personal-space/cap-js-incidents-app/package.json | 7 +------ 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index 41f60f3e..a61c3d67 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -62,7 +62,7 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/personal-space/cap-js-incidents-app run: | - sed -i 's/\$DATABASE_ID/${{ secrets.DATABASE_ID }}/g' package.json + sed -i 's|\$DATABASE_ID|${{ secrets.DATABASE_ID }}|g' mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index 7335882f..b1f7e821 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -60,7 +60,7 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/central-space/cap-js-incidents-app run: | - sed -i 's/\$DATABASE_ID/${{ secrets.DATABASE_ID }}/g' package.json + sed -i 's|\$DATABASE_ID|${{ secrets.DATABASE_ID }}|g' mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/central-space/cap-js-incidents-app diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json index 65ee5d7e..3dc8c7f1 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -13,6 +13,15 @@ "start": "cds-serve" }, "cds": { - "profile": "mtx-sidecar" + "profile": "mtx-sidecar", + "requires": { + "cds.xt.DeploymentService": { + "hdi": { + "create": { + "database_id": "$DATABASE_ID" + } + } + } + } } } diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/package.json index 6cfca521..a9cda489 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/package.json @@ -56,12 +56,7 @@ "cds": { "requires": { "cds.xt.DeploymentService": { - "preset": "in-sidecar", - "hdi": { - "create": { - "database_id": "$DATABASE_ID" - } - } + "preset": "in-sidecar" }, "auth": { "[development]": { diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json index 65ee5d7e..3dc8c7f1 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -13,6 +13,15 @@ "start": "cds-serve" }, "cds": { - "profile": "mtx-sidecar" + "profile": "mtx-sidecar", + "requires": { + "cds.xt.DeploymentService": { + "hdi": { + "create": { + "database_id": "$DATABASE_ID" + } + } + } + } } } diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/package.json index 6cfca521..a9cda489 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/package.json @@ -56,12 +56,7 @@ "cds": { "requires": { "cds.xt.DeploymentService": { - "preset": "in-sidecar", - "hdi": { - "create": { - "database_id": "$DATABASE_ID" - } - } + "preset": "in-sidecar" }, "auth": { "[development]": { From 37d9b528fc59242e78b25fb55b51abe19557b43e Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 09:58:24 +0530 Subject: [PATCH 09/16] Fix DATABASE_ID secret injection using step-level env variable --- .github/workflows/multiTenant_deploy.yml | 4 +++- .github/workflows/multiTenant_deploy_and_Integration_test.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index a61c3d67..aa41d95c 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -61,8 +61,10 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/personal-space/cap-js-incidents-app + env: + DATABASE_ID: ${{ secrets.DATABASE_ID }} run: | - sed -i 's|\$DATABASE_ID|${{ secrets.DATABASE_ID }}|g' mtx/sidecar/package.json + sed -i "s|\$DATABASE_ID|${DATABASE_ID}|g" mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index b1f7e821..cb6b0306 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -59,8 +59,10 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/central-space/cap-js-incidents-app + env: + DATABASE_ID: ${{ secrets.DATABASE_ID }} run: | - sed -i 's|\$DATABASE_ID|${{ secrets.DATABASE_ID }}|g' mtx/sidecar/package.json + sed -i "s|\$DATABASE_ID|${DATABASE_ID}|g" mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/central-space/cap-js-incidents-app From a682f044de4f1e43c9beed8a4999b478d970d079 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 10:22:33 +0530 Subject: [PATCH 10/16] Fix DATABASE_ID injection using yq consistent with REPOSITORY_ID pattern --- .github/workflows/multiTenant_deploy.yml | 4 +--- .github/workflows/multiTenant_deploy_and_Integration_test.yml | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index aa41d95c..dc07fb86 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -61,10 +61,8 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/personal-space/cap-js-incidents-app - env: - DATABASE_ID: ${{ secrets.DATABASE_ID }} run: | - sed -i "s|\$DATABASE_ID|${DATABASE_ID}|g" mtx/sidecar/package.json + yq -i e '.cds.requires["cds.xt.DeploymentService"].hdi.create.database_id = "${{ secrets.DATABASE_ID }}"' mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index cb6b0306..60c12b79 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -59,10 +59,8 @@ jobs: - name: Inject DATABASE_ID into package.json working-directory: app/multi-tenant/central-space/cap-js-incidents-app - env: - DATABASE_ID: ${{ secrets.DATABASE_ID }} run: | - sed -i "s|\$DATABASE_ID|${DATABASE_ID}|g" mtx/sidecar/package.json + yq -i e '.cds.requires["cds.xt.DeploymentService"].hdi.create.database_id = "${{ secrets.DATABASE_ID }}"' mtx/sidecar/package.json - name: Build and deploy working-directory: app/multi-tenant/central-space/cap-js-incidents-app From dde5438b9950a1889a36d345181c85a86a2eff4b Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 11:15:40 +0530 Subject: [PATCH 11/16] Inject DATABASE_ID via mta.yaml environment property to survive cds build --- .github/workflows/multiTenant_deploy.yml | 6 +----- .../workflows/multiTenant_deploy_and_Integration_test.yml | 6 +----- .../central-space/cap-js-incidents-app/mta.yaml | 2 ++ .../personal-space/cap-js-incidents-app/mta.yaml | 2 ++ 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index dc07fb86..2f7b070f 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -58,11 +58,7 @@ jobs: sudo chmod a+x /usr/local/bin/yq yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}")' mta.yaml - - - name: Inject DATABASE_ID into package.json - working-directory: app/multi-tenant/personal-space/cap-js-incidents-app - run: | - yq -i e '.cds.requires["cds.xt.DeploymentService"].hdi.create.database_id = "${{ secrets.DATABASE_ID }}"' mtx/sidecar/package.json + yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).properties.DATABASE_ID = "${{ secrets.DATABASE_ID }}"' mta.yaml - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index 60c12b79..afd7a26c 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -56,11 +56,7 @@ jobs: sudo chmod a+x /usr/local/bin/yq yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID_MT }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID_MT }}")' mta.yaml - - - name: Inject DATABASE_ID into package.json - working-directory: app/multi-tenant/central-space/cap-js-incidents-app - run: | - yq -i e '.cds.requires["cds.xt.DeploymentService"].hdi.create.database_id = "${{ secrets.DATABASE_ID }}"' mtx/sidecar/package.json + yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).properties.DATABASE_ID = "${{ secrets.DATABASE_ID }}"' mta.yaml - name: Build and deploy working-directory: app/multi-tenant/central-space/cap-js-incidents-app diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mta.yaml b/app/multi-tenant/central-space/cap-js-incidents-app/mta.yaml index 3ebdc6bf..831f3a69 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mta.yaml +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mta.yaml @@ -42,6 +42,8 @@ modules: # but let's give it a try here # https://cap.cloud.sap/docs/guides/multitenancy/#update-database-schema-for-tenants command: cds-mtx upgrade '*' + properties: + DATABASE_ID: REPLACE_WITH_YOUR_DATABASE_ID provides: - name: mtx-api properties: diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mta.yaml b/app/multi-tenant/personal-space/cap-js-incidents-app/mta.yaml index 1ea444b0..947d1b76 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mta.yaml +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mta.yaml @@ -42,6 +42,8 @@ modules: # but let's give it a try here # https://cap.cloud.sap/docs/guides/multitenancy/#update-database-schema-for-tenants command: cds-mtx upgrade '*' + properties: + DATABASE_ID: REPLACE_WITH_YOUR_DATABASE_ID provides: - name: mtx-api properties: From 9d545ed8a86163645b462e99189542a13a582ea2 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 12:17:27 +0530 Subject: [PATCH 12/16] Add diagnostic logging for DATABASE_ID env var configuration in sidecar server --- .../cap-js-incidents-app/mtx/sidecar/package.json | 11 +---------- .../cap-js-incidents-app/mtx/sidecar/server.js | 15 +++++++++++++++ .../cap-js-incidents-app/mtx/sidecar/package.json | 11 +---------- .../cap-js-incidents-app/mtx/sidecar/server.js | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json index 3dc8c7f1..65ee5d7e 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -13,15 +13,6 @@ "start": "cds-serve" }, "cds": { - "profile": "mtx-sidecar", - "requires": { - "cds.xt.DeploymentService": { - "hdi": { - "create": { - "database_id": "$DATABASE_ID" - } - } - } - } + "profile": "mtx-sidecar" } } diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js index 8f8b8dac..2288b6e4 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js @@ -9,6 +9,21 @@ cds.once('bootstrap', async (app) => { LOG.error('Hello'); app.disable('x-powered-by'); + // Set database_id from environment variable at runtime + const databaseId = process.env.DATABASE_ID; + LOG.info(`DATABASE_ID env var value: "${databaseId}"`); + + if (databaseId && databaseId !== 'REPLACE_WITH_YOUR_DATABASE_ID') { + cds.env.requires['cds.xt.DeploymentService'] ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi.create ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi.create.database_id = databaseId; + LOG.info(`Configured HDI database_id: ${databaseId}`); + LOG.info(`Full DeploymentService hdi config: ${JSON.stringify(cds.env.requires['cds.xt.DeploymentService'].hdi)}`); + } else { + LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder (value: "${databaseId}"). HDI container creation will fail. Set DATABASE_ID to the HANA Cloud instance GUID.`); + } + try { const services = xsenv.getServices({ runtimeRepo: { tag: 'html5-apps-repo-rt' }, diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json index 3dc8c7f1..65ee5d7e 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/package.json @@ -13,15 +13,6 @@ "start": "cds-serve" }, "cds": { - "profile": "mtx-sidecar", - "requires": { - "cds.xt.DeploymentService": { - "hdi": { - "create": { - "database_id": "$DATABASE_ID" - } - } - } - } + "profile": "mtx-sidecar" } } diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js index 8f8b8dac..2288b6e4 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js @@ -9,6 +9,21 @@ cds.once('bootstrap', async (app) => { LOG.error('Hello'); app.disable('x-powered-by'); + // Set database_id from environment variable at runtime + const databaseId = process.env.DATABASE_ID; + LOG.info(`DATABASE_ID env var value: "${databaseId}"`); + + if (databaseId && databaseId !== 'REPLACE_WITH_YOUR_DATABASE_ID') { + cds.env.requires['cds.xt.DeploymentService'] ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi.create ??= {}; + cds.env.requires['cds.xt.DeploymentService'].hdi.create.database_id = databaseId; + LOG.info(`Configured HDI database_id: ${databaseId}`); + LOG.info(`Full DeploymentService hdi config: ${JSON.stringify(cds.env.requires['cds.xt.DeploymentService'].hdi)}`); + } else { + LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder (value: "${databaseId}"). HDI container creation will fail. Set DATABASE_ID to the HANA Cloud instance GUID.`); + } + try { const services = xsenv.getServices({ runtimeRepo: { tag: 'html5-apps-repo-rt' }, From 7db2f5e90525127de4b1c7d7fd2632ec42a89836 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 12:43:31 +0530 Subject: [PATCH 13/16] Add comprehensive diagnostics to workflow for DATABASE_ID injection debugging --- .github/workflows/multiTenant_deploy.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index 2f7b070f..d9145504 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -53,13 +53,31 @@ jobs: - name: Inject REPOSITORY_ID into mta.yaml working-directory: app/multi-tenant/personal-space/cap-js-incidents-app + env: + DATABASE_ID_VAL: ${{ secrets.DATABASE_ID }} + REPOSITORY_ID_VAL: ${{ secrets.REPOSITORY_ID }} run: | sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 sudo chmod a+x /usr/local/bin/yq + + echo "=== Secret diagnostics ===" + echo "DATABASE_ID secret length: ${#DATABASE_ID_VAL}" + echo "REPOSITORY_ID secret length: ${#REPOSITORY_ID_VAL}" + echo "DATABASE_ID value (masked by GitHub if set): $DATABASE_ID_VAL" + + echo "=== mta.yaml before injection ===" + grep -E "DATABASE_ID|REPOSITORY_ID" mta.yaml + yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}")' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).properties.DATABASE_ID = "${{ secrets.DATABASE_ID }}"' mta.yaml + echo "=== mta.yaml after injection ===" + grep -E "DATABASE_ID|REPOSITORY_ID" mta.yaml + + echo "=== incidents-mtx-mtx module properties after injection ===" + yq e '.modules[] | select(.name == "incidents-mtx-mtx") | .properties' mta.yaml + - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app run: | @@ -68,5 +86,9 @@ jobs: sudo mv mbt /usr/local/bin/ npm i @sap/cds-dk -g mbt build + echo "=== gen/mtx/sidecar/package.json after build ===" + cat gen/mtx/sidecar/package.json cf install-plugin multiapps -f cf deploy mta_archives/capire.incidents.mtx_0.0.3.mtar -f + echo "=== CF env on incidents-mtx-mtx after deploy ===" + cf env incidents-mtx-mtx | grep -E "DATABASE_ID|REPOSITORY_ID" From fcba23374f60a3fcfa8de056876b339bd46662b7 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 14:00:54 +0530 Subject: [PATCH 14/16] Clean up diagnostics and make central-space and personal-space identical --- .github/workflows/multiTenant_deploy.yml | 26 ++----------------- ...ultiTenant_deploy_and_Integration_test.yml | 2 +- .../mtx/sidecar/server.js | 9 ++----- .../mtx/sidecar/server.js | 9 ++----- 4 files changed, 7 insertions(+), 39 deletions(-) diff --git a/.github/workflows/multiTenant_deploy.yml b/.github/workflows/multiTenant_deploy.yml index d9145504..0b8e3529 100644 --- a/.github/workflows/multiTenant_deploy.yml +++ b/.github/workflows/multiTenant_deploy.yml @@ -43,7 +43,7 @@ jobs: sudo apt update sudo apt install cf8-cli cf login -a "$CF_API" -u "$CF_USER" -p "$CF_PASSWORD" -o "$CF_ORG" -s "${{ github.event.inputs.space }}" - + - name: Prepare app & Build and deploy run: | npm pack @@ -51,33 +51,15 @@ jobs: cd app/multi-tenant/personal-space/cap-js-incidents-app npm i *.tgz - - name: Inject REPOSITORY_ID into mta.yaml + - name: Inject secrets into mta.yaml working-directory: app/multi-tenant/personal-space/cap-js-incidents-app - env: - DATABASE_ID_VAL: ${{ secrets.DATABASE_ID }} - REPOSITORY_ID_VAL: ${{ secrets.REPOSITORY_ID }} run: | sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 sudo chmod a+x /usr/local/bin/yq - - echo "=== Secret diagnostics ===" - echo "DATABASE_ID secret length: ${#DATABASE_ID_VAL}" - echo "REPOSITORY_ID secret length: ${#REPOSITORY_ID_VAL}" - echo "DATABASE_ID value (masked by GitHub if set): $DATABASE_ID_VAL" - - echo "=== mta.yaml before injection ===" - grep -E "DATABASE_ID|REPOSITORY_ID" mta.yaml - yq -i e '(.modules[] | select(.name == "incidents-mtx-srv")).properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}"' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).requires[] |= (select(.name == "app-api").properties.REPOSITORY_ID = "${{ secrets.REPOSITORY_ID }}")' mta.yaml yq -i e '(.modules[] | select(.name == "incidents-mtx-mtx")).properties.DATABASE_ID = "${{ secrets.DATABASE_ID }}"' mta.yaml - echo "=== mta.yaml after injection ===" - grep -E "DATABASE_ID|REPOSITORY_ID" mta.yaml - - echo "=== incidents-mtx-mtx module properties after injection ===" - yq e '.modules[] | select(.name == "incidents-mtx-mtx") | .properties' mta.yaml - - name: Build and deploy working-directory: app/multi-tenant/personal-space/cap-js-incidents-app run: | @@ -86,9 +68,5 @@ jobs: sudo mv mbt /usr/local/bin/ npm i @sap/cds-dk -g mbt build - echo "=== gen/mtx/sidecar/package.json after build ===" - cat gen/mtx/sidecar/package.json cf install-plugin multiapps -f cf deploy mta_archives/capire.incidents.mtx_0.0.3.mtar -f - echo "=== CF env on incidents-mtx-mtx after deploy ===" - cf env incidents-mtx-mtx | grep -E "DATABASE_ID|REPOSITORY_ID" diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index afd7a26c..372e6b79 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -49,7 +49,7 @@ jobs: cd app/multi-tenant/central-space/cap-js-incidents-app npm i *.tgz - - name: Inject REPOSITORY_ID into mta.yaml + - name: Inject secrets into mta.yaml working-directory: app/multi-tenant/central-space/cap-js-incidents-app run: | sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 diff --git a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js index 2288b6e4..07aad5ef 100644 --- a/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js +++ b/app/multi-tenant/central-space/cap-js-incidents-app/mtx/sidecar/server.js @@ -9,19 +9,15 @@ cds.once('bootstrap', async (app) => { LOG.error('Hello'); app.disable('x-powered-by'); - // Set database_id from environment variable at runtime const databaseId = process.env.DATABASE_ID; - LOG.info(`DATABASE_ID env var value: "${databaseId}"`); - if (databaseId && databaseId !== 'REPLACE_WITH_YOUR_DATABASE_ID') { cds.env.requires['cds.xt.DeploymentService'] ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi.create ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi.create.database_id = databaseId; - LOG.info(`Configured HDI database_id: ${databaseId}`); - LOG.info(`Full DeploymentService hdi config: ${JSON.stringify(cds.env.requires['cds.xt.DeploymentService'].hdi)}`); + LOG.info(`Configured HDI database_id from environment`); } else { - LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder (value: "${databaseId}"). HDI container creation will fail. Set DATABASE_ID to the HANA Cloud instance GUID.`); + LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder. HDI container creation will fail.`); } try { @@ -43,7 +39,6 @@ cds.once('bootstrap', async (app) => { LOG.info(`Configured SaaS dependency to SDM: ${runtimeSdmXsappname}`); LOG.info(`Configured SaaS dependency to Destination: ${runtimeDestinationXsappname}`); } catch (err) { - // LOG.warn(`Could not find service binding for HTML5 app repo runtime. Skipping Saas dependency setup. Error: ${err.message}`); LOG.warn(`Could not find service binding for needed dependency. Skipping Saas dependency setup. Error: ${err.message}`); } }); diff --git a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js index 2288b6e4..07aad5ef 100644 --- a/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js +++ b/app/multi-tenant/personal-space/cap-js-incidents-app/mtx/sidecar/server.js @@ -9,19 +9,15 @@ cds.once('bootstrap', async (app) => { LOG.error('Hello'); app.disable('x-powered-by'); - // Set database_id from environment variable at runtime const databaseId = process.env.DATABASE_ID; - LOG.info(`DATABASE_ID env var value: "${databaseId}"`); - if (databaseId && databaseId !== 'REPLACE_WITH_YOUR_DATABASE_ID') { cds.env.requires['cds.xt.DeploymentService'] ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi.create ??= {}; cds.env.requires['cds.xt.DeploymentService'].hdi.create.database_id = databaseId; - LOG.info(`Configured HDI database_id: ${databaseId}`); - LOG.info(`Full DeploymentService hdi config: ${JSON.stringify(cds.env.requires['cds.xt.DeploymentService'].hdi)}`); + LOG.info(`Configured HDI database_id from environment`); } else { - LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder (value: "${databaseId}"). HDI container creation will fail. Set DATABASE_ID to the HANA Cloud instance GUID.`); + LOG.error(`DATABASE_ID environment variable is not set or is still the placeholder. HDI container creation will fail.`); } try { @@ -43,7 +39,6 @@ cds.once('bootstrap', async (app) => { LOG.info(`Configured SaaS dependency to SDM: ${runtimeSdmXsappname}`); LOG.info(`Configured SaaS dependency to Destination: ${runtimeDestinationXsappname}`); } catch (err) { - // LOG.warn(`Could not find service binding for HTML5 app repo runtime. Skipping Saas dependency setup. Error: ${err.message}`); LOG.warn(`Could not find service binding for needed dependency. Skipping Saas dependency setup. Error: ${err.message}`); } }); From 9fda2052a812b097f2138ef4c4d63d7ca1519b70 Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Thu, 2 Jul 2026 16:15:10 +0530 Subject: [PATCH 15/16] Update xsappname in leading apps for individual spaces --- app/single-tenant/personal-space/incidents-app/mta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/single-tenant/personal-space/incidents-app/mta.yaml b/app/single-tenant/personal-space/incidents-app/mta.yaml index 32d588b0..494c95fe 100644 --- a/app/single-tenant/personal-space/incidents-app/mta.yaml +++ b/app/single-tenant/personal-space/incidents-app/mta.yaml @@ -136,7 +136,7 @@ resources: parameters: config: tenant-mode: dedicated - xsappname: sdmincidents + xsappname: sdmincidents-${org}-${space} oauth2-configuration: redirect-uris: - ~{app-api/app-url}/** From 6770755478467b0a26fded3e899614989b52523d Mon Sep 17 00:00:00 2001 From: "Yashmeet ." Date: Fri, 3 Jul 2026 15:57:53 +0530 Subject: [PATCH 16/16] Added PujaDeshmukh17 as codeowners --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7015270f..f4dfeb97 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,5 +2,5 @@ # before a PR can be merged (enforced when branch protection requires CODEOWNER review). # Any change to workflow files or GitHub config must be reviewed by the designated owner -/.github/ @vibhutikumar07 @yashmeet29 -/.github/workflows/ @vibhutikumar07 @yashmeet29 +/.github/ @vibhutikumar07 @yashmeet29 @PujaDeshmukh17 +/.github/workflows/ @vibhutikumar07 @yashmeet29 @PujaDeshmukh17