2023-04-12 14:12:04 +00:00
using DistTestCore.Codex ;
2023-04-30 08:56:19 +00:00
using DistTestCore.Marketplace ;
2023-07-11 10:21:48 +00:00
using DistTestCore.Metrics ;
2023-04-12 14:12:04 +00:00
using KubernetesWorkflow ;
2023-05-11 10:44:53 +00:00
using Logging ;
2023-04-12 14:06:04 +00:00
namespace DistTestCore
{
2023-04-18 11:45:48 +00:00
public class CodexStarter : BaseStarter
2023-04-12 14:06:04 +00:00
{
2023-04-13 12:36:17 +00:00
public CodexStarter ( TestLifecycle lifecycle , WorkflowCreator workflowCreator )
2023-04-18 11:45:48 +00:00
: base ( lifecycle , workflowCreator )
2023-04-12 14:06:04 +00:00
{
}
2023-04-13 09:53:54 +00:00
public List < CodexNodeGroup > RunningGroups { get ; } = new List < CodexNodeGroup > ( ) ;
2023-04-13 07:33:10 +00:00
public ICodexNodeGroup BringOnline ( CodexSetup codexSetup )
2023-04-12 14:06:04 +00:00
{
2023-04-19 07:19:06 +00:00
LogSeparator ( ) ;
2023-04-18 11:45:48 +00:00
LogStart ( $"Starting {codexSetup.Describe()}..." ) ;
2023-04-14 08:51:35 +00:00
var gethStartResult = lifecycle . GethStarter . BringOnlineMarketplaceFor ( codexSetup ) ;
2023-04-30 08:56:19 +00:00
var startupConfig = CreateStartupConfig ( gethStartResult , codexSetup ) ;
2023-04-14 08:51:35 +00:00
var containers = StartCodexContainers ( startupConfig , codexSetup . NumberOfNodes , codexSetup . Location ) ;
2023-04-13 09:53:54 +00:00
2023-07-11 10:21:48 +00:00
var metricAccessFactory = CollectMetrics ( codexSetup , containers ) ;
2023-04-12 14:06:04 +00:00
2023-04-14 08:51:35 +00:00
var codexNodeFactory = new CodexNodeFactory ( lifecycle , metricAccessFactory , gethStartResult . MarketplaceAccessFactory ) ;
2023-04-12 14:12:04 +00:00
2023-04-13 12:36:17 +00:00
var group = CreateCodexGroup ( codexSetup , containers , codexNodeFactory ) ;
2023-06-02 08:04:07 +00:00
var podInfo = group . Containers . RunningPod . PodInfo ;
2023-07-14 08:18:37 +00:00
LogEnd ( $"Started {codexSetup.NumberOfNodes} nodes of image '{containers.Containers.First().Recipe.Image}' at location '{podInfo.K8SNodeName}'={podInfo.Ip}. They are: {group.Describe()}" ) ;
2023-04-19 07:19:06 +00:00
LogSeparator ( ) ;
2023-04-13 09:53:54 +00:00
return group ;
2023-04-12 14:06:04 +00:00
}
2023-04-13 09:53:54 +00:00
public void BringOffline ( CodexNodeGroup group )
2023-04-13 09:07:36 +00:00
{
2023-04-18 11:45:48 +00:00
LogStart ( $"Stopping {group.Describe()}..." ) ;
2023-04-13 09:07:36 +00:00
var workflow = CreateWorkflow ( ) ;
2023-04-13 09:53:54 +00:00
workflow . Stop ( group . Containers ) ;
RunningGroups . Remove ( group ) ;
2023-04-18 11:45:48 +00:00
LogEnd ( "Stopped." ) ;
2023-04-13 09:07:36 +00:00
}
2023-04-12 14:06:04 +00:00
public void DeleteAllResources ( )
{
2023-04-13 09:07:36 +00:00
var workflow = CreateWorkflow ( ) ;
2023-05-03 12:18:37 +00:00
workflow . DeleteTestResources ( ) ;
2023-04-13 09:53:54 +00:00
RunningGroups . Clear ( ) ;
2023-04-12 14:06:04 +00:00
}
2023-04-13 09:07:36 +00:00
2023-04-13 09:30:19 +00:00
public void DownloadLog ( RunningContainer container , ILogHandler logHandler )
{
var workflow = CreateWorkflow ( ) ;
workflow . DownloadContainerLog ( container , logHandler ) ;
}
2023-04-30 08:56:19 +00:00
2023-07-11 10:21:48 +00:00
private IMetricsAccessFactory CollectMetrics ( CodexSetup codexSetup , RunningContainers containers )
{
if ( ! codexSetup . MetricsEnabled ) return new MetricsUnavailableAccessFactory ( ) ;
var runningContainers = lifecycle . PrometheusStarter . CollectMetricsFor ( containers ) ;
return new CodexNodeMetricsAccessFactory ( lifecycle , runningContainers ) ;
}
2023-04-30 08:56:19 +00:00
private StartupConfig CreateStartupConfig ( GethStartResult gethStartResult , CodexSetup codexSetup )
{
var startupConfig = new StartupConfig ( ) ;
startupConfig . NameOverride = codexSetup . NameOverride ;
startupConfig . Add ( codexSetup ) ;
startupConfig . Add ( gethStartResult ) ;
return startupConfig ;
}
2023-04-14 08:51:35 +00:00
private RunningContainers StartCodexContainers ( StartupConfig startupConfig , int numberOfNodes , Location location )
2023-04-13 12:36:17 +00:00
{
var workflow = CreateWorkflow ( ) ;
2023-04-14 08:51:35 +00:00
return workflow . Start ( numberOfNodes , location , new CodexContainerRecipe ( ) , startupConfig ) ;
2023-04-13 12:36:17 +00:00
}
private CodexNodeGroup CreateCodexGroup ( CodexSetup codexSetup , RunningContainers runningContainers , CodexNodeFactory codexNodeFactory )
{
var group = new CodexNodeGroup ( lifecycle , codexSetup , runningContainers , codexNodeFactory ) ;
RunningGroups . Add ( group ) ;
2023-05-11 10:44:53 +00:00
Stopwatch . Measure ( lifecycle . Log , "EnsureOnline" , group . EnsureOnline , debug : true ) ;
2023-04-13 12:36:17 +00:00
return group ;
}
2023-04-13 09:30:19 +00:00
2023-04-13 09:07:36 +00:00
private StartupWorkflow CreateWorkflow ( )
{
return workflowCreator . CreateWorkflow ( ) ;
}
2023-04-19 07:19:06 +00:00
private void LogSeparator ( )
{
Log ( "----------------------------------------------------------------------------" ) ;
}
2023-04-12 14:06:04 +00:00
}
}