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

Install Metrics component refactoring

Using notifications for error, removed picking
button icon method, simplified button generation.

Signed-off-by: alexfront <alex.andreev.email@gmail.com>
This commit is contained in:
alexfront 2020-08-04 15:49:21 +03:00
parent 71a9306e54
commit 0bee7b6c1a

View File

@ -1,15 +1,14 @@
import React from "react"; import React from "react";
import { Cluster } from "../../../../main/cluster"; import { Cluster } from "../../../../main/cluster";
import { Button } from "../../button"; import { Button } from "../../button";
import { autobind } from "../../../utils";
import { Tooltip, TooltipPosition } from "../../tooltip";
import { MetricsFeature } from "../../../../features/metrics"; import { MetricsFeature } from "../../../../features/metrics";
import { Spinner } from "../../spinner"; import { Spinner } from "../../spinner";
import { Icon } from "../../icon";
import { clusterIpc } from "../../../../common/cluster-ipc"; import { clusterIpc } from "../../../../common/cluster-ipc";
import { observable } from "mobx"; import { observable } from "mobx";
import { ActionStatus } from "./statuses" import { ActionStatus } from "./statuses"
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { SubTitle } from "../../layout/sub-title";
import { Notifications } from "../../notifications";
interface Props { interface Props {
cluster: Cluster; cluster: Cluster;
@ -20,90 +19,72 @@ export class InstallMetrics extends React.Component<Props> {
@observable status = ActionStatus.IDLE; @observable status = ActionStatus.IDLE;
@observable errorText?: string; @observable errorText?: string;
render() { getActionButtons() {
return <>
<h4>Metrics</h4>
<p>
User Mode feature enables non-admin users to see namespaces they have access to.
This is achieved by configuring RBAC rules so that every authenticated user is granted to list namespaces.
</p>
<div className="center">
{this.getActionButtons()}
</div>
</>;
}
getStatusIcon(): React.ReactNode {
switch (this.status) {
case ActionStatus.IDLE:
return null;
case ActionStatus.PROCESSING:
return <Spinner />;
case ActionStatus.ERROR:
return <Icon size="16px" material="error" title={this.errorText}></Icon>
}
}
getDisabledToolTip(id: string, action: string): React.ReactNode {
const { cluster } = this.props; const { cluster } = this.props;
if (cluster.isAdmin) { const features = cluster.features[MetricsFeature.id];
return null; const disabled = !cluster.isAdmin || this.status === ActionStatus.PROCESSING;
} const loadingIcon = this.status === ActionStatus.PROCESSING ? <Spinner/> : null;
if (!features) return null;
return ( return (
<Tooltip targetId={id} position={TooltipPosition.TOP}> <div className="flex gaps align-center">
{action} only allowed by admins {features.canUpgrade &&
</Tooltip> <Button
primary
disabled={disabled}
onClick={this.runAction("upgradeFeature")}
>
Upgrade
</Button>
}
{features.installed &&
<Button
primary
disabled={disabled}
onClick={this.runAction("uninstallFeature")}
>
Uninstall
</Button>
}
{!features.installed && !features.canUpgrade &&
<Button
primary
disabled={disabled}
onClick={this.runAction("installFeature")}
>
Install
</Button>
}
{loadingIcon}
{!cluster.isAdmin && <span className='admin-note'>Actions can only be performed by admins.</span>}
</div>
); );
} }
getActionButtons(): React.ReactNode[] {
const { cluster } = this.props
const buttons = [];
if (cluster.features[MetricsFeature.id]?.canUpgrade) {
buttons.push(
<Button key="upgrade" id="cluster-feature-metrics-upgrade" disabled={!cluster.isAdmin} primary onClick={this.runAction("upgradeFeature")}>
Upgrade {this.getStatusIcon()} {this.getDisabledToolTip("cluster-feature-metrics-upgrade", "Upgrading")}
</Button>
);
}
if (cluster.features[MetricsFeature.id]?.installed) {
buttons.push(
<Button key="uninstall" id="cluster-feature-metrics-uninstall" disabled={!cluster.isAdmin} primary onClick={this.runAction("uninstallFeature")}>
Uninstall {this.getStatusIcon()} {this.getDisabledToolTip("cluster-feature-metrics-uninstall", "Uninstalling")}
</Button>
);
} else {
buttons.push(
<Button key="install" id="cluster-feature-metrics-install" disabled={!cluster.isAdmin} primary onClick={this.runAction("installFeature")}>
Install {this.getStatusIcon()} {this.getDisabledToolTip("cluster-feature-metrics-install", "Installing")}
</Button>
);
}
return buttons;
}
runAction(action: keyof typeof clusterIpc): () => Promise<void> { runAction(action: keyof typeof clusterIpc): () => Promise<void> {
return async () => { return async () => {
const { cluster } = this.props; const { cluster } = this.props;
console.log(`running ${action} ${MetricsFeature.id} onto ${cluster.preferences.clusterName}`);
try { try {
this.status = ActionStatus.PROCESSING this.status = ActionStatus.PROCESSING
await clusterIpc[action].invokeFromRenderer(cluster.id, MetricsFeature.id); await clusterIpc[action].invokeFromRenderer(cluster.id, MetricsFeature.id);
try {
await cluster.refresh();
} catch (err) {
console.error(err);
}
this.status = ActionStatus.IDLE
} catch (err) { } catch (err) {
this.status = ActionStatus.ERROR Notifications.error(err.toString());
this.errorText = err.toString()
} }
this.status = ActionStatus.IDLE;
}; };
} }
render() {
return (
<>
<SubTitle title="Metrics"/>
<p>
Enable timeseries data visualization (Prometheus stack) for your cluster.
Install this only if you don't have existing Prometheus stack installed.
You can see preview of manifests{" "}
<a href="https://github.com/lensapp/lens/tree/master/src/features/metrics" target="_blank">here</a>.
</p>
{this.getActionButtons()}
</>
);
}
} }