diff --git a/src/Tgstation.Server.Api/Models/ErrorCode.cs b/src/Tgstation.Server.Api/Models/ErrorCode.cs
index 00800b4aa7..4dba0e189c 100644
--- a/src/Tgstation.Server.Api/Models/ErrorCode.cs
+++ b/src/Tgstation.Server.Api/Models/ErrorCode.cs
@@ -634,5 +634,11 @@ namespace Tgstation.Server.Api.Models
///
[Description("OpenDream could not be compiled due to being unable to locate the dotnet executable!")]
OpenDreamCantFindDotnet,
+
+ ///
+ /// Could not install OpenDream due to it not meeting the minimum version requirements.
+ ///
+ [Description("The specified OpenDream version is too old!")]
+ OpenDreamTooOld,
}
}
diff --git a/src/Tgstation.Server.Host/Components/Engine/OpenDreamInstaller.cs b/src/Tgstation.Server.Host/Components/Engine/OpenDreamInstaller.cs
index a1bda4f50b..e279f0d0cc 100644
--- a/src/Tgstation.Server.Host/Components/Engine/OpenDreamInstaller.cs
+++ b/src/Tgstation.Server.Host/Components/Engine/OpenDreamInstaller.cs
@@ -152,6 +152,9 @@ namespace Tgstation.Server.Host.Components.Engine
progressSection2,
cancellationToken);
+ if (!await repo.ShaIsParent("fab769776dada6b9bcad546094d78c604049e0e9", cancellationToken))
+ throw new JobException(ErrorCode.OpenDreamTooOld);
+
return new RepositoryEngineInstallationData(IOManager, repo, InstallationSourceSubDirectory);
}
catch
diff --git a/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs b/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs
index c674a3a42d..c3e5b32294 100644
--- a/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs
+++ b/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs
@@ -84,6 +84,55 @@ namespace Tgstation.Server.Tests.Live.Instance
.Run(cancellationToken);
}
+ public static async ValueTask DownloadEngineVersion(
+ EngineVersion compatVersion,
+ IInstanceClient instanceClient,
+ IFileDownloader fileDownloader,
+ CancellationToken cancellationToken)
+ {
+ var odRepoDir = Path.GetFullPath(Path.Combine(instanceClient.Metadata.Path, "..", "OpenDreamRepo"));
+ var tmpIOManager = new ResolvingIOManager(new DefaultIOManager(), odRepoDir);
+
+ var mockOptions = new Mock>();
+ mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration());
+ IEngineInstaller byondInstaller =
+ compatVersion.Engine == EngineType.OpenDream
+ ? new OpenDreamInstaller(
+ new DefaultIOManager(),
+ Mock.Of>(),
+ new PlatformIdentifier(),
+ Mock.Of(),
+ new RepositoryManager(
+ new LibGit2RepositoryFactory(
+ Mock.Of>()),
+ new LibGit2Commands(),
+ tmpIOManager,
+ new NoopEventConsumer(),
+ Mock.Of(),
+ Mock.Of(),
+ Mock.Of>(),
+ Mock.Of>(),
+ new GeneralConfiguration()),
+ mockOptions.Object)
+ : new PlatformIdentifier().IsWindows
+ ? new WindowsByondInstaller(
+ Mock.Of(),
+ Mock.Of(),
+ fileDownloader,
+ Options.Create(new GeneralConfiguration()),
+ Mock.Of>())
+ : new PosixByondInstaller(
+ Mock.Of(),
+ Mock.Of(),
+ fileDownloader,
+ Mock.Of>());
+
+ using var windowsByondInstaller = byondInstaller as WindowsByondInstaller;
+
+ // get the bytes for stable
+ return await byondInstaller.DownloadVersion(compatVersion, null, cancellationToken);
+ }
+
public async Task RunCompatTests(
EngineVersion compatVersion,
IInstanceClient instanceClient,
@@ -147,49 +196,10 @@ namespace Tgstation.Server.Tests.Live.Instance
var jrt = new JobsRequiredTest(instanceClient.Jobs);
-
- var odRepoDir = Path.GetFullPath(Path.Combine(instanceClient.Metadata.Path, "..", "OpenDreamRepo"));
- var tmpIOManager = new ResolvingIOManager(new DefaultIOManager(), odRepoDir);
-
- var mockOptions = new Mock>();
- mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration());
- IEngineInstaller byondInstaller =
- compatVersion.Engine == EngineType.OpenDream
- ? new OpenDreamInstaller(
- new DefaultIOManager(),
- Mock.Of>(),
- new PlatformIdentifier(),
- Mock.Of(),
- new RepositoryManager(
- new LibGit2RepositoryFactory(
- Mock.Of>()),
- new LibGit2Commands(),
- tmpIOManager,
- new NoopEventConsumer(),
- Mock.Of(),
- Mock.Of(),
- Mock.Of>(),
- Mock.Of>(),
- new GeneralConfiguration()),
- mockOptions.Object)
- : new PlatformIdentifier().IsWindows
- ? new WindowsByondInstaller(
- Mock.Of(),
- Mock.Of(),
- fileDownloader,
- Options.Create(new GeneralConfiguration()),
- Mock.Of>())
- : new PosixByondInstaller(
- Mock.Of(),
- Mock.Of(),
- fileDownloader,
- Mock.Of>());
-
- using var windowsByondInstaller = byondInstaller as WindowsByondInstaller;
-
- // get the bytes for stable
EngineInstallResponse installJob2;
- await using (var stableBytesMs = await TestingUtils.ExtractMemoryStreamFromInstallationData(await byondInstaller.DownloadVersion(compatVersion, null, cancellationToken), cancellationToken))
+ await using (var stableBytesMs = await TestingUtils.ExtractMemoryStreamFromInstallationData(
+ await DownloadEngineVersion(compatVersion, instanceClient, fileDownloader, cancellationToken),
+ cancellationToken))
{
installJob2 = await instanceClient.Engine.SetActiveVersion(new EngineVersionRequest
{
diff --git a/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs b/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs
index 6e5a48dc91..83b721cad6 100644
--- a/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs
+++ b/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs
@@ -40,6 +40,7 @@ using Tgstation.Server.Host.Components;
using Tgstation.Server.Host.Configuration;
using Tgstation.Server.Host.Database;
using Tgstation.Server.Host.Extensions;
+using Tgstation.Server.Host.Jobs;
using Tgstation.Server.Host.System;
using Tgstation.Server.Tests.Live.Instance;
@@ -1385,15 +1386,35 @@ namespace Tgstation.Server.Tests.Live
if (TestingUtils.RunningInGitHubActions) // they only have 2 cores, can't handle intense parallelization
await byondApiCompatTests;
- var odCompatTests = FailFast(
- instanceTest
+ async Task ODCompatTests()
+ {
+ var edgeODVersionTask = EngineTest.GetEdgeVersion(EngineType.OpenDream, fileDownloader, cancellationToken);
+ ;
+
+ var ex = await Assert.ThrowsExceptionAsync(
+ () => InstanceTest.DownloadEngineVersion(
+ new EngineVersion
+ {
+ Engine = EngineType.OpenDream,
+ SourceSHA = "f1dc153caf9d84cd1d0056e52286cc0163e3f4d3", // 1b4 verified version
+ },
+ instanceClient,
+ fileDownloader,
+ cancellationToken).AsTask());
+
+ Assert.AreEqual(ErrorCode.OpenDreamTooOld, ex.ErrorCode);
+
+ await instanceTest
.RunCompatTests(
- await EngineTest.GetEdgeVersion(EngineType.OpenDream, fileDownloader, cancellationToken),
+ await edgeODVersionTask,
adminClient.Instances.CreateClient(odInstance),
odDMPort,
odDDPort,
server.HighPriorityDreamDaemon,
- cancellationToken));
+ cancellationToken);
+ }
+
+ var odCompatTests = FailFast(ODCompatTests());
if (TestingUtils.RunningInGitHubActions) // they only have 2 cores, can't handle intense parallelization
await odCompatTests;