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 {