Skip to content

Commit 9211274

Browse files
MichaelGoberlingMichael Goberling
andauthored
feat: align action and package input schema with openwhisk (#45)
* feat: align action input schema with openwhisk * feat: document package inputs too --------- Co-authored-by: Michael Goberling <mgoberling+adobe@adobe.com>
1 parent bef8dda commit 9211274

7 files changed

Lines changed: 184 additions & 1 deletion

File tree

schema/app.config.yaml.schema.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
"type": "object",
114114
"properties": {
115115
"license": { "type": "string" },
116+
"inputs": { "$ref": "#/definitions/inputs" },
116117
"actions": { "$ref": "#/definitions/actions" }
117118
}
118119
},
@@ -147,7 +148,7 @@
147148
"type": "object",
148149
"patternProperties": {
149150
"^[^\n]+$": {
150-
"type": ["string", "boolean", "object"]
151+
"type": ["string", "boolean", "number", "array", "object", "null"]
151152
}
152153
},
153154
"additionalProperties": false

test/__fixtures__/app-exc-nui/app.config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ application:
1313
runtime: 'nodejs:14'
1414
inputs:
1515
LOG_LEVEL: 'debug'
16+
TAGS: ['tag1', 'tag2']
17+
MAX_ITEMS: 100
1618
SOMETHING:
1719
type: string
1820
description: this is about something

test/__fixtures__/app/app.config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ application:
1313
runtime: 'nodejs:14'
1414
inputs:
1515
LOG_LEVEL: 'debug'
16+
TAGS: ['tag1', 'tag2']
17+
MAX_ITEMS: 100
1618
SOMETHING:
1719
type: string
1820
description: this is about something

test/__fixtures__/legacy-app/manifest.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ packages:
88
runtime: 'nodejs:14'
99
inputs:
1010
LOG_LEVEL: 'debug'
11+
TAGS: ['tag1', 'tag2']
12+
MAX_ITEMS: 100
1113
SOMETHING:
1214
type: string
1315
description: this is about something

test/data-mocks/config-loader-include-index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,22 @@ const appIncludeIndex = {
179179
file: 'app.config.yaml',
180180
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.LOG_LEVEL'
181181
},
182+
'application.runtimeManifest.packages.my-app-package.actions.action.inputs.MAX_ITEMS': {
183+
file: 'app.config.yaml',
184+
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.MAX_ITEMS'
185+
},
186+
'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS': {
187+
file: 'app.config.yaml',
188+
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS'
189+
},
190+
'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS.0': {
191+
file: 'app.config.yaml',
192+
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS.0'
193+
},
194+
'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS.1': {
195+
file: 'app.config.yaml',
196+
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.TAGS.1'
197+
},
182198
'application.runtimeManifest.packages.my-app-package.actions.action.inputs.SOMETHING': {
183199
file: 'app.config.yaml',
184200
key: 'application.runtimeManifest.packages.my-app-package.actions.action.inputs.SOMETHING'
@@ -638,6 +654,22 @@ const legacyIncludeIndex = {
638654
file: 'manifest.yml',
639655
key: 'packages.__APP_PACKAGE__.actions.action.inputs.LOG_LEVEL'
640656
},
657+
'application.runtimeManifest.packages.__APP_PACKAGE__.actions.action.inputs.MAX_ITEMS': {
658+
file: 'manifest.yml',
659+
key: 'packages.__APP_PACKAGE__.actions.action.inputs.MAX_ITEMS'
660+
},
661+
'application.runtimeManifest.packages.__APP_PACKAGE__.actions.action.inputs.TAGS': {
662+
file: 'manifest.yml',
663+
key: 'packages.__APP_PACKAGE__.actions.action.inputs.TAGS'
664+
},
665+
'application.runtimeManifest.packages.__APP_PACKAGE__.actions.action.inputs.TAGS.0': {
666+
file: 'manifest.yml',
667+
key: 'packages.__APP_PACKAGE__.actions.action.inputs.TAGS.0'
668+
},
669+
'application.runtimeManifest.packages.__APP_PACKAGE__.actions.action.inputs.TAGS.1': {
670+
file: 'manifest.yml',
671+
key: 'packages.__APP_PACKAGE__.actions.action.inputs.TAGS.1'
672+
},
641673
'application.runtimeManifest.packages.__APP_PACKAGE__.actions.action.inputs.SOMETHING': {
642674
file: 'manifest.yml',
643675
key: 'packages.__APP_PACKAGE__.actions.action.inputs.SOMETHING'

test/data-mocks/config-loader.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ function fullFakeRuntimeManifest (pathToActionFolder, pkgName1) {
4646
runtime: 'nodejs:14',
4747
inputs: {
4848
LOG_LEVEL: 'debug',
49+
TAGS: ['tag1', 'tag2'],
50+
MAX_ITEMS: 100,
4951
SOMETHING: {
5052
type: 'string',
5153
description: 'this is about something',
@@ -434,6 +436,11 @@ module.exports = (appFixtureName, mockedAIOConfig, rewriteMockConfig = {}) => {
434436
}
435437
if (mockedAIOConfig && mockedAIOConfig.project && mockedAIOConfig.project.org) {
436438
config.all[k].imsOrgId = mockedAIOConfig.project.org.ims_org_id
439+
} else {
440+
config.all[k].imsOrgId = config.all[k].imsOrgId ?? undefined
441+
}
442+
if (config.all[k].app.hasFrontend && config.all[k].s3) {
443+
config.all[k].s3.tvmUrl = config.all[k].s3.tvmUrl ?? undefined
437444
}
438445
config.all[k].ow.package = `${config.packagejson.name}-${config.packagejson.version}`
439446
config.all[k].app.name = config.packagejson.name

test/index.test.js

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,143 @@ application:
869869
await expect(appConfig.load({})).rejects.toThrow('Missing or invalid keys in app.config.yaml')
870870
})
871871

872+
test('valid schema: action inputs support array (OpenWhisk spec)', async () => {
873+
global.fakeFileSystem.addJson(
874+
{
875+
'/package.json': '{}',
876+
'/app.config.yaml': `
877+
application:
878+
runtimeManifest:
879+
packages:
880+
pkg:
881+
actions:
882+
myaction:
883+
function: actions/test.js
884+
inputs:
885+
TAGS: ['tag1', 'tag2', 'tag3']
886+
EMPTY: []
887+
`
888+
}
889+
)
890+
const config = await appConfig.load({})
891+
const inputs = config.all.application.manifest.full.packages.pkg.actions.myaction.inputs
892+
expect(inputs.TAGS).toEqual(['tag1', 'tag2', 'tag3'])
893+
expect(Array.isArray(inputs.TAGS)).toBe(true)
894+
expect(inputs.EMPTY).toEqual([])
895+
})
896+
897+
test('valid schema: action inputs support number (OpenWhisk spec)', async () => {
898+
global.fakeFileSystem.addJson(
899+
{
900+
'/package.json': '{}',
901+
'/app.config.yaml': `
902+
application:
903+
runtimeManifest:
904+
packages:
905+
pkg:
906+
actions:
907+
myaction:
908+
function: actions/test.js
909+
inputs:
910+
COUNT: 42
911+
NEGATIVE: -531
912+
FLOAT: 432.43
913+
`
914+
}
915+
)
916+
const config = await appConfig.load({})
917+
const inputs = config.all.application.manifest.full.packages.pkg.actions.myaction.inputs
918+
expect(inputs.COUNT).toBe(42)
919+
expect(inputs.NEGATIVE).toBe(-531)
920+
expect(inputs.FLOAT).toBe(432.43)
921+
})
922+
923+
test('valid schema: action inputs support null (OpenWhisk spec)', async () => {
924+
global.fakeFileSystem.addJson(
925+
{
926+
'/package.json': '{}',
927+
'/app.config.yaml': `
928+
application:
929+
runtimeManifest:
930+
packages:
931+
pkg:
932+
actions:
933+
myaction:
934+
function: actions/test.js
935+
inputs:
936+
OPTIONAL: null
937+
`
938+
}
939+
)
940+
const config = await appConfig.load({})
941+
const inputs = config.all.application.manifest.full.packages.pkg.actions.myaction.inputs
942+
expect(inputs.OPTIONAL).toBeNull()
943+
})
944+
945+
test('valid schema: action inputs support mixed types (OpenWhisk spec)', async () => {
946+
global.fakeFileSystem.addJson(
947+
{
948+
'/package.json': '{}',
949+
'/app.config.yaml': `
950+
application:
951+
runtimeManifest:
952+
packages:
953+
pkg:
954+
actions:
955+
myaction:
956+
function: actions/test.js
957+
inputs:
958+
STR: hello
959+
NUM: 1
960+
FLAG: true
961+
ARR: [a, b]
962+
OBJ:
963+
type: string
964+
default: ''
965+
NIL: null
966+
`
967+
}
968+
)
969+
const config = await appConfig.load({})
970+
const inputs = config.all.application.manifest.full.packages.pkg.actions.myaction.inputs
971+
expect(inputs.STR).toBe('hello')
972+
expect(inputs.NUM).toBe(1)
973+
expect(inputs.FLAG).toBe(true)
974+
expect(inputs.ARR).toEqual(['a', 'b'])
975+
expect(inputs.OBJ).toEqual({ type: 'string', default: '' })
976+
expect(inputs.NIL).toBeNull()
977+
})
978+
979+
test('valid schema: package-level inputs (same constraints as action inputs)', async () => {
980+
global.fakeFileSystem.addJson(
981+
{
982+
'/package.json': '{}',
983+
'/app.config.yaml': `
984+
application:
985+
runtimeManifest:
986+
packages:
987+
pkg:
988+
license: Apache-2.0
989+
inputs:
990+
PKG_LEVEL: pkg-default
991+
PKG_TAGS: ['a', 'b']
992+
PKG_COUNT: 10
993+
actions:
994+
myaction:
995+
function: actions/test.js
996+
inputs:
997+
ACTION_INPUT: action-value
998+
`
999+
}
1000+
)
1001+
const config = await appConfig.load({})
1002+
const pkg = config.all.application.manifest.full.packages.pkg
1003+
expect(pkg.inputs.PKG_LEVEL).toBe('pkg-default')
1004+
expect(pkg.inputs.PKG_TAGS).toEqual(['a', 'b'])
1005+
expect(pkg.inputs.PKG_COUNT).toBe(10)
1006+
expect(pkg.actions.myaction.inputs.ACTION_INPUT).toBe('action-value')
1007+
})
1008+
8721009
test('valid schema with productDependencies', async () => {
8731010
global.fakeFileSystem.addJson(
8741011
{

0 commit comments

Comments
 (0)