From 3cbdfe6ad793d5a553a097587bb3883680f1a4f2 Mon Sep 17 00:00:00 2001 From: Harry Chen Date: Mon, 13 Apr 2020 21:19:57 +0800 Subject: [PATCH] fix: add fc service properties definition --- .../serverless-spec-builder/src/fc/builder.ts | 17 ++++----- .../src/fc/interface.ts | 35 ++++++++++++++++++- packages/serverless-spec-builder/src/utils.ts | 10 +++++- .../serverless-spec-builder/test/fc.test.ts | 17 +++++++++ .../test/fixtures/fc/f-service-properties.yml | 27 ++++++++++++++ .../test/utils.test.ts | 23 ++++++++++++ 6 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 packages/serverless-spec-builder/test/fixtures/fc/f-service-properties.yml create mode 100644 packages/serverless-spec-builder/test/utils.test.ts diff --git a/packages/serverless-spec-builder/src/fc/builder.ts b/packages/serverless-spec-builder/src/fc/builder.ts index c8891986..46635797 100644 --- a/packages/serverless-spec-builder/src/fc/builder.ts +++ b/packages/serverless-spec-builder/src/fc/builder.ts @@ -5,19 +5,15 @@ import { FCFunctionStructure, FCSpec, HTTPEventType, + FCProviderStructure, } from './interface'; import { SpecBuilder } from '../builder'; -import { - ProviderStructure, - HTTPEvent, - ScheduleEvent, - LogEvent, - OSEvent, -} from '../interface'; +import { HTTPEvent, ScheduleEvent, LogEvent, OSEvent } from '../interface'; +import { uppercaseObjectKey } from '../utils'; export class FCSpecBuilder extends SpecBuilder { toJSON() { - const providerData: ProviderStructure = this.getProvider(); + const providerData: FCProviderStructure = this.getProvider(); const serviceData = this.getService(); const functionsData: FCFunctionsStructure = this.getFunctions(); const serviceName = serviceData.name; @@ -31,6 +27,11 @@ export class FCSpecBuilder extends SpecBuilder { Properties: { Description: serviceData.description, Role: providerData.role, + InternetAccess: providerData.internetAccess, + VpcConfig: uppercaseObjectKey(providerData.vpcConfig), + Policies: uppercaseObjectKey(providerData.policies), + LogConfig: uppercaseObjectKey(providerData.logConfig), + NasConfig: uppercaseObjectKey(providerData.nasConfig), }, }, }, diff --git a/packages/serverless-spec-builder/src/fc/interface.ts b/packages/serverless-spec-builder/src/fc/interface.ts index c5916a33..d5147eae 100644 --- a/packages/serverless-spec-builder/src/fc/interface.ts +++ b/packages/serverless-spec-builder/src/fc/interface.ts @@ -1,4 +1,9 @@ -import { FunctionsStructure, FunctionStructure } from '../interface'; +import { + FunctionsStructure, + FunctionStructure, + ProviderStructure, + SpecStructure, +} from '../interface'; export interface FCSpec { ROSTemplateFormatVersion: string; @@ -14,6 +19,34 @@ export type FCCustomDomainType = 'Aliyun::Serverless::CustomDomain'; export type FCLogType = 'Aliyun::Serverless::Log'; export type FCLogStoreType = 'Aliyun::Serverless::Log::Logstore'; +export interface FCProviderStructure extends ProviderStructure { + vpcConfig?: { + vpcId: string; + vSwitchIds: string[]; + securityGroupId: string; + }; + internetAccess?: boolean; + policies?: string | string[]; + logConfig?: { + project: string; + logstore: string; + }; + nasConfig?: + | 'auto' + | { + userId: number; + groupId: number; + mountPoints: Array<{ + serverAddr: string; + mountDir: string; + }>; + }; +} + +export interface FCSpecStructure extends SpecStructure { + provider?: FCProviderStructure; +} + export interface FCServiceProperties { Role?: string; Policies?: string | string[]; diff --git a/packages/serverless-spec-builder/src/utils.ts b/packages/serverless-spec-builder/src/utils.ts index 8392f438..7ed1170d 100644 --- a/packages/serverless-spec-builder/src/utils.ts +++ b/packages/serverless-spec-builder/src/utils.ts @@ -6,7 +6,7 @@ export interface Ilayer { export function formatLayers(...multiLayers: Ilayer[]) { const layerTypeList = { npm: {} }; multiLayers.forEach((layer: Ilayer) => { - Object.keys(layer || {}).forEach(layerName => { + Object.keys(layer || {}).forEach((layerName) => { const [type, path] = layer[layerName].path.split(':'); if (!layerTypeList[type]) { return; @@ -34,3 +34,11 @@ export function getLayers(...layersList: any) { layers, }; } + +export function uppercaseObjectKey(obj) { + const json = JSON.stringify(obj); + const result = json.replace(/"([^"])([^"]*)":/gim, (...value) => { + return `"${value[1].toUpperCase()}${value[2]}":`; + }); + return JSON.parse(result); +} diff --git a/packages/serverless-spec-builder/test/fc.test.ts b/packages/serverless-spec-builder/test/fc.test.ts index 2117711d..bac174e2 100644 --- a/packages/serverless-spec-builder/test/fc.test.ts +++ b/packages/serverless-spec-builder/test/fc.test.ts @@ -15,6 +15,23 @@ describe('/test/fc.test.ts', () => { assert.deepStrictEqual(funResult['Events'], {}); }); + it('test transform service properties', () => { + const result = generateFunctionsSpec( + path.join(__dirname, './fixtures/fc/f-service-properties.yml') + ); + const funResult = result['Resources']['serverless-hello-world']['index']; + assert(funResult['Type'] === 'Aliyun::Serverless::Function'); + assert(funResult['Properties']['Initializer'] === 'index.initializer'); + assert(funResult['Properties']['Handler'] === 'index.handler'); + assert(funResult['Properties']['Runtime'] === 'nodejs10'); + assert.deepStrictEqual(funResult['Events'], {}); + const properties = result['Resources']['serverless-hello-world']['Properties']; + assert(properties['VpcConfig']); + assert(properties['Policies']); + assert(properties['LogConfig']); + assert(properties['NasConfig']); + }); + it('test http events', () => { const result = generateFunctionsSpec( path.join(__dirname, './fixtures/fc/f-event-http.yml') diff --git a/packages/serverless-spec-builder/test/fixtures/fc/f-service-properties.yml b/packages/serverless-spec-builder/test/fixtures/fc/f-service-properties.yml new file mode 100644 index 00000000..3147eabb --- /dev/null +++ b/packages/serverless-spec-builder/test/fixtures/fc/f-service-properties.yml @@ -0,0 +1,27 @@ +service: + name: serverless-hello-world + +provider: + name: aliyun + policies: + - AliyunECSNetworkInterfaceManagementAccess + vpcConfig: + vpcId: 'vpc-j6cfu2g6tslzekh8grfmk' + vSwitchIds: [ 'vsw-j6chkgsg9naj6gx49espd' ] + securityGroupId: 'sg-j6ceitqs6ljyssm1apom' + logConfig: + project: localtestlog + logstore: localteststore + nasConfig: + userId: 10003 + groupId: 10003 + mountPoints: + - serverAddr: '012194b28f-xxxxx.cn-hangzhou.nas.aliyuncs.com:/' + mountDir: '/mnt/test' + +functions: + index: + handler: index.handler + +package: + artifact: code.zip diff --git a/packages/serverless-spec-builder/test/utils.test.ts b/packages/serverless-spec-builder/test/utils.test.ts new file mode 100644 index 00000000..7e947bbc --- /dev/null +++ b/packages/serverless-spec-builder/test/utils.test.ts @@ -0,0 +1,23 @@ +import { uppercaseObjectKey } from '../src/utils'; +import { deepStrictEqual } from 'assert'; + +describe('/test/utils.test.ts', () => { + it('test unppercase', () => { + const json = { + a: 1, + bbbb: 2, + ddd: [ + 'ccc', + { + fff: ['eee'], + }, + ], + }; + const result = uppercaseObjectKey(json); + deepStrictEqual(result, { + A: 1, + Bbbb: 2, + Ddd: ['ccc', { Fff: ['eee'] }], + }); + }); +});