Cleanup 'Cluster' to remove environment specific details (#6951)

- requestNamespaceListPermissions is infallable so no need to have the extra try/catch

- Refactor isMetricHidden method away from Cluster

- Refactor shouldShowResource out of Cluster

- Refactor isInLocalKubeconfig out of Cluster

- Remove depecrated and unused workspace from Cluster

- Refactor out kubectl as a dependency of Cluster

- Remove from cluster getter used only once

- Split out ClusterConnection from Cluster

- Also split out KubeAuthProxyServer from ContextHandler

- Rename ContextHandler to PrometheusHandler

- Cleanup onNetworkOffline/Online impls within ClusterManager

- Remove annotations from ClusterConnection

- Remove mobx annotations from Cluster

- Rename loadConfigFromFileInjectable

- Remove all uses of dead createClusterInjectionToken

- Fix type errors related to broadcastConnectionUpdate

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton authored and GitHub committed 2023-03-10 09:37:39 +02:00
1 parent e6d6d1d8f7
commit ad9bafe2a5
133 files changed
+2544 -1961

No files matched your search

@@ -10,15 +10,18 @@ import type { V1Secret } from "@kubernetes/client-node";
import { CoreV1Api } from "@kubernetes/client-node";
import { clusterRoute } from "../../router/route";
import { dump } from "js-yaml";
import loadProxyKubeconfigInjectable from "../../cluster/load-proxy-kubeconfig.injectable";
const getServiceAccountRouteInjectable = getRouteInjectable({
id: "get-service-account-route",
instantiate: () => clusterRoute({
instantiate: (di) => clusterRoute({
method: "get",
path: `${apiPrefix}/kubeconfig/service-account/{namespace}/{account}`,
})(async ({ params, cluster }) => {
const client = (await cluster.getProxyKubeconfig()).makeApiClient(CoreV1Api);
const loadProxyKubeconfig = di.inject(loadProxyKubeconfigInjectable, cluster);
const proxyKubeconfig = await loadProxyKubeconfig();
const client = proxyKubeconfig.makeApiClient(CoreV1Api);
const secretList = await client.listNamespacedSecret(params.namespace);
const secret = secretList.body.items.find(secret => {
@@ -64,9 +67,9 @@ function generateKubeConfig(username: string, secret: V1Secret, cluster: Cluster
"kind": "Config",
"clusters": [
{
"name": cluster.contextName,
"name": cluster.contextName.get(),
"cluster": {
"server": cluster.apiUrl,
"server": cluster.apiUrl.get(),
"certificate-authority-data": caCrt,
},
},
@@ -81,14 +84,14 @@ function generateKubeConfig(username: string, secret: V1Secret, cluster: Cluster
],
"contexts": [
{
"name": cluster.contextName,
"name": cluster.contextName.get(),
"context": {
"user": username,
"cluster": cluster.contextName,
"cluster": cluster.contextName.get(),
"namespace": secret.metadata.namespace,
},
},
],
"current-context": cluster.contextName,
"current-context": cluster.contextName.get(),
});
}
@@ -14,6 +14,8 @@ import { isRequestError, object } from "../../../common/utils";
import type { GetMetrics } from "../../get-metrics.injectable";
import getMetricsInjectable from "../../get-metrics.injectable";
import loggerInjectable from "../../../common/logger.injectable";
import prometheusHandlerInjectable from "../../cluster/prometheus-handler/prometheus-handler.injectable";
import { runInAction } from "mobx";
// This is used for backoff retry tracking.
const ATTEMPTS = [false, false, false, false, true];
@@ -66,9 +68,10 @@ const addMetricsRouteInjectable = getRouteInjectable({
})(async ({ cluster, payload, query }) => {
const queryParams: Partial<Record<string, string>> = Object.fromEntries(query.entries());
const prometheusMetadata: ClusterPrometheusMetadata = {};
const prometheusHandler = di.inject(prometheusHandlerInjectable, cluster);
try {
const { prometheusPath, provider } = await cluster.contextHandler.getPrometheusDetails();
const { prometheusPath, provider } = await prometheusHandler.getPrometheusDetails();
prometheusMetadata.provider = provider?.kind;
prometheusMetadata.autoDetected = !cluster.preferences.prometheusProvider?.type;
@@ -115,7 +118,9 @@ const addMetricsRouteInjectable = getRouteInjectable({
return { response: {}};
} finally {
cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata;
runInAction(() => {
cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata;
});
}
});
},
@@ -8,6 +8,7 @@ import { PortForward } from "./functionality/port-forward";
import createPortForwardInjectable from "./functionality/create-port-forward.injectable";
import { clusterRoute } from "../../router/route";
import loggerInjectable from "../../../common/logger.injectable";
import kubeconfigManagerInjectable from "../../kubeconfig-manager/kubeconfig-manager.injectable";
const startPortForwardRouteInjectable = getRouteInjectable({
id: "start-current-port-forward-route",
@@ -24,6 +25,8 @@ const startPortForwardRouteInjectable = getRouteInjectable({
const port = Number(query.get("port"));
const forwardPort = Number(query.get("forwardPort"));
const proxyKubeconfigManager = di.inject(kubeconfigManagerInjectable, cluster);
try {
let portForward = PortForward.getPortforward({
clusterId: cluster.id,
@@ -42,8 +45,9 @@ const startPortForwardRouteInjectable = getRouteInjectable({
const thePort = 0 < forwardPort && forwardPort < 65536
? forwardPort
: 0;
const proxyKubeconfigPath = await proxyKubeconfigManager.ensurePath();
portForward = createPortForward(await cluster.getProxyKubeconfigPath(), {
portForward = createPortForward(proxyKubeconfigPath, {
clusterId: cluster.id,
kind: resourceType,
namespace,
@@ -6,22 +6,22 @@ import { getRouteInjectable } from "../../router/router.injectable";
import { apiPrefix } from "../../../common/vars";
import { payloadValidatedClusterRoute } from "../../router/route";
import Joi from "joi";
import createResourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable";
import resourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable";
const createResourceRouteInjectable = getRouteInjectable({
id: "create-resource-route",
instantiate: (di) => {
const createResourceApplier = di.inject(createResourceApplierInjectable);
instantiate: (di) => payloadValidatedClusterRoute({
method: "post",
path: `${apiPrefix}/stack`,
payloadValidator: Joi.string(),
})(async ({ cluster, payload }) => {
const resourceApplier = di.inject(resourceApplierInjectable, cluster);
return payloadValidatedClusterRoute({
method: "post",
path: `${apiPrefix}/stack`,
payloadValidator: Joi.string(),
})(async ({ cluster, payload }) => ({
response: await createResourceApplier(cluster).create(payload),
}));
},
return ({
response: await resourceApplier.create(payload),
});
}),
});
export default createResourceRouteInjectable;
@@ -7,7 +7,7 @@ import { apiPrefix } from "../../../common/vars";
import { payloadValidatedClusterRoute } from "../../router/route";
import Joi from "joi";
import type { Patch } from "rfc6902";
import createResourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable";
import resourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable";
interface PatchResourcePayload {
name: string;
@@ -40,22 +40,22 @@ const patchResourcePayloadValidator = Joi.object<PatchResourcePayload, true, Pat
const patchResourceRouteInjectable = getRouteInjectable({
id: "patch-resource-route",
instantiate: (di) => {
const createResourceApplier = di.inject(createResourceApplierInjectable);
instantiate: (di) => payloadValidatedClusterRoute({
method: "patch",
path: `${apiPrefix}/stack`,
payloadValidator: patchResourcePayloadValidator,
})(async ({ cluster, payload }) => {
const resourceApplier = di.inject(resourceApplierInjectable, cluster);
return payloadValidatedClusterRoute({
method: "patch",
path: `${apiPrefix}/stack`,
payloadValidator: patchResourcePayloadValidator,
})(async ({ cluster, payload }) => ({
response: await createResourceApplier(cluster).patch(
return ({
response: await resourceApplier.patch(
payload.name,
payload.kind,
payload.patch,
payload.ns,
),
}));
},
});
}),
});
export default patchResourceRouteInjectable;