From d0102a2d9a1f2498e6644403f55b0be009f0e3ef Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Wed, 11 Nov 2020 11:48:13 +0200 Subject: [PATCH 1/3] Expose all custom k8s api classes via extension api (#1319) Signed-off-by: Jari Kolehmainen --- src/extensions/renderer-api/k8s-api.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts index 6fab103448..9a0b50733f 100644 --- a/src/extensions/renderer-api/k8s-api.ts +++ b/src/extensions/renderer-api/k8s-api.ts @@ -3,10 +3,11 @@ export { apiManager } from "../../renderer/api/api-manager"; export { KubeObjectStore } from "../../renderer/kube-object.store" export { KubeApi, forCluster, IKubeApiCluster } from "../../renderer/api/kube-api"; export type { EventStore } from "../../renderer/components/+events/event.store" +export { VersionedKubeApi } from "../../renderer/api/kube-api-versioned"; export { KubeObject } from "../../renderer/api/kube-object"; -export { Pod, podsApi, IPodContainer, IPodContainerStatus } from "../../renderer/api/endpoints"; -export { Node, nodesApi } from "../../renderer/api/endpoints"; -export { Deployment, deploymentApi } from "../../renderer/api/endpoints"; +export { Pod, podsApi, PodsApi, IPodContainer, IPodContainerStatus } from "../../renderer/api/endpoints"; +export { Node, nodesApi, NodesApi } from "../../renderer/api/endpoints"; +export { Deployment, deploymentApi, DeploymentApi } from "../../renderer/api/endpoints"; export { DaemonSet, daemonSetApi } from "../../renderer/api/endpoints"; export { StatefulSet, statefulSetApi } from "../../renderer/api/endpoints"; export { Job, jobApi } from "../../renderer/api/endpoints"; @@ -19,10 +20,10 @@ export { HorizontalPodAutoscaler, hpaApi } from "../../renderer/api/endpoints"; export { PodDisruptionBudget, pdbApi } from "../../renderer/api/endpoints"; export { Service, serviceApi } from "../../renderer/api/endpoints"; export { Endpoint, endpointApi } from "../../renderer/api/endpoints"; -export { Ingress, ingressApi } from "../../renderer/api/endpoints"; +export { Ingress, ingressApi, IngressApi } from "../../renderer/api/endpoints"; export { NetworkPolicy, networkPolicyApi } from "../../renderer/api/endpoints"; export { PersistentVolume, persistentVolumeApi } from "../../renderer/api/endpoints"; -export { PersistentVolumeClaim, PersistentVolumeClaimsApi } from "../../renderer/api/endpoints"; +export { PersistentVolumeClaim, pvcApi, PersistentVolumeClaimsApi } from "../../renderer/api/endpoints"; export { StorageClass, storageClassApi } from "../../renderer/api/endpoints"; export { Namespace, namespacesApi } from "../../renderer/api/endpoints"; export { KubeEvent, eventApi } from "../../renderer/api/endpoints"; @@ -32,4 +33,4 @@ export { RoleBinding, roleBindingApi } from "../../renderer/api/endpoints"; export { ClusterRole, clusterRoleApi } from "../../renderer/api/endpoints"; export { ClusterRoleBinding, clusterRoleBindingApi } from "../../renderer/api/endpoints"; export { CustomResourceDefinition, crdApi } from "../../renderer/api/endpoints"; -export { KubeObjectStatus, KubeObjectStatusLevel} from "./kube-object-status" \ No newline at end of file +export { KubeObjectStatus, KubeObjectStatusLevel} from "./kube-object-status" From bcbbe140b9adee84d0591d499dd8c11326d210ea Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 11 Nov 2020 11:56:13 +0200 Subject: [PATCH 2/3] Expose registration and related component interfaces to extensions (#1322) Signed-off-by: Lauri Nevala --- src/extensions/core-api/index.ts | 2 ++ src/extensions/interfaces/index.ts | 1 + src/extensions/interfaces/registrations.ts | 7 +++++++ 3 files changed, 10 insertions(+) create mode 100644 src/extensions/interfaces/index.ts create mode 100644 src/extensions/interfaces/registrations.ts diff --git a/src/extensions/core-api/index.ts b/src/extensions/core-api/index.ts index 1a2c59759a..1f3c35e846 100644 --- a/src/extensions/core-api/index.ts +++ b/src/extensions/core-api/index.ts @@ -10,6 +10,7 @@ import * as EventBus from "./event-bus" import * as Store from "./stores" import * as Util from "./utils" import * as ClusterFeature from "./cluster-feature" +import * as Interface from "../interfaces" // TODO: allow to expose windowManager.navigate() as Navigation.navigate() in runtime export let windowManager: WindowManager; @@ -18,6 +19,7 @@ export { App, EventBus, ClusterFeature, + Interface, Store, Util, } diff --git a/src/extensions/interfaces/index.ts b/src/extensions/interfaces/index.ts new file mode 100644 index 0000000000..e3612bdb7f --- /dev/null +++ b/src/extensions/interfaces/index.ts @@ -0,0 +1 @@ +export * from "./registrations" \ No newline at end of file diff --git a/src/extensions/interfaces/registrations.ts b/src/extensions/interfaces/registrations.ts new file mode 100644 index 0000000000..1d875127d0 --- /dev/null +++ b/src/extensions/interfaces/registrations.ts @@ -0,0 +1,7 @@ +export type { AppPreferenceRegistration, AppPreferenceComponents } from "../registries/app-preference-registry" +export type { ClusterFeatureRegistration, ClusterFeatureComponents } from "../registries/cluster-feature-registry" +export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../registries/kube-object-detail-registry" +export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../registries/kube-object-menu-registry" +export type { KubeObjectStatusRegistration } from "../registries/kube-object-status-registry" +export type { PageRegistration, PageComponents } from "../registries/page-registry" +export type { StatusBarRegistration } from "../registries/status-bar-registry" \ No newline at end of file From c67dad54e3355db7cdcbb8ed368dbbfa38f5c7c4 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 11 Nov 2020 13:42:36 +0200 Subject: [PATCH 3/3] fix: allow to select kube-api objects with label & field selectors (#1327) Signed-off-by: Roman --- src/renderer/api/kube-api-versioned.ts | 2 +- src/renderer/api/kube-api.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/renderer/api/kube-api-versioned.ts b/src/renderer/api/kube-api-versioned.ts index f6aa94c089..59c1637b29 100644 --- a/src/renderer/api/kube-api-versioned.ts +++ b/src/renderer/api/kube-api-versioned.ts @@ -51,6 +51,6 @@ export class VersionedKubeApi extends KubeApi { namespace: isNamespaced ? namespace : undefined, name: name, }); - return resourcePath + (query ? `?` + stringify(query) : ""); + return resourcePath + (query ? `?` + stringify(this.normalizeQuery(query)) : ""); } } diff --git a/src/renderer/api/kube-api.ts b/src/renderer/api/kube-api.ts index b572bd774c..bcbd283709 100644 --- a/src/renderer/api/kube-api.ts +++ b/src/renderer/api/kube-api.ts @@ -24,6 +24,8 @@ export interface IKubeApiQueryParams { timeoutSeconds?: number; limit?: number; // doesn't work with ?watch continue?: string; // might be used with ?limit from second request + labelSelector?: string | string[]; // restrict list of objects by their labels, e.g. labelSelector: ["label=value"] + fieldSelector?: string | string[]; // restrict list of objects by their fields, e.g. fieldSelector: "field=name" } export interface IKubeApiCluster { @@ -114,7 +116,17 @@ export class KubeApi { namespace: this.isNamespaced ? namespace : undefined, name: name, }); - return resourcePath + (query ? `?` + stringify(query) : ""); + return resourcePath + (query ? `?` + stringify(this.normalizeQuery(query)) : ""); + } + + protected normalizeQuery(query: Partial = {}) { + if (query.labelSelector) { + query.labelSelector = [query.labelSelector].flat().join(",") + } + if (query.fieldSelector) { + query.fieldSelector = [query.fieldSelector].flat().join(",") + } + return query; } protected parseResponse(data: KubeJsonApiData | KubeJsonApiData[] | KubeJsonApiDataList, namespace?: string): any {