allow retrying seed generations that fail
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
@@ -43,9 +44,7 @@
|
|||||||
|
|
||||||
builder.Services.AddCors(options => {
|
builder.Services.AddCors(options => {
|
||||||
options.AddPolicy("AllowDomains", policy => {
|
options.AddPolicy("AllowDomains", policy => {
|
||||||
foreach (var domain in settings.AllowedCors) {
|
policy.WithOrigins(settings.AllowedCors.ToArray()).AllowAnyMethod().AllowAnyHeader();
|
||||||
policy.WithOrigins(domain).AllowAnyHeader();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -51,39 +51,30 @@
|
|||||||
[Route("/seed/{id}")]
|
[Route("/seed/{id}")]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult> GetSeed(string id) {
|
public async Task<ActionResult> GetSeed(string id) {
|
||||||
var result = await this.SeedService.GetSeed(id);
|
return ResolveResult(await this.SeedService.GetSeed(id));
|
||||||
if (result.TryGetValue("status", out var responseCode)) {
|
}
|
||||||
switch (responseCode) {
|
|
||||||
case 200:
|
|
||||||
return Ok(result);
|
|
||||||
case 404:
|
|
||||||
return NotFound(result);
|
|
||||||
case 409:
|
|
||||||
return Conflict(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Logger.LogWarning("Unexpected result from SeedService: {@result}", result);
|
[Route("/seed/{id}")]
|
||||||
return StatusCode(500);
|
[HttpPost]
|
||||||
|
public async Task<ActionResult> RetrySeed(string id) {
|
||||||
|
return ResolveResult(await this.RandomizeService.RetrySeed(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("/multi/{id}")]
|
[Route("/multi/{id}")]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult> GetMulti(string id) {
|
public async Task<ActionResult> GetMulti(string id) {
|
||||||
var result = await this.SeedService.GetMulti(id);
|
return ResolveResult(await this.SeedService.GetMulti(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ActionResult ResolveResult(IDictionary<string, object> result) {
|
||||||
if (result.TryGetValue("status", out var responseCode)) {
|
if (result.TryGetValue("status", out var responseCode)) {
|
||||||
switch (responseCode) {
|
if (responseCode is int code) {
|
||||||
case 200:
|
return StatusCode(code, result);
|
||||||
return Ok(result);
|
|
||||||
case 404:
|
|
||||||
return NotFound(result);
|
|
||||||
case 409:
|
|
||||||
return Conflict(result);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Logger.LogWarning("Unexpected result from SeedService: {@result}", result);
|
this.Logger.LogWarning("Unexpected result from SeedService: {@result}", result);
|
||||||
return StatusCode(500);
|
return StatusCode(500, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
namespace ALttPRandomizer.Service {
|
namespace ALttPRandomizer.Service {
|
||||||
|
using ALttPRandomizer.Azure;
|
||||||
using ALttPRandomizer.Model;
|
using ALttPRandomizer.Model;
|
||||||
using ALttPRandomizer.Randomizers;
|
using ALttPRandomizer.Randomizers;
|
||||||
using ALttPRandomizer.Settings;
|
using ALttPRandomizer.Settings;
|
||||||
@@ -7,13 +8,20 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
public class RandomizeService {
|
public class RandomizeService {
|
||||||
public RandomizeService(IdGenerator idGenerator, IServiceProvider serviceProvider, BaseRandomizer baseRandomizer, ILogger<RandomizeService> logger) {
|
public RandomizeService(
|
||||||
|
IdGenerator idGenerator,
|
||||||
|
IServiceProvider serviceProvider,
|
||||||
|
BaseRandomizer baseRandomizer,
|
||||||
|
AzureStorage azureStorage,
|
||||||
|
ILogger<RandomizeService> logger) {
|
||||||
this.IdGenerator = idGenerator;
|
this.IdGenerator = idGenerator;
|
||||||
this.ServiceProvider = serviceProvider;
|
this.ServiceProvider = serviceProvider;
|
||||||
this.BaseRandomizer = baseRandomizer;
|
this.BaseRandomizer = baseRandomizer;
|
||||||
|
this.AzureStorage = azureStorage;
|
||||||
this.Logger = logger;
|
this.Logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,9 +30,10 @@
|
|||||||
private IdGenerator IdGenerator { get; }
|
private IdGenerator IdGenerator { get; }
|
||||||
private BaseRandomizer BaseRandomizer { get; }
|
private BaseRandomizer BaseRandomizer { get; }
|
||||||
private IServiceProvider ServiceProvider { get; }
|
private IServiceProvider ServiceProvider { get; }
|
||||||
|
private AzureStorage AzureStorage { get; }
|
||||||
|
|
||||||
public async Task<string> RandomizeSeed(SeedSettings settings) {
|
public async Task<string> RandomizeSeed(SeedSettings settings, string? seedId = null) {
|
||||||
var id = this.IdGenerator.GenerateId();
|
var id = seedId ?? this.IdGenerator.GenerateId();
|
||||||
this.Logger.LogInformation("Generating seed {seedId} with settings {@settings}", id, settings);
|
this.Logger.LogInformation("Generating seed {seedId} with settings {@settings}", id, settings);
|
||||||
|
|
||||||
var fi = typeof(RandomizerInstance).GetField(settings.Randomizer.ToString(), BindingFlags.Static | BindingFlags.Public);
|
var fi = typeof(RandomizerInstance).GetField(settings.Randomizer.ToString(), BindingFlags.Static | BindingFlags.Public);
|
||||||
@@ -42,8 +51,8 @@
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> RandomizeMultiworld(IList<SeedSettings> settings) {
|
public async Task<string> RandomizeMultiworld(IList<SeedSettings> settings, string? multiId = null) {
|
||||||
var id = this.IdGenerator.GenerateId();
|
var id = multiId ?? this.IdGenerator.GenerateId();
|
||||||
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
||||||
|
|
||||||
this.BaseRandomizer.ValidateAll(settings);
|
this.BaseRandomizer.ValidateAll(settings);
|
||||||
@@ -51,5 +60,40 @@
|
|||||||
await this.BaseRandomizer.RandomizeMultiworld(id, settings);
|
await this.BaseRandomizer.RandomizeMultiworld(id, settings);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<IDictionary<string, object>> RetrySeed(string seedId) {
|
||||||
|
var files = await this.AzureStorage.GetFiles(seedId);
|
||||||
|
|
||||||
|
this.Logger.LogDebug("Found files: {@files}", files.Keys);
|
||||||
|
|
||||||
|
var result = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
if (!files.TryGetValue("settings.json", out var settingsData)) {
|
||||||
|
result["status"] = 404;
|
||||||
|
result["error"] = "seed not found";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var settingsJson = JsonDocument.Parse(settingsData.ToString());
|
||||||
|
|
||||||
|
var settings = settingsJson.Deserialize<SeedSettings>(JsonOptions.Default) ?? new SeedSettings();
|
||||||
|
|
||||||
|
if (files.TryGetValue("patch.bps", out var patchData)) {
|
||||||
|
result["status"] = 409;
|
||||||
|
result["error"] = "generation already successful";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (files.ContainsKey("generating")) {
|
||||||
|
result["status"] = 409;
|
||||||
|
result["error"] = "generation still in progress";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.RandomizeSeed(settings, seedId);
|
||||||
|
|
||||||
|
result["status"] = 202;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
} else {
|
} else {
|
||||||
result["status"] = 404;
|
result["status"] = 404;
|
||||||
result["error"] = "generation failed";
|
result["error"] = "generation failed";
|
||||||
|
result["retry"] = true;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user