mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Catch empty string error is parseKubeApi (#3358)
* Catch empty string error is parseKubeApi - Add more debugging lines Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add some unit tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * Use resolved pathname Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
2059034eab
commit
f2cd0aa8e8
@ -129,8 +129,18 @@ const tests: KubeApiParseTestData[] = [
|
|||||||
}],
|
}],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const throwtests = [
|
||||||
|
undefined,
|
||||||
|
"",
|
||||||
|
"ajklsmh"
|
||||||
|
];
|
||||||
|
|
||||||
describe("parseApi unit tests", () => {
|
describe("parseApi unit tests", () => {
|
||||||
it.each(tests)("testing %s", (url, expected) => {
|
it.each(tests)("testing %j", (url, expected) => {
|
||||||
expect(parseKubeApi(url)).toStrictEqual(expected);
|
expect(parseKubeApi(url)).toStrictEqual(expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it.each(throwtests)("testing %j should throw", (url) => {
|
||||||
|
expect(() => parseKubeApi(url)).toThrowError("invalid apiPath");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -58,8 +58,14 @@ export class ApiManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected resolveApi(api: string | KubeApi): KubeApi {
|
protected resolveApi(api?: string | KubeApi): KubeApi | undefined {
|
||||||
if (typeof api === "string") return this.getApi(api);
|
if (!api) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof api === "string") {
|
||||||
|
return this.getApi(api);
|
||||||
|
}
|
||||||
|
|
||||||
return api;
|
return api;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,9 @@
|
|||||||
import type { KubeObject } from "./kube-object";
|
import type { KubeObject } from "./kube-object";
|
||||||
import { splitArray } from "../../common/utils";
|
import { splitArray } from "../../common/utils";
|
||||||
import { apiManager } from "./api-manager";
|
import { apiManager } from "./api-manager";
|
||||||
|
import { isDebugging } from "../../common/vars";
|
||||||
|
import logger from "../../main/logger";
|
||||||
|
import { inspect } from "util";
|
||||||
|
|
||||||
export interface IKubeObjectRef {
|
export interface IKubeObjectRef {
|
||||||
kind: string;
|
kind: string;
|
||||||
@ -47,8 +50,26 @@ export interface IKubeApiParsed extends IKubeApiLinkRef {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function parseKubeApi(path: string): IKubeApiParsed {
|
export function parseKubeApi(path: string): IKubeApiParsed {
|
||||||
path = new URL(path, location.origin).pathname;
|
if (!isDebugging) {
|
||||||
const [, prefix, ...parts] = path.split("/");
|
return _parseKubeApi(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = _parseKubeApi(path);
|
||||||
|
|
||||||
|
logger.debug(`parseKubeApi(${inspect(path, false, null, false)}) -> ${inspect(res, false, null, false)}`);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
} catch (error) {
|
||||||
|
logger.debug(`parseKubeApi(${inspect(path, false, null, false)}) threw: ${error}`);
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _parseKubeApi(path: string): IKubeApiParsed {
|
||||||
|
const apiPath = new URL(path, location.origin).pathname;
|
||||||
|
const [, prefix, ...parts] = apiPath.split("/");
|
||||||
const apiPrefix = `/${prefix}`;
|
const apiPrefix = `/${prefix}`;
|
||||||
const [left, right, namespaced] = splitArray(parts, "namespaces");
|
const [left, right, namespaced] = splitArray(parts, "namespaces");
|
||||||
let apiGroup, apiVersion, namespace, resource, name;
|
let apiGroup, apiVersion, namespace, resource, name;
|
||||||
@ -70,12 +91,14 @@ export function parseKubeApi(path: string): IKubeApiParsed {
|
|||||||
apiGroup = left.join("/");
|
apiGroup = left.join("/");
|
||||||
} else {
|
} else {
|
||||||
switch (left.length) {
|
switch (left.length) {
|
||||||
|
case 0:
|
||||||
|
throw new Error(`invalid apiPath: ${apiPath}`);
|
||||||
case 4:
|
case 4:
|
||||||
[apiGroup, apiVersion, resource, name] = left;
|
[apiGroup, apiVersion, resource, name] = left;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
resource = left.pop();
|
resource = left.pop();
|
||||||
// fallthrough
|
// fallthrough
|
||||||
case 1:
|
case 1:
|
||||||
apiVersion = left.pop();
|
apiVersion = left.pop();
|
||||||
apiGroup = "";
|
apiGroup = "";
|
||||||
@ -113,7 +136,7 @@ export function parseKubeApi(path: string): IKubeApiParsed {
|
|||||||
const apiBase = [apiPrefix, apiGroup, apiVersion, resource].filter(v => v).join("/");
|
const apiBase = [apiPrefix, apiGroup, apiVersion, resource].filter(v => v).join("/");
|
||||||
|
|
||||||
if (!apiBase) {
|
if (!apiBase) {
|
||||||
throw new Error(`invalid apiPath: ${path}`);
|
throw new Error(`invalid apiPath: ${apiPath}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import { CrdResourceDetails } from "../+custom-resources";
|
|||||||
import { KubeObjectMenu } from "./kube-object-menu";
|
import { KubeObjectMenu } from "./kube-object-menu";
|
||||||
import type { CustomResourceDefinition } from "../../api/endpoints";
|
import type { CustomResourceDefinition } from "../../api/endpoints";
|
||||||
import { KubeObjectDetailRegistry } from "../../api/kube-object-detail-registry";
|
import { KubeObjectDetailRegistry } from "../../api/kube-object-detail-registry";
|
||||||
|
import logger from "../../../main/logger";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to store `object.selfLink` to show more info about resource in the details panel.
|
* Used to store `object.selfLink` to show more info about resource in the details panel.
|
||||||
@ -67,6 +68,7 @@ export function hideDetails() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getDetailsUrl(selfLink: string, resetSelected = false, mergeGlobals = true) {
|
export function getDetailsUrl(selfLink: string, resetSelected = false, mergeGlobals = true) {
|
||||||
|
logger.debug("getDetailsUrl", { selfLink, resetSelected, mergeGlobals });
|
||||||
const params = new URLSearchParams(mergeGlobals ? navigation.searchParams : "");
|
const params = new URLSearchParams(mergeGlobals ? navigation.searchParams : "");
|
||||||
|
|
||||||
params.set(kubeDetailsUrlParam.name, selfLink);
|
params.set(kubeDetailsUrlParam.name, selfLink);
|
||||||
@ -100,10 +102,12 @@ export class KubeObjectDetails extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@computed get object() {
|
@computed get object() {
|
||||||
const store = apiManager.getStore(this.path);
|
try {
|
||||||
|
return apiManager
|
||||||
if (store) {
|
.getStore(this.path)
|
||||||
return store.getByPath(this.path);
|
?.getByPath(this.path);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`[KUBE-OBJECT-DETAILS]: failed to get store or object: ${error}`, { path: this.path });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user