diff --git a/CHANGELOG.md b/CHANGELOG.md index 0399e7e..df5eaa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). The format is based on [Keep a Changelog](http://keepachangelog.com/). +## Version 0.20.0 - 17-August-2026 + +### Added + +- Added support for SAP Build Work Zone, Standard Edition (`workzone-standard`). Generates a `build-workzone-standard` service instance (`local-entry-point` plan) and binding, with workloads updated as required. + ## Version 0.19.0 - 31-July-2026 ### Added diff --git a/files/approuter.yaml.hbs b/files/approuter.yaml.hbs index ecbcefa..4e26727 100644 --- a/files/approuter.yaml.hbs +++ b/files/approuter.yaml.hbs @@ -22,9 +22,17 @@ workloads: {{#hasHTML5Repo}} - {{appName}}-html5-repo-runtime-bind {{/hasHTML5Repo}} + {{#hasWorkzoneStandard}} + - {{appName}}-workzone-bind + {{/hasWorkzoneStandard}} deploymentDefinition: type: Router image: ports: - name: router-port port: 5000 + {{#hasWorkzoneStandard}} + env: + - name: OWN_SAP_CLOUD_SERVICE + value: '["{{strippedAppName}}.service"]' + {{/hasWorkzoneStandard}} diff --git a/files/workloads.yaml.hbs b/files/workloads.yaml.hbs index 9e1337c..078cd61 100644 --- a/files/workloads.yaml.hbs +++ b/files/workloads.yaml.hbs @@ -54,6 +54,9 @@ workloads: {{#hasHtml5Repo}} - {{appName}}-html5-repo-host-bind {{/hasHtml5Repo}} + {{#hasWorkzoneStandard}} + - {{appName}}-workzone-bind + {{/hasWorkzoneStandard}} jobDefinition: type: Content image: diff --git a/files/workzone.yaml.hbs b/files/workzone.yaml.hbs new file mode 100644 index 0000000..2e2c5e3 --- /dev/null +++ b/files/workzone.yaml.hbs @@ -0,0 +1,15 @@ +serviceInstances: + workzone: + name: {{appName}}-workzone-service + serviceOfferingName: build-workzone-standard + servicePlanName: local-entry-point + parameters: + providerId: {{workzoneProviderId}} + exposureId: "{{strippedAppName}}.service" +serviceBindings: + workzone: + name: {{appName}}-workzone-bind + serviceInstanceName: {{appName}}-workzone-service + secretName: {{appName}}-workzone-bind-secret + secretKey: credentials + parameters: {} diff --git a/lib/add.js b/lib/add.js index 0cf12fb..68fdaac 100644 --- a/lib/add.js +++ b/lib/add.js @@ -122,9 +122,11 @@ module.exports = class CapOperatorAddPlugin extends cds.add.Plugin { const project = this.readProject(isServiceOnly) const { hasDestination, hasHtml5Repo, hasXsuaa, hasApprouter, - hasMultitenancy, hasIas + hasMultitenancy, hasIas, hasWorkzoneStandard } = project + if (hasWorkzoneStandard) project.workzoneProviderId = project.strippedAppName.slice(0, 20) + const valuesPath = join(cds.root, 'chart/values.yaml') const valuesYaml = yaml.parse(await read(valuesPath)) @@ -140,6 +142,11 @@ module.exports = class CapOperatorAddPlugin extends cds.add.Plugin { await addIf(hasIas, '../files/ias.yaml.hbs') await addIf(!hasIas && hasXsuaa, '../files/xsuaa.yaml.hbs') + if (hasWorkzoneStandard) { + project.workzoneProviderId = project.strippedAppName.slice(0, 20) + await addIf(true, '../files/workzone.yaml.hbs') + } + if (hasMultitenancy) { await addIf(hasIas, '../files/subscription-manager.yaml.hbs') await addIf(!hasIas && hasXsuaa, '../files/saas-registry.yaml.hbs') diff --git a/package-lock.json b/package-lock.json index c25e82f..65718eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@cap-js/cap-operator-plugin", - "version": "0.19.0", + "version": "0.20.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cap-js/cap-operator-plugin", - "version": "0.19.0", + "version": "0.20.0", "license": "Apache-2.0", "dependencies": { "enquirer": "^2.4.1", diff --git a/package.json b/package.json index 978334f..d1d4b61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cap-js/cap-operator-plugin", - "version": "0.19.0", + "version": "0.20.0", "description": "Add/Build Plugin for CAP Operator", "homepage": "https://github.com/cap-js/cap-operator-plugin/blob/main/README.md", "repository": { diff --git a/test/add.test.js b/test/add.test.js index 396bbad..08938a0 100644 --- a/test/add.test.js +++ b/test/add.test.js @@ -2,6 +2,7 @@ const { join } = require('node:path') const { execSync } = require('node:child_process') const { expect } = require('chai') const fs = require('node:fs') +const yaml = require('yaml') const TempUtil = require('./tempUtil') const tempUtil = new TempUtil(__filename, { local: true }) @@ -321,4 +322,35 @@ describe('cds add cap-operator', () => { expect(log).to.not.include("'btp.provider'") }) + + it('Add cap-operator chart with workzone-standard', async () => { + execSync(`cds add workzone-standard`, { cwd: bookshop }) + execSync(`cds add cap-operator`, { cwd: bookshop }) + + const parsed = yaml.parse(fs.readFileSync(join(bookshop, 'chart/values.yaml'), 'utf8')) + + // service instance + const wzInstance = parsed.serviceInstances.workzone + expect(wzInstance.serviceOfferingName).to.equal('build-workzone-standard') + expect(wzInstance.servicePlanName).to.equal('local-entry-point') + expect(wzInstance.parameters.providerId).to.equal('bookshop') + expect(wzInstance.parameters.providerId.length).to.be.at.most(20) + expect(wzInstance.parameters.exposureId).to.equal('bookshop.service') + + // service binding + const wzBinding = parsed.serviceBindings.workzone + expect(wzBinding.name).to.equal('bookshop-workzone-bind') + expect(wzBinding.serviceInstanceName).to.equal('bookshop-workzone-service') + + // appRouter: workzone binding in consumedBTPServices + OWN_SAP_CLOUD_SERVICE env var + const appRouter = parsed.workloads.appRouter + expect(appRouter.consumedBTPServices).to.include('bookshop-workzone-bind') + const ownSapCloudService = appRouter.deploymentDefinition.env?.find(e => e.name === 'OWN_SAP_CLOUD_SERVICE') + expect(ownSapCloudService).to.exist + expect(ownSapCloudService.value).to.include('bookshop.service') + + // contentDeploy: workzone binding in consumedBTPServices + const contentDeploy = parsed.workloads.contentDeploy + expect(contentDeploy.consumedBTPServices).to.include('bookshop-workzone-bind') + }) })