From 060a7e541e4fc27d7a4b520412e33f989a08eb7f Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 22 Jun 2020 18:17:04 +0300 Subject: [PATCH] fix api parsing for /api/v1/namespaces --- package.json | 4 +- src/common/utils/splitArray.ts | 2 +- src/renderer/api/__test__/parseAPI.test.ts | 58 +++++++++++++++++++ src/renderer/api/kube-api.ts | 4 +- .../components/+namespaces/namespace.store.ts | 15 ++--- src/renderer/theme.store.ts | 1 + 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 65fc1976c4..242d2dd497 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ "build:linux": "yarn compile && electron-builder --linux --dir -c.productName=LensDev", "build:mac": "yarn compile && electron-builder --mac --dir -c.productName=LensDev", "build:win": "yarn compile && electron-builder --win --dir -c.productName=LensDev", - "test": "jest spec/src", - "integration": "jest spec/integration", + "test": "jest spec/src $@", + "integration": "jest spec/integration $@", "dist": "yarn compile && electron-builder -p onTag", "dist:win": "yarn compile && electron-builder -p onTag --x64 --ia32", "dist:dir": "yarn dist --dir -c.compression=store -c.mac.identity=null", diff --git a/src/common/utils/splitArray.ts b/src/common/utils/splitArray.ts index 4b96d28864..90c342827d 100644 --- a/src/common/utils/splitArray.ts +++ b/src/common/utils/splitArray.ts @@ -1,4 +1,4 @@ -// Restored from dashboard/client/utils/arrays.ts +// Moved from dashboard/client/utils/arrays.ts /** * This function splits an array into two sub arrays on the first instance of * element (from the left). If the array does not contain the element. The diff --git a/src/renderer/api/__test__/parseAPI.test.ts b/src/renderer/api/__test__/parseAPI.test.ts index e69de29bb2..adfb325789 100644 --- a/src/renderer/api/__test__/parseAPI.test.ts +++ b/src/renderer/api/__test__/parseAPI.test.ts @@ -0,0 +1,58 @@ +import { IKubeApiLinkBase, KubeApi } from "../kube-api"; + +interface ParseAPITest { + url: string; + expected: IKubeApiLinkBase; +} + +const tests: ParseAPITest[] = [ + { + url: "/api/v1/namespaces/kube-system/pods/coredns-6955765f44-v8p27", + expected: { + apiBase: "/api/v1/pods", + apiPrefix: "/api", + apiGroup: "", + apiVersion: "v1", + apiVersionWithGroup: "v1", + namespace: "kube-system", + resource: "pods", + name: "coredns-6955765f44-v8p27" + }, + }, + { + url: "/apis/stable.example.com/foo1/crontabs", + expected: { + apiBase: "/apis/stable.example.com/foo1/crontabs", + apiPrefix: "/apis", + apiGroup: "stable.example.com", + apiVersion: "foo1", + apiVersionWithGroup: "stable.example.com/foo1", + resource: "crontabs", + name: undefined, + namespace: undefined, + }, + }, + { + url: "/apis/cluster.k8s.io/v1alpha1/clusters", + expected: { + apiBase: "/apis/cluster.k8s.io/v1alpha1/clusters", + apiPrefix: "/apis", + apiGroup: "cluster.k8s.io", + apiVersion: "v1alpha1", + apiVersionWithGroup: "cluster.k8s.io/v1alpha1", + resource: "clusters", + name: undefined, + namespace: undefined, + }, + }, +]; + +jest.mock('../kube-watch-api.ts', () => 'KubeWatchApi'); +describe("parseAPI unit tests", () => { + for (const i in tests) { + const { url: tUrl, expected:tExpect} = tests[i]; + test(`test #${parseInt(i)+1}`, () => { + expect(KubeApi.parseApi(tUrl)).toStrictEqual(tExpect); + }); + } +}); diff --git a/src/renderer/api/kube-api.ts b/src/renderer/api/kube-api.ts index 029a75b6bb..3cff112e9a 100644 --- a/src/renderer/api/kube-api.ts +++ b/src/renderer/api/kube-api.ts @@ -47,15 +47,13 @@ export class KubeApi { const [left, right, found] = splitArray(parts, "namespaces"); let apiGroup, apiVersion, namespace, resource, name; - if (found) { if (left.length == 0) { throw new Error(`invalid apiPath: ${apiPath}`) } - apiVersion = left.pop(); apiGroup = left.join("/"); - [namespace, resource, name] = right; + [namespace, resource = "namespaces", name] = right; // fix: "resource" is empty when "/api/v1/namespaces" } else { [apiGroup, apiVersion, resource] = left; } diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index 61797212f8..7f6e22748e 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -43,21 +43,14 @@ export class NamespaceStore extends KubeObjectStore { setQueryParams({ namespaces }, { replace: true }) } - protected loadItems(namespaces?: string[]) { + protected async loadItems(namespaces?: string[]) { if (!isAllowedResource("namespaces")) { - if (namespaces) { - return Promise.all(namespaces.map(name => this.getDummyNamespace(name))) - } - else { - return new Promise(() => { - return [] - }) - } + if (namespaces) return namespaces.map(this.getDummyNamespace); + return [] } if (namespaces) { return Promise.all(namespaces.map(name => this.api.get({ name }))) - } - else { + } else { return super.loadItems(); } } diff --git a/src/renderer/theme.store.ts b/src/renderer/theme.store.ts index 3484658d04..2976bd6918 100644 --- a/src/renderer/theme.store.ts +++ b/src/renderer/theme.store.ts @@ -143,6 +143,7 @@ export class ThemeStore { // auto-apply colors to dom from active theme reaction(() => this.activeTheme, this.onChange, { fireImmediately: true, + delay: 150, }); // apply theme from configuration