1515// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
1717import React , { useState , useEffect } from "react" ;
18+ import get from "lodash/get" ;
1819import { createStyles , Theme , withStyles } from "@material-ui/core/styles" ;
1920import {
2021 containerForHeader ,
@@ -38,12 +39,18 @@ import Trace from "./Trace/Trace";
3839import Watch from "./Watch/Watch" ;
3940import Heal from "./Heal/Heal" ;
4041import PageHeader from "../../Common/PageHeader/PageHeader" ;
42+ import UsageBarWrapper from "../../Common/UsageBarWrapper/UsageBarWrapper" ;
4143
4244interface ITenantDetailsProps {
4345 classes : any ;
4446 match : any ;
4547}
4648
49+ interface ITenantUsage {
50+ used : string ;
51+ disk_used : string ;
52+ }
53+
4754const 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