@@ -6,6 +6,7 @@ const metadata = require('../../metadata/wrapper');
66const { responseXMLBody } = require ( 'arsenal/build/lib/s3routes/routesUtils' ) ;
77const { respondWithData, getResponseHeader, buildHeadXML, validPath } = require ( './utils' ) ;
88const { processVersions, processMasterVersions } = require ( '../../api/bucketGet' ) ;
9+ const UtilizationService = require ( '../../../lib/utilization/instance' ) ;
910
1011
1112/**
@@ -96,37 +97,73 @@ function listVeeamFiles(request, response, bucketMd, log) {
9697 if ( err ) {
9798 return responseXMLBody ( errors . InternalError , null , response , log ) ;
9899 }
99- const filesToBuild = [ ] ;
100- const fieldsToGenerate = [ ] ;
101- if ( data . _capabilities ?. VeeamSOSApi ?. SystemInfo ) {
102- fieldsToGenerate . push ( {
103- ...data . _capabilities ?. VeeamSOSApi ?. SystemInfo ,
104- name : `${ validPath } system.xml` ,
100+
101+ const buildAndRespond = bucketMetrics => {
102+ const filesToBuild = [ ] ;
103+ const fieldsToGenerate = [ ] ;
104+ if ( data . _capabilities ?. VeeamSOSApi ?. SystemInfo ) {
105+ fieldsToGenerate . push ( {
106+ ...data . _capabilities ?. VeeamSOSApi ?. SystemInfo ,
107+ name : `${ validPath } system.xml` ,
108+ } ) ;
109+ }
110+ if ( data . _capabilities ?. VeeamSOSApi ?. CapacityInfo ) {
111+ fieldsToGenerate . push ( {
112+ ...data . _capabilities ?. VeeamSOSApi ?. CapacityInfo ,
113+ name : `${ validPath } capacity.xml` ,
114+ } ) ;
115+ }
116+ fieldsToGenerate . forEach ( file => {
117+ const isCapacity = file . name . endsWith ( 'capacity.xml' ) ;
118+ const lastModified = isCapacity
119+ ? ( bucketMetrics ?. date || new Date ( ) )
120+ : file . LastModified ;
121+ // eslint-disable-next-line no-param-reassign
122+ delete file . LastModified ;
123+ const builder = new xml2js . Builder ( {
124+ headless : true ,
125+ } ) ;
126+ const dataBuffer = Buffer . from ( buildHeadXML ( builder . buildObject ( file ) ) ) ;
127+ filesToBuild . push ( {
128+ ...getResponseHeader ( request , data ,
129+ dataBuffer , lastModified , log ) ,
130+ name : file . name ,
131+ } ) ;
105132 } ) ;
106- }
133+ // When `versions` is present, listing should return a versioned list
134+ return respondWithData ( request , response , log , data ,
135+ buildXMLResponse ( request , filesToBuild , 'versions' in request . query ) ) ;
136+ } ;
137+
107138 if ( data . _capabilities ?. VeeamSOSApi ?. CapacityInfo ) {
108- fieldsToGenerate . push ( {
109- ...data . _capabilities ?. VeeamSOSApi ?. CapacityInfo ,
110- name : `${ validPath } capacity.xml` ,
139+ const bucketKey = `${ bucketMd . _name } _${ new Date ( bucketMd . _creationDate ) . getTime ( ) } ` ;
140+ return UtilizationService . getUtilizationMetrics ( 'bucket' , bucketKey , null , { } , ( utilizationErr , bucketMetrics ) => {
141+ if ( utilizationErr ) {
142+ const statusCode = utilizationErr . response ?. status || utilizationErr . statusCode || utilizationErr . code ;
143+
144+ if ( statusCode === 404 ) {
145+ log . warn ( 'UtilizationService returned 404 when fetching capacity metrics' , {
146+ method : 'listVeeamFiles' ,
147+ bucket : request . bucketName ,
148+ error : utilizationErr . message || utilizationErr . code ,
149+ } ) ;
150+ return buildAndRespond ( ) ;
151+ }
152+
153+ log . error ( 'error fetching capacity metrics from UtilizationService' , {
154+ method : 'listVeeamFiles' ,
155+ bucket : request . bucketName ,
156+ error : utilizationErr . message || utilizationErr . code ,
157+ statusCode,
158+ } ) ;
159+
160+ return responseXMLBody ( errors . InternalError , null , response , log ) ;
161+ }
162+
163+ return buildAndRespond ( bucketMetrics ) ;
111164 } ) ;
112165 }
113- fieldsToGenerate . forEach ( file => {
114- const lastModified = file . LastModified ;
115- // eslint-disable-next-line no-param-reassign
116- delete file . LastModified ;
117- const builder = new xml2js . Builder ( {
118- headless : true ,
119- } ) ;
120- const dataBuffer = Buffer . from ( buildHeadXML ( builder . buildObject ( file ) ) ) ;
121- filesToBuild . push ( {
122- ...getResponseHeader ( request , data ,
123- dataBuffer , lastModified , log ) ,
124- name : file . name ,
125- } ) ;
126- } ) ;
127- // When `versions` is present, listing should return a versioned list
128- return respondWithData ( request , response , log , data ,
129- buildXMLResponse ( request , filesToBuild , 'versions' in request . query ) ) ;
166+ return buildAndRespond ( ) ;
130167 } ) ;
131168}
132169
0 commit comments