From 8e296356333ed87c9da64febfc06ed0e1bc96fa0 Mon Sep 17 00:00:00 2001 From: Richard Lindner Date: Wed, 24 Jan 2024 15:05:42 +0100 Subject: [PATCH] Fb/cds onboard metadata (#57) * change cli options for cds onboard metadata * implement metadata param for cdsot * add new onboard docs * fixes --- docs/cap-multitenancy/index.md | 47 +++++++++++++++++++++++-------- docs/index.md | 21 +++++++------- src/cli.js | 21 +++++++------- src/cliOptions.js | 4 ++- src/submodules/capMultitenancy.js | 16 +++++++---- 5 files changed, 72 insertions(+), 37 deletions(-) diff --git a/docs/cap-multitenancy/index.md b/docs/cap-multitenancy/index.md index db49cdd..de64903 100644 --- a/docs/cap-multitenancy/index.md +++ b/docs/cap-multitenancy/index.md @@ -33,16 +33,17 @@ Commands for this area are: ``` === cap multitenancy (cds) === -~ cdsl --cds-list [TENANT] list all cds-mtx tenant names -~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants - cdsot --cds-onboard-tenant TENANT_ID SUBDOMAIN onboard specific tenant - cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant - cdsua --cds-upgrade-all upgrade all tenants -* --cds-offboard-tenant TENANT_ID offboard specific tenant -* --cds-offboard-all offboard all tenants - ... [TENANT] filter list for tenant id or subdomain - ... --auto-undeploy upgrade with auto undeploy - ... --time list includes timestamps +~ cdsl --cds-list [TENANT] list all cds-mtx tenant names +~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants + cdsot --cds-onboard-tenant TENANT_ID [METADATA] onboard specific tenant + cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant + cdsua --cds-upgrade-all upgrade all tenants +* --cds-offboard-tenant TENANT_ID offboard specific tenant +* --cds-offboard-all offboard all tenants + ... [METADATA] onboard subscription metadata + ... [TENANT] filter list for tenant id or subdomain + ... --auto-undeploy upgrade with auto undeploy + ... --time list includes timestamps ~ are read-only commands * are potentially _dangerous_ commands @@ -74,7 +75,31 @@ Be mindful that onboarding _only_ through CAP is usually not a good idea, since BTP subaccount. This can be useful for testing or mocking purposes. {: .warn} -In most cases, the BTP cockpit's subaccount _subscribe_ funcationality should be used instead. +In most cases, the BTP cockpit's subaccount _subscribe_ functionality should be used instead. + +The onboard command takes the tenant id as a required argument, and it takes a metadata object as an optional argument. +For this metadata, the following are potential fields that can be set: + +| Property | Purpose | +| :--------------------- | :-------------------------------------------------------------------------------------- | +| subscriptionAppId | The application ID of the main subscribed application. | +| | Generated by Authorization and Trust Management service (xsuaa) based on the xsappname. | +| subscriptionAppName | The application name of the main subscribed application. | +| subscribedTenantId | ID of the subscription tenant. | +| subscribedSubaccountId | ID of the subscription subaccount. | +| subscribedSubdomain | The subdomain of the subscription tenant (hostname for the identityzone). | +| globalAccountGUID | ID of the global account. | +| subscribedLicenseType | The license type of the subscription tenant. | + +Common options are: + +``` +{ "subscriptionAppName": "", "globalAccountGUID": "", "subscribedSubaccountId": "", "subscribedSubdomain": "" } +``` + +{: .info} +For more details see +[https://help.sap.com/docs/btp/sap-business-technology-platform/develop-multitenant-application#procedure](https://help.sap.com/docs/btp/sap-business-technology-platform/develop-multitenant-application#procedure) ## Upgrade Tenant diff --git a/docs/index.md b/docs/index.md index f1cbfd5..ce189ef 100644 --- a/docs/index.md +++ b/docs/index.md @@ -72,16 +72,17 @@ commands: ... --skip-unchanged skip update for unchanged dependencies === cap multitenancy (cds) === -~ cdsl --cds-list [TENANT] list all cds-mtx tenant names -~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants - cdsot --cds-onboard-tenant TENANT_ID SUBDOMAIN onboard specific tenant - cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant - cdsua --cds-upgrade-all upgrade all tenants -* --cds-offboard-tenant TENANT_ID offboard specific tenant -* --cds-offboard-all offboard all tenants - ... [TENANT] filter list for tenant id or subdomain - ... --auto-undeploy upgrade with auto undeploy - ... --time list includes timestamps +~ cdsl --cds-list [TENANT] list all cds-mtx tenant names +~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants + cdsot --cds-onboard-tenant TENANT_ID [METADATA] onboard specific tenant + cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant + cdsua --cds-upgrade-all upgrade all tenants +* --cds-offboard-tenant TENANT_ID offboard specific tenant +* --cds-offboard-all offboard all tenants + ... [METADATA] onboard subscription metadata + ... [TENANT] filter list for tenant id or subdomain + ... --auto-undeploy upgrade with auto undeploy + ... --time list includes timestamps === hana management (hdi) === ~ hdil --hdi-list [TENANT_ID] list all hdi container instances diff --git a/src/cli.js b/src/cli.js index 290c1cd..cdf7a87 100644 --- a/src/cli.js +++ b/src/cli.js @@ -47,16 +47,17 @@ commands: ... --skip-unchanged skip update for unchanged dependencies === cap multitenancy (cds) === -~ cdsl --cds-list [TENANT] list all cds-mtx tenant names -~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants - cdsot --cds-onboard-tenant TENANT_ID SUBDOMAIN onboard specific tenant - cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant - cdsua --cds-upgrade-all upgrade all tenants -* --cds-offboard-tenant TENANT_ID offboard specific tenant -* --cds-offboard-all offboard all tenants - ... [TENANT] filter list for tenant id or subdomain - ... --auto-undeploy upgrade with auto undeploy - ... --time list includes timestamps +~ cdsl --cds-list [TENANT] list all cds-mtx tenant names +~ cdsll --cds-long-list [TENANT] long list all cds-mtx tenants + cdsot --cds-onboard-tenant TENANT_ID [METADATA] onboard specific tenant + cdsut --cds-upgrade-tenant TENANT_ID upgrade specific tenant + cdsua --cds-upgrade-all upgrade all tenants +* --cds-offboard-tenant TENANT_ID offboard specific tenant +* --cds-offboard-all offboard all tenants + ... [METADATA] onboard subscription metadata + ... [TENANT] filter list for tenant id or subdomain + ... --auto-undeploy upgrade with auto undeploy + ... --time list includes timestamps === hana management (hdi) === ~ hdil --hdi-list [TENANT_ID] list all hdi container instances diff --git a/src/cliOptions.js b/src/cliOptions.js index 2623325..bf49391 100644 --- a/src/cliOptions.js +++ b/src/cliOptions.js @@ -19,6 +19,7 @@ const PASS_ARG = Object.freeze({ APP_NAME: "APP_NAME", APP_INSTANCE: "APP_INSTANCE", PARAMS: "PARAMS", + METADATA: "METADATA", }); const FLAG_ARG = Object.freeze({ @@ -147,7 +148,8 @@ module.exports = { }, CDS_ONBOARD_TENANT: { commandVariants: ["cdsot", "--cds-onboard-tenant"], - requiredPassArgs: [PASS_ARG.TENANT_ID, PASS_ARG.SUBDOMAIN], + requiredPassArgs: [PASS_ARG.TENANT_ID], + optionalPassArgs: [PASS_ARG.METADATA], callback: cds.cdsOnboardTenant, }, CDS_UPGRADE_TENANT: { diff --git a/src/submodules/capMultitenancy.js b/src/submodules/capMultitenancy.js index 2761460..b0c9310 100644 --- a/src/submodules/capMultitenancy.js +++ b/src/submodules/capMultitenancy.js @@ -13,6 +13,7 @@ const { balancedSplit, limiter, formatTimestampsWithRelativeDays, + isObject, } = require("../shared/static"); const { assert, assertAll } = require("../shared/error"); const { request, requestTry } = require("../shared/request"); @@ -99,7 +100,7 @@ const cdsLongList = async (context, [tenant]) => { return JSON.stringify(data, null, 2); }; -const _cdsOnboard = async (context, tenantId, subdomain) => { +const _cdsOnboard = async (context, tenantId, metadata = {}) => { const { cfRouteUrl } = await context.getCdsInfo(); await request({ method: "PUT", @@ -111,14 +112,19 @@ const _cdsOnboard = async (context, tenantId, subdomain) => { headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ subscribedSubdomain: subdomain, eventType: "CREATE" }), + body: JSON.stringify({ ...metadata, eventType: "CREATE" }), }); }; -const cdsOnboardTenant = async (context, [tenantId, subdomain]) => { +const cdsOnboardTenant = async (context, [tenantId, rawMetadata]) => { + let metadata; assert(isUUID(tenantId), "TENANT_ID is not a uuid", tenantId); - assert(isDashedWord(subdomain), "SUBDOMAIN is not a valid subdomain", subdomain); - return _cdsOnboard(context, tenantId, subdomain); + if (rawMetadata) { + metadata = tryJsonParse(rawMetadata); + assert(isObject(metadata), "METADATA is not a JSON object"); + console.log("using onboarding metadata: %O", metadata); + } + return _cdsOnboard(context, tenantId, metadata); }; const _cdsUpgradeBuildLogFilepath = (tenantId) => `cds-upgrade-buildlog-${tenantId}.txt`;