5454import com .cloud .agent .api .Answer ;
5555import com .cloud .agent .api .Command ;
5656import com .cloud .agent .api .StartupCommand ;
57+ import com .cloud .alert .AlertManager ;
5758import com .cloud .exception .ConnectionException ;
5859import com .cloud .host .Host ;
5960import com .cloud .host .Status ;
6061import com .cloud .host .dao .HostDao ;
6162import com .cloud .storage .Volume .Event ;
6263import com .cloud .storage .dao .VMTemplateDao ;
64+ import com .cloud .storage .dao .VMTemplateZoneDao ;
6365import com .cloud .storage .dao .VolumeDao ;
6466import com .cloud .template .VirtualMachineTemplate ;
6567import com .cloud .utils .component .ManagerBase ;
@@ -96,6 +98,10 @@ public class ImageStoreUploadMonitorImpl extends ManagerBase implements ImageSto
9698 private DataStoreManager storeMgr ;
9799 @ Inject
98100 ResourceLimitService _resourceLimitMgr ;
101+ @ Inject
102+ private AlertManager _alertMgr ;
103+ @ Inject
104+ private VMTemplateZoneDao _vmTemplateZoneDao ;
99105
100106 private long _nodeId ;
101107 private ScheduledExecutorService _executor = null ;
@@ -275,6 +281,8 @@ private void handleVolumeStatusResponse(final UploadStatusAnswer answer, final V
275281 public void doInTransactionWithoutResult (TransactionStatus status ) {
276282 VolumeVO tmpVolume = _volumeDao .findById (volume .getId ());
277283 VolumeDataStoreVO tmpVolumeDataStore = _volumeDataStoreDao .findById (volumeDataStore .getId ());
284+ boolean sendAlert = false ;
285+ String msg = null ;
278286 try {
279287 switch (answer .getStatus ()) {
280288 case COMPLETED :
@@ -305,9 +313,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
305313 tmpVolumeDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .DOWNLOAD_ERROR );
306314 tmpVolumeDataStore .setState (State .Failed );
307315 stateMachine .transitTo (tmpVolume , Event .OperationFailed , null , _volumeDao );
308- if ( s_logger . isDebugEnabled ()) {
309- s_logger .debug ( "Volume " + tmpVolume . getUuid () + " failed to upload due to operation timed out" );
310- }
316+ msg = "Volume " + tmpVolume . getUuid () + " failed to upload due to operation timed out" ;
317+ s_logger .error ( msg );
318+ sendAlert = true ;
311319 } else {
312320 tmpVolumeDataStore .setDownloadPercent (answer .getDownloadPercent ());
313321 }
@@ -317,26 +325,30 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
317325 tmpVolumeDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .DOWNLOAD_ERROR );
318326 tmpVolumeDataStore .setState (State .Failed );
319327 stateMachine .transitTo (tmpVolume , Event .OperationFailed , null , _volumeDao );
320- if ( s_logger . isDebugEnabled ()) {
321- s_logger .debug ( "Volume " + tmpVolume . getUuid () + " failed to upload. Error details: " + answer . getDetails () );
322- }
328+ msg = "Volume " + tmpVolume . getUuid () + " failed to upload. Error details: " + answer . getDetails ();
329+ s_logger .error ( msg );
330+ sendAlert = true ;
323331 break ;
324332 case UNKNOWN :
325333 if (tmpVolume .getState () == Volume .State .NotUploaded ) { // check for timeout
326334 if (System .currentTimeMillis () - tmpVolumeDataStore .getCreated ().getTime () > _uploadOperationTimeout ) {
327335 tmpVolumeDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .ABANDONED );
328336 tmpVolumeDataStore .setState (State .Failed );
329337 stateMachine .transitTo (tmpVolume , Event .OperationTimeout , null , _volumeDao );
330- if ( s_logger . isDebugEnabled ()) {
331- s_logger .debug ( "Volume " + tmpVolume . getUuid () + " failed to upload due to operation timed out" );
332- }
338+ msg = "Volume " + tmpVolume . getUuid () + " failed to upload due to operation timed out" ;
339+ s_logger .error ( msg );
340+ sendAlert = true ;
333341 }
334342 }
335343 break ;
336344 }
337345 _volumeDataStoreDao .update (tmpVolumeDataStore .getId (), tmpVolumeDataStore );
338346 } catch (NoTransitionException e ) {
339347 s_logger .error ("Unexpected error " + e .getMessage ());
348+ } finally {
349+ if (sendAlert ) {
350+ _alertMgr .sendAlert (AlertManager .AlertType .ALERT_TYPE_UPLOAD_FAILED , tmpVolume .getDataCenterId (), null , msg , msg );
351+ }
340352 }
341353 }
342354 });
@@ -349,6 +361,8 @@ private void handleTemplateStatusResponse(final UploadStatusAnswer answer, final
349361 public void doInTransactionWithoutResult (TransactionStatus status ) {
350362 VMTemplateVO tmpTemplate = _templateDao .findById (template .getId ());
351363 TemplateDataStoreVO tmpTemplateDataStore = _templateDataStoreDao .findById (templateDataStore .getId ());
364+ boolean sendAlert = false ;
365+ String msg = null ;
352366 try {
353367 switch (answer .getStatus ()) {
354368 case COMPLETED :
@@ -380,9 +394,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
380394 tmpTemplateDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .DOWNLOAD_ERROR );
381395 tmpTemplateDataStore .setState (State .Failed );
382396 stateMachine .transitTo (tmpTemplate , VirtualMachineTemplate .Event .OperationFailed , null , _templateDao );
383- if ( s_logger . isDebugEnabled ()) {
384- s_logger .debug ( "Template " + tmpTemplate . getUuid () + " failed to upload due to operation timed out" );
385- }
397+ msg = "Template " + tmpTemplate . getUuid () + " failed to upload due to operation timed out" ;
398+ s_logger .error ( msg );
399+ sendAlert = true ;
386400 } else {
387401 tmpTemplateDataStore .setDownloadPercent (answer .getDownloadPercent ());
388402 }
@@ -392,26 +406,31 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
392406 tmpTemplateDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .DOWNLOAD_ERROR );
393407 tmpTemplateDataStore .setState (State .Failed );
394408 stateMachine .transitTo (tmpTemplate , VirtualMachineTemplate .Event .OperationFailed , null , _templateDao );
395- if ( s_logger . isDebugEnabled ()) {
396- s_logger .debug ( "Template " + tmpTemplate . getUuid () + " failed to upload. Error details: " + answer . getDetails () );
397- }
409+ msg = "Template " + tmpTemplate . getUuid () + " failed to upload. Error details: " + answer . getDetails ();
410+ s_logger .error ( msg );
411+ sendAlert = true ;
398412 break ;
399413 case UNKNOWN :
400414 if (tmpTemplate .getState () == VirtualMachineTemplate .State .NotUploaded ) { // check for timeout
401415 if (System .currentTimeMillis () - tmpTemplateDataStore .getCreated ().getTime () > _uploadOperationTimeout ) {
402416 tmpTemplateDataStore .setDownloadState (VMTemplateStorageResourceAssoc .Status .ABANDONED );
403417 tmpTemplateDataStore .setState (State .Failed );
404418 stateMachine .transitTo (tmpTemplate , VirtualMachineTemplate .Event .OperationTimeout , null , _templateDao );
405- if ( s_logger . isDebugEnabled ()) {
406- s_logger .debug ( "Template " + tmpTemplate . getUuid () + " failed to upload due to operation timed out" );
407- }
419+ msg = "Template " + tmpTemplate . getUuid () + " failed to upload due to operation timed out" ;
420+ s_logger .error ( msg );
421+ sendAlert = true ;
408422 }
409423 }
410424 break ;
411425 }
412426 _templateDataStoreDao .update (tmpTemplateDataStore .getId (), tmpTemplateDataStore );
413427 } catch (NoTransitionException e ) {
414428 s_logger .error ("Unexpected error " + e .getMessage ());
429+ } finally {
430+ if (sendAlert ) {
431+ _alertMgr .sendAlert (AlertManager .AlertType .ALERT_TYPE_UPLOAD_FAILED ,
432+ _vmTemplateZoneDao .listByTemplateId (tmpTemplate .getId ()).get (0 ).getZoneId (), null , msg , msg );
433+ }
415434 }
416435 }
417436 });
0 commit comments