Skip to content

Commit

Permalink
Merge pull request #191 from entando/ENG-5365-add-retrocompatibility-…
Browse files Browse the repository at this point in the history
…to-v5-bundles

ENG-5365 Add bundleDescriptorVersion field to improve backwards compatibility
  • Loading branch information
alepintus authored Jan 22, 2024
2 parents a9ce8f5 + 716277c commit 0632926
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 17 deletions.
10 changes: 8 additions & 2 deletions src/models/bundle-descriptor-constraints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import {
Resources,
WidgetConfigMicroFrontend,
WidgetMicroFrontend,
WidgetParam
WidgetParam,
BundleDescriptorVersion
} from './bundle-descriptor'
import { MicroFrontendStack, MicroserviceStack } from './component'
import {
Expand Down Expand Up @@ -696,7 +697,12 @@ export const BUNDLE_DESCRIPTOR_CONSTRAINTS: ObjectConstraints<BundleDescriptor>
children: NAV_CONSTRAINTS
}
}
}
},
bundleDescriptorVersion: {
required: false,
type: 'string',
validators: [values(BundleDescriptorVersion)]
},
}

function microfrontendValidator(
Expand Down
6 changes: 5 additions & 1 deletion src/models/bundle-descriptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ export enum DBMS {
Oracle = 'oracle',
Embedded = 'embedded'
}

export enum BundleDescriptorVersion {
v5 = 'v5',
v6 = 'v6'
}
export enum SecurityLevel {
Strict = 'strict',
Lenient = 'lenient'
Expand Down Expand Up @@ -130,6 +133,7 @@ export type BundleDescriptor = {
global?: {
nav: Nav[]
}
bundleDescriptorVersion?: BundleDescriptorVersion
}

export type BundleGroup = {
Expand Down
23 changes: 14 additions & 9 deletions src/services/bundle-descriptor-converter-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
ApiClaim,
ApiType,
BundleDescriptor,
BundleDescriptorVersion,
DBMS,
EnvironmentVariable,
ExternalApiClaim,
Expand Down Expand Up @@ -67,7 +68,7 @@ export class BundleDescriptorConverterService {
const bundleDescriptor = this.bundleDescriptorService.getBundleDescriptor()

for (const microFrontend of bundleDescriptor.microfrontends) {
this.generateMicroFrontendYamlDescriptor(microFrontend)
this.generateMicroFrontendYamlDescriptor(microFrontend, bundleDescriptor.bundleDescriptorVersion)
}

const versionedMicroservices = this.componentService.getVersionedComponents(
Expand All @@ -80,7 +81,8 @@ export class BundleDescriptorConverterService {
)!
this.generateMicroserviceYamlDescriptor(
microservice,
versionedMicroservice.version
versionedMicroservice.version,
bundleDescriptor.bundleDescriptorVersion
)
}

Expand All @@ -91,7 +93,7 @@ export class BundleDescriptorConverterService {
)
}

private generateMicroFrontendYamlDescriptor(microFrontend: MicroFrontend) {
private generateMicroFrontendYamlDescriptor(microFrontend: MicroFrontend, bundleDescriptorVersion: BundleDescriptorVersion | undefined) {
const customUiFile = path.resolve(
MICROFRONTENDS_FOLDER,
microFrontend.name,
Expand All @@ -104,7 +106,8 @@ export class BundleDescriptorConverterService {
| YamlWidgetConfigDescriptor
| YamlAppBuilderWidgetDescriptor = this.mapMicroFrontendToYamlDescriptor(
microFrontend,
customUiFileExists
customUiFileExists,
bundleDescriptorVersion
)

if (customUiFileExists) {
Expand Down Expand Up @@ -145,7 +148,8 @@ export class BundleDescriptorConverterService {

private mapMicroFrontendToYamlDescriptor(
microFrontend: MicroFrontend,
customUiFileExists: boolean
customUiFileExists: boolean,
bundleDescriptorVersion: BundleDescriptorVersion | undefined
):
| YamlWidgetDescriptor
| YamlWidgetConfigDescriptor
Expand All @@ -157,7 +161,7 @@ export class BundleDescriptorConverterService {
type: microFrontend.type,
...('titles' in microFrontend && { titles: microFrontend.titles }),
group: microFrontend.group,
descriptorVersion: WIDGET_DESCRIPTOR_VERSION,
descriptorVersion: bundleDescriptorVersion ?? WIDGET_DESCRIPTOR_VERSION,
...(microFrontend.customElement
? { customElement: microFrontend.customElement }
: {}),
Expand Down Expand Up @@ -238,11 +242,12 @@ export class BundleDescriptorConverterService {

private generateMicroserviceYamlDescriptor(
microservice: Microservice,
version: string
version: string,
bundleDescriptorVersion?: string,
) {
const pluginDescriptor: YamlPluginDescriptor = {
name: microservice.name,
descriptorVersion: PLUGIN_DESCRIPTOR_VERSION,
descriptorVersion: bundleDescriptorVersion ?? PLUGIN_DESCRIPTOR_VERSION,
dbms: microservice.dbms ?? DBMS.None,
image: DockerService.getDockerImageName(
this.dockerOrganization,
Expand Down Expand Up @@ -304,7 +309,7 @@ export class BundleDescriptorConverterService {
description: bundleDescriptor.description,
components: {},
ext: bundleDescriptor.global,
descriptorVersion: BUNDLE_DESCRIPTOR_VERSION
descriptorVersion: bundleDescriptor.bundleDescriptorVersion ?? BUNDLE_DESCRIPTOR_VERSION
}
if (thumbnail?.base64) {
yamlBundleDescriptor.thumbnail = thumbnail.base64
Expand Down
1 change: 1 addition & 0 deletions src/services/bundle-descriptor-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export class BundleDescriptorService {
const componentService = new ComponentService()
componentService.checkDuplicatedComponentNames()
componentService.checkConfigMfes()
componentService.checkDescriptorFieldsCompatibility()
return bundleDescriptor
} catch (error) {
throw new CLIError(
Expand Down
18 changes: 16 additions & 2 deletions src/services/component-service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
BundleDescriptor,
BundleDescriptor, BundleDescriptorVersion,
Commands,
MicroFrontend,
MicroFrontendType,
Expand Down Expand Up @@ -48,7 +48,7 @@ export class ComponentService {
}

public getComponents(type?: ComponentType): Array<Component<ComponentType>> {
const { microfrontends, microservices }: BundleDescriptor =
const {microfrontends, microservices}: BundleDescriptor =
this.bundleDescriptorService.getBundleDescriptor()

let components: Array<Component<ComponentType>>
Expand Down Expand Up @@ -185,6 +185,20 @@ export class ComponentService {
}
}

public checkDescriptorFieldsCompatibility(): void {
const bundleDescriptor = this.bundleDescriptorService.getBundleDescriptor()
const bundleDescriptorVersion = bundleDescriptor.bundleDescriptorVersion;

for (const ms of bundleDescriptor.microservices) {
// Microservice Resources has been added starting from v6 bundles
if (ms.resources && bundleDescriptorVersion === BundleDescriptorVersion.v5) {
throw new CLIError(
`Incompatible "resources" field for the microservice ${ms.name}, this field can't be set in v5 bundle version`
)
}
}
}

public getComponent(name: string): Component<ComponentType> {
const component = this.getComponents().find(comp => comp.name === name)
if (component === undefined) {
Expand Down
11 changes: 11 additions & 0 deletions test/helpers/mocks/bundle-descriptor-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,17 @@ export class BundleDescriptorHelper {
}
}

export const mockBundleWithInvalidBundleDescriptorVersion=
`{
"name": "test-bundle-v99999",
"version": "0.0.1",
"type": "bundle",
"description": "test description",
"bundleDescriptorVersion": "v99999",
"microservices": [],
"microfrontends": []
}`

export const mocksExpectedErrorWithInput = [
{
expectedLineError: 9,
Expand Down
68 changes: 67 additions & 1 deletion test/services/bundle-descriptor-converter-service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import {
DBMS,
SecurityLevel,
MicroFrontendType,
MicroFrontendAppBuilderSlot
MicroFrontendAppBuilderSlot,
BundleDescriptorVersion
} from '../../src/models/bundle-descriptor'

describe('bundle-descriptor-converter-service', () => {
Expand Down Expand Up @@ -419,6 +420,71 @@ describe('bundle-descriptor-converter-service', () => {
components: {}
})
})

test.it('test bundle conversion with a specific bundle descriptor version', () => {
const bundleDir = tempDirHelper.createInitializedBundleDir(
'test-bundle-v5'
)
const bundleDescriptorPath = path.resolve(
bundleDir,
...OUTPUT_FOLDER,
'descriptors',
BUNDLE_DESCRIPTOR_NAME
)

const converterService = new BundleDescriptorConverterService('docker-org')
const bundleDescriptorService = new BundleDescriptorService()

bundleDescriptorService.createBundleDescriptor({
name: 'test-bundle-v5',
version: '0.0.1',
type: 'bundle',
description: 'test-bundle-v5 description',
bundleDescriptorVersion: BundleDescriptorVersion.v5,
microservices: [
{
name: 'test-ms',
stack: MicroserviceStack.SpringBoot,
dbms: DBMS.PostgreSQL,
version: '0.0.1',
healthCheckPath: '/path/to/check'
}
],
microfrontends: [
{
name: 'test-mfe',
customElement: 'test-mfe',
stack: MicroFrontendStack.React,
type: MicroFrontendType.Widget,
titles: {
en: 'mfe title',
it: 'titolo mfe'
},
group: 'free',
publicFolder: 'public',
configMfe: 'test-mfe-no-code',
}
]
})

fs.writeFileSync(`${bundleDir}/thumbnail.png`, 'this is a thumbnail')

converterService.generateYamlDescriptors({})

checkYamlFile(bundleDescriptorPath, {
name: 'test-bundle-v5',
descriptorVersion: 'v5',
description: 'test-bundle-v5 description',
components: {
plugins: [
"plugins/test-ms.yaml"
],
widgets: [
"widgets/test-mfe.yaml"
]
}
})
})
})

function checkYamlFile(filePath: string, expectedContent: any) {
Expand Down
30 changes: 29 additions & 1 deletion test/services/component-service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { MICROSERVICES_FOLDER } from '../../src/paths'
import { ProcessExecutorService } from '../../src/services/process-executor-service'
import { BundleDescriptorHelper } from '../helpers/mocks/bundle-descriptor-helper'
import { ComponentHelper } from '../helpers/mocks/component-helper'
import { MicroFrontendType } from '../../src/models/bundle-descriptor'
import { BundleDescriptorVersion, MicroFrontendType } from '../../src/models/bundle-descriptor'

describe('component-service', () => {
let componentService: ComponentService
Expand Down Expand Up @@ -181,6 +181,34 @@ describe('component-service', () => {
'Checks for config MFE that has invalid requirements with non-existent mfe name'
)

test
.do(() => {
const bundleDescriptor = BundleDescriptorHelper.newBundleDescriptor()
bundleDescriptor.bundleDescriptorVersion = BundleDescriptorVersion.v5
bundleDescriptor.microservices = [
ComponentHelper.newMicroservice('ms-name-1', {
resources: {
cpu: '100m',
memory: '20gb',
storage: '10gb'
}
})
]

sinon
.stub(BundleDescriptorService.prototype, 'getBundleDescriptor')
.returns(bundleDescriptor)
componentService.checkDescriptorFieldsCompatibility()
})
.catch(error => {
expect(error.message).contain(
'Incompatible "resources" field for the microservice ms-name-1, this field can\'t be set in v5 bundle version'
)
})
.it(
'Check bundle v5 fields compatibility'
)

test
.do(() => {
const bundleDescriptor = BundleDescriptorHelper.newBundleDescriptor()
Expand Down
24 changes: 23 additions & 1 deletion test/services/constraints-validator-service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import {
INVALID_VERSION_MESSAGE,
VALID_CONTEXT_PARAM_FORMAT
} from '../../src/models/bundle-descriptor-constraints'
import { BundleDescriptorHelper } from '../helpers/mocks/bundle-descriptor-helper'
import {
BundleDescriptorHelper,
mockBundleWithInvalidBundleDescriptorVersion,
} from '../helpers/mocks/bundle-descriptor-helper'
import { YamlBundleDescriptor } from '../../src/models/yaml-bundle-descriptor'
import { YAML_BUNDLE_DESCRIPTOR_CONSTRAINTS } from '../../src/models/yaml-bundle-descriptor-constraints'
import {
Expand All @@ -19,6 +22,7 @@ import {
} from '../../src/models/component'
import * as sinon from 'sinon'
import { existsSyncMock } from '../helpers/mocks/validator-helper'
import {BundleDescriptorService} from "../../src/services/bundle-descriptor-service";

describe('BundleDescriptorValidatorService', () => {
afterEach(() => {
Expand All @@ -32,6 +36,23 @@ describe('BundleDescriptorValidatorService', () => {
)
})

test
.do(() => {
const bundleDescriptorService = new BundleDescriptorService()
bundleDescriptorService.writeDescriptor(mockBundleWithInvalidBundleDescriptorVersion)
const invalidDescriptor = bundleDescriptorService.getBundleDescriptor();
console.log(invalidDescriptor)
ConstraintsValidatorService.validateObjectConstraints(
invalidDescriptor,
BUNDLE_DESCRIPTOR_CONSTRAINTS
)
})
.catch(error => {
console.log(error)
expect(error.message).contain('Field "bundleDescriptorVersion" is not valid. Allowed values are: v5, v6')
})
.it('Validates invalid bundleDescriptorVersion')

test
.do(() => {
const invalidDescriptor: any =
Expand Down Expand Up @@ -1128,4 +1149,5 @@ describe('Validates YAML descriptor', () => {
expect(error.message).contain('$.ext.nav[0].target')
})
.it('Validates invalid nav target')

})

0 comments on commit 0632926

Please sign in to comment.