UNPKG

@sap/cds-dk

Version:

Command line client and development toolkit for the SAP Cloud Application Programming Model

133 lines (123 loc) 4.96 kB
const { join } = require('path') const cds = require('../../../cds') const { read, write } = cds.utils const mvn = require('../../mvn') const { readProject } = require('../../projectReader') const { merge, sort } = require('../../merge') const { copyRenderedJSON } = require('../../../util/fs') const { srv4, // Server mtxSidecar4, // Additional Modules saasRegistry, subscriptionManager, // BTP Services srvApi4, providedMtxApiSidecar4, requiredMtxSidecarApi4, // APIs } = require('../../registries/mta') module.exports = class MultitenancyTemplate extends require('../../plugin') { static help() { return 'schema-based multitenancy support' } static hasInProduction(env) { return env.requires?.multitenancy } async run() { const project = readProject() const { isNodejs, isJava, configFile } = project project.profile ??= 'production' await merge(__dirname, 'files/package.json.hbs').into(configFile, { with: project }) if (isJava) { const packageJson = await read('package.json') packageJson.workspaces = ['mtx/sidecar'] packageJson.devDependencies ??= {} packageJson.devDependencies['@sap/cds-mtxs'] ??= '^3' await write('package.json', packageJson, { spaces: 2 }) await sort('package.json', 'devDependencies') await mvn.add('mtx') } if (isNodejs) await sort('package.json', 'dependencies') await copyRenderedJSON(join(__dirname, 'files', 'package.sidecar.json.hbs'), join('mtx', 'sidecar/package.json'), project) } async combine() { const project = readProject() const { isNodejs, isJava, addMta, hasMta, addXsuaa, hasXsuaa, addIas, hasIas, hasHana, addContainerize, addKyma, addHelm, addHelmUnifiedRuntime, hasApprouter, srvPath, appName } = project if (addMta || (addIas || addXsuaa) && hasMta) { const srv = srv4(srvPath) const mtxSidecar = mtxSidecar4(isJava ? 'mtx/sidecar' : 'gen/mtx/sidecar') const modules = [srv, mtxSidecar] const services = [] if (hasIas) services.push(subscriptionManager) if (!hasIas || hasXsuaa) services.push(saasRegistry) const apis = [srvApi4(srv), providedMtxApiSidecar4(mtxSidecar)] if (isJava) { const name = hasIas ? '~{mtx-cert-url}' : '~{mtx-url}' apis.push(requiredMtxSidecarApi4(srv, name)) } const additions = [...modules, ...services, ...apis] const relationships = [] if (hasXsuaa) { relationships.push({ insert: [saasRegistry, 'name'], into: [isJava ? srv : mtxSidecar, 'requires', 'name'] }) } if (hasIas) { relationships.push({ insert: [subscriptionManager, 'name'], into: [isJava ? srv : mtxSidecar, 'requires', 'name'] }) } if (isJava) { relationships.push({ insert: [srv, 'name'], into: [mtxSidecar, 'build-parameters.requires', 'name'] }) } const templateMtaPath = join(__dirname, 'files/mta.yaml.hbs') await merge(templateMtaPath).into('mta.yaml', { with: project, additions, relationships }) } if (addKyma) { await merge(__dirname, 'files/values.yaml.hbs').into('chart/values.yaml', { with: project }) const applicationWorkload = hasApprouter ? 'approuter' : 'srv' await merge({ ...(isNodejs) && { sidecar: { env: { SUBSCRIPTION_URL: `https://\${tenant_subdomain}-{{ .Release.Name }}-${applicationWorkload}-{{ .Release.Namespace }}.{{ .Values.global.domain }}` }}}, ...(isJava) && { srv: { env: { CDS_MULTITENANCY_APPUI_URL: `https://{{ .Release.Name }}-${applicationWorkload}-{{ .Release.Namespace }}.{{ .Values.global.domain }}`, CDS_MULTITENANCY_SIDECAR_URL: hasIas ? `https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.cert.{{ .Values.global.domain }}` : `https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.{{ .Values.global.domain }}` }}} }).into('chart/values.yaml',{ forceOverwrite: true }) } // cds10 move to if above // needed because of adding kyma to cli options in case of helm if (addContainerize || (addKyma && !addHelm && !addHelmUnifiedRuntime)) { const deletions = [] if (hasHana) { deletions.push({ item: { in: 'modules', where: { name: `${appName}-hana-deployer` } } }) } const additions = [{ in: 'modules', where: { name: `${appName}-sidecar` } }] await merge(__dirname, '/files/containerize.yaml.hbs').into('containerize.yaml', { with: project, additions, deletions }) } if (addXsuaa) { await merge(__dirname, 'files/xs-security.json.hbs').into('xs-security.json', { project, additions: [{ in: 'scopes', where: { name: '$XSAPPNAME.mtcallback' }, }] }) } } }