From a9e4cacaa0a75e223029fc95cfc8829c8a4041b4 Mon Sep 17 00:00:00 2001 From: Vojtech Szocs Date: Mon, 27 May 2019 18:56:36 +0200 Subject: [PATCH] Add YAML template extension --- .../console-demo-plugin/src/plugin.tsx | 12 ++++++++++- .../console-demo-plugin/src/yaml-templates.ts | 12 +++++++++++ .../console-plugin-sdk/src/registry.ts | 5 +++++ .../console-plugin-sdk/src/typings/index.ts | 1 + .../src/typings/yaml-templates.ts | 18 +++++++++++++++++ frontend/public/models/yaml-templates.ts | 20 ++++++++++++++++++- 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 frontend/packages/console-demo-plugin/src/yaml-templates.ts create mode 100644 frontend/packages/console-plugin-sdk/src/typings/yaml-templates.ts diff --git a/frontend/packages/console-demo-plugin/src/plugin.tsx b/frontend/packages/console-demo-plugin/src/plugin.tsx index f423ba19eca..e57adb957a4 100644 --- a/frontend/packages/console-demo-plugin/src/plugin.tsx +++ b/frontend/packages/console-demo-plugin/src/plugin.tsx @@ -11,6 +11,7 @@ import { ResourceListPage, ResourceDetailPage, Perspective, + YAMLTemplate, } from '@console/plugin-sdk'; // TODO(vojtech): internal code needed by plugins should be moved to console-shared package @@ -18,6 +19,7 @@ import { PodModel } from '@console/internal/models'; import { FLAGS } from '@console/internal/const'; import * as models from './models'; +import { yamlTemplates } from './yaml-templates'; type ConsumedExtensions = | ModelDefinition @@ -27,7 +29,8 @@ type ConsumedExtensions = | ResourceClusterNavItem | ResourceListPage | ResourceDetailPage - | Perspective; + | Perspective + | YAMLTemplate; const plugin: Plugin = [ { @@ -110,6 +113,13 @@ const plugin: Plugin = [ landingPageURL: '/search', }, }, + { + type: 'YAMLTemplate', + properties: { + model: models.FooBarModel, + template: yamlTemplates.getIn([models.FooBarModel, 'default']), + }, + }, ]; export default plugin; diff --git a/frontend/packages/console-demo-plugin/src/yaml-templates.ts b/frontend/packages/console-demo-plugin/src/yaml-templates.ts new file mode 100644 index 00000000000..ea40e31dd38 --- /dev/null +++ b/frontend/packages/console-demo-plugin/src/yaml-templates.ts @@ -0,0 +1,12 @@ +import { Map as ImmutableMap } from 'immutable'; + +import { FooBarModel } from './models'; + +export const yamlTemplates = ImmutableMap() + .setIn([FooBarModel, 'default'], ` +apiVersion: ${FooBarModel.apiVersion} +kind: ${FooBarModel.kind} +metadata: + name: example + namespace: default +`); diff --git a/frontend/packages/console-plugin-sdk/src/registry.ts b/frontend/packages/console-plugin-sdk/src/registry.ts index eed8deb8f44..16ba9ab5fbf 100644 --- a/frontend/packages/console-plugin-sdk/src/registry.ts +++ b/frontend/packages/console-plugin-sdk/src/registry.ts @@ -8,6 +8,7 @@ import { isNavItem, isResourcePage, isPerspective, + isYAMLTemplate, } from './typings'; /** @@ -39,4 +40,8 @@ export class ExtensionRegistry { public getPerspectives() { return this.extensions.filter(isPerspective); } + + public getYAMLTemplates() { + return this.extensions.filter(isYAMLTemplate); + } } diff --git a/frontend/packages/console-plugin-sdk/src/typings/index.ts b/frontend/packages/console-plugin-sdk/src/typings/index.ts index edd13dee1da..f317dd98c74 100644 --- a/frontend/packages/console-plugin-sdk/src/typings/index.ts +++ b/frontend/packages/console-plugin-sdk/src/typings/index.ts @@ -75,3 +75,4 @@ export * from './models'; export * from './nav'; export * from './pages'; export * from './perspective'; +export * from './yaml-templates'; diff --git a/frontend/packages/console-plugin-sdk/src/typings/yaml-templates.ts b/frontend/packages/console-plugin-sdk/src/typings/yaml-templates.ts new file mode 100644 index 00000000000..bf040108dd1 --- /dev/null +++ b/frontend/packages/console-plugin-sdk/src/typings/yaml-templates.ts @@ -0,0 +1,18 @@ +import { Extension } from '.'; +import { K8sKind } from '@console/internal/module/k8s'; + +namespace ExtensionProperties { + export interface YAMLTemplate { + model: K8sKind; + template: string; + templateName?: string; + } +} + +export interface YAMLTemplate extends Extension { + type: 'YAMLTemplate'; +} + +export function isYAMLTemplate(e: Extension): e is YAMLTemplate { + return e.type === 'YAMLTemplate'; +} diff --git a/frontend/public/models/yaml-templates.ts b/frontend/public/models/yaml-templates.ts index 2a123e917fb..4f0b214d0f9 100644 --- a/frontend/public/models/yaml-templates.ts +++ b/frontend/public/models/yaml-templates.ts @@ -2,11 +2,12 @@ import { Map as ImmutableMap } from 'immutable'; import { GroupVersionKind, referenceForModel } from '../module/k8s'; import * as k8sModels from '../models'; +import * as plugins from '../plugins'; /** * Sample YAML manifests for some of the statically-defined Kubernetes models. */ -export const yamlTemplates = ImmutableMap>() +const baseTemplates = ImmutableMap>() .setIn(['DEFAULT', 'default'], ` apiVersion: '' kind: '' @@ -809,3 +810,20 @@ spec: kind: MachineSet name: worker `); + +const pluginTemplates = ImmutableMap>() + .withMutations(map => { + plugins.registry.getYAMLTemplates().forEach(yt => { + const modelRef = referenceForModel(yt.properties.model); + const templateName = yt.properties.templateName || 'default'; + + if (!baseTemplates.hasIn([modelRef, templateName])) { + map.setIn([modelRef, templateName], yt.properties.template); + } else { + // eslint-disable-next-line no-console + console.warn(`attempt to redefine YAML template ${templateName} for model ${modelRef}`); + } + }); + }); + +export const yamlTemplates = baseTemplates.merge(pluginTemplates);