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

Remove uses of legacy global logger from injectables (#6660)

- Clean up some of them to use more injectables

Signed-off-by: Sebastian Malton <sebastian@malton.name>

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-11-29 05:56:09 -08:00 committed by GitHub
parent 9589175604
commit 005ed1c34e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 153 additions and 151 deletions

View File

@ -7,13 +7,13 @@ import { apiPrefix } from "../../../common/vars";
import { getRouteInjectable } from "../../router/router.injectable"; import { getRouteInjectable } from "../../router/router.injectable";
import type { ClusterPrometheusMetadata } from "../../../common/cluster-types"; import type { ClusterPrometheusMetadata } from "../../../common/cluster-types";
import { ClusterMetadataKey } from "../../../common/cluster-types"; import { ClusterMetadataKey } from "../../../common/cluster-types";
import logger from "../../logger";
import type { Cluster } from "../../../common/cluster/cluster"; import type { Cluster } from "../../../common/cluster/cluster";
import { clusterRoute } from "../../router/route"; import { clusterRoute } from "../../router/route";
import { isObject } from "lodash"; import { isObject } from "lodash";
import { isRequestError } from "../../../common/utils"; import { isRequestError, object } from "../../../common/utils";
import type { GetMetrics } from "../../get-metrics.injectable"; import type { GetMetrics } from "../../get-metrics.injectable";
import getMetricsInjectable from "../../get-metrics.injectable"; import getMetricsInjectable from "../../get-metrics.injectable";
import loggerInjectable from "../../../common/logger.injectable";
// This is used for backoff retry tracking. // This is used for backoff retry tracking.
const ATTEMPTS = [false, false, false, false, true]; const ATTEMPTS = [false, false, false, false, true];
@ -55,66 +55,70 @@ const loadMetricsFor = (getMetrics: GetMetrics) => async (promQueries: string[],
const addMetricsRouteInjectable = getRouteInjectable({ const addMetricsRouteInjectable = getRouteInjectable({
id: "add-metrics-route", id: "add-metrics-route",
instantiate: (di) => clusterRoute({ instantiate: (di) => {
method: "post",
path: `${apiPrefix}/metrics`,
})(async ({ cluster, payload, query }) => {
const getMetrics = di.inject(getMetricsInjectable); const getMetrics = di.inject(getMetricsInjectable);
const loadMetrics = loadMetricsFor(getMetrics); const loadMetrics = loadMetricsFor(getMetrics);
const logger = di.inject(loggerInjectable);
const queryParams: Partial<Record<string, string>> = Object.fromEntries(query.entries()); return clusterRoute({
const prometheusMetadata: ClusterPrometheusMetadata = {}; method: "post",
path: `${apiPrefix}/metrics`,
})(async ({ cluster, payload, query }) => {
const queryParams: Partial<Record<string, string>> = Object.fromEntries(query.entries());
const prometheusMetadata: ClusterPrometheusMetadata = {};
try { try {
const { prometheusPath, provider } = await cluster.contextHandler.getPrometheusDetails(); const { prometheusPath, provider } = await cluster.contextHandler.getPrometheusDetails();
prometheusMetadata.provider = provider?.kind; prometheusMetadata.provider = provider?.kind;
prometheusMetadata.autoDetected = !cluster.preferences.prometheusProvider?.type; prometheusMetadata.autoDetected = !cluster.preferences.prometheusProvider?.type;
if (!prometheusPath) { if (!prometheusPath) {
prometheusMetadata.success = false; prometheusMetadata.success = false;
return { response: {}};
}
// return data in same structure as query
if (typeof payload === "string") {
const [data] = await loadMetrics([payload], cluster, prometheusPath, queryParams);
return { response: data };
}
if (Array.isArray(payload)) {
const data = await loadMetrics(payload, cluster, prometheusPath, queryParams);
return { response: data };
}
if (isObject(payload)) {
const data = payload as Record<string, Record<string, string>>;
const queries = object.entries(data)
.map(([queryName, queryOpts]) => (
provider.getQuery(queryOpts, queryName)
));
const result = await loadMetrics(queries, cluster, prometheusPath, queryParams);
const response = object.fromEntries(object.keys(data).map((metricName, i) => [metricName, result[i]]));
prometheusMetadata.success = true;
return { response };
}
return { response: {}}; return { response: {}};
} catch (error) {
prometheusMetadata.success = false;
logger.warn(`[METRICS-ROUTE]: failed to get metrics for clusterId=${cluster.id}:`, error);
return { response: {}};
} finally {
cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata;
} }
});
// return data in same structure as query },
if (typeof payload === "string") {
const [data] = await loadMetrics([payload], cluster, prometheusPath, queryParams);
return { response: data };
}
if (Array.isArray(payload)) {
const data = await loadMetrics(payload, cluster, prometheusPath, queryParams);
return { response: data };
}
if (isObject(payload)) {
const queries = Object.entries(payload as Record<string, Record<string, string>>)
.map(([queryName, queryOpts]) => (
provider.getQuery(queryOpts, queryName)
));
const result = await loadMetrics(queries, cluster, prometheusPath, queryParams);
const data = Object.fromEntries(Object.keys(payload).map((metricName, i) => [metricName, result[i]]));
prometheusMetadata.success = true;
return { response: data };
}
return { response: {}};
} catch (error) {
prometheusMetadata.success = false;
logger.warn(`[METRICS-ROUTE]: failed to get metrics for clusterId=${cluster.id}:`, error);
return { response: {}};
} finally {
cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata;
}
}),
}); });
export default addMetricsRouteInjectable; export default addMetricsRouteInjectable;

View File

@ -5,15 +5,16 @@
import { getRouteInjectable } from "../../router/router.injectable"; import { getRouteInjectable } from "../../router/router.injectable";
import { apiPrefix } from "../../../common/vars"; import { apiPrefix } from "../../../common/vars";
import { PortForward } from "./functionality/port-forward"; import { PortForward } from "./functionality/port-forward";
import logger from "../../logger";
import createPortForwardInjectable from "./functionality/create-port-forward.injectable"; import createPortForwardInjectable from "./functionality/create-port-forward.injectable";
import { clusterRoute } from "../../router/route"; import { clusterRoute } from "../../router/route";
import loggerInjectable from "../../../common/logger.injectable";
const startPortForwardRouteInjectable = getRouteInjectable({ const startPortForwardRouteInjectable = getRouteInjectable({
id: "start-current-port-forward-route", id: "start-current-port-forward-route",
instantiate: (di) => { instantiate: (di) => {
const createPortForward = di.inject(createPortForwardInjectable); const createPortForward = di.inject(createPortForwardInjectable);
const logger = di.inject(loggerInjectable);
return clusterRoute({ return clusterRoute({
method: "post", method: "post",

View File

@ -5,39 +5,42 @@
import { getRouteInjectable } from "../../router/router.injectable"; import { getRouteInjectable } from "../../router/router.injectable";
import { apiPrefix } from "../../../common/vars"; import { apiPrefix } from "../../../common/vars";
import { PortForward } from "./functionality/port-forward"; import { PortForward } from "./functionality/port-forward";
import logger from "../../logger";
import { clusterRoute } from "../../router/route"; import { clusterRoute } from "../../router/route";
import loggerInjectable from "../../../common/logger.injectable";
const stopCurrentPortForwardRouteInjectable = getRouteInjectable({ const stopCurrentPortForwardRouteInjectable = getRouteInjectable({
id: "stop-current-port-forward-route", id: "stop-current-port-forward-route",
instantiate: () => clusterRoute({ instantiate: (di) => {
method: "delete", const logger = di.inject(loggerInjectable);
path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}`,
})(async ({ params, query, cluster }) => { return clusterRoute({
const { namespace, resourceType, resourceName } = params; method: "delete",
const port = Number(query.get("port")); path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}`,
const forwardPort = Number(query.get("forwardPort")); })(async ({ params, query, cluster }) => {
const portForward = PortForward.getPortforward({ const { namespace, resourceType, resourceName } = params;
clusterId: cluster.id, kind: resourceType, name: resourceName, const port = Number(query.get("port"));
namespace, port, forwardPort, const forwardPort = Number(query.get("forwardPort"));
const portForward = PortForward.getPortforward({
clusterId: cluster.id, kind: resourceType, name: resourceName,
namespace, port, forwardPort,
});
try {
await portForward?.stop();
return { response: { status: true }};
} catch (error) {
logger.error("[PORT-FORWARD-ROUTE]: error stopping a port-forward", { namespace, port, forwardPort, resourceType, resourceName });
return {
error: {
message: `error stopping a forward port ${port}`,
},
};
}
}); });
},
try {
await portForward?.stop();
return { response: { status: true }};
} catch (error) {
logger.error("[PORT-FORWARD-ROUTE]: error stopping a port-forward", { namespace, port, forwardPort, resourceType, resourceName });
return {
error: {
message: `error stopping a forward port ${port}`,
},
};
}
}),
}); });
export default stopCurrentPortForwardRouteInjectable; export default stopCurrentPortForwardRouteInjectable;

View File

@ -5,16 +5,15 @@
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import extensionDiscoveryInjectable from "../../../../extensions/extension-discovery/extension-discovery.injectable"; import extensionDiscoveryInjectable from "../../../../extensions/extension-discovery/extension-discovery.injectable";
import { validatePackage } from "./validate-package"; import { validatePackage } from "./validate-package";
import type { ExtensionDiscovery } from "../../../../extensions/extension-discovery/extension-discovery";
import { getMessageFromError } from "../get-message-from-error/get-message-from-error"; import { getMessageFromError } from "../get-message-from-error/get-message-from-error";
import logger from "../../../../main/logger";
import { Notifications } from "../../notifications";
import path from "path";
import fse from "fs-extra";
import React from "react"; import React from "react";
import os from "os";
import type { LensExtensionId, LensExtensionManifest } from "../../../../extensions/lens-extension"; import type { LensExtensionId, LensExtensionManifest } from "../../../../extensions/lens-extension";
import type { InstallRequest } from "./attempt-install.injectable"; import type { InstallRequest } from "./attempt-install.injectable";
import loggerInjectable from "../../../../common/logger.injectable";
import writeFileInjectable from "../../../../common/fs/write-file.injectable";
import joinPathsInjectable from "../../../../common/path/join-paths.injectable";
import tempDirectoryPathInjectable from "../../../../common/os/temp-directory-path.injectable";
import showErrorNotificationInjectable from "../../notifications/show-error-notification.injectable";
export interface InstallRequestValidated { export interface InstallRequestValidated {
fileName: string; fileName: string;
@ -24,74 +23,69 @@ export interface InstallRequestValidated {
tempFile: string; // temp system path to packed extension for unpacking tempFile: string; // temp system path to packed extension for unpacking
} }
interface Dependencies {
extensionDiscovery: ExtensionDiscovery;
}
export type CreateTempFilesAndValidate = (request: InstallRequest) => Promise<InstallRequestValidated | null>; export type CreateTempFilesAndValidate = (request: InstallRequest) => Promise<InstallRequestValidated | null>;
const createTempFilesAndValidate = ({
extensionDiscovery,
}: Dependencies): CreateTempFilesAndValidate => (
async ({ fileName, data }) => {
// copy files to temp
await fse.ensureDir(getExtensionPackageTemp());
// validate packages
const tempFile = getExtensionPackageTemp(fileName);
try {
await fse.writeFile(tempFile, data);
const manifest = await validatePackage(tempFile);
const id = path.join(
extensionDiscovery.nodeModulesPath,
manifest.name,
"package.json",
);
return {
fileName,
data,
manifest,
tempFile,
id,
};
} catch (error) {
const message = getMessageFromError(error);
logger.info(
`[EXTENSION-INSTALLATION]: installing ${fileName} has failed: ${message}`,
{ error },
);
Notifications.error((
<div className="flex column gaps">
<p>
{"Installing "}
<em>{fileName}</em>
{" has failed, skipping."}
</p>
<p>
{"Reason: "}
<em>{message}</em>
</p>
</div>
));
}
return null;
}
);
function getExtensionPackageTemp(fileName = "") {
return path.join(os.tmpdir(), "lens-extensions", fileName);
}
const createTempFilesAndValidateInjectable = getInjectable({ const createTempFilesAndValidateInjectable = getInjectable({
id: "create-temp-files-and-validate", id: "create-temp-files-and-validate",
instantiate: (di) => createTempFilesAndValidate({ instantiate: (di): CreateTempFilesAndValidate => {
extensionDiscovery: di.inject(extensionDiscoveryInjectable), const extensionDiscovery = di.inject(extensionDiscoveryInjectable);
}), const logger = di.inject(loggerInjectable);
const writeFile = di.inject(writeFileInjectable);
const joinPaths = di.inject(joinPathsInjectable);
const showErrorNotification = di.inject(showErrorNotificationInjectable);
const tempDirectoryPath = di.inject(tempDirectoryPathInjectable);
const getTempExtensionPackagePath = (fileName: string) => joinPaths(
tempDirectoryPath,
"lens-extensions",
fileName,
);
return async ({ fileName, data }) => {
// validate packages
const tempFile = getTempExtensionPackagePath(fileName);
try {
await writeFile(tempFile, data);
const manifest = await validatePackage(tempFile);
const id = joinPaths(
extensionDiscovery.nodeModulesPath,
manifest.name,
"package.json",
);
return {
fileName,
data,
manifest,
tempFile,
id,
};
} catch (error) {
const message = getMessageFromError(error);
logger.info(
`[EXTENSION-INSTALLATION]: installing ${fileName} has failed: ${message}`,
{ error },
);
showErrorNotification((
<div className="flex column gaps">
<p>
{"Installing "}
<em>{fileName}</em>
{" has failed, skipping."}
</p>
<p>
{"Reason: "}
<em>{message}</em>
</p>
</div>
));
}
return null;
};
},
}); });
export default createTempFilesAndValidateInjectable; export default createTempFilesAndValidateInjectable;