Skip to content
This repository was archived by the owner on Nov 1, 2023. It is now read-only.

Commit 4af4f93

Browse files
authored
Only warn on cannot delete nodes from scaleset warning (#2691)
1 parent fa3e6a4 commit 4af4f93

File tree

3 files changed

+48
-31
lines changed

3 files changed

+48
-31
lines changed

src/ApiService/ApiService/onefuzzlib/ScalesetOperations.cs

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

src/ApiService/ApiService/onefuzzlib/VmssOperations.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Async.Task<OneFuzzResultVoid> CreateVmss(
4343

4444
IAsyncEnumerable<VirtualMachineScaleSetVmResource> ListVmss(Guid name);
4545
Async.Task<OneFuzzResultVoid> ReimageNodes(Guid scalesetId, IEnumerable<Node> nodes);
46-
Async.Task DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes);
46+
Async.Task<OneFuzzResultVoid> DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes);
4747
}
4848

4949
public class VmssOperations : IVmssOperations {
@@ -526,15 +526,16 @@ public async Async.Task<OneFuzzResultVoid> ReimageNodes(Guid scalesetId, IEnumer
526526
return OneFuzzResultVoid.Ok;
527527
}
528528

529-
public async Async.Task DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes) {
529+
public async Async.Task<OneFuzzResultVoid> DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes) {
530530
var result = await CheckCanUpdate(scalesetId);
531531
if (!result.IsOk) {
532-
throw new Exception($"cannot delete nodes from scaleset {scalesetId} : {result.ErrorV}");
532+
_log.Warning($"cannot delete nodes from scaleset {scalesetId} : {result.ErrorV}");
533+
return OneFuzzResultVoid.Error(result.ErrorV);
533534
}
534535

535536
var instanceIds = await ResolveInstanceIds(scalesetId, nodes);
536537
if (!instanceIds.Any()) {
537-
return;
538+
return OneFuzzResultVoid.Ok;
538539
}
539540

540541
var subscription = _creds.GetSubscription();
@@ -553,6 +554,6 @@ public async Async.Task DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes) {
553554
if (r.GetRawResponse().IsError) {
554555
_log.Error($"failed to start deletion of scaleset {scalesetId:Tag:ScalesetId} due to {r.GetRawResponse().ReasonPhrase:Tag:Error}");
555556
}
556-
return;
557+
return OneFuzzResultVoid.Ok;
557558
}
558559
}

src/ApiService/IntegrationTests/Fakes/TestVmssOperations.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public Task<OneFuzzResultVoid> ReimageNodes(Guid scalesetId, IEnumerable<Node> n
6464
throw new NotImplementedException();
6565
}
6666

67-
public Async.Task DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes) {
67+
public Async.Task<OneFuzzResultVoid> DeleteNodes(Guid scalesetId, IEnumerable<Node> nodes) {
6868
throw new NotImplementedException();
6969
}
7070
}

0 commit comments

Comments
 (0)