@@ -614,28 +614,35 @@ where x.State.ReadyForReset()
614614 _ => NodeDisposalStrategy . ScaleIn ,
615615 } ;
616616
617- await ReimageNodes ( scaleSet , toReimage . Values , strategy ) ;
618- await DeleteNodes ( scaleSet , toDelete . Values ) ;
617+ var reimageNodes = await ReimageNodes ( scaleSet , toReimage . Values , strategy ) ;
618+ if ( ! reimageNodes . IsOk ) {
619+ _log . Warning ( reimageNodes . ErrorV ) ;
620+ return ( false , scaleSet ) ;
621+ }
622+ var deleteNodes = await DeleteNodes ( scaleSet , toDelete . Values ) ;
623+ if ( ! deleteNodes . IsOk ) {
624+ _log . Warning ( deleteNodes . ErrorV ) ;
625+ return ( toReimage . Count > 0 , scaleSet ) ;
626+ }
619627
620628 return ( toReimage . Count > 0 || toDelete . Count > 0 , scaleSet ) ;
621629 }
622630
623631
624- public async Async . Task ReimageNodes ( Scaleset scaleset , IEnumerable < Node > nodes , NodeDisposalStrategy disposalStrategy ) {
632+ public async Async . Task < OneFuzzResultVoid > ReimageNodes ( Scaleset scaleset , IEnumerable < Node > nodes , NodeDisposalStrategy disposalStrategy ) {
625633 if ( nodes is null || ! nodes . Any ( ) ) {
626634 _log . Info ( $ "no nodes to reimage: { scaleset . ScalesetId : Tag:ScalesetId} ") ;
627- return ;
635+ return OneFuzzResultVoid . Ok ;
628636 }
629637
630638 if ( scaleset . State == ScalesetState . Shutdown ) {
631639 _log . Info ( $ "scaleset shutting down, deleting rather than reimaging nodes { scaleset . ScalesetId : Tag:ScalesetId} ") ;
632- await DeleteNodes ( scaleset , nodes ) ;
633- return ;
640+ return await DeleteNodes ( scaleset , nodes ) ;
634641 }
635642
636643 if ( scaleset . State == ScalesetState . Halt ) {
637644 _log . Info ( $ "scaleset halting, ignoring node reimage { scaleset . ScalesetId : Tag:ScalesetId} ") ;
638- return ;
645+ return OneFuzzResultVoid . Ok ;
639646 }
640647
641648 var nodesToReimage = new List < Node > ( ) ;
@@ -653,49 +660,54 @@ public async Async.Task ReimageNodes(Scaleset scaleset, IEnumerable<Node> nodes,
653660
654661 if ( ! nodesToReimage . Any ( ) ) {
655662 _log . Info ( $ "no nodes to reimage { scaleset . ScalesetId : Tag:ScalesetId} ") ;
656- return ;
663+ return OneFuzzResultVoid . Ok ;
657664 }
658665
659666 switch ( disposalStrategy ) {
660667 case NodeDisposalStrategy . Decommission :
661668 _log . Info ( $ "Skipping reimage of nodes in scaleset: { scaleset . ScalesetId : Tag:ScalesetId} , deleting nodes: { string . Join ( ", " , nodesToReimage . Select ( n => n . MachineId ) ) : Tag:MachineIds} { string . Join ( ", " , nodesToReimage . Select ( n => n . InstanceId ) ) : Tag:InstanceIds} ") ;
662- await _context . VmssOperations . DeleteNodes ( scaleset . ScalesetId , nodesToReimage ) ;
669+ var deleteNodes = await _context . VmssOperations . DeleteNodes ( scaleset . ScalesetId , nodesToReimage ) ;
670+ if ( ! deleteNodes . IsOk ) {
671+ return deleteNodes ;
672+ }
663673 await Async . Task . WhenAll ( nodesToReimage
664674 . Select ( async node => {
665675 await _context . NodeOperations . Delete ( node ) ;
666676 } ) ) ;
667- return ;
677+ return OneFuzzResultVoid . Ok ;
668678
669679 case NodeDisposalStrategy . ScaleIn :
670680 var r = await _context . VmssOperations . ReimageNodes ( scaleset . ScalesetId , nodesToReimage ) ;
671- if ( r . IsOk ) {
672- await Async . Task . WhenAll ( nodesToReimage
673- . Select ( async node => {
674- var r = await _context . NodeOperations . ReleaseScaleInProtection ( node ) ;
675- if ( r . IsOk ) {
676- await _context . NodeOperations . Delete ( node ) ;
677- }
678- } ) ) ;
679- } else {
680- _log . Info ( $ "failed to reimage nodes due to { r . ErrorV : Tag:Error} ") ;
681+ if ( ! r . IsOk ) {
682+ return r ;
681683 }
682- return ;
684+
685+ await Async . Task . WhenAll ( nodesToReimage
686+ . Select ( async node => {
687+ var r = await _context . NodeOperations . ReleaseScaleInProtection ( node ) ;
688+ if ( r . IsOk ) {
689+ await _context . NodeOperations . Delete ( node ) ;
690+ }
691+ } ) ) ;
692+ return OneFuzzResultVoid . Ok ;
693+ default :
694+ return OneFuzzResultVoid . Error ( ErrorCode . INVALID_CONFIGURATION , $ "Unhandled node disposal strategy: { disposalStrategy } ") ;
683695 }
684696 }
685697
686698
687- public async Async . Task DeleteNodes ( Scaleset scaleset , IEnumerable < Node > nodes ) {
699+ public async Async . Task < OneFuzzResultVoid > DeleteNodes ( Scaleset scaleset , IEnumerable < Node > nodes ) {
688700 if ( nodes is null || ! nodes . Any ( ) ) {
689701 _log . Info ( $ "no nodes to delete: scaleset_id: { scaleset . ScalesetId : Tag:ScalesetId} ") ;
690- return ;
702+ return OneFuzzResultVoid . Ok ;
691703 }
692704
693705 // TODO: try to do this as one atomic operation:
694706 nodes = await Async . Task . WhenAll ( nodes . Select ( node => _context . NodeOperations . SetHalt ( node ) ) ) ;
695707
696708 if ( scaleset . State == ScalesetState . Halt ) {
697709 _log . Info ( $ "scaleset halting, ignoring deletion { scaleset . ScalesetId : Tag:ScalesetId} ") ;
698- return ;
710+ return OneFuzzResultVoid . Ok ;
699711 }
700712
701713 var nodesToDelete = new List < Node > ( ) ;
@@ -708,11 +720,15 @@ public async Async.Task DeleteNodes(Scaleset scaleset, IEnumerable<Node> nodes)
708720 }
709721
710722 _log . Info ( $ "deleting nodes { scaleset . ScalesetId : Tag:ScalesetId} { string . Join ( ", " , nodesToDelete . Select ( n => n . MachineId ) ) : Tag:MachineIds} ") ;
711- await _context . VmssOperations . DeleteNodes ( scaleset . ScalesetId , nodesToDelete ) ;
723+ var deleteNodes = await _context . VmssOperations . DeleteNodes ( scaleset . ScalesetId , nodesToDelete ) ;
724+ if ( ! deleteNodes . IsOk ) {
725+ return deleteNodes ;
726+ }
712727 await Async . Task . WhenAll ( nodesToDelete
713728 . Select ( async node => {
714729 await _context . NodeOperations . Delete ( node ) ;
715730 } ) ) ;
731+ return OneFuzzResultVoid . Ok ;
716732 }
717733
718734 public async Task < OneFuzzResult < Scaleset > > GetById ( Guid scalesetId ) {
0 commit comments