Skip to content

Commit dbbaae7

Browse files
authored
Added tenant usage indicator (#454)
1 parent 585780d commit dbbaae7

File tree

2 files changed

+153
-4
lines changed

2 files changed

+153
-4
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import React from "react";
2+
import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
3+
import { LinearProgress } from "@material-ui/core";
4+
import Paper from "@material-ui/core/Paper";
5+
import Grid from "@material-ui/core/Grid";
6+
import CircularProgress from "@material-ui/core/CircularProgress";
7+
8+
interface IProgressBar {
9+
maxValue: number;
10+
currValue: number;
11+
label: string;
12+
renderFunction?: (element: string) => any;
13+
error: string;
14+
loading: boolean;
15+
classes: any;
16+
}
17+
18+
const styles = (theme: Theme) =>
19+
createStyles({
20+
paperContainer: {
21+
padding: 15,
22+
},
23+
allValue: {
24+
fontSize: 16,
25+
fontWeight: 700,
26+
marginBottom: 8,
27+
},
28+
currentUsage: {
29+
fontSize: 12,
30+
marginTop: 8,
31+
},
32+
centerItem: {
33+
textAlign: "center",
34+
},
35+
error: {
36+
color: "#9c9c9c",
37+
},
38+
});
39+
40+
const BorderLinearProgress = withStyles((theme) => ({
41+
root: {
42+
height: 10,
43+
borderRadius: 5,
44+
},
45+
colorPrimary: {
46+
backgroundColor: "#F4F4F4",
47+
},
48+
bar: {
49+
borderRadius: 5,
50+
backgroundColor: "#081C42",
51+
},
52+
}))(LinearProgress);
53+
54+
const UsageBarWrapper = ({
55+
classes,
56+
maxValue,
57+
currValue,
58+
label,
59+
renderFunction,
60+
loading,
61+
error,
62+
}: IProgressBar) => {
63+
const porcentualValue = (currValue * 100) / maxValue;
64+
65+
const renderComponent = () => {
66+
if (!loading) {
67+
return error !== "" ? (
68+
<React.Fragment>
69+
<span className={classes.error}>{error}</span>
70+
</React.Fragment>
71+
) : (
72+
<React.Fragment>
73+
<Grid item xs={12} className={classes.allValue}>
74+
{label}{" "}
75+
{renderFunction ? renderFunction(maxValue.toString()) : maxValue}
76+
</Grid>
77+
<BorderLinearProgress variant="determinate" value={porcentualValue} />
78+
<Grid item xs={12} className={classes.currentUsage}>
79+
Used:{" "}
80+
{renderFunction ? renderFunction(currValue.toString()) : currValue}
81+
</Grid>
82+
</React.Fragment>
83+
);
84+
}
85+
86+
return null;
87+
};
88+
89+
return (
90+
<React.Fragment>
91+
<Paper className={classes.paperContainer}>
92+
{loading && (
93+
<React.Fragment>
94+
<Grid item xs={12} className={classes.centerItem}>
95+
<CircularProgress
96+
color="primary"
97+
size={40}
98+
variant="indeterminate"
99+
/>
100+
</Grid>
101+
</React.Fragment>
102+
)}
103+
{renderComponent()}
104+
</Paper>
105+
</React.Fragment>
106+
);
107+
};
108+
109+
export default withStyles(styles)(UsageBarWrapper);

portal-ui/src/screens/Console/Tenants/TenantDetails/TenantDetails.tsx

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

1717
import React, { useState, useEffect } from "react";
18+
import get from "lodash/get";
1819
import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
1920
import {
2021
containerForHeader,
@@ -38,12 +39,18 @@ import Trace from "./Trace/Trace";
3839
import Watch from "./Watch/Watch";
3940
import Heal from "./Heal/Heal";
4041
import PageHeader from "../../Common/PageHeader/PageHeader";
42+
import UsageBarWrapper from "../../Common/UsageBarWrapper/UsageBarWrapper";
4143

4244
interface ITenantDetailsProps {
4345
classes: any;
4446
match: any;
4547
}
4648

49+
interface ITenantUsage {
50+
used: string;
51+
disk_used: string;
52+
}
53+
4754
const styles = (theme: Theme) =>
4855
createStyles({
4956
errorBlock: {
@@ -109,6 +116,12 @@ const TenantDetails = ({ classes, match }: ITenantDetailsProps) => {
109116
const [addReplicationOpen, setAddReplicationOpen] = useState<boolean>(false);
110117
const [error, setError] = useState<string>("");
111118
const [tenant, setTenant] = useState<ITenant | null>(null);
119+
const [loadingUsage, setLoadingUsage] = useState<boolean>(true);
120+
const [usageError, setUsageError] = useState<string>("");
121+
const [usage, setUsage] = useState<number>(0);
122+
123+
const tenantName = match.params["tenantName"];
124+
const tenantNamespace = match.params["tenantNamespace"];
112125

113126
const onCloseZoneAndRefresh = (reload: boolean) => {
114127
setAddZone(false);
@@ -131,9 +144,6 @@ const TenantDetails = ({ classes, match }: ITenantDetailsProps) => {
131144
};
132145

133146
const loadInfo = () => {
134-
const tenantName = match.params["tenantName"];
135-
const tenantNamespace = match.params["tenantNamespace"];
136-
137147
api
138148
.invoke(
139149
"GET",
@@ -172,8 +182,28 @@ const TenantDetails = ({ classes, match }: ITenantDetailsProps) => {
172182
});
173183
};
174184

185+
const loadUsage = () => {
186+
api
187+
.invoke(
188+
"GET",
189+
`/api/v1/namespaces/${tenantNamespace}/tenants/${tenantName}/usage`
190+
)
191+
.then((result: ITenantUsage) => {
192+
const usage = get(result, "disk_used", "0");
193+
setUsage(parseInt(usage));
194+
setUsageError("");
195+
setLoadingUsage(false);
196+
})
197+
.catch((err) => {
198+
setUsageError(err);
199+
setUsage(0);
200+
setLoadingUsage(false);
201+
});
202+
};
203+
175204
useEffect(() => {
176205
loadInfo();
206+
loadUsage();
177207
// eslint-disable-next-line react-hooks/exhaustive-deps
178208
}, []);
179209

@@ -209,7 +239,7 @@ const TenantDetails = ({ classes, match }: ITenantDetailsProps) => {
209239
<Grid item xs={12}>
210240
<br />
211241
</Grid>
212-
<Grid item xs={12} className={classes.containerHeader}>
242+
<Grid item xs={9} className={classes.containerHeader}>
213243
<Paper className={classes.paperContainer}>
214244
<div className={classes.infoGrid}>
215245
<div>Capacity:</div>
@@ -227,6 +257,16 @@ const TenantDetails = ({ classes, match }: ITenantDetailsProps) => {
227257
</div>
228258
</Paper>
229259
</Grid>
260+
<Grid item xs={3}>
261+
<UsageBarWrapper
262+
currValue={usage}
263+
maxValue={tenant ? tenant.total_size : 0}
264+
label={"Storage"}
265+
renderFunction={niceBytes}
266+
error={usageError}
267+
loading={loadingUsage}
268+
/>
269+
</Grid>
230270
<Grid item xs={12}>
231271
<br />
232272
</Grid>

0 commit comments

Comments
 (0)