diff --git a/Moonlight/App/Helpers/Retry.cs b/Moonlight/App/Helpers/Retry.cs new file mode 100644 index 00000000..5af921d5 --- /dev/null +++ b/Moonlight/App/Helpers/Retry.cs @@ -0,0 +1,66 @@ +namespace Moonlight.App.Helpers; + +public class Retry +{ + private List RetryExceptionTypes; + private List> RetryFilters; + private int RetryTimes = 1; + + public Retry() + { + RetryExceptionTypes = new(); + RetryFilters = new(); + } + + public Retry Times(int times) + { + RetryTimes = times; + return this; + } + + public Retry At(Func filter) + { + RetryFilters.Add(filter); + return this; + } + + public Retry At() + { + RetryExceptionTypes.Add(typeof(T)); + return this; + } + + public async Task Call(Func method) + { + int triesLeft = RetryTimes; + + do + { + try + { + await method.Invoke(); + return; + } + catch (Exception e) + { + if(triesLeft < 1) // Throw if no tries left + throw; + + if (RetryExceptionTypes.Any(x => x.FullName == e.GetType().FullName)) + { + triesLeft--; + continue; + } + + if (RetryFilters.Any(x => x.Invoke(e))) + { + triesLeft--; + continue; + } + + // Throw if not filtered -> unknown/unhandled + throw; + } + } while (triesLeft >= 0); + } +} \ No newline at end of file diff --git a/Moonlight/App/Services/ServerService.cs b/Moonlight/App/Services/ServerService.cs index c10fc333..b9c72850 100644 --- a/Moonlight/App/Services/ServerService.cs +++ b/Moonlight/App/Services/ServerService.cs @@ -79,10 +79,20 @@ public class ServerService { Server server = EnsureNodeData(s); - return await WingsApiHelper.Get( - server.Node, - $"api/servers/{server.Uuid}" - ); + ServerDetails result = null!; + + await new Retry() + .Times(3) + .At(x => x.Message.Contains("A task was canceled")) + .Call(async () => + { + result = await WingsApiHelper.Get( + server.Node, + $"api/servers/{server.Uuid}" + ); + }); + + return result; } public async Task SetPowerState(Server s, PowerSignal signal) @@ -305,11 +315,17 @@ public class ServerService try { - await WingsApiHelper.Post(node, $"api/servers", new CreateServer() - { - Uuid = newServerData.Uuid, - StartOnCompletion = false - }); + await new Retry() + .Times(3) + .At(x => x.Message.Contains("A task was canceled")) + .Call(async () => + { + await WingsApiHelper.Post(node, $"api/servers", new CreateServer() + { + Uuid = newServerData.Uuid, + StartOnCompletion = false + }); + }); //TODO: AuditLog diff --git a/Moonlight/Shared/Views/Servers/Index.razor b/Moonlight/Shared/Views/Servers/Index.razor index 392924d3..2a1ab700 100644 --- a/Moonlight/Shared/Views/Servers/Index.razor +++ b/Moonlight/Shared/Views/Servers/Index.razor @@ -352,206 +352,4 @@ InvokeAsync(StateHasChanged); } } -} - -@* -@if (AllServers.Any()) -{ - if (UseSortedServerView) - { - var groupedServers = AllServers - .OrderBy(x => x.Name) - .GroupBy(x => x.Image.Name); - - foreach (var groupedServer in groupedServers) - { -
@(groupedServer.Key)
-
- @foreach (var server in groupedServer) - { -
- -
-
-
-
- -
-
- - @(server.Name) - - - @(Math.Round(server.Memory / 1024D, 2)) GB / @(Math.Round(server.Disk / 1024D, 2)) GB / @(server.Node.Name) - @(server.Image.Name) - -
-
-
-
- @(server.Node.Fqdn):@(server.MainAllocation.Port) -
-
- @if (StatusCache.ContainsKey(server)) - { - var status = StatusCache[server]; - - switch (status) - { - case "offline": - - Offline - - break; - case "stopping": - - Stopping - - break; - case "starting": - - Starting - - break; - case "running": - - Running - - break; - case "failed": - - Failed - - break; - default: - - Offline - - break; - } - } - else - { - - Loading - - } -
-
- -
- } -
- } - } - else - { - foreach (var server in AllServers) - { -
- -
-
-
-
- -
-
- - @(server.Name) - - - @(Math.Round(server.Memory / 1024D, 2)) GB / @(Math.Round(server.Disk / 1024D, 2)) GB / @(server.Node.Name) - @(server.Image.Name) - -
-
-
-
- @(server.Node.Fqdn):@(server.MainAllocation.Port) -
-
- @if (StatusCache.ContainsKey(server)) - { - var status = StatusCache[server]; - - switch (status) - { - case "offline": - - Offline - - break; - case "stopping": - - Stopping - - break; - case "starting": - - Starting - - break; - case "running": - - Running - - break; - case "failed": - - Failed - - break; - default: - - Offline - - break; - } - } - else - { - - Loading - - } -
-
- -
- } - } -} -else -{ -
-
-

- You have no servers -

- - We were not able to find any servers associated with your account - -
-
-} - -
-
-
-
- Beta -
-
-
-
- -
-
- - -
-
-
-
-
-
-*@ \ No newline at end of file +} \ No newline at end of file