diff --git a/src/Tgstation.Server.Host/Components/Deployment/DmbFactory.cs b/src/Tgstation.Server.Host/Components/Deployment/DmbFactory.cs index cb6497e3a4..e2f9fd442a 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DmbFactory.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DmbFactory.cs @@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Tgstation.Server.Host.Components.Deployment.Remote; +using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Database; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.Models; @@ -53,6 +54,11 @@ namespace Tgstation.Server.Host.Components.Deployment /// readonly ILogger logger; + /// + /// The for . + /// + readonly IEventConsumer eventConsumer; + /// /// The for the . /// @@ -69,7 +75,7 @@ namespace Tgstation.Server.Host.Components.Deployment readonly IDictionary jobLockCounts; /// - /// representing calls to . + /// representing calls to . /// Task cleanupTask; @@ -94,18 +100,21 @@ namespace Tgstation.Server.Host.Components.Deployment /// The value of . /// The value of . /// The value of . + /// The value of . /// The value of . /// The value of . public DmbFactory( IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, + IEventConsumer eventConsumer, ILogger logger, Api.Models.Instance metadata) { this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory)); this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory)); + this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata)); @@ -245,7 +254,7 @@ namespace Tgstation.Server.Host.Components.Deployment void CleanupAction() { if (providerSubmitted) - CleanJob(compileJob); + CleanRegisteredCompileJob(compileJob); } var newProvider = new DmbProvider(compileJob, ioManager, CleanupAction); @@ -358,7 +367,7 @@ namespace Tgstation.Server.Host.Components.Deployment try { ++deleting; - await ioManager.DeleteDirectory(x, cancellationToken); + await DeleteCompileJobContent(x, cancellationToken); } catch (OperationCanceledException) { @@ -386,19 +395,19 @@ namespace Tgstation.Server.Host.Components.Deployment /// Delete the of . /// /// The to clean. - void CleanJob(CompileJob job) + void CleanRegisteredCompileJob(CompileJob job) { async Task HandleCleanup() { - var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token); - var remoteDeploymentManager = remoteDeploymentManagerFactory.CreateRemoteDeploymentManager( - metadata, - job); + // First kill the GitHub deployment + var remoteDeploymentManager = remoteDeploymentManagerFactory.CreateRemoteDeploymentManager(metadata, job); // DCT: None available var deploymentJob = remoteDeploymentManager.MarkInactive(job, default); + + var deleteTask = DeleteCompileJobContent(job.DirectoryName.ToString(), cleanupCts.Token); var otherTask = cleanupTask; - await Task.WhenAll(otherTask, deleteJob, deploymentJob); + await Task.WhenAll(otherTask, deleteTask, deploymentJob); } lock (jobLockCounts) @@ -414,5 +423,18 @@ namespace Tgstation.Server.Host.Components.Deployment logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented); } } + + /// + /// Handles cleaning the resources of a . + /// + /// The directory to cleanup. + /// The for this . + /// The deletion . + async Task DeleteCompileJobContent(string directory, CancellationToken cancellationToken) + { + // Then call the cleanup event, waiting here first + await eventConsumer.HandleEvent(EventType.DeploymentCleanup, new List { ioManager.ResolvePath(directory) }, cancellationToken); + await ioManager.DeleteDirectory(directory, cancellationToken); + } } } diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index ffb2935ac9..e8464b0d89 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -929,6 +929,7 @@ namespace Tgstation.Server.Host.Components.Deployment try { // DCT: None available + await eventConsumer.HandleEvent(EventType.DeploymentCleanup, new List { jobPath }, default); await ioManager.DeleteDirectory(jobPath, default); } catch (Exception e) diff --git a/src/Tgstation.Server.Host/Components/Events/EventType.cs b/src/Tgstation.Server.Host/Components/Events/EventType.cs index ba91a25f4f..f67a4bea87 100644 --- a/src/Tgstation.Server.Host/Components/Events/EventType.cs +++ b/src/Tgstation.Server.Host/Components/Events/EventType.cs @@ -155,5 +155,11 @@ /// [EventScript("PreDreamMaker")] PreDreamMaker, + + /// + /// Whenever a deployment folder is deleted from disk. Parameters: Game directory path + /// + [EventScript("DeploymentCleanup")] + DeploymentCleanup, } } diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs index ff4fc85c11..1bb8121c9d 100644 --- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs +++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs @@ -286,6 +286,7 @@ namespace Tgstation.Server.Host.Components databaseContextFactory, gameIoManager, remoteDeploymentManagerFactory, + eventConsumer, loggerFactory.CreateLogger(), metadata); try