@sap/cds-dk
Version:
Command line client and development toolkit for the SAP Cloud Application Programming Model
164 lines (153 loc) • 6.75 kB
JavaScript
const { join } = require('path')
const cds = require('../../../cds')
const { readFileSync, exists, rimraf, copy, yaml } = cds.utils
const { readProject } = require('../../projectReader')
const { merge } = require('../../merge')
const { ask4 } = require('../../../util/question')
const { execSync } = require('child_process')
const { mvn } = require('../../add')
const term = require('../../../../lib/util/term')
// cds10: Remove this plugin and hasHelm doc in projectReader
module.exports = class HelmTemplate extends require('../../plugin') {
options() {
return {
'y': {
type: 'boolean',
}
}
}
async canRun() {
const hasInProduction = HelmTemplate.hasInProduction()
if (cds.cli.options.force) {
await rimraf('chart')
return true
} else if (exists('chart') && !hasInProduction) {
throw `Chart already exists. Use --force to overwrite.`
}
return true
}
// Won't need this any more with plugin approach: package not there -> plugin not pulled
static hasInProduction() {
if (exists('chart/Chart.yaml')) {
const chartYaml = yaml.parse(readFileSync(join(cds.root, 'chart', 'Chart.yaml'), 'utf8'))
return chartYaml.annotations?.["app.kubernetes.io/managed-by"] === 'cds-dk/helm'
}
return false
}
async run() {
console.log(term.warn(`The "cds add helm" command is deprecated and will be removed in the next major release. Please use the "cds add kyma" command instead.`))
const project = readProject()
let registry, domain, tag
if (!HelmTemplate.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 */ }
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, '../kyma/files/values.schema.json')).to('chart/values.schema.json')
await merge(__dirname, '../kyma/files/Chart.yaml.hbs').into('chart/Chart.yaml', { with: project })
await merge(__dirname, '../kyma/files/values.yaml.hbs').into('chart/values.yaml', { with: project })
await this._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,
addApprouter, addIas, addAms, hasXsuaa, hasMultitenancy,
addDestination, addEnterpriseMessaging, addEnterpriseMessagingShared, addHtml5Repo, hasHtml5Repo, addKafka, addAttachments, addPortal, addMalwareScanner,
addDynatrace, addCloudLogging, addAuditLogging,
} = readProject()
if (addApprouter) {
await this._mergeDependency('web-application', 'approuter')
}
if (addHtml5Repo || addApprouter && hasHtml5Repo) {
if (addHtml5Repo) {
await this._mergeDependency('service-instance', 'html5-apps-repo-host')
await this._mergeDependency('content-deployment', 'html5-apps-deployer')
}
if (addApprouter) {
await this._mergeDependency('service-instance', 'html5-apps-repo-runtime')
}
}
if (addMultitenancy || addXsuaa || addIas || addAms) {
if (addMultitenancy) {
await this._mergeDependency('web-application', 'sidecar')
}
if (hasXsuaa && hasMultitenancy) {
await this._mergeDependency('service-instance', 'saas-registry')
} else if (hasMultitenancy) {
await this._mergeDependency('service-instance', 'subscription-manager')
}
}
if (addDestination) {
await this._mergeDependency('service-instance', 'destination')
}
if (addAttachments) {
await this._mergeDependency('service-instance', 'attachments')
}
if (addEnterpriseMessaging || addEnterpriseMessagingShared) {
await this._mergeDependency('service-instance', 'event-mesh')
}
if (addXsuaa) {
await this._mergeDependency('service-instance', 'xsuaa')
}
if (addHana || addMultitenancy) {
if (hasMultitenancy) {
await this._mergeDependency('service-instance', 'service-manager')
} else {
await this._mergeDependency('service-instance', 'hana')
await this._mergeDependency('content-deployment', 'hana-deployer')
}
}
if (addKafka) {
await this._mergeDependency('service-instance', 'kafka')
}
if (addPortal) {
await this._mergeDependency('service-instance', 'portal')
await this._mergeDependency('content-deployment', 'portal-deployer')
}
if (addMalwareScanner) {
await this._mergeDependency('service-instance', 'malware-scanner')
}
if (addCloudLogging) {
await this._mergeDependency('service-instance', 'cloud-logging')
}
if (addDynatrace) {
await this._mergeDependency('service-instance', 'dynatrace')
}
if (addAuditLogging) {
await this._mergeDependency('service-instance', 'auditlog')
}
}
async _mergeDependency(name, alias) {
const project = readProject()
await merge({
dependencies: [{
name,
alias,
version: '>0.0.0'
}]
}).into('chart/Chart.yaml', {
project,
additions: [{
in: 'dependencies',
where: { alias }
}]
})
}
}