@sap/cds-dk
Version:
Command line client and development toolkit for the SAP Cloud Application Programming Model
115 lines (96 loc) • 4.43 kB
JavaScript
const { join } = require('path')
const cds = require('../../../cds')
const { read, write, exists, copy, rimraf } = cds.utils
const { readProject } = require('../../projectReader')
const { merge } = require('../../merge')
const mvn = require('../../mvn')
const { srv4, hdbDeployer, serviceManager, hdiContainer, mtxSidecar4 } = require('../../registries/mta')
module.exports = class HanaTemplate extends require('../../plugin') {
static help() {
return 'database support for SAP HANA'
}
static hasInProduction(env) {
return env.requires?.db?.kind === 'hana' || readProject().dependencies?.['@cap-js/hana']
}
async run() {
const project = readProject()
const { isJava, configFile, db } = project
project.shortcut = typeof (await read(configFile)).cds?.requires?.db !== 'object'
// REVISIT: Let cds build generate those by default
await merge(__dirname, 'files/src/.hdiconfig').into(join(db.folder, 'src/.hdiconfig'))
await merge(__dirname, 'files/undeploy.json').into(join(db.folder, 'undeploy.json'))
if (isJava) {
await copy(join(__dirname, 'files', 'db')).to(db.folder)
await mvn.add('hana')
}
await merge(__dirname, 'files/package.json.hbs').into(configFile, { with: project, forceOverwrite: true }) // REVISIT: forceOverwrite: true as default?
const packageJson = exists('package.json') ? await read('package.json') : null
if (packageJson?.dependencies) {
delete packageJson.dependencies['@sap/hana-client']
await write('package.json', packageJson, { spaces: 2 })
}
}
async combine() {
const project = readProject()
const { hasMta, hasHelm, hasHelmUnifiedRuntime, hasHtml5Repo, hasContainerize, isJava, hasMultitenancy, srvPath } = project
if (hasMta) {
const srv = srv4(srvPath)
const db = hasMultitenancy ? serviceManager : hdiContainer
const deletions = hasMultitenancy ? [{
item: hdbDeployer,
relationships: [{
removeProperty: 'name',
allWithin: ['modules', 'requires', 'name'],
}]
}, {
item: hdiContainer,
relationships: [{
removeProperty: 'name',
allWithin: ['modules', 'requires', 'name'],
}]
}] : []
const relationships = [{
insert: [db, 'name'],
into: [srv, 'requires', 'name']
}]
if (hasMultitenancy) {
relationships.push({
insert: [serviceManager, 'name'],
into: [mtxSidecar4(isJava ? 'mtx/sidecar' : 'gen/mtx/sidecar'), 'requires', 'name']
})
} else {
relationships.push({
insert: [hdiContainer, 'name'],
into: [hdbDeployer, 'requires', 'name']
})
}
const modules = hasMultitenancy ? [srv] : [srv, hdbDeployer]
await merge(__dirname, 'files/mta.yaml.hbs').into('mta.yaml', {
with: project, additions: [...modules, db].filter(a => a), deletions, relationships
})
}
if (hasHelm || hasHelmUnifiedRuntime) {
if (hasMultitenancy) {
await merge('chart/values.yaml')
.remove(['hana-deployer', 'srv.bindings.db', 'hana'])
await merge('chart/Chart.yaml')
.remove([
{ dependencies: { alias: 'hana' } },
{ dependencies: { alias: 'hana-deployer' } }
])
if (!hasHtml5Repo) {
await rimraf('chart/charts/content-deployment') // REVISIT: Move to build task
}
} else {
await merge(__dirname, 'files', 'values.yaml.hbs').into('chart/values.yaml', { with: project })
}
}
if (hasContainerize && !hasMultitenancy) {
const additions = [{
in: 'modules',
where: { name: `${project.appName}-hana-deployer` }
}]
await merge(__dirname, '/files/containerize.yaml.hbs').into('containerize.yaml', { with: project, additions })
}
}
}