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

Only allow extensions to use non-lens specific cluster phases (#4036)

This commit is contained in:
Sebastian Malton 2021-10-14 10:25:48 -04:00 committed by GitHub
parent a01eecdc79
commit 9d5689ce69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 16 deletions

View File

@ -54,15 +54,24 @@ export interface KubernetesClusterSpec extends CatalogEntitySpec {
accessibleNamespaces?: string[];
}
export enum LensKubernetesClusterStatus {
DELETING = "deleting",
CONNECTING = "connecting",
CONNECTED = "connected",
DISCONNECTED = "disconnected"
}
export interface KubernetesClusterMetadata extends CatalogEntityMetadata {
distro?: string;
kubeVersion?: string;
}
/**
* @deprecated This is no longer used as it is incorrect. Other sources can add more values
*/
export type KubernetesClusterStatusPhase = "connected" | "connecting" | "disconnected" | "deleting";
export interface KubernetesClusterStatus extends CatalogEntityStatus {
phase: KubernetesClusterStatusPhase;
}
export class KubernetesCluster extends CatalogEntity<KubernetesClusterMetadata, KubernetesClusterStatus, KubernetesClusterSpec> {
@ -110,15 +119,15 @@ export class KubernetesCluster extends CatalogEntity<KubernetesClusterMetadata,
}
switch (this.status.phase) {
case "connected":
case "connecting":
case LensKubernetesClusterStatus.CONNECTED:
case LensKubernetesClusterStatus.CONNECTING:
context.menuItems.push({
title: "Disconnect",
icon: "link_off",
onClick: () => requestMain(clusterDisconnectHandler, this.metadata.uid)
});
break;
case "disconnected":
case LensKubernetesClusterStatus.DISCONNECTED:
context.menuItems.push({
title: "Connect",
icon: "link",

View File

@ -19,5 +19,22 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
export * from "../../common/catalog-entities";
export {
KubernetesCluster,
kubernetesClusterCategory,
GeneralEntity,
WebLink,
} from "../../common/catalog-entities";
export type {
KubernetesClusterPrometheusMetrics,
KubernetesClusterSpec,
KubernetesClusterMetadata,
WebLinkSpec,
WebLinkStatus,
WebLinkStatusPhase,
KubernetesClusterStatusPhase,
KubernetesClusterStatus,
} from "../../common/catalog-entities";
export * from "../../common/catalog/catalog-entity";

View File

@ -27,7 +27,7 @@ import logger from "./logger";
import { apiKubePrefix } from "../common/vars";
import { getClusterIdFromHost, Singleton } from "../common/utils";
import { catalogEntityRegistry } from "./catalog";
import { KubernetesCluster, KubernetesClusterPrometheusMetrics, KubernetesClusterStatusPhase } from "../common/catalog-entities/kubernetes-cluster";
import { KubernetesCluster, KubernetesClusterPrometheusMetrics, LensKubernetesClusterStatus } from "../common/catalog-entities/kubernetes-cluster";
import { ipcMainOn } from "../common/ipc";
import { once } from "lodash";
import { ClusterStore } from "../common/cluster-store";
@ -35,6 +35,8 @@ import type { ClusterId } from "../common/cluster-types";
const logPrefix = "[CLUSTER-MANAGER]:";
const lensSpecificClusterStatuses: Set<string> = new Set(Object.values(LensKubernetesClusterStatus));
export class ClusterManager extends Singleton {
private store = ClusterStore.getInstance();
deleting = observable.set<ClusterId>();
@ -90,6 +92,8 @@ export class ClusterManager extends Singleton {
@action
protected updateCatalog(clusters: Cluster[]) {
logger.debug("[CLUSTER-MANAGER]: updating catalog from cluster store");
for (const cluster of clusters) {
this.updateEntityFromCluster(cluster);
}
@ -144,27 +148,28 @@ export class ClusterManager extends Singleton {
@action
protected updateEntityStatus(entity: KubernetesCluster, cluster?: Cluster) {
if (this.deleting.has(entity.getId())) {
entity.status.phase = "deleting";
entity.status.phase = LensKubernetesClusterStatus.DELETING;
entity.status.enabled = false;
} else {
entity.status.phase = ((): KubernetesClusterStatusPhase => {
entity.status.phase = (() => {
if (!cluster) {
return "disconnected";
return LensKubernetesClusterStatus.DISCONNECTED;
}
if (cluster.accessible) {
return "connected";
return LensKubernetesClusterStatus.CONNECTED;
}
if (!cluster.disconnected) {
return "connecting";
return LensKubernetesClusterStatus.CONNECTING;
}
if (entity?.status?.phase) {
// Extensions are not allowed to use the Lens specific status phases
if (!lensSpecificClusterStatuses.has(entity?.status?.phase)) {
return entity.status.phase;
}
return "disconnected";
return LensKubernetesClusterStatus.DISCONNECTED;
})();
entity.status.enabled = true;
@ -276,7 +281,9 @@ export function catalogEntityFromCluster(cluster: Cluster) {
icon: {}
},
status: {
phase: cluster.disconnected ? "disconnected" : "connected",
phase: cluster.disconnected
? LensKubernetesClusterStatus.DISCONNECTED
: LensKubernetesClusterStatus.CONNECTED,
reason: "",
message: "",
active: !cluster.disconnected

View File

@ -394,7 +394,6 @@ export class Cluster implements ClusterModel, ClusterState {
* @internal
*/
@action disconnect() {
logger.info(`[CLUSTER]: disconnect`, this.getMeta());
this.unbindEvents();
this.contextHandler?.stopServer();
this.disconnected = true;
@ -405,6 +404,7 @@ export class Cluster implements ClusterModel, ClusterState {
this.allowedNamespaces = [];
this.resourceAccessStatuses.clear();
this.pushState();
logger.info(`[CLUSTER]: disconnect`, this.getMeta());
}
/**

View File

@ -31,6 +31,7 @@ import { cssNames, IClassName } from "../../utils";
import { Icon } from "../icon";
import { HotbarIcon } from "./hotbar-icon";
import { HotbarStore } from "../../../common/hotbar-store";
import { LensKubernetesClusterStatus } from "../../../common/catalog-entities/kubernetes-cluster";
interface Props extends DOMAttributes<HTMLElement> {
entity: CatalogEntity;
@ -78,7 +79,7 @@ export class HotbarEntityIcon extends React.Component<Props> {
return null;
}
const className = cssNames("led", { online: this.props.entity.status.phase == "connected"}); // TODO: make it more generic
const className = cssNames("led", { online: this.props.entity.status.phase === LensKubernetesClusterStatus.CONNECTED}); // TODO: make it more generic
return <div className={className} />;
}