mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Move Cluster.apiUrl to seperate injectable (#7354)
* Refactor out Cluster.apiUrl to direct reading - Should help prevent using stale data - Removes some uses of synchronous FS operations Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * Rename helper function to better communicate intent Signed-off-by: Sebastian Malton <sebastian@malton.name> * Improve prometheus handler tests to override less things Signed-off-by: Sebastian Malton <sebastian@malton.name> --------- Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
1 parent
18d660ea77
commit
fe2fd4c1fd
53 files changed
+472
-640
No files matched your search
@@ -183,7 +183,6 @@ export const initialNodeShellImage = "docker.io/alpine:3.13";
|
||||
* The data representing a cluster's state, for passing between main and renderer
|
||||
*/
|
||||
export interface ClusterState {
|
||||
apiUrl: string;
|
||||
online: boolean;
|
||||
disconnected: boolean;
|
||||
accessible: boolean;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { computed, observable, toJS, runInAction } from "mobx";
|
||||
import type { KubeApiResource } from "../rbac";
|
||||
import type { ClusterState, ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences, ClusterPrometheusPreferences, UpdateClusterModel, ClusterConfigData } from "../cluster-types";
|
||||
import type { ClusterState, ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences, ClusterPrometheusPreferences, UpdateClusterModel } from "../cluster-types";
|
||||
import { ClusterMetadataKey, clusterModelIdChecker, updateClusterModelChecker } from "../cluster-types";
|
||||
import type { IObservableValue } from "mobx";
|
||||
import { replaceObservableObject } from "../utils/replace-observable-object";
|
||||
@@ -27,11 +27,6 @@ export class Cluster {
|
||||
*/
|
||||
readonly kubeConfigPath = observable.box() as IObservableValue<string>;
|
||||
|
||||
/**
|
||||
* Kubernetes API server URL
|
||||
*/
|
||||
readonly apiUrl: IObservableValue<string>;
|
||||
|
||||
/**
|
||||
* Describes if we can detect that cluster is online
|
||||
*/
|
||||
@@ -122,7 +117,7 @@ export class Cluster {
|
||||
*/
|
||||
readonly prometheusPreferences = computed(() => pick(toJS(this.preferences), "prometheus", "prometheusProvider") as ClusterPrometheusPreferences);
|
||||
|
||||
constructor({ id, ...model }: ClusterModel, configData: ClusterConfigData) {
|
||||
constructor({ id, ...model }: ClusterModel) {
|
||||
const { error } = clusterModelIdChecker.validate({ id });
|
||||
|
||||
if (error) {
|
||||
@@ -131,7 +126,6 @@ export class Cluster {
|
||||
|
||||
this.id = id;
|
||||
this.updateModel(model);
|
||||
this.apiUrl = observable.box(configData.clusterServerUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,7 +181,6 @@ export class Cluster {
|
||||
*/
|
||||
getState(): ClusterState {
|
||||
return {
|
||||
apiUrl: this.apiUrl.get(),
|
||||
online: this.online.get(),
|
||||
ready: this.ready.get(),
|
||||
disconnected: this.disconnected.get(),
|
||||
@@ -207,7 +200,6 @@ export class Cluster {
|
||||
this.accessible.set(state.accessible);
|
||||
this.allowedNamespaces.replace(state.allowedNamespaces);
|
||||
this.resourcesToShow.replace(state.resourcesToShow);
|
||||
this.apiUrl.set(state.apiUrl);
|
||||
this.disconnected.set(state.disconnected);
|
||||
this.isAdmin.set(state.isAdmin);
|
||||
this.isGlobalWatchEnabled.set(state.isGlobalWatchEnabled);
|
||||
|
||||
@@ -51,8 +51,6 @@ describe("ApiManager", () => {
|
||||
contextName: "some-context-name",
|
||||
id: "some-cluster-id",
|
||||
kubeConfigPath: "/some-path-to-a-kubeconfig",
|
||||
}, {
|
||||
clusterServerUrl: "https://localhost:8080",
|
||||
}));
|
||||
|
||||
apiManager = di.inject(apiManagerInjectable);
|
||||
|
||||
@@ -43,8 +43,6 @@ describe("KubeApi", () => {
|
||||
contextName: "some-context-name",
|
||||
id: "some-cluster-id",
|
||||
kubeConfigPath: "/some-path-to-a-kubeconfig",
|
||||
}, {
|
||||
clusterServerUrl: "https://localhost:8080",
|
||||
}));
|
||||
|
||||
apiManager = di.inject(apiManagerInjectable);
|
||||
|
||||
@@ -62,8 +62,6 @@ describe("createKubeApiForRemoteCluster", () => {
|
||||
contextName: "some-context-name",
|
||||
id: "some-cluster-id",
|
||||
kubeConfigPath: "/some-path-to-a-kubeconfig",
|
||||
}, {
|
||||
clusterServerUrl: "https://localhost:8080",
|
||||
}));
|
||||
|
||||
fetchMock = asyncFn();
|
||||
@@ -168,8 +166,6 @@ describe("KubeApi", () => {
|
||||
contextName: "some-context-name",
|
||||
id: "some-cluster-id",
|
||||
kubeConfigPath: "/some-path-to-a-kubeconfig",
|
||||
}, {
|
||||
clusterServerUrl: "https://localhost:8080",
|
||||
}));
|
||||
|
||||
di.override(apiKubeInjectable, () => createKubeJsonApi({
|
||||
|
||||
@@ -130,6 +130,16 @@ export function loadConfigFromString(content: string): ConfigResult {
|
||||
};
|
||||
}
|
||||
|
||||
export function loadValidatedConfig(content: string, contextName: string): ValidateKubeConfigResult {
|
||||
const { options, error } = loadToOptions(content);
|
||||
|
||||
if (error) {
|
||||
return { error };
|
||||
}
|
||||
|
||||
return validateKubeConfig(loadFromOptions(options), contextName);
|
||||
}
|
||||
|
||||
export interface SplitConfigEntry {
|
||||
config: KubeConfig;
|
||||
validationResult: ValidateKubeConfigResult;
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* 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 { Cluster } from "../cluster/cluster";
|
||||
import readFileInjectable from "../fs/read-file.injectable";
|
||||
import type { ValidateKubeConfigResult } from "../kube-helpers";
|
||||
import { loadValidatedConfig } from "../kube-helpers";
|
||||
import resolveTildeInjectable from "../path/resolve-tilde.injectable";
|
||||
|
||||
export type LoadValidatedClusterConfig = (cluster: Cluster) => Promise<ValidateKubeConfigResult>;
|
||||
|
||||
const loadValidatedClusterConfigInjectable = getInjectable({
|
||||
id: "load-validated-cluster-config",
|
||||
instantiate: (di): LoadValidatedClusterConfig => {
|
||||
const readFile = di.inject(readFileInjectable);
|
||||
const resolveTilde = di.inject(resolveTildeInjectable);
|
||||
|
||||
return async (cluster) => {
|
||||
const data = await readFile(resolveTilde(cluster.kubeConfigPath.get()));
|
||||
|
||||
return loadValidatedConfig(data, cluster.contextName.get());
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export default loadValidatedClusterConfigInjectable;
|
||||
Reference in new issue
Block a user