From 6770f05dc8b11143fa68753b1e6e9d6e44a99000 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 23 Jun 2020 08:48:20 -0400 Subject: [PATCH] special case */namespace/* in parseApi, add test (#509) --- .../client/api/__test__/parseAPI.test.ts | 15 +++++- dashboard/client/api/kube-api.ts | 47 +++++++++---------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/dashboard/client/api/__test__/parseAPI.test.ts b/dashboard/client/api/__test__/parseAPI.test.ts index b748098622..e700650e05 100644 --- a/dashboard/client/api/__test__/parseAPI.test.ts +++ b/dashboard/client/api/__test__/parseAPI.test.ts @@ -2,7 +2,7 @@ import { KubeApi, IKubeApiLinkBase } from "../kube-api"; interface ParseAPITest { url: string; - expected: IKubeApiLinkBase; + expected: Required; } const tests: ParseAPITest[] = [ @@ -97,6 +97,19 @@ const tests: ParseAPITest[] = [ namespace: undefined, }, }, + { + url: "/api/v1/namespaces/kube-public", + expected: { + apiBase: "/api/v1/namespaces", + apiPrefix: "/api", + apiGroup: "", + apiVersion: "v1", + apiVersionWithGroup: "v1", + resource: "namespaces", + name: "kube-public", + namespace: undefined, + }, + }, ]; jest.mock('../kube-watch-api.ts', () => 'KubeWatchApi'); diff --git a/dashboard/client/api/kube-api.ts b/dashboard/client/api/kube-api.ts index b77a538d14..e6668084f5 100644 --- a/dashboard/client/api/kube-api.ts +++ b/dashboard/client/api/kube-api.ts @@ -8,7 +8,6 @@ import { apiKube } from "./index"; import { kubeWatchApi } from "./kube-watch-api"; import { apiManager } from "./api-manager"; import { split } from "../utils/arrays"; -import isEqual from "lodash/isEqual"; export interface IKubeApiOptions { kind: string; // resource type within api-group, e.g. "Namespace" @@ -43,7 +42,6 @@ export interface IKubeApiLinkBase extends IKubeApiLinkRef { export class KubeApi { static parseApi(apiPath = ""): IKubeApiLinkBase { apiPath = new URL(apiPath, location.origin).pathname; - const [, prefix, ...parts] = apiPath.split("/"); const apiPrefix = `/${prefix}`; @@ -52,12 +50,12 @@ export class KubeApi { if (namespaced) { switch (right.length) { + case 1: + name = right[0]; + // fallthrough case 0: resource = "namespaces"; // special case this due to `split` removing namespaces break; - case 1: - resource = right[0]; - break; default: [namespace, resource, name] = right; break; @@ -69,27 +67,28 @@ export class KubeApi { switch (left.length) { case 2: resource = left.pop(); + // fallthrough case 1: apiVersion = left.pop(); apiGroup = ""; break; default: /** - * Given that - * - `apiVersion` is `GROUP/VERSION` and - * - `VERSION` is `DNS_LABEL` which is /^[a-z0-9]((-[a-z0-9])|[a-z0-9])*$/i - * where length <= 63 - * - `GROUP` is /^D(\.D)*$/ where D is `DNS_LABEL` and length <= 253 - * - * There is no well defined selection from an array of items that were - * seperated by '/' - * - * Solution is to create a huristic. Namely: - * 1. if '.' in left[0] then apiGroup <- left[0] - * 2. if left[1] matches /^v[0-9]/ then apiGroup, apiVersion <- left[0], left[1] - * 3. otherwise assume apiVersion <- left[0] - * 4. always resource, name <- left[(0 or 1)+1..] - */ + * Given that + * - `apiVersion` is `GROUP/VERSION` and + * - `VERSION` is `DNS_LABEL` which is /^[a-z0-9]((-[a-z0-9])|[a-z0-9])*$/i + * where length <= 63 + * - `GROUP` is /^D(\.D)*$/ where D is `DNS_LABEL` and length <= 253 + * + * There is no well defined selection from an array of items that were + * seperated by '/' + * + * Solution is to create a huristic. Namely: + * 1. if '.' in left[0] then apiGroup <- left[0] + * 2. if left[1] matches /^v[0-9]/ then apiGroup, apiVersion <- left[0], left[1] + * 3. otherwise assume apiVersion <- left[0] + * 4. always resource, name <- left[(0 or 1)+1..] + */ if (left[0].includes('.') || left[1].match(/^v[0-9]/)) { [apiGroup, apiVersion] = left; resource = left.slice(2).join("/") @@ -199,7 +198,7 @@ export class KubeApi { if (KubeObject.isJsonApiData(data)) { return new KubeObjectConstructor(data); } - + // process items list response if (KubeObject.isJsonApiDataList(data)) { const { apiVersion, items, metadata } = data; @@ -211,12 +210,12 @@ export class KubeApi { ...item, })) } - + // custom apis might return array for list response, e.g. users, groups, etc. if (Array.isArray(data)) { return data.map(data => new KubeObjectConstructor(data)); } - + return data; } @@ -234,7 +233,7 @@ export class KubeApi { async create({ name = "", namespace = "default" } = {}, data?: Partial): Promise { const apiUrl = this.getUrl({ namespace }); - + return this.request .post(apiUrl, { data: merge({