diff --git a/Framework/KubernetesWorkflow/K8sController.cs b/Framework/KubernetesWorkflow/K8sController.cs index 8af6fd86..b14267d3 100644 --- a/Framework/KubernetesWorkflow/K8sController.cs +++ b/Framework/KubernetesWorkflow/K8sController.cs @@ -49,13 +49,14 @@ namespace KubernetesWorkflow return CreatePodInfo(pod); } - public void Stop(StartResult startResult) + public void Stop(StartResult startResult, bool waitTillStopped) { log.Debug(); if (startResult.InternalService != null) DeleteService(startResult.InternalService); if (startResult.ExternalService != null) DeleteService(startResult.ExternalService); DeleteDeployment(startResult.Deployment); - WaitUntilPodsForDeploymentAreOffline(startResult.Deployment); + + if (waitTillStopped) WaitUntilPodsForDeploymentAreOffline(startResult.Deployment); } public void DownloadPodLog(RunningContainer container, ILogHandler logHandler, int? tailLines) diff --git a/Framework/KubernetesWorkflow/StartupWorkflow.cs b/Framework/KubernetesWorkflow/StartupWorkflow.cs index 15bc3e30..4d1a2f67 100644 --- a/Framework/KubernetesWorkflow/StartupWorkflow.cs +++ b/Framework/KubernetesWorkflow/StartupWorkflow.cs @@ -14,7 +14,7 @@ namespace KubernetesWorkflow PodInfo GetPodInfo(RunningContainer container); PodInfo GetPodInfo(RunningContainers containers); CrashWatcher CreateCrashWatcher(RunningContainer container); - void Stop(RunningContainers containers); + void Stop(RunningContainers containers, bool waitTillStopped); void DownloadContainerLog(RunningContainer container, ILogHandler logHandler, int? tailLines = null); string ExecuteCommand(RunningContainer container, string command, params string[] args); void DeleteNamespace(); @@ -86,11 +86,11 @@ namespace KubernetesWorkflow return K8s(c => c.CreateCrashWatcher(container)); } - public void Stop(RunningContainers runningContainers) + public void Stop(RunningContainers runningContainers, bool waitTillStopped) { K8s(controller => { - controller.Stop(runningContainers.StartResult); + controller.Stop(runningContainers.StartResult, waitTillStopped); cluster.Configuration.Hooks.OnContainersStopped(runningContainers); }); } diff --git a/ProjectPlugins/CodexContractsPlugin/CodexContractsStarter.cs b/ProjectPlugins/CodexContractsPlugin/CodexContractsStarter.cs index f7864de3..a6f6641e 100644 --- a/ProjectPlugins/CodexContractsPlugin/CodexContractsStarter.cs +++ b/ProjectPlugins/CodexContractsPlugin/CodexContractsStarter.cs @@ -33,7 +33,7 @@ namespace CodexContractsPlugin try { var result = DeployContract(container, workflow, gethNode); - workflow.Stop(containers); + workflow.Stop(containers, waitTillStopped: false); Log("Container stopped."); return result; } diff --git a/ProjectPlugins/CodexPlugin/CodexNode.cs b/ProjectPlugins/CodexPlugin/CodexNode.cs index 2c79459e..de7f10fc 100644 --- a/ProjectPlugins/CodexPlugin/CodexNode.cs +++ b/ProjectPlugins/CodexPlugin/CodexNode.cs @@ -26,7 +26,7 @@ namespace CodexPlugin CrashWatcher CrashWatcher { get; } PodInfo GetPodInfo(); ITransferSpeeds TransferSpeeds { get; } - void Stop(); + void Stop(bool waitTillStopped); } public class CodexNode : ICodexNode @@ -153,13 +153,13 @@ namespace CodexPlugin return CodexAccess.GetPodInfo(); } - public void Stop() + public void Stop(bool waitTillStopped) { if (Group.Count() > 1) throw new InvalidOperationException("Codex-nodes that are part of a group cannot be " + "individually shut down. Use 'BringOffline()' on the group object to stop the group. This method is only " + "available for codex-nodes in groups of 1."); - Group.BringOffline(); + Group.BringOffline(waitTillStopped); } public void EnsureOnlineGetVersionResponse() diff --git a/ProjectPlugins/CodexPlugin/CodexNodeGroup.cs b/ProjectPlugins/CodexPlugin/CodexNodeGroup.cs index 0b6dee7d..e9eceb75 100644 --- a/ProjectPlugins/CodexPlugin/CodexNodeGroup.cs +++ b/ProjectPlugins/CodexPlugin/CodexNodeGroup.cs @@ -7,7 +7,7 @@ namespace CodexPlugin { public interface ICodexNodeGroup : IEnumerable, IHasManyMetricScrapeTargets { - void BringOffline(); + void BringOffline(bool waitTillStopped); ICodexNode this[int index] { get; } } @@ -31,9 +31,9 @@ namespace CodexPlugin } } - public void BringOffline() + public void BringOffline(bool waitTillStopped) { - starter.BringOffline(this); + starter.BringOffline(this, waitTillStopped); // Clear everything. Prevent accidental use. Nodes = Array.Empty(); Containers = null!; diff --git a/ProjectPlugins/CodexPlugin/CodexStarter.cs b/ProjectPlugins/CodexPlugin/CodexStarter.cs index af815a8d..57045cc2 100644 --- a/ProjectPlugins/CodexPlugin/CodexStarter.cs +++ b/ProjectPlugins/CodexPlugin/CodexStarter.cs @@ -48,14 +48,14 @@ namespace CodexPlugin return group; } - public void BringOffline(CodexNodeGroup group) + public void BringOffline(CodexNodeGroup group, bool waitTillStopped) { Log($"Stopping {group.Describe()}..."); StopCrashWatcher(group); var workflow = pluginTools.CreateWorkflow(); foreach (var c in group.Containers) { - workflow.Stop(c); + workflow.Stop(c, waitTillStopped); } Log("Stopped."); } diff --git a/Tests/CodexTests/BasicTests/OneClientTests.cs b/Tests/CodexTests/BasicTests/OneClientTests.cs index 26cf84e1..d8045862 100644 --- a/Tests/CodexTests/BasicTests/OneClientTests.cs +++ b/Tests/CodexTests/BasicTests/OneClientTests.cs @@ -21,7 +21,7 @@ namespace CodexTests.BasicTests { var primary = Ci.StartCodexNode(); - primary.Stop(); + primary.Stop(waitTillStopped: true); primary = Ci.StartCodexNode();