Wiring up the starter class

This commit is contained in:
benbierens 2023-06-22 10:17:12 +02:00
parent e5a7f04c4e
commit ee5a466940
No known key found for this signature in database
GPG Key ID: FE44815D96D0A1AA
8 changed files with 138 additions and 17 deletions

View File

@ -9,6 +9,7 @@
public static readonly ArgVar KubeNamespace = new ArgVar("kube-namespace", "KUBENAMESPACE", "Kubernetes namespace to be used for deployment.");
public static readonly ArgVar NumberOfCodexNodes = new ArgVar("nodes", "NODES", "Number of Codex nodes to be created.");
public static readonly ArgVar StorageQuota = new ArgVar("storage-quota", "STORAGEQUOTA", "Storage quota in megabytes used by each Codex node.");
public static readonly ArgVar LogLevel = new ArgVar("log-level", "LOGLEVEL", "Log level used by each Codex node. [Trace, Debug*, Info, Warn, Error]");
private readonly string[] args;
@ -53,11 +54,13 @@
"The deployer will set up the required supporting services, deploy the Codex on-chain contracts, start and bootstrap the Codex instances. " +
"All Kubernetes objects will be created in the namespace provided, allowing you to easily find, modify, and delete them afterwards." + nl);
Console.WriteLine("CodexNetDeployer assumes you are running this tool from *outside* the Kubernetes cluster you want to deploy to. " +
"If you are running this from a container inside the cluster, add the argument '--internal'." + nl);
Console.Write("\t[ CLI argument ] or [ Environment variable ]");
Console.CursorLeft = 70;
Console.Write("(Description)" + nl);
var fields = GetType().GetFields();// System.Reflection.BindingFlags.Public & System.Reflection.BindingFlags.Static);
var fields = GetType().GetFields();
foreach (var field in fields)
{
var value = (ArgVar)field.GetValue(null)!;

View File

@ -1,4 +1,6 @@
namespace CodexNetDeployer
using DistTestCore;
namespace CodexNetDeployer
{
public class Configuration
{
@ -9,7 +11,9 @@
string kubeConfigFile,
string kubeNamespace,
int? numberOfCodexNodes,
int? storageQuota)
int? storageQuota,
string codexLogLevel,
TestRunnerLocation runnerLocation)
{
CodexImage = codexImage;
GethImage = gethImage;
@ -18,6 +22,8 @@
KubeNamespace = kubeNamespace;
NumberOfCodexNodes = numberOfCodexNodes;
StorageQuota = storageQuota;
CodexLogLevel = codexLogLevel;
RunnerLocation = runnerLocation;
}
public string CodexImage { get; }
@ -27,6 +33,8 @@
public string KubeNamespace { get; }
public int? NumberOfCodexNodes { get; }
public int? StorageQuota { get; }
public string CodexLogLevel { get; }
public TestRunnerLocation RunnerLocation { get; }
public void PrintConfig()
{

View File

@ -0,0 +1,41 @@
using DistTestCore;
using DistTestCore.Codex;
using Utils;
namespace CodexNetDeployer
{
public class Deployer
{
private readonly Configuration config;
public Deployer(Configuration config)
{
this.config = config;
}
public void Deploy()
{
var log = new NullLog();
var lifecycleConfig = new DistTestCore.Configuration
(
kubeConfigFile: config.KubeConfigFile,
logPath: "null",
logDebug: false,
dataFilesPath: "notUsed",
codexLogLevel: ParseEnum.Parse<CodexLogLevel>(config.CodexLogLevel),
runnerLocation: config.RunnerLocation
);
var timeset = new DefaultTimeSet();
var kubeConfig = new KubernetesWorkflow.Configuration(
k8sNamespacePrefix: config.KubeNamespace,
kubeConfigFile: config.KubeConfigFile,
operationTimeout: timeset.K8sOperationTimeout(),
retryDelay: timeset.WaitForK8sServiceDelay());
var lifecycle = new TestLifecycle(log, lifecycleConfig, timeset);
var workflowCreator = new KubernetesWorkflow.WorkflowCreator(log, kubeConfig);
var starter = new CodexStarter(lifecycle, workflowCreator);
}
}
}

View File

@ -0,0 +1,41 @@
using Logging;
namespace CodexNetDeployer
{
public class NullLog : TestLog
{
public NullLog() : base("NULL", false, "NULL")
{
}
protected override LogFile CreateLogFile()
{
return null!;
}
public override void Log(string message)
{
}
public override void Debug(string message = "", int skipFrames = 0)
{
}
public override void Error(string message)
{
Console.WriteLine("Error: " + message);
}
public override void MarkAsFailed()
{
}
public override void AddStringReplace(string from, string to)
{
}
public override void Delete()
{
}
}
}

View File

@ -1,6 +1,8 @@
using CodexNetDeployer;
using DistTestCore;
using DistTestCore.Codex;
using DistTestCore.Marketplace;
using Configuration = CodexNetDeployer.Configuration;
public class Program
{
@ -17,6 +19,12 @@ public class Program
return;
}
var location = TestRunnerLocation.ExternalToCluster;
if (args.Any(a => a == "--internal"))
{
location = TestRunnerLocation.InternalToCluster;
}
var config = new Configuration(
codexImage: argOrVar.Get(ArgOrVar.CodexImage, CodexContainerRecipe.DockerImage),
gethImage: argOrVar.Get(ArgOrVar.GethImage, GethContainerRecipe.DockerImage),
@ -24,7 +32,9 @@ public class Program
kubeConfigFile: argOrVar.Get(ArgOrVar.KubeConfigFile),
kubeNamespace: argOrVar.Get(ArgOrVar.KubeNamespace),
numberOfCodexNodes: argOrVar.GetInt(ArgOrVar.NumberOfCodexNodes),
storageQuota: argOrVar.GetInt(ArgOrVar.StorageQuota)
storageQuota: argOrVar.GetInt(ArgOrVar.StorageQuota),
codexLogLevel: argOrVar.Get(ArgOrVar.LogLevel),
runnerLocation: location
);
Console.WriteLine("Using:");
@ -41,6 +51,9 @@ public class Program
return;
}
var deployer = new Deployer(config);
deployer.Deploy();
Console.WriteLine("Done!");
}
}

View File

@ -19,8 +19,18 @@ namespace DistTestCore
logPath = GetEnvVarOrDefault("LOGPATH", "CodexTestLogs");
logDebug = GetEnvVarOrDefault("LOGDEBUG", "false").ToLowerInvariant() == "true";
dataFilesPath = GetEnvVarOrDefault("DATAFILEPATH", "TestDataFiles");
codexLogLevel = ParseEnum<CodexLogLevel>(GetEnvVarOrDefault("LOGLEVEL", nameof(CodexLogLevel.Trace)));
runnerLocation = ParseEnum<TestRunnerLocation>(GetEnvVarOrDefault("RUNNERLOCATION", nameof(TestRunnerLocation.ExternalToCluster)));
codexLogLevel = ParseEnum.Parse<CodexLogLevel>(GetEnvVarOrDefault("LOGLEVEL", nameof(CodexLogLevel.Trace)));
runnerLocation = ParseEnum.Parse<TestRunnerLocation>(GetEnvVarOrDefault("RUNNERLOCATION", nameof(TestRunnerLocation.ExternalToCluster)));
}
public Configuration(string? kubeConfigFile, string logPath, bool logDebug, string dataFilesPath, CodexLogLevel codexLogLevel, TestRunnerLocation runnerLocation)
{
this.kubeConfigFile = kubeConfigFile;
this.logPath = logPath;
this.logDebug = logDebug;
this.dataFilesPath = dataFilesPath;
this.codexLogLevel = codexLogLevel;
this.runnerLocation = runnerLocation;
}
public KubernetesWorkflow.Configuration GetK8sConfiguration(ITimeSet timeSet)
@ -75,11 +85,6 @@ namespace DistTestCore
if (v == null) return defaultValue;
return v;
}
private static T ParseEnum<T>(string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
}
public enum TestRunnerLocation

View File

@ -25,12 +25,12 @@ namespace Logging
}
}
public void Log(string message)
public virtual void Log(string message)
{
LogFile.Write(ApplyReplacements(message));
}
public void Debug(string message = "", int skipFrames = 0)
public virtual void Debug(string message = "", int skipFrames = 0)
{
if (debug)
{
@ -40,25 +40,25 @@ namespace Logging
}
}
public void Error(string message)
public virtual void Error(string message)
{
Log($"[ERROR] {message}");
}
public void MarkAsFailed()
public virtual void MarkAsFailed()
{
if (hasFailed) return;
hasFailed = true;
LogFile.ConcatToFilename("_FAILED");
}
public void AddStringReplace(string from, string to)
public virtual void AddStringReplace(string from, string to)
{
if (string.IsNullOrWhiteSpace(from)) return;
replacements.Add(new BaseLogStringReplacement(from, to));
}
public void Delete()
public virtual void Delete()
{
File.Delete(LogFile.FullFilename);
}

10
Utils/ParseEnum.cs Normal file
View File

@ -0,0 +1,10 @@
namespace Utils
{
public static class ParseEnum
{
public static T Parse<T>(string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
}
}