UNPKG

@sap/cds-dk

Version:

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

140 lines (126 loc) 5 kB
const { join } = require('path') const cds = require('../../../cds') const { exists, rimraf, copy, yaml, fs } = cds.utils const { readProject } = require('../../projectReader') const { merge } = require('../../merge') const { ask4 } = require('../../../util/question') const { execSync } = require('child_process') const { mvn } = require('../../add') module.exports = class KymaTemplate extends require('../../plugin') { options() { return { 'unified-runtime': { type: 'boolean' }, 'y': { type: 'boolean', } } } static hasInProduction() { if (exists('chart/Chart.yaml')) { const chartYaml = yaml.parse(fs.readFileSync(join(cds.root, 'chart', 'Chart.yaml'), 'utf8')) return chartYaml.annotations?.["app.kubernetes.io/managed-by"] === 'cds-dk/helm' } return false } async canRun() { const hasInProduction = KymaTemplate.hasInProduction() if (cds.cli.options.force) { await rimraf('chart') await rimraf('containerize.yaml') return true } else if (exists('chart') && !hasInProduction) { throw `Chart already exists. Use --force to overwrite.` } return true } static help() { return 'Kyma deployment using Helm charts' } async run() { const project = readProject() let registry, domain, tag if (!KymaTemplate.hasInProduction() && !project.isBas /* don't run this for the BAS Yeoman generator */) { try { const domainGuess = execSync(`kubectl config view --minify --output jsonpath="{.clusters[*].cluster.server}"`, { stdio: "pipe" }).toString() const domainStartIndex = domainGuess.indexOf('api.') if (domainStartIndex !== -1) domain = domainGuess.substring(domainStartIndex + 4) } catch { /* ignore */ } // cds10: remove if (exists('containerize.yaml')) { const { repository: r, tag: t } = yaml.parse(join(cds.root, 'containerize.yaml')) if (r) registry = r if (t) tag = t } if (!cds.cli.options.y && !cds.cli.options.force) { registry ??= await ask4([`registry server: `]) domain ??= await ask4([`cluster domain: `]) } } project.registry = registry ?? '<your-container-registry-server>' project.domain = domain ?? '<cluster-domain>' project.imagePullSecret = 'docker-registry' project.tag = tag ?? 'latest' await copy(join(__dirname, 'files', 'values.schema.json')).to('chart/values.schema.json') await merge(__dirname, 'files/Chart.yaml.hbs').into('chart/Chart.yaml', { with: project }) await merge(__dirname, 'files/values.yaml.hbs').into('chart/values.yaml', { with: project }) await merge(__dirname, 'files/containerize.yaml.hbs').into('containerize.yaml', { with: project }) await KymaTemplate.mergeDependency('web-application', 'srv') if (project.isJava) await mvn.add('k8s') } async combine() { // REVISIT: This must be moved to the respective plugins const { addHana, addMultitenancy, addXsuaa, hasApprouter, addApprouter, addIas, addAms, hasXsuaa, hasMultitenancy, addWorkzoneStandard, addHtml5Repo, hasHtml5Repo } = readProject() if (addHtml5Repo || addWorkzoneStandard || addApprouter && hasHtml5Repo) { if (addHtml5Repo) { await KymaTemplate.mergeDependency('service-instance', 'html5-apps-repo-host') await KymaTemplate.mergeDependency('content-deployment', 'html5-apps-deployer') } if (hasApprouter && hasHtml5Repo) { await KymaTemplate.mergeDependency('service-instance', 'html5-apps-repo-runtime') } } if (addMultitenancy || addXsuaa || addIas || addAms) { if (addMultitenancy) { await KymaTemplate.mergeDependency('web-application', 'sidecar') } if (hasXsuaa && hasMultitenancy) { await KymaTemplate.mergeDependency('service-instance', 'saas-registry') } else if (hasMultitenancy) { await KymaTemplate.mergeDependency('service-instance', 'subscription-manager') } } if (addHana || addMultitenancy) { if (hasMultitenancy) { await KymaTemplate.mergeDependency('service-instance', 'service-manager') await KymaTemplate.mergeDependency('content-deployment', 'mtx-upgrade') } else { await KymaTemplate.mergeDependency('service-instance', 'hana') await KymaTemplate.mergeDependency('content-deployment', 'hana-deployer') } } } static async mergeDependency(name, alias) { const project = readProject() await merge({ dependencies: [{ name, alias, version: '>0.0.0', ...((cds.cli.options["unified-runtime"] || project.hasHelmUnifiedRuntime) && { repository: 'https://int.repositories.cloud.sap/artifactory/virtual-unified-runtime-helm-dmz' }) }] }).into('chart/Chart.yaml', { with: project, additions: [{ in: 'dependencies', where: { alias } }] } ) } }