From 99f2c3ba339443ab6fc3b5ea8d4e567b176b5388 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 18 Sep 2019 14:43:46 -0500 Subject: [PATCH] Backport PR #7229: Add kernelspec metadata --- packages/services/src/kernel/kernel.ts | 5 +++ packages/services/src/kernel/validate.ts | 16 ++++++++- tests/test-services/src/kernel/kernel.spec.ts | 36 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/services/src/kernel/kernel.ts b/packages/services/src/kernel/kernel.ts index 148e0c01c3b9..9164ef5381a8 100644 --- a/packages/services/src/kernel/kernel.ts +++ b/packages/services/src/kernel/kernel.ts @@ -1061,6 +1061,11 @@ export namespace Kernel { * A mapping of resource file name to download path. */ readonly resources: { [key: string]: string }; + + /** + * A dictionary of additional attributes about this kernel; used by clients to aid in kernel selection. + */ + readonly metadata?: JSONObject; } /** diff --git a/packages/services/src/kernel/validate.ts b/packages/services/src/kernel/validate.ts index c92d9c546947..a728a165d8e5 100644 --- a/packages/services/src/kernel/validate.ts +++ b/packages/services/src/kernel/validate.ts @@ -120,12 +120,26 @@ export function validateSpecModel(data: any): Kernel.ISpecModel { validateProperty(spec, 'language', 'string'); validateProperty(spec, 'display_name', 'string'); validateProperty(spec, 'argv', 'array'); + + let metadata: any = null; + if (spec.hasOwnProperty('metadata')) { + validateProperty(spec, 'metadata', 'object'); + metadata = spec.metadata; + } + + let env: any = null; + if (spec.hasOwnProperty('env')) { + validateProperty(spec, 'env', 'object'); + env = spec.env; + } return { name: data.name, resources: data.resources, language: spec.language, display_name: spec.display_name, - argv: spec.argv + argv: spec.argv, + metadata, + env }; } diff --git a/tests/test-services/src/kernel/kernel.spec.ts b/tests/test-services/src/kernel/kernel.spec.ts index c67df74c3ad8..a8d3a29d6785 100644 --- a/tests/test-services/src/kernel/kernel.spec.ts +++ b/tests/test-services/src/kernel/kernel.spec.ts @@ -298,5 +298,41 @@ describe('kernel', () => { const promise = Kernel.getSpecs(serverSettings); await expectFailure(promise, 'Invalid response: 201 Created'); }); + + it('should handle metadata', async () => { + const PYTHON_SPEC_W_MD = JSON.parse(JSON.stringify(PYTHON_SPEC)); + PYTHON_SPEC_W_MD.spec.metadata = { some_application: { key: 'value' } }; + const serverSettings = getRequestHandler(200, { + default: 'python', + kernelspecs: { python: PYTHON_SPEC_W_MD } + }); + const specs = await Kernel.getSpecs(serverSettings); + + expect(specs.kernelspecs['python']).to.have.property('metadata'); + const metadata = specs.kernelspecs['python'].metadata; + expect(metadata).to.have.property('some_application'); + expect((metadata as any).some_application).to.have.property( + 'key', + 'value' + ); + }); + + it('should handle env values', async () => { + const PYTHON_SPEC_W_ENV = JSON.parse(JSON.stringify(PYTHON_SPEC)); + PYTHON_SPEC_W_ENV.spec.env = { + SOME_ENV: 'some_value', + LANG: 'en_US.UTF-8' + }; + const serverSettings = getRequestHandler(200, { + default: 'python', + kernelspecs: { python: PYTHON_SPEC_W_ENV } + }); + const specs = await Kernel.getSpecs(serverSettings); + + expect(specs.kernelspecs['python']).to.have.property('env'); + const env = specs.kernelspecs['python'].env; + expect(env).to.have.property('SOME_ENV', 'some_value'); + expect(env).to.have.property('LANG', 'en_US.UTF-8'); + }); }); });