1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Add new injectable for create KubeJsonApi and JsonApi instances

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-08-10 11:00:06 -04:00
parent 5f612dd595
commit 4bef236f8c
7 changed files with 106 additions and 61 deletions

View File

@ -0,0 +1,26 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { RequestInit } from "node-fetch";
import fetchInjectable from "../fetch/fetch.injectable";
import loggerInjectable from "../logger.injectable";
import type { JsonApiConfig, JsonApiData, JsonApiDependencies, JsonApiParams } from "./json-api";
import { JsonApi } from "./json-api";
export type CreateJsonApi = <Data = JsonApiData, Params extends JsonApiParams<Data> = JsonApiParams<Data>>(config: JsonApiConfig, reqInit?: RequestInit) => JsonApi<Data, Params>;
const createJsonApiInjectable = getInjectable({
id: "create-json-api",
instantiate: (di): CreateJsonApi => {
const deps: JsonApiDependencies = {
fetch: di.inject(fetchInjectable),
logger: di.inject(loggerInjectable),
};
return (config, reqInit) => new JsonApi(deps, config, reqInit);
},
});
export default createJsonApiInjectable;

View File

@ -3,15 +3,12 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import fetchInjectable from "../fetch/fetch.injectable";
import loggerInjectable from "../logger.injectable";
import { apiKubePrefix } from "../vars"; import { apiKubePrefix } from "../vars";
import isDevelopmentInjectable from "../vars/is-development.injectable"; import isDevelopmentInjectable from "../vars/is-development.injectable";
import { apiBaseInjectionToken } from "./api-base"; import { apiBaseInjectionToken } from "./api-base";
import type { JsonApiDependencies } from "./json-api"; import createKubeJsonApiInjectable from "./create-kube-json-api.injectable";
import type { KubeApiOptions } from "./kube-api"; import type { KubeApiOptions } from "./kube-api";
import { KubeApi } from "./kube-api"; import { KubeApi } from "./kube-api";
import { KubeJsonApi } from "./kube-json-api";
import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object"; import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object";
export interface CreateKubeApiForLocalClusterConfig { export interface CreateKubeApiForLocalClusterConfig {
@ -38,28 +35,28 @@ const createKubeApiForClusterInjectable = getInjectable({
instantiate: (di): CreateKubeApiForCluster => { instantiate: (di): CreateKubeApiForCluster => {
const apiBase = di.inject(apiBaseInjectionToken); const apiBase = di.inject(apiBaseInjectionToken);
const isDevelopment = di.inject(isDevelopmentInjectable); const isDevelopment = di.inject(isDevelopmentInjectable);
const dependencies: JsonApiDependencies = { const createKubeJsonApi = di.inject(createKubeJsonApiInjectable);
fetch: di.inject(fetchInjectable),
logger: di.inject(loggerInjectable),
};
return (cluster: CreateKubeApiForLocalClusterConfig, kubeClass: KubeObjectConstructor<KubeObject, KubeJsonApiDataFor<KubeObject>>, apiClass = KubeApi) => { return (
const url = new URL(apiBase.config.serverAddress); cluster: CreateKubeApiForLocalClusterConfig,
const request = new KubeJsonApi(dependencies, { kubeClass: KubeObjectConstructor<KubeObject, KubeJsonApiDataFor<KubeObject>>,
serverAddress: apiBase.config.serverAddress, apiClass = KubeApi,
apiBase: apiKubePrefix, ) => (
debug: isDevelopment, new apiClass({
}, {
headers: {
"Host": `${cluster.metadata.uid}.localhost:${url.port}`,
},
});
return new apiClass({
objectConstructor: kubeClass, objectConstructor: kubeClass,
request, request: createKubeJsonApi(
}); {
}; serverAddress: apiBase.config.serverAddress,
apiBase: apiKubePrefix,
debug: isDevelopment,
}, {
headers: {
"Host": `${cluster.metadata.uid}.localhost:${new URL(apiBase.config.serverAddress).port}`,
},
},
),
})
);
}, },
}); });

View File

@ -6,13 +6,10 @@ import { getInjectable } from "@ogre-tools/injectable";
import type { AgentOptions } from "https"; import type { AgentOptions } from "https";
import { Agent } from "https"; import { Agent } from "https";
import type { RequestInit } from "node-fetch"; import type { RequestInit } from "node-fetch";
import fetchInjectable from "../fetch/fetch.injectable";
import loggerInjectable from "../logger.injectable";
import isDevelopmentInjectable from "../vars/is-development.injectable"; import isDevelopmentInjectable from "../vars/is-development.injectable";
import type { JsonApiDependencies } from "./json-api"; import createKubeJsonApiInjectable from "./create-kube-json-api.injectable";
import type { KubeApiOptions } from "./kube-api"; import type { KubeApiOptions } from "./kube-api";
import { KubeApi } from "./kube-api"; import { KubeApi } from "./kube-api";
import { KubeJsonApi } from "./kube-json-api";
import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object"; import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object";
export interface CreateKubeApiForRemoteClusterConfig { export interface CreateKubeApiForRemoteClusterConfig {
@ -52,10 +49,7 @@ const createKubeApiForRemoteClusterInjectable = getInjectable({
id: "create-kube-api-for-remote-cluster", id: "create-kube-api-for-remote-cluster",
instantiate: (di): CreateKubeApiForRemoteCluster => { instantiate: (di): CreateKubeApiForRemoteCluster => {
const isDevelopment = di.inject(isDevelopmentInjectable); const isDevelopment = di.inject(isDevelopmentInjectable);
const dependencies: JsonApiDependencies = { const createKubeJsonApi = di.inject(createKubeJsonApiInjectable);
fetch: di.inject(fetchInjectable),
logger: di.inject(loggerInjectable),
};
return (config: CreateKubeApiForRemoteClusterConfig, kubeClass: KubeObjectConstructor<KubeObject, KubeJsonApiDataFor<KubeObject>>, apiClass = KubeApi) => { return (config: CreateKubeApiForRemoteClusterConfig, kubeClass: KubeObjectConstructor<KubeObject, KubeJsonApiDataFor<KubeObject>>, apiClass = KubeApi) => {
const reqInit: RequestInit = {}; const reqInit: RequestInit = {};
@ -86,7 +80,7 @@ const createKubeApiForRemoteClusterInjectable = getInjectable({
} }
const token = config.user.token; const token = config.user.token;
const request = new KubeJsonApi(dependencies, { const request = createKubeJsonApi({
serverAddress: config.cluster.server, serverAddress: config.cluster.server,
apiBase: "", apiBase: "",
debug: isDevelopment, debug: isDevelopment,

View File

@ -3,12 +3,10 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import fetchInjectable from "../fetch/fetch.injectable";
import loggerInjectable from "../logger.injectable";
import { apiKubePrefix, isDebugging } from "../vars"; import { apiKubePrefix, isDebugging } from "../vars";
import { apiBaseInjectionToken } from "./api-base"; import { apiBaseInjectionToken } from "./api-base";
import type { JsonApiDependencies } from "./json-api"; import createKubeJsonApiInjectable from "./create-kube-json-api.injectable";
import { KubeJsonApi } from "./kube-json-api"; import type { KubeJsonApi } from "./kube-json-api";
export type CreateKubeJsonApiForCluster = (clusterId: string) => KubeJsonApi; export type CreateKubeJsonApiForCluster = (clusterId: string) => KubeJsonApi;
@ -16,24 +14,20 @@ const createKubeJsonApiForClusterInjectable = getInjectable({
id: "create-kube-json-api-for-cluster", id: "create-kube-json-api-for-cluster",
instantiate: (di): CreateKubeJsonApiForCluster => { instantiate: (di): CreateKubeJsonApiForCluster => {
const apiBase = di.inject(apiBaseInjectionToken); const apiBase = di.inject(apiBaseInjectionToken);
const dependencies: JsonApiDependencies = { const createKubeJsonApi = di.inject(createKubeJsonApiInjectable);
fetch: di.inject(fetchInjectable),
logger: di.inject(loggerInjectable),
};
return (clusterId) => { return (clusterId) => createKubeJsonApi(
const url = new URL(apiBase.config.serverAddress); {
return new KubeJsonApi(dependencies, {
serverAddress: apiBase.config.serverAddress, serverAddress: apiBase.config.serverAddress,
apiBase: apiKubePrefix, apiBase: apiKubePrefix,
debug: isDebugging, debug: isDebugging,
}, { },
{
headers: { headers: {
"Host": `${clusterId}.localhost:${url.port}`, "Host": `${clusterId}.localhost:${new URL(apiBase.config.serverAddress).port}`,
}, },
}); },
}; );
}, },
}); });

View File

@ -0,0 +1,26 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { RequestInit } from "node-fetch";
import fetchInjectable from "../fetch/fetch.injectable";
import loggerInjectable from "../logger.injectable";
import type { JsonApiConfig, JsonApiDependencies } from "./json-api";
import { KubeJsonApi } from "./kube-json-api";
export type CreateKubeJsonApi = (config: JsonApiConfig, reqInit?: RequestInit) => KubeJsonApi;
const createKubeJsonApiInjectable = getInjectable({
id: "create-kube-json-api",
instantiate: (di): CreateKubeJsonApi => {
const dependencies: JsonApiDependencies = {
fetch: di.inject(fetchInjectable),
logger: di.inject(loggerInjectable),
};
return (config, reqInit) => new KubeJsonApi(dependencies, config, reqInit);
},
});
export default createKubeJsonApiInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { apiBaseInjectionToken } from "../../common/k8s-api/api-base"; import { apiBaseInjectionToken } from "../../common/k8s-api/api-base";
import { JsonApi } from "../../common/k8s-api/json-api"; import createJsonApiInjectable from "../../common/k8s-api/create-json-api.injectable";
import { apiPrefix, isDebugging } from "../../common/vars"; import { apiPrefix, isDebugging } from "../../common/vars";
import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable";
import lensProxyPortInjectable from "../lens-proxy/lens-proxy-port.injectable"; import lensProxyPortInjectable from "../lens-proxy/lens-proxy-port.injectable";
@ -13,8 +13,9 @@ const apiBaseInjectable = getInjectable({
id: "api-base", id: "api-base",
instantiate: (di) => { instantiate: (di) => {
const proxyPort = di.inject(lensProxyPortInjectable); const proxyPort = di.inject(lensProxyPortInjectable);
const createJsonApi = di.inject(createJsonApiInjectable);
return new JsonApi({ return createJsonApi({
serverAddress: `http://127.0.0.1:${proxyPort.get()}`, serverAddress: `http://127.0.0.1:${proxyPort.get()}`,
apiBase: apiPrefix, apiBase: apiPrefix,
debug: di.inject(isDevelopmentInjectable) || isDebugging, debug: di.inject(isDevelopmentInjectable) || isDebugging,

View File

@ -4,21 +4,28 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { apiBaseInjectionToken } from "../../common/k8s-api/api-base"; import { apiBaseInjectionToken } from "../../common/k8s-api/api-base";
import { JsonApi } from "../../common/k8s-api/json-api"; import createJsonApiInjectable from "../../common/k8s-api/create-json-api.injectable";
import { apiPrefix, isDebugging } from "../../common/vars"; import { apiPrefix, isDebugging } from "../../common/vars";
import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable";
const apiBaseInjectable = getInjectable({ const apiBaseInjectable = getInjectable({
id: "api-base", id: "api-base",
instantiate: (di) => new JsonApi({ instantiate: (di) => {
serverAddress: `http://127.0.0.1:${window.location.port}`, const createJsonApi = di.inject(createJsonApiInjectable);
apiBase: apiPrefix,
debug: di.inject(isDevelopmentInjectable) || isDebugging, return createJsonApi(
}, { {
headers: { serverAddress: `http://127.0.0.1:${window.location.port}`,
"Host": window.location.host, apiBase: apiPrefix,
}, debug: di.inject(isDevelopmentInjectable) || isDebugging,
}), },
{
headers: {
"Host": window.location.host,
},
},
);
},
injectionToken: apiBaseInjectionToken, injectionToken: apiBaseInjectionToken,
}); });