@sap/cds-dk
Version:
Command line client and development toolkit for the SAP Cloud Application Programming Model
140 lines (126 loc) • 5 kB
JavaScript
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 }
}]
}
)
}
}