@@ -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,82 @@ 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` ,
111- } ) ;
139+ const bucketKey = `${ bucketMd . _name } _${ new Date ( bucketMd . _creationDate ) . getTime ( ) } ` ;
140+
141+ return UtilizationService . getUtilizationMetrics (
142+ 'bucket' ,
143+ bucketKey ,
144+ null ,
145+ { } ,
146+ ( utilizationErr , bucketMetrics ) => {
147+ if ( utilizationErr ) {
148+ const statusCode = utilizationErr . response ?. status ||
149+ utilizationErr . statusCode ||
150+ utilizationErr . code ;
151+
152+ if ( statusCode === 404 ) {
153+ log . warn ( 'UtilizationService returned 404 when fetching capacity metrics' , {
154+ method : 'listVeeamFiles' ,
155+ bucket : request . bucketName ,
156+ error : utilizationErr . message || utilizationErr . code ,
157+ } ) ;
158+ return buildAndRespond ( ) ;
159+ }
160+
161+ log . error ( 'error fetching capacity metrics from UtilizationService' , {
162+ method : 'listVeeamFiles' ,
163+ bucket : request . bucketName ,
164+ error : utilizationErr . message || utilizationErr . code ,
165+ statusCode,
166+ } ) ;
167+
168+ return responseXMLBody ( errors . InternalError , null , response , log ) ;
169+ }
170+
171+ return buildAndRespond ( bucketMetrics ) ;
172+ } ,
173+ ) ;
112174 }
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 ) ) ;
175+ return buildAndRespond ( ) ;
130176 } ) ;
131177}
132178
0 commit comments