CodexContainerProcessControl.cs
1 using CodexClient; 2 using Core; 3 using KubernetesWorkflow; 4 using KubernetesWorkflow.Types; 5 using Logging; 6 7 namespace CodexPlugin 8 { 9 public class CodexContainerProcessControl : IProcessControl 10 { 11 private readonly IPluginTools tools; 12 private readonly RunningPod pod; 13 private readonly Action onStop; 14 private readonly ContainerCrashWatcher crashWatcher; 15 16 public CodexContainerProcessControl(IPluginTools tools, RunningPod pod, Action onStop) 17 { 18 this.tools = tools; 19 this.pod = pod; 20 this.onStop = onStop; 21 22 crashWatcher = tools.CreateWorkflow().CreateCrashWatcher(pod.Containers.Single()); 23 crashWatcher.Start(); 24 } 25 26 public void Stop(bool waitTillStopped) 27 { 28 Log($"Stopping node..."); 29 crashWatcher.Stop(); 30 var workflow = tools.CreateWorkflow(); 31 workflow.Stop(pod, waitTillStopped); 32 onStop(); 33 Log("Stopped."); 34 } 35 36 public IDownloadedLog DownloadLog(LogFile file) 37 { 38 var workflow = tools.CreateWorkflow(); 39 return workflow.DownloadContainerLog(pod.Containers.Single()); 40 } 41 42 public void DeleteDataDirFolder() 43 { 44 var container = pod.Containers.Single(); 45 46 try 47 { 48 var dataDirVar = container.Recipe.EnvVars.Single(e => e.Name == "CODEX_DATA_DIR"); 49 var dataDir = dataDirVar.Value; 50 var workflow = tools.CreateWorkflow(); 51 workflow.ExecuteCommand(container, "rm", "-Rfv", $"/codex/{dataDir}/repo"); 52 Log("Deleted repo folder."); 53 } 54 catch (Exception e) 55 { 56 Log("Unable to delete repo folder: " + e); 57 } 58 } 59 60 public bool HasCrashed() 61 { 62 return crashWatcher.HasCrashed(); 63 } 64 65 private void Log(string message) 66 { 67 tools.GetLog().Log(message); 68 } 69 } 70 }