diff --git a/VERSION b/VERSION index 513cc0b6cf..312883d27f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.0.14 \ No newline at end of file +3.0.15 \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Actions.FunctionalTests/MLPerfProfileTests.cs b/src/VirtualClient/VirtualClient.Actions.FunctionalTests/MLPerfProfileTests.cs index 04900bd3e1..4c31460af1 100644 --- a/src/VirtualClient/VirtualClient.Actions.FunctionalTests/MLPerfProfileTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.FunctionalTests/MLPerfProfileTests.cs @@ -16,6 +16,7 @@ namespace VirtualClient.Actions [TestFixture] [Category("Functional")] + [Ignore("MLPerf profiles archived - no longer in active profiles directory")] public class MLPerfProfileTests { private DependencyFixture mockFixture; diff --git a/src/VirtualClient/VirtualClient.Actions.FunctionalTests/SuperBenchmarkProfileTests.cs b/src/VirtualClient/VirtualClient.Actions.FunctionalTests/SuperBenchmarkProfileTests.cs index 96ea2a4a99..217db0781f 100644 --- a/src/VirtualClient/VirtualClient.Actions.FunctionalTests/SuperBenchmarkProfileTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.FunctionalTests/SuperBenchmarkProfileTests.cs @@ -39,7 +39,7 @@ public void SuperBenchmarkWorkloadProfileParametersAreInlinedCorrectly(string pr } [Test] - [TestCase("SETUP-NVIDIA-A100.json")] + [TestCase("SETUP-GPU-NVIDIA-A100.json")] public async Task SuperBenchmarkWorkloadProfileExecutesTheExpectedDependenciesAndReboot(string profile) { List expectedCommands = new List @@ -74,7 +74,7 @@ public async Task SuperBenchmarkWorkloadProfileExecutesTheExpectedDependenciesAn } [Test] - [TestCase("SETUP-NVIDIA-A100.json")] + [TestCase("SETUP-GPU-NVIDIA-A100.json")] public async Task SuperBenchmarkWorkloadProfileExecutesTheExpectedDependenciesAndWorkloadsAfterReboot(string profile) { IEnumerable expectedCommands = this.GetProfileExpectedCommands(PlatformID.Unix); diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs index 2bd9c5437b..c6b91d979b 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs @@ -48,12 +48,12 @@ public async Task HammerDBClientExecutorRunsTheExpectedWorkloadCommand(PlatformI if (platform == PlatformID.Unix) { - expectedCommands.Add($"sudo python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "configure-workload-generator.py")} --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --password [A-Za-z0-9+/=]+ --dbName hammerdbtest --hostIPAddress [0-9.]+ --warehouseCount 1 --duration 1"); + expectedCommands.Add($"sudo python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "configure-workload-generator.py")} --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --password [A-Fa-f0-9]+ --dbName hammerdbtest --hostIPAddress [0-9.]+ --warehouseCount 1 --duration 1"); expectedCommands.Add($"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "run-workload.py")} --runTransactionsTCLFilePath runTransactions.tcl"); } else { - expectedCommands.Add($"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "configure-workload-generator.py")} --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --password [A-Za-z0-9+/=]+ --dbName hammerdbtest --hostIPAddress [0-9.]+ --warehouseCount 1 --duration 1"); + expectedCommands.Add($"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "configure-workload-generator.py")} --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --password [A-Fa-f0-9]+ --dbName hammerdbtest --hostIPAddress [0-9.]+ --warehouseCount 1 --duration 1"); expectedCommands.Add($"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "run-workload.py")} --runTransactionsTCLFilePath runTransactions.tcl"); } diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBExecutorTests.cs index 2d3ec1c873..33e5dccb5c 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBExecutorTests.cs @@ -74,6 +74,25 @@ public void HammerDBPExecutorThrowsOnUnsupportedDistroAsync() } } + [Test] + public void SuperUserPasswordUsesHexEncodingWithNoSpecialCharacters() + { + using (TestHammerDBExecutor executor = new TestHammerDBExecutor(this.fixture.Dependencies, this.fixture.Parameters)) + { + string password = executor.SuperUserPassword; + + // Password must be hex-encoded (alphanumeric only) to avoid breaking + // HammerDB TCL diset command argument parsing. + Assert.IsTrue(System.Text.RegularExpressions.Regex.IsMatch(password, "^[A-Fa-f0-9]+$"), + $"SuperUserPassword must be hex-encoded (alphanumeric only). Got: {password}"); + + // Must not contain Base64 special characters that break TCL parsing + Assert.IsFalse(password.Contains("+"), "Password must not contain '+' (breaks TCL parsing)"); + Assert.IsFalse(password.Contains("="), "Password must not contain '=' (breaks TCL parsing)"); + Assert.IsFalse(password.Contains("/"), "Password must not contain '/' (breaks TCL parsing)"); + } + } + private class TestHammerDBExecutor : HammerDBExecutor { public TestHammerDBExecutor(IServiceCollection dependencies, IDictionary parameters = null) diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs index 296d794808..16909ec9c4 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs @@ -98,7 +98,7 @@ public string SuperUserPassword get { byte[] hashBytes = SHA256.HashData(Encoding.UTF8.GetBytes("default")); - return Convert.ToBase64String(hashBytes); + return Convert.ToHexString(hashBytes); } } diff --git a/src/VirtualClient/VirtualClient.Actions/Sysbench/SysbenchExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Sysbench/SysbenchExecutor.cs index c601232334..2215079023 100644 --- a/src/VirtualClient/VirtualClient.Actions/Sysbench/SysbenchExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Sysbench/SysbenchExecutor.cs @@ -170,7 +170,7 @@ public string SuperUserPassword get { byte[] hashBytes = SHA256.HashData(Encoding.UTF8.GetBytes("default")); - return Convert.ToBase64String(hashBytes); + return Convert.ToHexString(hashBytes); } } diff --git a/src/VirtualClient/VirtualClient.Dependencies/PostgreSQLServer/PostgreSQLServerConfiguration.cs b/src/VirtualClient/VirtualClient.Dependencies/PostgreSQLServer/PostgreSQLServerConfiguration.cs index 3634827e08..f05e6bc593 100644 --- a/src/VirtualClient/VirtualClient.Dependencies/PostgreSQLServer/PostgreSQLServerConfiguration.cs +++ b/src/VirtualClient/VirtualClient.Dependencies/PostgreSQLServer/PostgreSQLServerConfiguration.cs @@ -108,7 +108,7 @@ public string SuperUserPassword get { byte[] hashBytes = SHA256.HashData(Encoding.UTF8.GetBytes("default")); - return Convert.ToBase64String(hashBytes); + return Convert.ToHexString(hashBytes); } }