From 34399824a6c301c542d567a29afabcf9264c6ba9 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 1 Jul 2020 18:51:33 +0200 Subject: [PATCH] fix(scaffolder): schema adjusted --- packages/catalog-model/package.json | 1 + .../src/kinds/TemplateEntityV1alpha1.test.ts | 16 ++++++++++++++++ .../src/kinds/TemplateEntityV1alpha1.ts | 4 +++- packages/catalog-model/src/types.ts | 4 ++++ plugins/scaffolder/src/api.ts | 16 +++++++++++++--- yarn.lock | 5 +++++ 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 889d9d2e02..64ac3b3221 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -22,6 +22,7 @@ "dependencies": { "@backstage/config": "^0.1.1-alpha.12", "@types/yup": "^0.28.2", + "json-schema": "^0.2.5", "lodash": "^4.17.15", "uuid": "^8.0.0", "yup": "^0.29.1" diff --git a/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.test.ts b/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.test.ts index d2e455145f..52951c793a 100644 --- a/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.test.ts +++ b/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.test.ts @@ -33,6 +33,22 @@ describe('TemplateEntityV1alpah1', () => { }, spec: { type: 'cookiecutter', + schema: { + $schema: 'http://json-schema.org/draft-07/schema#', + required: ['storePath', 'owner'], + properties: { + owner: { + type: 'string', + title: 'Owner', + description: 'Who is going to own this component', + }, + storePath: { + type: 'string', + title: 'Store path', + description: 'GitHub store path in org/repo format', + }, + }, + }, }, }; policy = new TemplateEntityV1alpha1Policy(); diff --git a/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.ts b/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.ts index 0bef220a63..c2f071b7c3 100644 --- a/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.ts +++ b/packages/catalog-model/src/kinds/TemplateEntityV1alpha1.ts @@ -16,7 +16,7 @@ import * as yup from 'yup'; import type { Entity } from '../entity/Entity'; -import type { EntityPolicy } from '../types'; +import type { EntityPolicy, JSONSchema } from '../types'; const API_VERSION = ['backstage.io/v1alpha1', 'backstage.io/v1beta1'] as const; const KIND = 'Template' as const; @@ -27,6 +27,7 @@ export interface TemplateEntityV1alpha1 extends Entity { spec: { type: string; path?: string; + schema: JSONSchema; }; } @@ -41,6 +42,7 @@ export class TemplateEntityV1alpha1Policy implements EntityPolicy { .object({ type: yup.string().required().min(1), path: yup.string(), + schema: yup.object().required(), }) .required(), }); diff --git a/packages/catalog-model/src/types.ts b/packages/catalog-model/src/types.ts index 29ca8bdfa3..cba6438ccb 100644 --- a/packages/catalog-model/src/types.ts +++ b/packages/catalog-model/src/types.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { JsonValue } from '@backstage/config'; +import { JSONSchema7 } from 'json-schema'; import type { Entity } from './entity/Entity'; /** @@ -30,3 +32,5 @@ export type EntityPolicy = { */ enforce(entity: Entity): Promise; }; + +export type JSONSchema = JSONSchema7 & { [key in string]?: JsonValue }; diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index e84adb45f8..585a49ad78 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -37,20 +37,30 @@ export class ScaffolderApi { this.basePath = basePath; } + /** + * + * @param template Template entity for the scaffolder to use. New project is going to be created out of this template. + * @param values Parameters for the template, e.g. name, description + */ async scaffold( template: TemplateEntityV1alpha1, values: Record, ) { const url = `${this.apiOrigin}${this.basePath}/jobs`; - const { id: jobId } = await fetch(url, { + const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ template, values }), - }).then(x => x.json()); + }); - return jobId; + if (response.status !== 201) { + throw new Error(await response.text()); + } + + const { id } = await response.json(); + return id; } async getJob(jobId: string) { diff --git a/yarn.lock b/yarn.lock index f3e2129cc9..8b28254a52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11721,6 +11721,11 @@ json-schema@0.2.3: resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.5.tgz#97997f50972dd0500214e208c407efa4b5d7063b" + integrity sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"