diff --git a/ContinuousTests/CodexNodeFactory.cs b/ContinuousTests/CodexNodeFactory.cs index a3bf54b..6992398 100644 --- a/ContinuousTests/CodexNodeFactory.cs +++ b/ContinuousTests/CodexNodeFactory.cs @@ -1,20 +1,17 @@ using DistTestCore; using DistTestCore.Codex; +using KubernetesWorkflow; using Logging; -using Utils; namespace ContinuousTests { public class CodexNodeFactory { - public CodexNode[] Create(string[] urls, BaseLog log, ITimeSet timeSet) + public CodexNode[] Create(RunningContainer[] containers, BaseLog log, ITimeSet timeSet) { - return urls.Select(url => + return containers.Select(container => { - var cutIndex = url.LastIndexOf(':'); - var host = url.Substring(0, cutIndex); - var port = url.Substring(cutIndex + 1); - var address = new Address(host, Convert.ToInt32(port)); + var address = container.ClusterInternalAddress; return new CodexNode(log, timeSet, address); }).ToArray(); } diff --git a/ContinuousTests/Configuration.cs b/ContinuousTests/Configuration.cs index 4e6278e..f61c463 100644 --- a/ContinuousTests/Configuration.cs +++ b/ContinuousTests/Configuration.cs @@ -1,11 +1,12 @@ -using Newtonsoft.Json; +using DistTestCore.Codex; +using Newtonsoft.Json; namespace ContinuousTests { public class Configuration { public string LogPath { get; set; } = string.Empty; - public string[] CodexUrls { get; set; } = Array.Empty(); + public CodexDeployment CodexDeployment { get; set; } = null!; public int SleepSecondsPerSingleTest { get; set; } public int SleepSecondsPerAllTests { get; set; } public bool KeepPassedTestLogs { get; set; } @@ -37,32 +38,30 @@ namespace ContinuousTests } var logPath = Environment.GetEnvironmentVariable("LOGPATH"); - var codexUrls = Environment.GetEnvironmentVariable("CODEXURLS"); + var codexDeploymentJson = Environment.GetEnvironmentVariable("CODEXDEPLOYMENT"); var sleepPerSingle = Environment.GetEnvironmentVariable("SLEEPSECONDSPERSINGLETEST"); var sleepPerAll = Environment.GetEnvironmentVariable("SLEEPSECONDSPERALLTESTS"); var keep = Environment.GetEnvironmentVariable("KEEPPASSEDTESTLOGS"); if (!string.IsNullOrEmpty(logPath) && - !string.IsNullOrEmpty(codexUrls) && + !string.IsNullOrEmpty(codexDeploymentJson) && !string.IsNullOrEmpty(sleepPerSingle) && !string.IsNullOrEmpty(sleepPerAll)) { - var urls = codexUrls.Split(';', StringSplitOptions.RemoveEmptyEntries); - int secondsSingle; - int secondsAll; - if (int.TryParse(sleepPerSingle, out secondsSingle) && int.TryParse(sleepPerAll, out secondsAll)) + try { - if (urls.Length > 0) - { - return new Configuration - { - LogPath = logPath, - CodexUrls = urls, - SleepSecondsPerSingleTest = secondsSingle, - SleepSecondsPerAllTests = secondsAll, - KeepPassedTestLogs = keep == "1" - }; - } + return new Configuration + { + LogPath = logPath, + CodexDeployment = ParseCodexDeploymentJson(codexDeploymentJson), + SleepSecondsPerSingleTest = Convert.ToInt32(sleepPerSingle), + SleepSecondsPerAllTests = Convert.ToInt32(sleepPerAll), + KeepPassedTestLogs = keep == "1" + }; + } + catch (Exception ex) + { + Console.WriteLine("Exception: " + ex); } } @@ -70,7 +69,7 @@ namespace ContinuousTests throw new Exception($"Unable to load configuration from '{filename}', and " + "unable to load configuration from environment variables. " + nl + "'LOGPATH' = Path where log files will be saved." + nl + - "'CODEXURLS' = Semi-colon separated URLs to codex APIs. e.g. 'https://hostaddr_one:port;https://hostaddr_two:port'" + nl + + "'CODEXDEPLOYMENT' = Path to codex-deployment JSON file." + nl + "'SLEEPSECONDSPERSINGLETEST' = Seconds to sleep after each individual test." + nl + "'SLEEPSECONDSPERALLTESTS' = Seconds to sleep after all tests, before starting again." + nl + "'KEEPPASSEDTESTLOGS' = (Optional, default: 0) Set to '1' to keep log files of tests that passed." + nl + @@ -95,10 +94,17 @@ namespace ContinuousTests throw new Exception($"Unvalid logpath set: '{configuration.LogPath}'"); } - if (!configuration.CodexUrls.Any()) + if (configuration.CodexDeployment != null && configuration.CodexDeployment.CodexContainers.Any()) { - throw new Exception("No Codex URLs found."); + throw new Exception("No Codex deployment found."); } } + + private CodexDeployment ParseCodexDeploymentJson(string filename) + { + var d = JsonConvert.DeserializeObject(File.ReadAllText(filename))!; + if (d == null) throw new Exception("Unable to parse " + filename); + return d; + } } } diff --git a/ContinuousTests/ContinuousTestRunner.cs b/ContinuousTests/ContinuousTestRunner.cs index cb6bc3f..117cedc 100644 --- a/ContinuousTests/ContinuousTestRunner.cs +++ b/ContinuousTests/ContinuousTestRunner.cs @@ -12,15 +12,7 @@ namespace ContinuousTests public void Run() { - var config = //configLoader.Load(); - new Configuration - { - CodexUrls =new[] { "http://localhost:8080", "http://localhost:8081" }, - LogPath = "logs", - KeepPassedTestLogs = false, - SleepSecondsPerAllTests = 1, - SleepSecondsPerSingleTest = 1, - }; + var config = configLoader.Load(); StartupChecks(config); while (true) @@ -73,9 +65,9 @@ namespace ContinuousTests var errors = new List(); foreach (var test in tests) { - if (test.RequiredNumberOfNodes > config.CodexUrls.Length) + if (test.RequiredNumberOfNodes > config.CodexDeployment.CodexContainers.Length) { - errors.Add($"Test '{test.Name}' requires {test.RequiredNumberOfNodes} nodes. Configuration only has {config.CodexUrls.Length}"); + errors.Add($"Test '{test.Name}' requires {test.RequiredNumberOfNodes} nodes. Deployment only has {config.CodexDeployment.CodexContainers.Length}"); } } @@ -92,7 +84,7 @@ namespace ContinuousTests private void CheckCodexNodes(BaseLog log, Configuration config) { - var nodes = codexNodeFactory.Create(config.CodexUrls, log, new DefaultTimeSet()); + var nodes = codexNodeFactory.Create(config.CodexDeployment.CodexContainers, log, new DefaultTimeSet()); var pass = true; foreach (var n in nodes) { diff --git a/ContinuousTests/SingleTestRun.cs b/ContinuousTests/SingleTestRun.cs index 978f4bd..6782424 100644 --- a/ContinuousTests/SingleTestRun.cs +++ b/ContinuousTests/SingleTestRun.cs @@ -2,6 +2,7 @@ using DistTestCore; using Logging; using Utils; +using KubernetesWorkflow; namespace ContinuousTests { @@ -37,18 +38,18 @@ namespace ContinuousTests private CodexNode[] CreateRandomNodes(int number, BaseLog testLog) { - var urls = SelectRandomUrls(number); - testLog.Log("Selected nodes: " + string.Join(",", urls)); - return codexNodeFactory.Create(urls, testLog, test.TimeSet); + var containers = SelectRandomContainers(number); + testLog.Log("Selected nodes: " + string.Join(",", containers.Select(c => c.Name))); + return codexNodeFactory.Create(containers, testLog, test.TimeSet); } - private string[] SelectRandomUrls(int number) + private RunningContainer[] SelectRandomContainers(int number) { - var urls = config.CodexUrls.ToList(); - var result = new string[number]; + var containers = config.CodexDeployment.CodexContainers.ToList(); + var result = new RunningContainer[number]; for (var i = 0; i < number; i++) { - result[i] = urls.PickOneRandom(); + result[i] = containers.PickOneRandom(); } return result; }