diff --git a/src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.ts b/src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.ts index a062e81bdb..fea74610ae 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.ts @@ -1,13 +1,4 @@ -import { - Component, - ComponentFactoryResolver, - ComponentRef, - Injector, - Input, - OnDestroy, - OnInit, - ViewChild, -} from '@angular/core'; +import { Component, ComponentFactoryResolver, ComponentRef, Injector, Input, OnDestroy, ViewChild } from '@angular/core'; import { ListComponent } from '../../list.component'; import { IListConfig, ListConfig } from '../../list.component.types'; @@ -22,9 +13,13 @@ import { ListConfigProvider } from '../list-config-provider.types'; ListComponent ] }) -export class ListViewComponent implements OnInit, OnDestroy { +export class ListViewComponent implements OnDestroy { - @Input() config: ListConfigProvider; + @Input() set config(config: ListConfigProvider) { + if (config) { + this.create(config); + } + } @ViewChild(ListHostDirective, { static: true }) public listHost: ListHostDirective; @@ -36,13 +31,22 @@ export class ListViewComponent implements OnInit, OnDestroy { private injector: Injector ) { } - ngOnInit() { + ngOnDestroy() { + if (this.componentRef) { + this.componentRef.destroy(); + } + } + + create(listConfig: ListConfigProvider) { + // Clean up old component + this.ngOnDestroy(); + const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ListComponent); const viewContainerRef = this.listHost.viewContainerRef; this.componentRef = viewContainerRef.createComponent( componentFactory, null, - this.makeCustomConfigInjector(this.config.getListConfig()) + this.makeCustomConfigInjector(listConfig.getListConfig()) ); } @@ -52,10 +56,4 @@ export class ListViewComponent implements OnInit, OnDestroy { parent: this.injector }); } - - ngOnDestroy() { - if (this.componentRef) { - this.componentRef.destroy(); - } - } } diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.html b/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.html index c66ecb63b2..eeff6b4e62 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.html +++ b/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.html @@ -24,6 +24,6 @@ - {{ value }} - - + {{ value }} + - \ No newline at end of file diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.types.ts b/src/frontend/packages/core/src/shared/components/list/list.component.types.ts index 4602379d29..e5a673e44c 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.types.ts +++ b/src/frontend/packages/core/src/shared/components/list/list.component.types.ts @@ -126,6 +126,9 @@ export interface IListConfig { customTimeInitialValue?: string; } +// Simple list config does not need getDataSource +export type ISimpleListConfig = Omit, 'getDataSource'>; + export interface IListMultiFilterConfig { key: string; label: string; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.ts index bf615dad5e..35262b20c9 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.ts @@ -7,7 +7,7 @@ import { first, map } from 'rxjs/operators'; import { HomePageCardLayout } from '../../../../core/src/features/home/home.types'; import { HomeCardShortcut } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { EndpointModel } from '../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { KubernetesEndpointService } from '../services/kubernetes-endpoint.service'; @Component({ @@ -37,7 +37,7 @@ export class KubernetesHomeCardComponent implements OnInit { public nodeCount$: Observable; public namespaceCount$: Observable; - constructor(private store: Store) { } + constructor(private store: Store) { } ngOnInit() { const guid = this.endpoint.guid; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-catalog.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-catalog.ts deleted file mode 100644 index 6836c0bcda..0000000000 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-catalog.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - StratosCatalogEndpointEntity, - StratosCatalogEntity, -} from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; -import { IFavoriteMetadata } from '../../../store/src/types/user-favorites.types'; -import { - AnalysisReportsActionBuilders, - KubeDashboardActionBuilders, - KubeDeploymentActionBuilders, - KubeNamespaceActionBuilders, - KubeNodeActionBuilders, - KubePodActionBuilders, - KubeServiceActionBuilders, - KubeStatefulSetsActionBuilders, -} from './store/action-builders/kube.action-builders'; -import { - AnalysisReport, - KubernetesDeployment, - KubernetesNamespace, - KubernetesNode, - KubernetesPod, - KubernetesStatefulSet, - KubeService, -} from './store/kube.types'; -import { KubeDashboardStatus } from './store/kubernetes.effects'; - -/** - * A strongly typed collection of Kube Catalog Entities. - * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc - */ -export class KubeEntityCatalog { - public endpoint: StratosCatalogEndpointEntity; - public statefulSet: StratosCatalogEntity; - public pod: StratosCatalogEntity; - public deployment: StratosCatalogEntity; - public node: StratosCatalogEntity; - public namespace: StratosCatalogEntity; - public service: StratosCatalogEntity; - public dashboard: StratosCatalogEntity; - public analysisReport: StratosCatalogEntity; -} - -/** - * A strongly typed collection of Kube Catalog Entities. - * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc - */ -export const kubeEntityCatalog: KubeEntityCatalog = new KubeEntityCatalog(); diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-factory.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-factory.ts index 3b82c7d712..d2ea966654 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-factory.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-factory.ts @@ -4,25 +4,26 @@ import { getAPIResourceGuid } from '../../../cloud-foundry/src/store/selectors/a import { EntitySchema } from '../../../store/src/helpers/entity-schema'; import { metricEntityType } from '../../../store/src/helpers/stratos-entity-factory'; import { - getGuidFromKubeDashboardObj, getGuidFromKubeDeploymentObj, getGuidFromKubeNamespaceObj, getGuidFromKubeNodeObj, getGuidFromKubePodObj, getGuidFromKubeServiceObj, getGuidFromKubeStatefulSetObj, + getGuidFromResource, } from './store/kube.getIds'; import { KubernetesApp } from './store/kube.types'; -export const kubernetesEntityType = 'kubernetesInfo'; -export const kubernetesNodesEntityType = 'kubernetesNode'; -export const kubernetesPodsEntityType = 'kubernetesPod'; -export const kubernetesNamespacesEntityType = 'kubernetesNamespace'; -export const kubernetesServicesEntityType = 'kubernetesService'; -export const kubernetesStatefulSetsEntityType = 'kubernetesStatefulSet'; -export const kubernetesDeploymentsEntityType = 'kubernetesDeployment'; -export const kubernetesDashboardEntityType = 'kubernetesDashboard'; +export const kubernetesEntityType = 'info'; +export const kubernetesNodesEntityType = 'node'; +export const kubernetesPodsEntityType = 'pod'; +export const kubernetesNamespacesEntityType = 'namespace'; +export const kubernetesServicesEntityType = 'service'; +export const kubernetesStatefulSetsEntityType = 'statefulSet'; +export const kubernetesDeploymentsEntityType = 'deployment'; +export const kubernetesDashboardEntityType = 'dashboard'; export const analysisReportEntityType = 'analysisReport'; +export const kubernetesConfigMapEntityType = 'configMap'; export const getKubeAppId = (object: KubernetesApp) => object.name; @@ -102,7 +103,7 @@ entityCache[kubernetesServicesEntityType] = new KubernetesEntitySchema( entityCache[kubernetesDashboardEntityType] = new KubernetesEntitySchema( kubernetesDashboardEntityType, {}, - { idAttribute: getGuidFromKubeDashboardObj } + { idAttribute: getGuidFromResource } ); // Analysis Reports - should not be bound to an endpoint diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-generator.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-generator.ts index 185944495e..c87e5236a3 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-generator.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-generator.ts @@ -1,9 +1,12 @@ import { Compiler, Injector } from '@angular/core'; import { Validators } from '@angular/forms'; -import { entityFetchedWithoutError } from '@stratosui/store'; import { BaseEndpointAuth } from '../../../core/src/core/endpoint-auth'; import { urlValidationExpression } from '../../../core/src/core/utils.service'; +import { + OrchestratedActionBuilderConfig, + OrchestratedActionBuilders, +} from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, @@ -16,7 +19,6 @@ import { import { EndpointAuthTypeConfig, EndpointType } from '../../../store/src/extension-types'; import { metricEntityType } from '../../../store/src/helpers/stratos-entity-factory'; import { IFavoriteMetadata } from '../../../store/src/types/user-favorites.types'; -import { UserFavoriteManager } from '../../../store/src/user-favorite-manager'; import { KubernetesAWSAuthFormComponent } from './auth-forms/kubernetes-aws-auth-form/kubernetes-aws-auth-form.component'; import { KubernetesCertsAuthFormComponent, @@ -29,19 +31,25 @@ import { KubernetesSATokenAuthFormComponent, } from './auth-forms/kubernetes-serviceaccount-auth-form/kubernetes-serviceaccount-auth-form.component'; import { KubeConfigRegistrationComponent } from './kube-config-registration/kube-config-registration.component'; -import { kubeEntityCatalog } from './kubernetes-entity-catalog'; import { + addKubernetesEntitySchema, analysisReportEntityType, KUBERNETES_ENDPOINT_TYPE, + kubernetesConfigMapEntityType, kubernetesDashboardEntityType, kubernetesDeploymentsEntityType, kubernetesEntityFactory, + KubernetesEntitySchema, kubernetesNamespacesEntityType, kubernetesNodesEntityType, kubernetesPodsEntityType, kubernetesServicesEntityType, kubernetesStatefulSetsEntityType, } from './kubernetes-entity-factory'; +import { + createKubeResourceActionBuilder, + KubeResourceActionBuilders, +} from './store/action-builders/kube-resource.action-builder'; import { AnalysisReportsActionBuilders, analysisReportsActionBuilders, @@ -60,7 +68,12 @@ import { KubeStatefulSetsActionBuilders, kubeStatefulSetsActionBuilders, } from './store/action-builders/kube.action-builders'; +import { getGuidFromKubePodObj } from './store/kube.getIds'; import { + AnalysisReport, + KubeAPIResource, + KubeResourceEntityDefinition, + KubernetesConfigMap, KubernetesDeployment, KubernetesNamespace, KubernetesNode, @@ -68,6 +81,7 @@ import { KubernetesStatefulSet, KubeService, } from './store/kube.types'; +import { KubeDashboardStatus } from './store/kubernetes.effects'; import { generateWorkloadsEntities } from './workloads/store/workloads-entity-generator'; @@ -147,223 +161,405 @@ const kubeAuthTypeMap: { [type: string]: EndpointAuthTypeConfig, } = { } }; -export function generateKubernetesEntities(): StratosBaseCatalogEntity[] { - const endpointDefinition: StratosEndpointExtensionDefinition = { - type: KUBERNETES_ENDPOINT_TYPE, - label: 'Kubernetes', - labelPlural: 'Kubernetes', - icon: 'kubernetes', - iconFont: 'stratos-icons', - logoUrl: '/core/assets/custom/kubernetes.svg', - authTypes: [ - kubeAuthTypeMap[KubeEndpointAuthTypes.CERT_AUTH], - kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG], - BaseEndpointAuth.UsernamePassword, - kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN], - ], - getEndpointIdFromEntity: (entity) => entity.kubeGuid, - renderPriority: 4, - urlValidationRegexString: urlValidationExpression, - subTypes: [ - { - type: 'config', - label: 'Import Kubeconfig', - authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG]], - logoUrl: '/core/assets/custom/kube_import.png', - renderPriority: 3, - registrationComponent: KubeConfigRegistrationComponent, - }, - { - type: 'caasp', - label: 'SUSE CaaS Platform', - labelShort: 'CaaSP', - authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], - logoUrl: '/core/assets/custom/caasp.png', - renderPriority: 5, - }, { - type: 'aks', - label: 'Azure AKS', - labelShort: 'AKS', - authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG_AZ], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], - logoUrl: '/core/assets/custom/aks.svg', - renderPriority: 6 - }, { - type: 'eks', - label: 'Amazon EKS', - labelShort: 'EKS', - authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.AWS_IAM], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], - logoUrl: '/core/assets/custom/eks.svg', - renderPriority: 6 - }, { - type: 'gke', - label: 'Google Kubernetes Engine', - labelShort: 'GKE', - authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.GKE], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], - logoUrl: '/core/assets/custom/gke.svg', - renderPriority: 6 - }, { - type: 'k3s', - label: 'K3S', - labelShort: 'K3S', - authTypes: [BaseEndpointAuth.UsernamePassword, kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], - logoUrl: '/core/assets/custom/k3s.svg', - renderPriority: 6 - }], - homeCard: { - component: (compiler: Compiler, injector: Injector) => import('./home/kubernetes-home-card.module').then((m) => { - return compiler.compileModuleAndAllComponentsAsync(m.KubernetesHomeCardModule).then(cm => { - const mod = cm.ngModuleFactory.create(injector); - return mod.instance.createHomeCard(mod.componentFactoryResolver); - }); - }), - fullView: false +class KubeResourceEntityHelper { + + public static generate< + B = any, + C extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders + >( + endpointDefinition: StratosEndpointExtensionDefinition, + defn: KubeResourceEntityDefinition + ): StratosCatalogEntity { + // Simplify registration by registering the schema in the entity cache + addKubernetesEntitySchema(defn.type, new KubernetesEntitySchema(defn.type, {}, { idAttribute: getGuidFromKubePodObj })); + + defn.labelTab = defn.labelTab || defn.labelPlural || `${defn.label}s`; + + if (defn.apiNamespaced !== false) { + defn.apiNamespaced = true; } - }; - return [ - generateEndpointEntity(endpointDefinition), - generateStatefulSetsEntity(endpointDefinition), - generatePodsEntity(endpointDefinition), - generateDeploymentsEntity(endpointDefinition), - generateNodesEntity(endpointDefinition), - generateNamespacesEntity(endpointDefinition), - generateServicesEntity(endpointDefinition), - generateDashboardEntity(endpointDefinition), - generateAnalysisReportsEntity(endpointDefinition), - generateMetricEntity(endpointDefinition), - ...generateWorkloadsEntities(endpointDefinition) - ]; -} -function generateEndpointEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - kubeEntityCatalog.endpoint = new StratosCatalogEndpointEntity( - endpointDefinition, - favorite => `/kubernetes/${favorite.endpointId}` - ); - return kubeEntityCatalog.endpoint; -} + const d: IStratosEntityDefinition = { + ...defn, + endpoint: endpointDefinition, + schema: kubernetesEntityFactory(defn.type), + iconFont: defn.iconFont || 'stratos-icons', + labelPlural: defn.labelPlural || `${defn.label}s` + }; -function generateStatefulSetsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesStatefulSetsEntityType, - schema: kubernetesEntityFactory(kubernetesStatefulSetsEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.statefulSet = new StratosCatalogEntity( - definition, { - actionBuilders: kubeStatefulSetsActionBuilders - }); - return kubeEntityCatalog.statefulSet; + if (defn.getKubeCatalogEntity) { + return defn.getKubeCatalogEntity(d); + } else { + return new StratosCatalogEntity(d, { + actionBuilders: createKubeResourceActionBuilder(d.type) as unknown as C + }); + } + } } -function generatePodsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesPodsEntityType, - schema: kubernetesEntityFactory(kubernetesPodsEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.pod = new StratosCatalogEntity(definition, { - actionBuilders: kubePodActionBuilders - }); - return kubeEntityCatalog.pod; -} -function generateDeploymentsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesDeploymentsEntityType, - schema: kubernetesEntityFactory(kubernetesDeploymentsEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.deployment = new StratosCatalogEntity( - definition, { - actionBuilders: kubeDeploymentActionBuilders - }); - return kubeEntityCatalog.deployment; -} +/** + * A strongly typed collection of Kube Catalog Entities. + * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc + */ +export class KubeEntityCatalog { -function generateNodesEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesNodesEntityType, - schema: kubernetesEntityFactory(kubernetesNodesEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.node = new StratosCatalogEntity(definition, { - actionBuilders: kubeNodeActionBuilders - }); - return kubeEntityCatalog.node; -} + public endpoint: StratosCatalogEndpointEntity; + public statefulSet: StratosCatalogEntity; + public pod: StratosCatalogEntity; + public deployment: StratosCatalogEntity; + public node: StratosCatalogEntity; + public namespace: StratosCatalogEntity; + public service: StratosCatalogEntity; + public dashboard: StratosCatalogEntity; + public analysisReport: StratosCatalogEntity; + public configMap: StratosCatalogEntity; + public metrics: StratosCatalogEntity; -function generateNamespacesEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesNamespacesEntityType, - schema: kubernetesEntityFactory(kubernetesNamespacesEntityType), - endpoint: endpointDefinition, - label: 'Namespace', - icon: 'namespace', - iconFont: 'stratos-icons', - }; - kubeEntityCatalog.namespace = new StratosCatalogEntity( - definition, { - actionBuilders: kubeNamespaceActionBuilders, - entityBuilder: { - getIsValid: (fav) => kubeEntityCatalog.namespace.api.get(fav.metadata.name, fav.endpointId).pipe(entityFetchedWithoutError()), - getMetadata: (namespace: any) => { - return { - endpointId: namespace.kubeGuid, - guid: namespace.metadata.uid, - kubeGuid: namespace.kubeGuid, - name: namespace.metadata.name, - }; - }, - getLink: favorite => `/kubernetes/${favorite.endpointId}/namespaces/${favorite.metadata.name}`, - getGuid: namespace => namespace.metadata.uid, - } - }); - return kubeEntityCatalog.namespace; -} + public secrets: StratosCatalogEntity; + public pvc: StratosCatalogEntity; + public storage: StratosCatalogEntity; + public pv: StratosCatalogEntity; + public replicaSet: StratosCatalogEntity; + public clusterRole: StratosCatalogEntity; + public serviceAccount: StratosCatalogEntity; + public role: StratosCatalogEntity; + public job: StratosCatalogEntity; -function generateServicesEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesServicesEntityType, - schema: kubernetesEntityFactory(kubernetesServicesEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.service = new StratosCatalogEntity(definition, { - actionBuilders: kubeServiceActionBuilders - }); - return kubeEntityCatalog.service; -} + constructor() { + const endpointDef: StratosEndpointExtensionDefinition = { + type: KUBERNETES_ENDPOINT_TYPE, + label: 'Kubernetes', + labelPlural: 'Kubernetes', + icon: 'kubernetes', + iconFont: 'stratos-icons', + logoUrl: '/core/assets/custom/kubernetes.svg', + authTypes: [ + kubeAuthTypeMap[KubeEndpointAuthTypes.CERT_AUTH], + kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG], + BaseEndpointAuth.UsernamePassword, + kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN], + ], + getEndpointIdFromEntity: (entity) => entity.kubeGuid, + renderPriority: 4, + urlValidationRegexString: urlValidationExpression, + subTypes: [ + { + type: 'config', + label: 'Import Kubeconfig', + authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG]], + logoUrl: '/core/assets/custom/kube_import.png', + renderPriority: 3, + registrationComponent: KubeConfigRegistrationComponent, + }, + { + type: 'caasp', + label: 'SUSE CaaS Platform', + labelShort: 'CaaSP', + authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], + logoUrl: '/core/assets/custom/caasp.png', + renderPriority: 5, + }, { + type: 'aks', + label: 'Azure AKS', + labelShort: 'AKS', + authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.CONFIG_AZ], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], + logoUrl: '/core/assets/custom/aks.svg', + renderPriority: 6 + }, { + type: 'eks', + label: 'Amazon EKS', + labelShort: 'EKS', + authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.AWS_IAM], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], + logoUrl: '/core/assets/custom/eks.svg', + renderPriority: 6 + }, { + type: 'gke', + label: 'Google Kubernetes Engine', + labelShort: 'GKE', + authTypes: [kubeAuthTypeMap[KubeEndpointAuthTypes.GKE], kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], + logoUrl: '/core/assets/custom/gke.svg', + renderPriority: 6 + }, { + type: 'k3s', + label: 'K3S', + labelShort: 'K3S', + authTypes: [BaseEndpointAuth.UsernamePassword, kubeAuthTypeMap[KubeEndpointAuthTypes.TOKEN]], + logoUrl: '/core/assets/custom/k3s.svg', + renderPriority: 6 + }], + homeCard: { + component: (compiler: Compiler, injector: Injector) => import('./home/kubernetes-home-card.module').then((m) => { + return compiler.compileModuleAndAllComponentsAsync(m.KubernetesHomeCardModule).then(cm => { + const mod = cm.ngModuleFactory.create(injector); + return mod.instance.createHomeCard(mod.componentFactoryResolver); + }); + }), + fullView: false + } + }; -function generateDashboardEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: kubernetesDashboardEntityType, - schema: kubernetesEntityFactory(kubernetesDashboardEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.dashboard = new StratosCatalogEntity(definition, { - actionBuilders: kubeDashboardActionBuilders - }); - return kubeEntityCatalog.dashboard; -} + this.endpoint = new StratosCatalogEndpointEntity( + endpointDef, + favorite => `/kubernetes/${favorite.endpointId}` + ); + + this.statefulSet = this.generateStatefulSetsEntity(endpointDef); + this.pod = KubeResourceEntityHelper.generate(endpointDef, { + type: kubernetesPodsEntityType, + icon: 'pod', + label: 'Pod', + apiVersion: '/api/v1', + apiName: 'pods', + apiNamespaced: true, + listConfig: 'k8s-pods', + getKubeCatalogEntity: (definition) => new StratosCatalogEntity( + definition, { actionBuilders: kubePodActionBuilders } + ) + }); + this.deployment = this.generateDeploymentsEntity(endpointDef); + this.node = this.generateNodesEntity(endpointDef); + this.namespace = KubeResourceEntityHelper.generate(endpointDef, { + type: kubernetesNamespacesEntityType, + icon: 'namespace', + label: 'Namespace', + apiVersion: '/api/v1', + apiName: 'namespaces', + apiNamespaced: false, + getKubeCatalogEntity: (definition) => new StratosCatalogEntity( + definition, { actionBuilders: kubeNamespaceActionBuilders } + ), + listColumns: [ + { + header: 'Status', + field: 'status.phase', + sort: true + } + ] + }); + this.service = KubeResourceEntityHelper.generate(endpointDef, { + type: kubernetesServicesEntityType, + icon: 'service', + label: 'Service', + apiVersion: '/api/v1', + apiName: 'service', + apiNamespaced: true, + listConfig: 'k8s-services', + getKubeCatalogEntity: (definition) => new StratosCatalogEntity( + definition, { + actionBuilders: kubeServiceActionBuilders + } + ) + }); + this.dashboard = this.generateDashboardEntity(endpointDef); + this.analysisReport = this.generateAnalysisReportsEntity(endpointDef); + this.configMap = KubeResourceEntityHelper.generate(endpointDef, { + type: kubernetesConfigMapEntityType, + icon: 'config_maps', + label: 'Config Map', + apiVersion: '/api/v1', + apiName: 'configmaps', + listColumns: [ + { + header: 'Data Keys', + field: (row: KubernetesConfigMap) => `${Object.keys(row.data).length}` + }, + ] + }); + this.metrics = this.generateMetricEntity(endpointDef); + + + this.secrets = KubeResourceEntityHelper.generate(endpointDef, { + type: 'secrets', + icon: 'config_maps', + label: 'Secret', + apiVersion: '/api/v1', + apiName: 'secrets', + listColumns: [ + { + header: 'Data Keys', + field: (row: KubernetesConfigMap) => `${Object.keys(row.data).length}` + }, + ], + }); + this.pvc = KubeResourceEntityHelper.generate(endpointDef, { + type: 'persistentVolumeClaims', + icon: 'job', + label: 'Persistent Volume Claim', + labelTab: 'PVCs', + apiVersion: '/api/v1', + apiName: 'persistentvolumeclaims', + listColumns: [ + { + header: 'Storage Class', + field: 'spec.storageClassName', + sort: true + }, + { + header: 'Phase', + field: 'status.phase', + sort: true + }, + { + header: 'Capacity', + field: 'status.capacity.storage', + } + ] + }); + this.storage = KubeResourceEntityHelper.generate(endpointDef, { + type: 'storageClass', + icon: 'storage_class', + label: 'Storage Class', + labelPlural: 'Storage Classes', + apiVersion: '/apis/storage.k8s.io/v1', + apiName: 'storageclasses', + apiNamespaced: false, + listColumns: [ + { + header: 'Provisioner', + field: 'provisioner', + sort: true + }, + { + header: 'Reclaim Policy', + field: 'reclaimPolicy', + sort: true + }, + { + header: 'Binding Mode', + field: 'volumeBindingMode', + sort: true + } + ] + }); + this.pv = KubeResourceEntityHelper.generate(endpointDef, { + type: 'persistentVolume', + icon: 'persistent_volume', + label: 'Persistent Volume', + apiVersion: '/api/v1', + apiName: 'persistentvolumes', + apiNamespaced: false, + }); + this.replicaSet = KubeResourceEntityHelper.generate(endpointDef, { + type: 'replicaSet', + icon: 'replica_set', + label: 'Replica Set', + apiVersion: '/apis/apps/v1', + apiName: 'replicasets', + listColumns: [ + { + header: 'Replicas', + field: 'spec.replicas', + sort: true + }, + ] + }); + this.clusterRole = KubeResourceEntityHelper.generate(endpointDef, { + type: 'clusterRole', + icon: 'cluster_role', + label: 'Cluster Role', + apiVersion: '/apis/rbac.authorization.k8s.io/v1', + apiName: 'clusterroles', + apiNamespaced: false, + }); + this.serviceAccount = KubeResourceEntityHelper.generate(endpointDef, { + type: 'serviceAccount', + icon: 'replica_set', + label: 'Service Account', + apiVersion: '/api/v1', + apiName: 'serviceaccounts', + }); + this.role = KubeResourceEntityHelper.generate(endpointDef, { + type: 'role', + icon: 'role_binding', + label: 'Role', + apiVersion: '/apis/rbac.authorization.k8s.io/v1', + apiName: 'roles', + }); + this.job = KubeResourceEntityHelper.generate(endpointDef, { + type: 'job', + icon: 'job', + label: 'Job', + apiVersion: '/apis/batch/v1', + apiName: 'jobs', + }); + + } + + public allKubeEntities(): StratosBaseCatalogEntity[] { + return [ + ...Object.getOwnPropertyNames(this).map(s => this[s]), + ...generateWorkloadsEntities(this.endpoint.definition) + ]; + } + + private generateStatefulSetsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity( + { + type: kubernetesStatefulSetsEntityType, + schema: kubernetesEntityFactory(kubernetesStatefulSetsEntityType), + endpoint: endpointDefinition + }, { + actionBuilders: kubeStatefulSetsActionBuilders + }); + } + + private generateDeploymentsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity( + { + type: kubernetesDeploymentsEntityType, + schema: kubernetesEntityFactory(kubernetesDeploymentsEntityType), + endpoint: endpointDefinition + }, { + actionBuilders: kubeDeploymentActionBuilders + }); + } + + private generateNodesEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity({ + type: kubernetesNodesEntityType, + schema: kubernetesEntityFactory(kubernetesNodesEntityType), + endpoint: endpointDefinition + }, { + actionBuilders: kubeNodeActionBuilders + }); + } + + private generateDashboardEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity({ + type: kubernetesDashboardEntityType, + schema: kubernetesEntityFactory(kubernetesDashboardEntityType), + endpoint: endpointDefinition + }, { + actionBuilders: kubeDashboardActionBuilders + }); + } + + private generateAnalysisReportsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity({ + type: analysisReportEntityType, + schema: kubernetesEntityFactory(analysisReportEntityType), + endpoint: endpointDefinition + }, { + actionBuilders: analysisReportsActionBuilders + }); + } + + private generateMetricEntity(endpointDefinition: StratosEndpointExtensionDefinition) { + return new StratosCatalogEntity({ + type: metricEntityType, + schema: kubernetesEntityFactory(metricEntityType), + label: 'Kubernetes Metric', + labelPlural: 'Kubernetes Metrics', + endpoint: endpointDefinition, + }); + } -function generateAnalysisReportsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition = { - type: analysisReportEntityType, - schema: kubernetesEntityFactory(analysisReportEntityType), - endpoint: endpointDefinition - }; - kubeEntityCatalog.analysisReport = new StratosCatalogEntity(definition, { - actionBuilders: analysisReportsActionBuilders - }); - return kubeEntityCatalog.analysisReport; -} -function generateMetricEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: metricEntityType, - schema: kubernetesEntityFactory(metricEntityType), - label: 'Kubernetes Metric', - labelPlural: 'Kubernetes Metrics', - endpoint: endpointDefinition, - }; - return new StratosCatalogEntity(definition); } + +/** + * A strongly typed collection of Kube Catalog Entities. + * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc + */ +export const kubeEntityCatalog: KubeEntityCatalog = new KubeEntityCatalog(); diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-list-service.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-list-service.ts new file mode 100644 index 0000000000..4cede8e981 --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-list-service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { ISimpleListConfig } from 'frontend/packages/core/src/shared/components/list/list.component.types'; + +interface KubernetesListConfig { + [name: string]: ISimpleListConfig; +} + +// Holder for list configurations +// This allows us to reference them by name and lazy-load the configs yet reference them +// in an entity defintion that may not have been laz-loaded + +@Injectable({ + providedIn: 'root', +}) +export class KubernetesListConfigService { + + private configs: KubernetesListConfig = {}; + + set(name: string, config: ISimpleListConfig) { + this.configs[name] = config; + } + + get(name: string): ISimpleListConfig { + return name ? this.configs[name] : undefined; + } +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.ts index 691b367d92..044a84b05b 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.ts @@ -58,10 +58,11 @@ export class KubernetesNamespaceComponent { ); this.tabLinks = [ - { link: 'pods', label: 'Pods', icon: 'pod', iconFont: 'stratos-icons' }, - { link: 'services', label: 'Services', icon: 'service', iconFont: 'stratos-icons' }, { link: 'analysis', label: 'Analysis', icon: 'assignment', hidden$: this.analysisService.hideAnalysis$ }, + { link: 'services', label: 'Services', icon: 'service', iconFont: 'stratos-icons' }, ]; + + this.tabLinks.push(...this.getTabsFromEntityConfig(true)); } public favorite$ = this.kubeNamespaceService.namespace$.pipe( @@ -76,4 +77,29 @@ export class KubernetesNamespaceComponent { KUBERNETES_ENDPOINT_TYPE )) ); + + private getTabsFromEntityConfig(namespaced: boolean = true) { + return []; + // const entityNames = Object.getOwnPropertyNames(kubeEntityCatalog); + // const tabsFromRouterConfig = []; + + // // Get the tabs from the router configuration + // kubeEntityCatalog.allKubeEntities().forEach(catalogEntity => { + // if (catalogEntity) { + // const defn = catalogEntity.definition as KubeResourceEntityDefinition; + // if (defn.apiNamespaced === namespaced) { + // tabsFromRouterConfig.push({ + // link: defn.route || `resource/${key}`, + // label: defn.labelTab || defn.labelPlural, + // icon: defn.icon, + // iconFont: defn.iconFont, + // }); + // } + // } + // }); + + // tabsFromRouterConfig.sort((a, b) => a.label.localeCompare(b.label)); + // return tabsFromRouterConfig; + } + } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.module.ts new file mode 100644 index 0000000000..6f1a7d5297 --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.module.ts @@ -0,0 +1,34 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { CoreModule } from '@angular/flex-layout'; + +import { SharedModule } from '../../../../core/src/public-api'; +import { BaseKubeGuid } from '../kubernetes-page.types'; +import { KubernetesEndpointService } from '../services/kubernetes-endpoint.service'; +import { KubernetesService } from '../services/kubernetes.service'; +import { MDAppModule } from './../../../../core/src/core/md.module'; +import { KubernetesResourceRoutingModule } from './generic-resource.routing'; +import { KubernetesResourceListComponent } from './kubernetes-resource-list/kubernetes-resource-list.component'; + +@NgModule({ + imports: [ + CoreModule, + MDAppModule, + CommonModule, + SharedModule, + KubernetesResourceRoutingModule, + ], + declarations: [ + KubernetesResourceListComponent, + ], + providers: [ + KubernetesService, + BaseKubeGuid, + KubernetesEndpointService, + ], + exports: [ + KubernetesResourceListComponent, + ] +}) +export class KubernetesGenericResourceModule { } + diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.routing.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.routing.ts new file mode 100644 index 0000000000..36827ebcee --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.routing.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { KubernetesResourceListComponent } from './kubernetes-resource-list/kubernetes-resource-list.component'; + +const genericResource: Routes = [{ + path: '', + component: KubernetesResourceListComponent +}]; + +@NgModule({ + imports: [RouterModule.forChild(genericResource)] +}) +export class KubernetesResourceRoutingModule { } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.html b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.html new file mode 100644 index 0000000000..86e4d2f939 --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.html @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.scss b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.scss new file mode 100644 index 0000000000..a5fd29f8ad --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.scss @@ -0,0 +1,36 @@ +.sub-nav-menu-button { + border: 1px solid #777; + border-radius: 5px; + margin-left: 20px; + width: 200px; + + &__btn { + line-height: 28px; + padding: 0 8px 0 12px; + width: 100%; + + .mat-button-wrapper { + display: flex; + justify-content: flex-start; + } + } + &__label { + flex: 1; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + } + &__arrow { + margin: 0; + margin-Left: 10px; + } + &__not-allowed { + opacity: 0.5 + } +} + +.menu { + max-height: 400px; + width: 180px; +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.spec.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.spec.ts new file mode 100644 index 0000000000..e1538f6d1f --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.spec.ts @@ -0,0 +1,46 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; + +import { TabNavService } from '../../../../../core/src/tab-nav.service'; +import { KubeBaseGuidMock, KubernetesBaseTestModules } from '../../kubernetes.testing.module'; +import { KubernetesResourceListComponent } from './kubernetes-resource-list.component'; + +describe('KubernetesResourceListComponent', () => { + let component: KubernetesResourceListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ KubernetesResourceListComponent ], + imports: [ KubernetesBaseTestModules ], + providers: [ + KubeBaseGuidMock, + TabNavService, + { + provide: ActivatedRoute, + useValue: { + snapshot: { + data: { + entityCatalogKey: 'test' + }, + params: { + }, + queryParams: {} + } + } + } + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(KubernetesResourceListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.ts new file mode 100644 index 0000000000..361fbf74ac --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.ts @@ -0,0 +1,222 @@ +import { Component, OnDestroy } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Observable, of, Subscription } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; + +import { + ActionListConfigProvider, +} from '../../../../../core/src/shared/components/list/list-generics/list-providers/action-list-config-provider'; +import { + TableCellSidePanelComponent, + TableCellSidePanelConfig, +} from '../../../../../core/src/shared/components/list/list-table/table-cell-side-panel/table-cell-side-panel.component'; +import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; +import { ListViewTypes } from '../../../../../core/src/shared/components/list/list.component.types'; +import { entityCatalog } from '../../../../../store/src/public-api'; +import { KUBERNETES_ENDPOINT_TYPE } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; +import { KubernetesListConfigService } from '../../kubernetes-list-service'; +import { BaseKubeGuid } from '../../kubernetes-page.types'; +import { + KubernetesResourceViewerComponent, + KubernetesResourceViewerConfig, +} from '../../kubernetes-resource-viewer/kubernetes-resource-viewer.component'; +import { defaultHelmKubeListPageSize } from '../../list-types/kube-helm-list-types'; +import { createKubeAgeColumn } from '../../list-types/kube-list.helper'; +import { + KubeAPIResource, + KubeResourceEntityDefinition, + KubernetesCurrentNamespace, + SimpleColumnValueGetter, + SimpleKubeListColumn, +} from '../../store/kube.types'; +import { SetCurrentNamespaceAction } from './../../store/kubernetes.actions'; + +const namespaceColumnId = 'namespace'; + +@Component({ + selector: 'app-kubernetes-resource-list', + templateUrl: './kubernetes-resource-list.component.html', + styleUrls: ['./kubernetes-resource-list.component.scss'], +}) +export class KubernetesResourceListComponent implements OnDestroy { + + public entityCatalogKey: string; + + public namespaces$: Observable; + + selectedNamespace: string; + + public showNamespaceLink = true; + + public provider: ActionListConfigProvider; + + public isNamespacedView = true; + + private sub: Subscription; + + constructor( + private store: Store, + route: ActivatedRoute, + router: Router, + private kubeId: BaseKubeGuid, + private listConfigService: KubernetesListConfigService + ) { + // Entity Catalog Key can be specified in the route config + this.entityCatalogKey = route.snapshot.data.entityCatalogKey; + if (!this.entityCatalogKey) { + // Default is to use the last part of the route + const routeParts = router.url.split('/'); + this.entityCatalogKey = routeParts[routeParts.length - 1]; + } + + const catalogEntity = entityCatalog.getEntityFromKey(entityCatalog.getEntityKey(KUBERNETES_ENDPOINT_TYPE, this.entityCatalogKey)); + if (!catalogEntity) { + console.error(`Can not find catalog entity for Kubernetes entity ${this.entityCatalogKey}`); + return; + } + + const namespacesObs = kubeEntityCatalog.namespace.store.getPaginationService(kubeId.guid); + this.namespaces$ = namespacesObs.entities$.pipe(map(ns => ns.map(n => n.metadata.name))); + + this.createProvider(catalogEntity); + + // Watch for namespace changes + this.sub = this.store.select(state => state.k8sCurrentNamespace).pipe( + map(data => data[this.kubeId.guid]), + filter(data => !!data) + ).subscribe(ns => { + this.selectedNamespace = ns === '*' ? undefined : ns; + if (this.isNamespacedView) { + this.createProvider(catalogEntity); + } + }); + } + + ngOnDestroy() { + if (this.sub) { + this.sub.unsubscribe(); + } + } + + private createProvider(catalogEntity: any) { + this.isNamespacedView = !!catalogEntity.definition.apiNamespaced; + let action; + if (this.selectedNamespace && this.isNamespacedView) { + action = catalogEntity.actions.getInNamespace(this.kubeId.guid, this.selectedNamespace); + } else { + action = catalogEntity.actions.getMultiple(this.kubeId.guid); + } + + const provider = new ActionListConfigProvider(this.store, action); + const listConfigName = catalogEntity.definition ? catalogEntity.definition.listConfig : null; + let listConfig: any = this.listConfigService.get(listConfigName); + if (!listConfig) { + listConfig = { + pageSizeOptions: defaultHelmKubeListPageSize, + viewType: ListViewTypes.TABLE_ONLY, + enableTextFilter: true, + text: { + title: null, + filter: 'Filter by Name', + noEntries: 'There are no resources' + }, + getColumns: () => this.getColumns(catalogEntity.definition) + }; + } + + provider.updateListConfig(listConfig); + this.provider = provider; + } + + select(item?: string) { + this.store.dispatch(new SetCurrentNamespaceAction(this.kubeId.guid, item)); + } + + private getColumns(definition: KubeResourceEntityDefinition): ITableColumn[] { + let columns: Array> = [ + // Name + { + columnId: 'name', headerCell: () => 'Name', + cellComponent: TableCellSidePanelComponent, + sort: { + type: 'sort', + orderKey: 'name', + field: 'metadata.name' + }, + cellFlex: '3', + cellConfig: (resource): TableCellSidePanelConfig => { + return ({ + text: resource.metadata.name, + sidePanelComponent: KubernetesResourceViewerComponent, + sidePanelConfig: { + title: resource.metadata.name, + resourceKind: definition.label, + resource$: of(resource) + } + }); + } + }, + // Namespace + { + columnId: namespaceColumnId, headerCell: () => 'Namespace', + cellDefinition: { + valuePath: 'metadata.namespace', + getLink: row => this.showNamespaceLink ? `/kubernetes/${this.kubeId}/namespaces/${row.metadata.namespace}` : null + }, + sort: { + type: 'sort', + orderKey: namespaceColumnId, + field: 'metadata.namespace' + }, + cellFlex: '2', + }, + ]; + + // We hide the namespace column if we are in a given namespace OR the resource is not namespaced + // let hideNamespaceColumn = !!this.selectedNamespace; + let hideNamespaceColumn = false; + if (definition && definition.apiNamespaced === false) { + hideNamespaceColumn = true; + } + + if (hideNamespaceColumn) { + // Hide the namespace column + columns = columns.filter(column => column.columnId !== namespaceColumnId); + } + + if (definition && definition.listColumns) { + definition.listColumns.forEach(c => columns.push(this.simpleCellToTableCell(c))); + } + + columns.push(createKubeAgeColumn()); + return columns; + } + + private simpleCellToTableCell(cell: SimpleKubeListColumn): ITableColumn { + + const tableCell: ITableColumn = { + columnId: cell.header.toLowerCase(), + headerCell: () => cell.header, + cellDefinition: {}, + cellFlex: cell.flex || '1' + }; + + if (typeof (cell.field) === 'string') { + tableCell.cellDefinition.valuePath = cell.field as string; + } else { + tableCell.cellDefinition.getValue = cell.field as SimpleColumnValueGetter; + } + + if (cell.sort && typeof (cell.field) === 'string') { + tableCell.sort = { + type: 'sort', + orderKey: tableCell.columnId, + field: cell.field as string + }; + } + + return tableCell; + } +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.html b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.html index ab204d0455..9e26fd3e85 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.html +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.html @@ -3,6 +3,7 @@

{{ (kubeEndpointService.endpoint$ | async)?.entity.name }}

+ \ No newline at end of file diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.ts index 4b3b5e61ea..61e4df51a9 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes-tab-base/kubernetes-tab-base.component.ts @@ -9,6 +9,8 @@ import { BaseKubeGuid } from '../kubernetes-page.types'; import { KubernetesEndpointService } from '../services/kubernetes-endpoint.service'; import { KubernetesAnalysisService } from '../services/kubernetes.analysis.service'; import { KubernetesService } from '../services/kubernetes.service'; +import { KubeResourceEntityDefinition } from '../store/kube.types'; +import { kubeEntityCatalog } from './../kubernetes-entity-generator'; @Component({ selector: 'app-kubernetes-tab-base', @@ -43,18 +45,42 @@ export class KubernetesTabBaseComponent implements OnInit { public kubeEndpointService: KubernetesEndpointService, public userFavoriteManager: UserFavoriteManager, public analysisService: KubernetesAnalysisService, + private route: ActivatedRoute, ) { this.tabLinks = [ { link: 'summary', label: 'Summary', icon: 'kubernetes', iconFont: 'stratos-icons' }, { link: 'analysis', label: 'Analysis', icon: 'assignment', hidden$: this.analysisService.hideAnalysis$ }, { link: '-', label: 'Cluster' }, { link: 'nodes', label: 'Nodes', icon: 'node', iconFont: 'stratos-icons' }, - { link: 'namespaces', label: 'Namespaces', icon: 'namespace', iconFont: 'stratos-icons' }, + ...this.getTabsFromEntityConfig(false), { link: '-', label: 'Resources' }, - { link: 'pods', label: 'Pods', icon: 'pod', iconFont: 'stratos-icons' }, + ...this.getTabsFromEntityConfig(true) ]; } + + private getTabsFromEntityConfig(namespaced: boolean = true) { + const tabsFromRouterConfig = []; + + // Get the tabs from the router configuration + kubeEntityCatalog.allKubeEntities().forEach(catalogEntity => { + if (catalogEntity) { + const defn = catalogEntity.definition as unknown as KubeResourceEntityDefinition; + if (defn.apiNamespaced === namespaced && !defn.hidden) { + tabsFromRouterConfig.push({ + link: `resource/${catalogEntity.type}`, + label: defn.labelTab || defn.labelPlural, + icon: defn.icon, + iconFont: defn.iconFont, + }); + } + } + }); + + tabsFromRouterConfig.sort((a, b) => a.label.localeCompare(b.label)); + return tabsFromRouterConfig; + } + ngOnInit() { this.isFetching$ = this.kubeEndpointService.endpoint$.pipe( map(endpoint => !endpoint), @@ -68,5 +94,4 @@ export class KubernetesTabBaseComponent implements OnInit { map(endpoint => [endpoint.entity.guid]) ); } - } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.module.ts index 2ee5760928..c453d11135 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.module.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.module.ts @@ -26,6 +26,7 @@ import { KubedashConfigurationComponent, } from './kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component'; import { KubernetesDashboardTabComponent } from './kubernetes-dashboard/kubernetes-dashboard.component'; +import { KubernetesListConfigService } from './kubernetes-list-service'; import { KubernetesNamespaceAnalysisReportComponent, } from './kubernetes-namespace/kubernetes-namespace-analysis-report/kubernetes-namespace-analysis-report.component'; @@ -101,10 +102,12 @@ import { KubernetesPodStatusComponent, } from './list-types/kubernetes-pods/kubernetes-pod-status/kubernetes-pod-status.component'; import { KubernetesPodTagsComponent } from './list-types/kubernetes-pods/kubernetes-pod-tags/kubernetes-pod-tags.component'; +import { KubernetesPodsListConfig } from './list-types/kubernetes-pods/kubernetes-pods-list-config.service'; import { KubernetesServicePortsComponent } from './list-types/kubernetes-service-ports/kubernetes-service-ports.component'; import { KubeServiceCardComponent, } from './list-types/kubernetes-services/kubernetes-service-card/kubernetes-service-card.component'; +import { KubernetesServicesListConfig } from './list-types/kubernetes-services/kubernetes-service-list-config.service'; import { PodMetricsComponent } from './pod-metrics/pod-metrics.component'; import { KubernetesEndpointService } from './services/kubernetes-endpoint.service'; import { KubernetesNodeService } from './services/kubernetes-node.service'; @@ -121,7 +124,6 @@ import { import { KubernetesAnalysisTabComponent } from './tabs/kubernetes-analysis-tab/kubernetes-analysis-tab.component'; import { KubernetesNamespacesTabComponent } from './tabs/kubernetes-namespaces-tab/kubernetes-namespaces-tab.component'; import { KubernetesNodesTabComponent } from './tabs/kubernetes-nodes-tab/kubernetes-nodes-tab.component'; -import { KubernetesPodsTabComponent } from './tabs/kubernetes-pods-tab/kubernetes-pods-tab.component'; import { KubernetesSummaryTabComponent } from './tabs/kubernetes-summary-tab/kubernetes-summary.component'; /* tslint:disable:max-line-length */ @@ -140,7 +142,6 @@ import { KubernetesSummaryTabComponent } from './tabs/kubernetes-summary-tab/kub KubernetesNodesTabComponent, KubernetesTabBaseComponent, KubernetesNodeCapacityComponent, - KubernetesPodsTabComponent, KubernetesPodTagsComponent, KubernetesNamespacesTabComponent, KubernetesDashboardTabComponent, @@ -234,5 +235,11 @@ import { KubernetesSummaryTabComponent } from './tabs/kubernetes-summary-tab/kub AnalysisStatusCellComponent, ] }) -export class KubernetesModule { } +export class KubernetesModule { + + constructor(listConfigService: KubernetesListConfigService) { + listConfigService.set('k8s-pods', new KubernetesPodsListConfig()); + listConfigService.set('k8s-services', new KubernetesServicesListConfig()); + } +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.routing.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.routing.ts index 35c15386f8..db092316d9 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.routing.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.routing.ts @@ -1,8 +1,14 @@ -import { KubernetesNamespaceAnalysisReportComponent } from './kubernetes-namespace/kubernetes-namespace-analysis-report/kubernetes-namespace-analysis-report.component'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { KubeConsoleComponent } from './kube-terminal/kube-console.component'; +import { + KubedashConfigurationComponent, +} from './kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component'; import { KubernetesDashboardTabComponent } from './kubernetes-dashboard/kubernetes-dashboard.component'; +import { + KubernetesNamespaceAnalysisReportComponent, +} from './kubernetes-namespace/kubernetes-namespace-analysis-report/kubernetes-namespace-analysis-report.component'; import { KubernetesNamespacePodsComponent, } from './kubernetes-namespace/kubernetes-namespace-pods/kubernetes-namespace-pods.component'; @@ -19,17 +25,16 @@ import { KubernetesNodeSummaryComponent, } from './list-types/kubernetes-nodes/kubernetes-node-summary/kubernetes-node-summary.component'; import { PodMetricsComponent } from './pod-metrics/pod-metrics.component'; +import { + KubernetesAnalysisInfoComponent, +} from './tabs/kubernetes-analysis-tab/kubernetes-analysis-info/kubernetes-analysis-info.component'; +import { + KubernetesAnalysisReportComponent, +} from './tabs/kubernetes-analysis-tab/kubernetes-analysis-report/kubernetes-analysis-report.component'; +import { KubernetesAnalysisTabComponent } from './tabs/kubernetes-analysis-tab/kubernetes-analysis-tab.component'; import { KubernetesNamespacesTabComponent } from './tabs/kubernetes-namespaces-tab/kubernetes-namespaces-tab.component'; import { KubernetesNodesTabComponent } from './tabs/kubernetes-nodes-tab/kubernetes-nodes-tab.component'; -import { KubernetesPodsTabComponent } from './tabs/kubernetes-pods-tab/kubernetes-pods-tab.component'; import { KubernetesSummaryTabComponent } from './tabs/kubernetes-summary-tab/kubernetes-summary.component'; -import { KubedashConfigurationComponent } from './kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component'; -import { KubeConsoleComponent } from './kube-terminal/kube-console.component'; -import { KubernetesAnalysisTabComponent } from './tabs/kubernetes-analysis-tab/kubernetes-analysis-tab.component'; -import { KubernetesAnalysisReportComponent } from './tabs/kubernetes-analysis-tab/kubernetes-analysis-report/kubernetes-analysis-report.component'; -import { - KubernetesAnalysisInfoComponent -} from './tabs/kubernetes-analysis-tab/kubernetes-analysis-info/kubernetes-analysis-info.component'; const kubernetes: Routes = [{ path: '', @@ -70,9 +75,10 @@ const kubernetes: Routes = [{ } ] }, +// TODO: RC these can be removed? { path: ':endpointId/namespaces/:namespaceName', - component: KubernetesNamespaceComponent, + component: KubernetesNamespaceComponent, // TODO: RC This component, and others in here, should be removed if route goes children: [ { path: '', @@ -90,7 +96,11 @@ const kubernetes: Routes = [{ { path: 'analysis', component: KubernetesNamespaceAnalysisReportComponent - } + }, + { + path: 'resource/:resource', + loadChildren: () => import('./kubernetes-resource/generic-resource.module').then(m => m.KubernetesGenericResourceModule), + }, ] }, { @@ -114,10 +124,6 @@ const kubernetes: Routes = [{ path: 'namespaces', component: KubernetesNamespacesTabComponent }, - { - path: 'pods', - component: KubernetesPodsTabComponent - }, { path: 'analysis', component: KubernetesAnalysisTabComponent @@ -130,6 +136,11 @@ const kubernetes: Routes = [{ path: 'analysis/info', component: KubernetesAnalysisInfoComponent }, + { + path: 'resource/:resource', + loadChildren: () => import('./kubernetes-resource/generic-resource.module').then(m => m.KubernetesGenericResourceModule), + }, + ] }, { diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.setup.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.setup.module.ts index ab0a527eec..55f487759c 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.setup.module.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.setup.module.ts @@ -40,16 +40,16 @@ import { import { KubeConfigTableUserSelectComponent, } from './kube-config-registration/kube-config-selection/kube-config-table-user-select/kube-config-table-user-select.component'; -import { kubeEntityCatalog } from './kubernetes-entity-catalog'; import { KUBERNETES_ENDPOINT_TYPE } from './kubernetes-entity-factory'; -import { generateKubernetesEntities } from './kubernetes-entity-generator'; +import { kubeEntityCatalog } from './kubernetes-entity-generator'; +import { KubernetesListConfigService } from './kubernetes-list-service'; import { BaseKubeGuid } from './kubernetes-page.types'; import { KubernetesStoreModule } from './kubernetes.store.module'; import { KubernetesEndpointService } from './services/kubernetes-endpoint.service'; @NgModule({ imports: [ - EntityCatalogModule.forFeature(generateKubernetesEntities), + EntityCatalogModule.forFeature(() => kubeEntityCatalog.allKubeEntities()), CoreModule, CommonModule, SharedModule, @@ -74,6 +74,7 @@ import { KubernetesEndpointService } from './services/kubernetes-endpoint.servic providers: [ BaseKubeGuid, KubernetesEndpointService, + KubernetesListConfigService, ], entryComponents: [ KubernetesCertsAuthFormComponent, diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.store.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.store.module.ts index 4b37169198..906b6ee457 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.store.module.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.store.module.ts @@ -3,13 +3,15 @@ import { EffectsModule } from '@ngrx/effects'; import { AnalysisEffects } from './store/analysis.effects'; import { KubernetesEffects } from './store/kubernetes.effects'; +import { KubernetesReducersModule } from './store/kubernetes.reducers'; @NgModule({ imports: [ EffectsModule.forFeature([ AnalysisEffects, KubernetesEffects, - ]) + ]), + KubernetesReducersModule, ] }) export class KubernetesStoreModule { } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.testing.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.testing.module.ts index bffc35ba08..612024e973 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.testing.module.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/kubernetes.testing.module.ts @@ -15,7 +15,7 @@ import { import { generateStratosEntities } from '../../../store/src/stratos-entity-generator'; import { createBasicStoreModule } from '../../../store/testing/public-api'; import { HelmReleaseActivatedRouteMock, HelmReleaseGuidMock } from '../helm/helm-testing.module'; -import { generateKubernetesEntities } from './kubernetes-entity-generator'; +import { kubeEntityCatalog } from './kubernetes-entity-generator'; import { BaseKubeGuid } from './kubernetes-page.types'; import { HelmReleaseHelperService } from './workloads/release/tabs/helm-release-helper.service'; @@ -29,7 +29,7 @@ import { HelmReleaseHelperService } from './workloads/release/tabs/helm-release- testEntityCatalog.clear(); return [ ...generateStratosEntities(), - ...generateKubernetesEntities(), + ...kubeEntityCatalog.allKubeEntities(), ]; } } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/analysis-reports-list-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/analysis-reports-list-source.ts index 0b1cccec2f..2e3b1e14b6 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/analysis-reports-list-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/analysis-reports-list-source.ts @@ -8,7 +8,7 @@ import { first, map } from 'rxjs/operators'; import { AppState } from '../../../../store/src/public-api'; import { isFetchingPage } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { KubernetesEndpointService } from '../services/kubernetes-endpoint.service'; import { GetAnalysisReports } from '../store/analysis.actions'; import { AnalysisReport } from '../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-data-source.ts index 8ed8c1128c..8d994ac5c5 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-data-source.ts @@ -3,8 +3,8 @@ import { Store } from '@ngrx/store'; import { ListDataSource } from '../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; import { kubernetesEntityFactory, kubernetesPodsEntityType } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesNamespaceService } from '../../services/kubernetes-namespace.service'; import { KubernetesPod } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-list-config.service.ts index c5e48a4935..adb90ee069 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-pods/kubernetes-namespace-pods-list-config.service.ts @@ -17,9 +17,7 @@ export class KubernetesNamespacePodsListConfigService extends BaseKubernetesPods kubeId: BaseKubeGuid, public kubeNamespaceService: KubernetesNamespaceService, ) { - super(kubeId.guid, [ - BaseKubernetesPodsListConfigService.namespaceColumnId, - ]); + super([BaseKubernetesPodsListConfigService.namespaceColumnId]); this.podsDataSource = new KubernetesNamespacePodsDataSource(store, kubeId, this, kubeNamespaceService); } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-data-source.ts index bf533daf17..a21b07430c 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-data-source.ts @@ -2,7 +2,7 @@ import { Store } from '@ngrx/store'; import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubeService } from '../../store/kube.types'; import { BaseKubernetesServicesDataSource } from '../kubernetes-services/kubernetes-services-data-source'; @@ -18,7 +18,7 @@ export class KubernetesNamespaceServicesDataSource extends BaseKubernetesService ) { super( store, - kubeEntityCatalog.service.actions.getInNamespace(namespace, kubeGuid.guid), + kubeEntityCatalog.service.actions.getInNamespace(kubeGuid.guid, namespace), listConfig ); } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-list-config.service.ts index ebf6103361..e42423e571 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespace-services/kubernetes-namespace-services-list-config.service.ts @@ -1,14 +1,16 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; +import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../store/src/public-api'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesNamespaceService } from '../../services/kubernetes-namespace.service'; +import { KubeService } from '../../store/kube.types'; import { BaseKubernetesServicesListConfig } from '../kubernetes-services/kubernetes-service-list-config.service'; import { KubernetesNamespaceServicesDataSource } from './kubernetes-namespace-services-data-source'; @Injectable() -export class KubernetesNamespaceServicesListConfig extends BaseKubernetesServicesListConfig { +export class KubernetesNamespaceServicesListConfig extends BaseKubernetesServicesListConfig implements IListConfig { dataSource: KubernetesNamespaceServicesDataSource; constructor( @@ -20,6 +22,4 @@ export class KubernetesNamespaceServicesListConfig extends BaseKubernetesService this.dataSource = new KubernetesNamespaceServicesDataSource(store, kubeId, this, kubeNamespaceService.namespaceName); } getDataSource = () => this.dataSource; - - } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespaces/kubernetes-namespaces-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespaces/kubernetes-namespaces-data-source.ts index c95efb1f23..118afa09ff 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespaces/kubernetes-namespaces-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-namespaces/kubernetes-namespaces-data-source.ts @@ -4,8 +4,8 @@ import { ListDataSource } from '../../../../../core/src/shared/components/list/d import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { getPaginationKey } from '../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; import { kubernetesNamespacesEntityType } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesNamespace } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-data-source.ts index 6ff5893190..426a6861d8 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-data-source.ts @@ -3,7 +3,7 @@ import { Store } from '@ngrx/store'; import { ListDataSource } from '../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesNodeService } from '../../services/kubernetes-node.service'; import { KubernetesPod } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-list-config.service.ts index 4f93ff213b..b204ccea12 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-node-pods/kubernetes-node-pods-list-config.service.ts @@ -19,9 +19,7 @@ export class KubernetesNodePodsListConfigService extends BaseKubernetesPodsListC kubeId: BaseKubeGuid, public kubeNodeService: KubernetesNodeService, ) { - super(kubeId.guid, [ - BaseKubernetesPodsListConfigService.nodeColumnId - ]); + super([BaseKubernetesPodsListConfigService.nodeColumnId]); this.podsDataSource = new KubernetesNodePodsDataSource(store, kubeId, this, kubeNodeService); } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-nodes/kubernetes-nodes-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-nodes/kubernetes-nodes-data-source.ts index 2550ea4e65..5e48788fe0 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-nodes/kubernetes-nodes-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-nodes/kubernetes-nodes-data-source.ts @@ -8,8 +8,8 @@ import { import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { getPaginationKey } from '../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; import { kubernetesNodesEntityType } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesNode } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts index c460e8aa4b..0463f79322 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts @@ -5,7 +5,7 @@ import { Observable } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { CardCell } from '../../../../../../core/src/shared/components/list/list.types'; -import { kubeEntityCatalog } from '../../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../../kubernetes-entity-generator'; import { Container, ContainerState, ContainerStatus, InitContainer, KubernetesPod } from '../../../store/kube.types'; export interface ContainerForTable { diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-data-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-data-source.ts index dd6b22afcb..096f5a79c6 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-data-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-data-source.ts @@ -3,7 +3,7 @@ import { Store } from '@ngrx/store'; import { ListDataSource } from '../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../store/src/public-api'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { BaseKubeGuid } from '../../kubernetes-page.types'; import { KubernetesPod } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-list-config.service.ts index 6534cf9b8a..d1595ace69 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-pods/kubernetes-pods-list-config.service.ts @@ -1,8 +1,3 @@ -import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { - IListDataSource, -} from 'frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { of } from 'rxjs'; import { @@ -10,9 +5,7 @@ import { TableCellSidePanelConfig, } from '../../../../../core/src/shared/components/list/list-table/table-cell-side-panel/table-cell-side-panel.component'; import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; -import { IListConfig, ListViewTypes } from '../../../../../core/src/shared/components/list/list.component.types'; -import { AppState } from '../../../../../store/src/public-api'; -import { BaseKubeGuid } from '../../kubernetes-page.types'; +import { ISimpleListConfig, ListViewTypes } from '../../../../../core/src/shared/components/list/list.component.types'; import { KubernetesResourceViewerComponent, KubernetesResourceViewerConfig, @@ -22,16 +15,14 @@ import { defaultHelmKubeListPageSize } from '../kube-helm-list-types'; import { createKubeAgeColumn } from '../kube-list.helper'; import { KubernetesPodContainersComponent } from './kubernetes-pod-containers/kubernetes-pod-containers.component'; import { KubernetesPodStatusComponent } from './kubernetes-pod-status/kubernetes-pod-status.component'; -import { KubernetesPodsDataSource } from './kubernetes-pods-data-source'; -export abstract class BaseKubernetesPodsListConfigService implements IListConfig { +export abstract class BaseKubernetesPodsListConfigService implements ISimpleListConfig { static namespaceColumnId = 'namespace'; static nodeColumnId = 'node'; public showNamespaceLink = true; constructor( - private kubeId: string, hideColumns: string[] = [ BaseKubernetesPodsListConfigService.namespaceColumnId, BaseKubernetesPodsListConfigService.nodeColumnId @@ -74,7 +65,7 @@ export abstract class BaseKubernetesPodsListConfigService implements IListConfig columnId: BaseKubernetesPodsListConfigService.namespaceColumnId, headerCell: () => 'Namespace', cellDefinition: { valuePath: 'metadata.namespace', - getLink: row => this.showNamespaceLink ? `/kubernetes/${this.kubeId}/namespaces/${row.metadata.namespace}` : null + getLink: row => this.showNamespaceLink ? `/kubernetes/${row.metadata.kubeId}/namespaces/${row.metadata.namespace}` : null }, sort: { type: 'sort', @@ -88,7 +79,7 @@ export abstract class BaseKubernetesPodsListConfigService implements IListConfig columnId: BaseKubernetesPodsListConfigService.nodeColumnId, headerCell: () => 'Node', cellDefinition: { valuePath: 'spec.nodeName', - getLink: pod => `/kubernetes/${this.kubeId}/nodes/${pod.spec.nodeName}/summary` + getLink: pod => `/kubernetes/${pod.metadata.kubeId}/nodes/${pod.spec.nodeName}/summary` }, sort: { type: 'sort', @@ -97,14 +88,6 @@ export abstract class BaseKubernetesPodsListConfigService implements IListConfig }, cellFlex: '2', }, - { - columnId: 'ready', - headerCell: () => 'Ready', - cellDefinition: { - getValue: pod => `${pod.expandedStatus.readyContainers}/${pod.expandedStatus.totalContainers}` - }, - cellFlex: '1' - }, { columnId: 'expandedStatus', headerCell: () => 'Status', @@ -139,7 +122,6 @@ export abstract class BaseKubernetesPodsListConfigService implements IListConfig filter: 'Filter by Name', noEntries: 'There are no pods' }; - abstract getDataSource: () => IListDataSource; expandComponent = KubernetesPodContainersComponent; getGlobalActions = () => null; @@ -149,19 +131,8 @@ export abstract class BaseKubernetesPodsListConfigService implements IListConfig getMultiFiltersConfigs = () => []; } -@Injectable() -export class KubernetesPodsListConfigService extends BaseKubernetesPodsListConfigService { - private podsDataSource: KubernetesPodsDataSource; - - getDataSource = () => this.podsDataSource; - - constructor( - store: Store, - kubeId: BaseKubeGuid, - ) { - super(kubeId.guid, []); - this.podsDataSource = new KubernetesPodsDataSource(store, kubeId, this); +export class KubernetesPodsListConfig extends BaseKubernetesPodsListConfigService { + constructor() { + super([]); } - } - diff --git a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-services/kubernetes-service-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-services/kubernetes-service-list-config.service.ts index 6c861ff29c..d650f64276 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-services/kubernetes-service-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/list-types/kubernetes-services/kubernetes-service-list-config.service.ts @@ -1,12 +1,11 @@ import { of } from 'rxjs'; -import { ListDataSource } from '../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { TableCellSidePanelComponent, TableCellSidePanelConfig, } from '../../../../../core/src/shared/components/list/list-table/table-cell-side-panel/table-cell-side-panel.component'; import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; -import { IListConfig, ListViewTypes } from '../../../../../core/src/shared/components/list/list.component.types'; +import { ISimpleListConfig, ListViewTypes } from '../../../../../core/src/shared/components/list/list.component.types'; import { KubernetesResourceViewerComponent, KubernetesResourceViewerConfig, @@ -17,7 +16,7 @@ import { createKubeAgeColumn } from '../kube-list.helper'; import { KubernetesServicePortsComponent } from '../kubernetes-service-ports/kubernetes-service-ports.component'; import { KubeServiceCardComponent } from './kubernetes-service-card/kubernetes-service-card.component'; -export abstract class BaseKubernetesServicesListConfig implements IListConfig { +export abstract class BaseKubernetesServicesListConfig implements ISimpleListConfig { columns: Array> = [ { columnId: 'name', headerCell: () => 'Name', @@ -71,11 +70,15 @@ export abstract class BaseKubernetesServicesListConfig implements IListConfig ListDataSource; - getGlobalActions = () => null; getMultiActions = () => []; getSingleActions = () => []; getColumns = () => this.columns; getMultiFiltersConfigs = () => []; } + +export class KubernetesServicesListConfig extends BaseKubernetesServicesListConfig { + constructor() { + super(); + } +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/pod-metrics/pod-metrics.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/pod-metrics/pod-metrics.component.ts index 6d0801f813..752b2e4e93 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/pod-metrics/pod-metrics.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/pod-metrics/pod-metrics.component.ts @@ -14,7 +14,7 @@ import { IHeaderBreadcrumb } from '../../../../core/src/shared/components/page-h import { EntityInfo } from '../../../../store/src/types/api.types'; import { ChartSeries, IMetricMatrixResult } from '../../../../store/src/types/base-metric.types'; import { IMetricApplication } from '../../../../store/src/types/metric.types'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { formatAxisCPUTime, formatCPUTime } from '../kubernetes-metrics.helpers'; import { BaseKubeGuid } from '../kubernetes-page.types'; import { KubernetesEndpointService } from '../services/kubernetes-endpoint.service'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-endpoint.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-endpoint.service.ts index 8ca622e099..034233dae7 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-endpoint.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-endpoint.service.ts @@ -11,7 +11,7 @@ import { EndpointModel } from '../../../../store/src/public-api'; import { PaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { EntityInfo } from '../../../../store/src/types/api.types'; import { EndpointUser } from '../../../../store/src/types/endpoint.types'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { BaseKubeGuid } from '../kubernetes-page.types'; import { KubernetesDeployment, diff --git a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-namespace.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-namespace.service.ts index ef31dc8889..dbc66755fd 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-namespace.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-namespace.service.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { getIdFromRoute } from '../../../../core/src/core/utils.service'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { KubernetesNamespace } from '../store/kube.types'; import { KubernetesEndpointService } from './kubernetes-endpoint.service'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-node.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-node.service.ts index 951a50de18..b51cd6d1a3 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-node.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes-node.service.ts @@ -10,7 +10,7 @@ import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-moni import { AppState } from '../../../../store/src/public-api'; import { EntityInfo } from '../../../../store/src/types/api.types'; import { MetricQueryType } from '../../../../store/src/types/metric.types'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { KubernetesNode, MetricStatistic } from '../store/kube.types'; import { FetchKubernetesMetricsAction } from '../store/kubernetes.actions'; import { KubernetesEndpointService } from './kubernetes-endpoint.service'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes.analysis.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes.analysis.service.ts index 160d92e53c..1261e859ae 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes.analysis.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/services/kubernetes.analysis.service.ts @@ -8,7 +8,7 @@ import { SnackBarService } from '../../../../core/src/shared/services/snackbar.s import { ResetPaginationOfType } from '../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../store/src/app-state'; import { ListActionState, RequestInfoState } from '../../../../store/src/reducers/api-request-reducer/types'; -import { kubeEntityCatalog } from '../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; import { GetAnalysisReports } from '../store/analysis.actions'; import { AnalysisReport } from '../store/kube.types'; import { getHelmReleaseDetailsFromGuid } from '../workloads/store/workloads-entity-factory'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube-resource.action-builder.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube-resource.action-builder.ts new file mode 100644 index 0000000000..0b136365ce --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube-resource.action-builder.ts @@ -0,0 +1,27 @@ +import { OrchestratedActionBuilders } from '../../../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; +import { GetKubernetesResource, GetKubernetesResources, GetKubernetesResourcesInNamespace } from '../kube-resource.actions'; + + +export interface KubeResourceActionBuilders extends OrchestratedActionBuilders { + get: ( + resourceName: string, + kubeGuid: string, + extraArgs: { namespace: string, } + ) => GetKubernetesResource; + getMultiple: ( + kubeGuid: string, + paginationKey?: string, + ) => GetKubernetesResources; + getInNamespace: ( + kubeGuid: string, + namespace: string + ) => GetKubernetesResourcesInNamespace; +} + +export function createKubeResourceActionBuilder(entityType: string): KubeResourceActionBuilders { + return { + get: (resName: string, kubeGuid: string, { namespace }) => new GetKubernetesResource(entityType, resName, namespace, kubeGuid), + getMultiple: (kubeGuid: string, paginationKey?: string) => new GetKubernetesResources(entityType, kubeGuid), + getInNamespace: (kubeGuid: string, namespace: string) => new GetKubernetesResourcesInNamespace(entityType, kubeGuid, namespace), + }; +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube.action-builders.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube.action-builders.ts index c48bd2c580..c5362463fd 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube.action-builders.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube.action-builders.ts @@ -126,8 +126,8 @@ export interface KubeServiceActionBuilders extends OrchestratedActionBuilders { paginationKey?: string ) => GetKubernetesServices; getInNamespace: ( + kubeGuid: string, namespace: string, - kubeGuid: string ) => GetKubernetesServicesInNamespace; getInWorkload: ( releaseTitle: string, @@ -137,7 +137,7 @@ export interface KubeServiceActionBuilders extends OrchestratedActionBuilders { export const kubeServiceActionBuilders: KubeServiceActionBuilders = { getMultiple: (kubeGuid: string, paginationKey?: string) => new GetKubernetesServices(kubeGuid), - getInNamespace: (namespace: string, kubeGuid: string) => new GetKubernetesServicesInNamespace(kubeGuid, namespace), + getInNamespace: (kubeGuid: string, namespace: string) => new GetKubernetesServicesInNamespace(kubeGuid, namespace), getInWorkload: (releaseTitle: string, kubeGuid: string) => new GetHelmReleaseServices(kubeGuid, releaseTitle) }; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kube-resource.actions.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kube-resource.actions.ts new file mode 100644 index 0000000000..c9a350270d --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kube-resource.actions.ts @@ -0,0 +1,80 @@ +import { SortDirection } from '@angular/material/sort'; + +import { getPaginationKey } from '../../../../store/src/actions/pagination.actions'; +import { PaginationParam } from '../../../../store/src/types/pagination.types'; +import { KUBERNETES_ENDPOINT_TYPE, kubernetesEntityFactory } from '../kubernetes-entity-factory'; +import { getGuidFromKubePod } from './kube.getIds'; +import { KubePaginationAction, KubeSingleEntityAction } from './kubernetes.actions'; + + +export const GET_KUBE_RESOURCES = '[KUBERNETES Endpoint] Get Resources'; +export const GET_KUBE_RESOURCES_SUCCESS = '[KUBERNETES Endpoint] Get Resources Success'; +export const GET_KUBE_RESOURCES_FAILURE = '[KUBERNETES Endpoint] Get Resources Failure'; + +export const GET_KUBE_RESOURCE = '[KUBERNETES Endpoint] Get Resource'; +export const GET_KUBE_RESOURCE_SUCCESS = '[KUBERNETES Endpoint] Get Resource Success'; +export const GET_KUBE_RESOURCE_FAILURE = '[KUBERNETES Endpoint] Get Resource Failure'; + +export const GET_KUBE_RESOURCES_IN_NAMESPACE = '[KUBERNETES Endpoint] Get Resources in namespace'; +export const GET_KUBE_RESOURCES_IN_NAMESPACE_SUCCESS = '[KUBERNETES Endpoint] Get Resources in namespace Success'; +export const GET_KUBE_RESOURCES_IN_NAMESPACE_FAILURE = '[KUBERNETES Endpoint] Get Resources in namespace Failure'; + + +const defaultSortParams = { + 'order-direction': 'desc' as SortDirection, + 'order-direction-field': 'name' +}; + +export class GetKubernetesResource implements KubeSingleEntityAction { + + public entity; + + constructor(public entityType: string, public podName: string, public namespaceName: string, public kubeGuid: string) { + this.guid = getGuidFromKubePod(kubeGuid, namespaceName, podName); + this.entity = [kubernetesEntityFactory(entityType)]; + } + type = GET_KUBE_RESOURCE; + endpointType = KUBERNETES_ENDPOINT_TYPE; + actions = [ + GET_KUBE_RESOURCE, + GET_KUBE_RESOURCE_SUCCESS, + GET_KUBE_RESOURCE_FAILURE + ]; + guid: string; +} + +export class GetKubernetesResources implements KubePaginationAction { + + public entity; + + constructor(public entityType: string, public kubeGuid: string) { + this.paginationKey = getPaginationKey(entityType, 'k8s', kubeGuid); + this.entity = [kubernetesEntityFactory(entityType)]; + } + type = GET_KUBE_RESOURCES; + endpointType = KUBERNETES_ENDPOINT_TYPE; + actions = [ + GET_KUBE_RESOURCES, + GET_KUBE_RESOURCES_SUCCESS, + GET_KUBE_RESOURCES_FAILURE + ]; + paginationKey: string; + initialParams: PaginationParam = { + ...defaultSortParams + }; + flattenPagination = true; +} + + +export class GetKubernetesResourcesInNamespace extends GetKubernetesResources { + constructor(entityType: string, kubeGuid: string, public namespaceName: string) { + super(entityType, kubeGuid); + this.paginationKey = getPaginationKey(entityType, `ns-${namespaceName}`, kubeGuid); + } + type = GET_KUBE_RESOURCES_IN_NAMESPACE; + actions = [ + GET_KUBE_RESOURCES_IN_NAMESPACE, + GET_KUBE_RESOURCES_IN_NAMESPACE_SUCCESS, + GET_KUBE_RESOURCES_IN_NAMESPACE_FAILURE + ]; +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kube.getIds.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kube.getIds.ts index 256d39ca39..0dac96b99d 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/store/kube.getIds.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kube.getIds.ts @@ -8,7 +8,6 @@ import { KubernetesStatefulSet, KubeService, } from './kube.types'; -import { KubeDashboardStatus } from './kubernetes.effects'; const deliminate = (...args: string[]) => args.join('_:_'); @@ -20,8 +19,35 @@ const debugMissingKubeId = (entity: BasicKubeAPIResource, func: (...args: string }; export const getGuidFromKubeNode = (kubeGuid: string, name: string): string => deliminate(name, kubeGuid); -export const getGuidFromKubeNodeObj = (entity: KubernetesNode): string => - debugMissingKubeId(entity, getGuidFromKubeNode, entity.metadata.kubeId, entity.metadata.name); + +export const getGuidForResource = (kubeGuid: string, name: string): string => deliminate(name, kubeGuid); +export const getGuidForNamespacedResource = (kubeGuid: string, namespace: string, name: string): string => + deliminate(name, namespace, kubeGuid); + +/** + * Get the ID for a Kubernetes Resource + */ +export const getGuidFromResource = (entity: BasicKubeAPIResource): string => { + + // Resource with namespace + if (entity.metadata.namespace) { + return deliminate(entity.metadata.kubeId, entity.metadata.namespace, entity.metadata.name); + } + + // Named resource (no namespace) + if (entity.metadata.name) { + return deliminate(entity.metadata.kubeId, entity.metadata.name); + } + + // Cluster-level resource (e.g. Kubernetes dashboard) + return entity.metadata.kubeId; +}; + +// ====================================================================================================================================== +// LEGACY - Remove those not needed +// ====================================================================================================================================== + +export const getGuidFromKubeNodeObj = (entity: KubernetesNode): string => getGuidFromResource(entity); export const getGuidFromKubeNamespace = (kubeGuid: string, name: string): string => deliminate(name, kubeGuid); export const getGuidFromKubeNamespaceObj = (entity: KubernetesNamespace): string => @@ -44,6 +70,3 @@ export const getGuidFromKubeDeploymentObj = (entity: KubernetesDeployment): stri export const getGuidFromKubePod = (kubeGuid: string, namespace: string, name: string): string => deliminate(name, namespace, kubeGuid); export const getGuidFromKubePodObj = (entity: KubernetesPod): string => debugMissingKubeId(entity, getGuidFromKubePod, entity.metadata.kubeId, entity.metadata.namespace, entity.metadata.name); - -export const getGuidFromKubeDashboard = (kubeGuid: string): string => kubeGuid; -export const getGuidFromKubeDashboardObj = (entity: KubeDashboardStatus): string => getGuidFromKubeDashboard(entity.kubeGuid); diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kube.types.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kube.types.ts index f2d1b28916..708264ec46 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/store/kube.types.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kube.types.ts @@ -1,5 +1,18 @@ +import { Observable } from 'rxjs'; + +import { + OrchestratedActionBuilderConfig, + OrchestratedActionBuilders, +} from '../../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; +import { StratosCatalogEntity } from '../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { IEntityMetadata, IStratosEntityDefinition } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { KubernetesPodExpandedStatus } from '../services/kubernetes-expanded-state'; +// Map of endpoint ID to current namespace for that endpoint +export interface KubernetesCurrentNamespace { + [endpoint: string]: string; +} + export interface KubernetesInfo { nodes: {}; pods: {}; @@ -23,6 +36,34 @@ export interface KubeAPIResource extends BasicKubeAPIResource { spec: any; } +export interface IKubeResourceEntityDefinition extends IStratosEntityDefinition { + apiVersion: string; + apiName: string; + apiNamespaced: boolean; +} + +export interface KubeResourceEntityDefinition< + A extends IEntityMetadata = IEntityMetadata, + B = any, + C extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders + > { + apiVersion: string; + apiName: string; + apiNamespaced?: boolean; + label: string; + labelPlural?: string; + labelTab?: string; + icon: string; + iconFont?: string; + type: string; + getKubeCatalogEntity?: (IStratosEntityDefinition) => StratosCatalogEntity; + listColumns?: SimpleKubeListColumn[]; + // Should this entity be hidden in the auto-generated navigation? + hidden?: boolean; + // Name fo a list config that can be obtained from the list config service + listConfig?: string; +} + export interface KubeService extends BasicKubeAPIResource { metadata: KubeServiceMetadata; status: ServiceStatus; @@ -517,3 +558,17 @@ export interface AnalysisReport { report?: any; title?: string; } + + +export interface KubernetesConfigMap extends BasicKubeAPIResource { + test?: string; +} + +export type SimpleColumnValueGetter = (row: T) => string | Observable; + +export interface SimpleKubeListColumn { + field: string | SimpleColumnValueGetter; + header: string; + flex?: string; + sort?: boolean; +} diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.actions.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.actions.ts index ebba3d6dca..f808c25fb9 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.actions.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.actions.ts @@ -1,4 +1,5 @@ import { SortDirection } from '@angular/material/sort'; +import { Action } from '@ngrx/store'; import { getActions } from 'frontend/packages/store/src/actions/action.helper'; import { ApiRequestTypes } from 'frontend/packages/store/src/reducers/api-request-reducer/request-helpers'; @@ -17,7 +18,7 @@ import { kubernetesServicesEntityType, kubernetesStatefulSetsEntityType, } from '../kubernetes-entity-factory'; -import { getGuidFromKubeDashboard, getGuidFromKubeNamespace, getGuidFromKubeNode, getGuidFromKubePod } from './kube.getIds'; +import { getGuidFromKubeNamespace, getGuidFromKubeNode, getGuidFromKubePod } from './kube.getIds'; export const GET_RELEASE_POD_INFO = '[KUBERNETES Endpoint] Get Release Pods Info'; export const GET_RELEASE_POD_INFO_SUCCESS = '[KUBERNETES Endpoint] Get Release Pods Info Success'; @@ -81,11 +82,18 @@ export const GET_KUBE_DASHBOARD = '[KUBERNETES Endpoint] Get K8S Dashboard Info' export const GET_KUBE_DASHBOARD_SUCCESS = '[KUBERNETES Endpoint] Get Dashboard Success'; export const GET_KUBE_DASHBOARD_FAILURE = '[KUBERNETES Endpoint] Get Dashboard Failure'; +export const SET_CURRENT_NAMESPACE = '[Kubernetes] Set Current Namespace'; + const defaultSortParams = { 'order-direction': 'desc' as SortDirection, 'order-direction-field': 'name' }; +// Set the current namespace fo the given endpoint +export class SetCurrentNamespaceAction implements Action { + constructor(public endpoint, public namespace: string) { } + type = SET_CURRENT_NAMESPACE; +} export interface KubeAction extends EntityRequestAction { kubeGuid: string; @@ -325,7 +333,7 @@ export class GeKubernetesDeployments implements KubePaginationAction { export class GetKubernetesDashboard implements KubeSingleEntityAction { constructor(public kubeGuid: string) { - this.guid = getGuidFromKubeDashboard(kubeGuid); + this.guid = kubeGuid; } type = GET_KUBE_DASHBOARD; entityType = kubernetesDashboardEntityType; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.effects.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.effects.ts index a430bc9bb1..b112159622 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.effects.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.effects.ts @@ -18,8 +18,16 @@ import { kubernetesPodsEntityType, } from '../kubernetes-entity-factory'; import { KubernetesPodExpandedStatusHelper } from '../services/kubernetes-expanded-state'; +import { + GET_KUBE_RESOURCES, + GET_KUBE_RESOURCES_IN_NAMESPACE, + GetKubernetesResources, + GetKubernetesResourcesInNamespace, +} from './kube-resource.actions'; import { BasicKubeAPIResource, + IKubeResourceEntityDefinition, + KubeAPIResource, KubernetesDeployment, KubernetesNamespace, KubernetesNode, @@ -68,6 +76,9 @@ export interface KubeDashboardContainer { export interface KubeDashboardStatus { guid: string; kubeGuid: string; + metadata?: { + kubeId: string; + }; installed: boolean; stratosInstalled: boolean; running: boolean; @@ -111,6 +122,9 @@ export class KubernetesEffects { } as NormalizedResponse; const status = response as KubeDashboardStatus; status.kubeGuid = action.kubeGuid; + status.metadata = { + kubeId: action.kubeGuid + }; result.entities[dashboardEntityConfig.entityKey][action.guid] = status; result.result.push(action.guid); return [ @@ -254,6 +268,50 @@ export class KubernetesEffects { )) ); + // ======================================================================================= + // Generic resource effects + // ======================================================================================= + + @Effect() + fetchKubeResources$ = this.actions$.pipe( + ofType(GET_KUBE_RESOURCES), + flatMap((action: GetKubernetesResources) => { + const catalog = entityCatalog.getEntity(action.endpointType, action.entityType); + if (catalog && catalog.definition) { + const defn = catalog.definition as IKubeResourceEntityDefinition; + if (defn.apiVersion && defn.apiName) { + return this.processListAction( + action, + `/pp/${this.proxyAPIVersion}/proxy/${defn.apiVersion}/${defn.apiName}` + ); + } + } + + throw new Error('Kubernetes Resource request - but no API information is available'); + }) + ); + + @Effect() + fetchKubeResourcesInNamespace$ = this.actions$.pipe( + ofType(GET_KUBE_RESOURCES_IN_NAMESPACE), + flatMap((action: GetKubernetesResourcesInNamespace) => { + const catalog = entityCatalog.getEntity(action.endpointType, action.entityType); + if (catalog && catalog.definition) { + const defn = catalog.definition as IKubeResourceEntityDefinition; + if (defn.apiVersion && defn.apiName) { + return this.processListAction( + action, + `/pp/${this.proxyAPIVersion}/proxy/${defn.apiVersion}/namespaces/${action.namespaceName}/${defn.apiName}` + ); + } + } + + throw new Error('Kubernetes Resource request - but no API information is available'); + }) + ); + + // ======================================================================================= + private processNodeAction(action: GetKubernetesNodes) { return this.processListAction( action, diff --git a/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.reducers.ts b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.reducers.ts new file mode 100644 index 0000000000..116c7eb3b1 --- /dev/null +++ b/src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.reducers.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { StoreModule } from '@ngrx/store'; import { KubernetesCurrentNamespace } from './kube.types'; +import { SET_CURRENT_NAMESPACE } from './kubernetes.actions'; + +export const KUBERNETES_CURRENT_NAMESPACE = 'k8sCurrentNamespace'; + +const defaultState: KubernetesCurrentNamespace = {}; + +function createCurrentNamespaceReducer(state: KubernetesCurrentNamespace = defaultState, action) { + switch (action.type) { + case SET_CURRENT_NAMESPACE: + return { + ...state, + [action.endpoint]: action.namespace + }; + default: + return state; + } +} + +@NgModule({ + imports: [ + StoreModule.forFeature(KUBERNETES_CURRENT_NAMESPACE, createCurrentNamespaceReducer), + ] +}) +export class KubernetesReducersModule { } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.html b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.html deleted file mode 100644 index dd2b6cb351..0000000000 --- a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.scss b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.spec.ts b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.spec.ts deleted file mode 100644 index b046e6a850..0000000000 --- a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BaseKubeGuid } from '../../kubernetes-page.types'; -import { KubernetesBaseTestModules } from '../../kubernetes.testing.module'; -import { KubernetesEndpointService } from '../../services/kubernetes-endpoint.service'; -import { KubernetesPodsTabComponent } from './kubernetes-pods-tab.component'; - -describe('KubernetesPodsTabComponent', () => { - let component: KubernetesPodsTabComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [KubernetesPodsTabComponent], - imports: KubernetesBaseTestModules, - providers: [BaseKubeGuid, KubernetesEndpointService] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(KubernetesPodsTabComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.ts deleted file mode 100644 index 3315248a53..0000000000 --- a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component } from '@angular/core'; - -import { ListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; -import { KubernetesPodsListConfigService } from '../../list-types/kubernetes-pods/kubernetes-pods-list-config.service'; - -@Component({ - selector: 'app-kubernetes-pods-tab', - templateUrl: './kubernetes-pods-tab.component.html', - styleUrls: ['./kubernetes-pods-tab.component.scss'], - providers: [{ - provide: ListConfig, - useClass: KubernetesPodsListConfigService, - }] -}) -export class KubernetesPodsTabComponent { } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts index efe1eeab7c..6405ed2558 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts @@ -15,7 +15,7 @@ import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagi import { AppState, entityCatalog } from '../../../../../store/src/public-api'; import { getCurrentPageRequestInfo } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { PaginatedAction, PaginationEntityState } from '../../../../../store/src/types/pagination.types'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { CaaspNodesData, KubernetesEndpointService } from '../../services/kubernetes-endpoint.service'; interface IValueLabels { diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/create-release/create-release.component.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/create-release/create-release.component.ts index a126fe31f5..a5c7ebdb45 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/create-release/create-release.component.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/create-release/create-release.component.ts @@ -13,8 +13,8 @@ import { ChartsService } from '../../../helm/monocular/shared/services/charts.se import { createMonocularProviders } from '../../../helm/monocular/stratos-monocular-providers.helpers'; import { getMonocularEndpoint, stratosMonocularEndpointGuid } from '../../../helm/monocular/stratos-monocular.helper'; import { HelmChartReference, HelmInstallValues } from '../../../helm/store/helm.types'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; import { KUBERNETES_ENDPOINT_TYPE } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { KubernetesNamespace } from '../../store/kube.types'; import { ChartValuesConfig, ChartValuesEditorComponent } from './../chart-values-editor/chart-values-editor.component'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-config.service.ts index ba0c1ddd4c..c9a0d9d714 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-config.service.ts @@ -14,10 +14,7 @@ export class HelmReleasePodsListConfig extends BaseKubernetesPodsListConfigServi store: Store, helmReleaseHelper: HelmReleaseHelperService ) { - super( - helmReleaseHelper.endpointGuid, - [BaseKubernetesPodsListConfigService.namespaceColumnId] - ); + super([BaseKubernetesPodsListConfigService.namespaceColumnId]); this.podsDataSource = new HelmReleasePodsDataSource(store, this, helmReleaseHelper.endpointGuid, helmReleaseHelper.releaseTitle); } diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-source.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-source.ts index 6726c3ef26..786a1c1859 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-source.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-source.ts @@ -3,7 +3,7 @@ import { ListDataSource } from 'frontend/packages/core/src/shared/components/lis import { IListConfig } from 'frontend/packages/core/src/shared/components/list/list.component.types'; import { AppState } from 'frontend/packages/store/src/app-state'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { KubernetesPod } from '../../store/kube.types'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-services-list-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-services-list-config.service.ts index d9d31a7505..aa2fa53e8f 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-services-list-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-services-list-config.service.ts @@ -3,14 +3,16 @@ import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { AppState } from 'frontend/packages/store/src/app-state'; +import { IListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { BaseKubernetesServicesListConfig, } from '../../list-types/kubernetes-services/kubernetes-service-list-config.service'; +import { KubeService } from '../../store/kube.types'; import { HelmReleaseHelperService } from '../release/tabs/helm-release-helper.service'; import { HelmReleaseServicesDataSource } from './helm-release-services-list-source'; @Injectable() -export class HelmReleaseServicesListConfig extends BaseKubernetesServicesListConfig { +export class HelmReleaseServicesListConfig extends BaseKubernetesServicesListConfig implements IListConfig { constructor( private store: Store, diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts index ca476270ce..e5564c3df3 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts @@ -18,8 +18,8 @@ import { } from 'rxjs/operators'; import { getCurrentPageRequestInfo } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; -import { kubeEntityCatalog } from '../../kubernetes-entity-catalog'; import { KUBERNETES_ENDPOINT_TYPE } from '../../kubernetes-entity-factory'; +import { kubeEntityCatalog } from '../../kubernetes-entity-generator'; import { KubernetesNamespace } from '../../store/kube.types'; export interface KubernetesNamespacesFilterItem { diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/helm-release-tab-base/helm-release-socket-service.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/helm-release-tab-base/helm-release-socket-service.ts index a3164755b9..b8e5be696d 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/helm-release-tab-base/helm-release-socket-service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/helm-release-tab-base/helm-release-socket-service.ts @@ -7,7 +7,7 @@ import { catchError, map, share, switchMap } from 'rxjs/operators'; import { SnackBarService } from '../../../../../../core/src/shared/services/snackbar.service'; import { AppState, entityCatalog, WrapperRequestActionSuccess } from '../../../../../../store/src/public-api'; import { EntityRequestAction } from '../../../../../../store/src/types/request.types'; -import { kubeEntityCatalog } from '../../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../../kubernetes-entity-generator'; import { KubernetesPodExpandedStatusHelper } from '../../../services/kubernetes-expanded-state'; import { KubernetesPod, KubeService } from '../../../store/kube.types'; import { KubePaginationAction } from '../../../store/kubernetes.actions'; diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-helper.service.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-helper.service.ts index 07cc4dd957..7888e51906 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-helper.service.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-helper.service.ts @@ -5,7 +5,7 @@ import { filter, map } from 'rxjs/operators'; import { helmEntityCatalog } from '../../../../helm/helm-entity-catalog'; import { ChartAttributes } from '../../../../helm/monocular/shared/models/chart'; import { ChartMetadata } from '../../../../helm/store/helm.types'; -import { kubeEntityCatalog } from '../../../kubernetes-entity-catalog'; +import { kubeEntityCatalog } from '../../../kubernetes-entity-generator'; import { ContainerStateCollection, KubernetesPod } from '../../../store/kube.types'; import { getHelmReleaseDetailsFromGuid } from '../../store/workloads-entity-factory'; import { diff --git a/src/frontend/packages/kubernetes/src/kubernetes/workloads/workloads.testing.module.ts b/src/frontend/packages/kubernetes/src/kubernetes/workloads/workloads.testing.module.ts index 5d1b9d4b87..4e6b29d1d8 100644 --- a/src/frontend/packages/kubernetes/src/kubernetes/workloads/workloads.testing.module.ts +++ b/src/frontend/packages/kubernetes/src/kubernetes/workloads/workloads.testing.module.ts @@ -15,7 +15,7 @@ import { generateStratosEntities } from '../../../../store/src/stratos-entity-ge import { createBasicStoreModule } from '../../../../store/testing/public-api'; import { generateHelmEntities } from '../../helm/helm-entity-generator'; import { HelmTestingModule } from '../../helm/helm-testing.module'; -import { generateKubernetesEntities } from '../kubernetes-entity-generator'; +import { kubeEntityCatalog } from '../kubernetes-entity-generator'; @NgModule({ imports: [{ @@ -27,7 +27,7 @@ import { generateKubernetesEntities } from '../kubernetes-entity-generator'; testEntityCatalog.clear(); return [ ...generateStratosEntities(), - ...generateKubernetesEntities(), + ...kubeEntityCatalog.allKubeEntities(), ...generateHelmEntities(), ]; }