public Driver(DriverConfig Config, string Image) { this.Config = Config; this.Image = Image; _requestsBehind = new TDict <string, DataRequest>(); _connector = new Connector(Config); }
public static Driver MakeDriver(string image, int replica) { string name = Params.ID + "_" + image.Replace("-", "_").Replace("/", "_").Replace(" ", "") + "_" + replica.ToString(); DriverConfig config = new DriverConfig() { ID = name, Host = Params.DOCKER_HOST, Port = Params.GetUnusedPort(), AssociatedNode = Credentials.Self, Image = image, Replica = replica }; try { (bool running, string id)info = Docker.Instance.IsContainerRunning(name).GetAwaiter().GetResult(); if (info.running == true && info.id != null) { Docker.Instance.StopContainers(info.id).GetAwaiter().GetResult(); Docker.Instance.RemoveStoppedContainers().GetAwaiter().GetResult(); } } catch { } while (true) { try { Docker.Instance.Containerize(config).GetAwaiter().GetResult(); break; } catch { Utils.Sleep(Utils.GetRandomInt(Params.ELECTION_TIMEOUT_START, Params.ELECTION_TIMEOUT_END)); (bool running, string id)info = Docker.Instance.IsContainerRunning(name).GetAwaiter().GetResult(); // Console.WriteLine("pulled" + info.id + " " + info.running.ToString()); if (info.running) { break; } } } return(new Driver(config, image)); }
public Connector(DriverConfig config) { Host = config.Host; Port = config.Port; ID = config.ID; }
public async Task <string> Containerize(DriverConfig config) { string ID = null; try { bool status = await PullImage(config.Image); // Console.WriteLine(status); if (!status) { return(ID); } // CancellationTokenSource cts = new CancellationTokenSource(8000); // cts.CancelAfter(8000); // Task.Run(async () => { // Console.WriteLine(ID); var response = await _client.Containers.CreateContainerAsync(new CreateContainerParameters { Image = config.Image, Name = config.ID, Hostname = "localhost", Env = new string[] { "HOST=" + config.Host, "PORT=" + config.Port.ToString(), "ID=" + config.ID, "TIMEOUT=" + Params.TIMEOUT.ToString(), "IMAGE=" + config.Image, "BATCH_SIZE=" + Params.BATCH_SIZE.ToString(), "NODE_HOST=" + config.AssociatedNode.Host, "NODE_NAME=" + config.AssociatedNode.ID, "NODE_PORT=" + config.AssociatedNode.Port.ToString() }, ExposedPorts = new Dictionary <string, EmptyStruct> { { config.Port.ToString(), default(EmptyStruct) } }, HostConfig = new HostConfig { PortBindings = new Dictionary <string, IList <PortBinding> > { { config.Port.ToString(), new List <PortBinding> { new PortBinding { HostPort = config.Port.ToString() } } } }, PublishAllPorts = true } }); Logger.Write(Logger.Tag.INFO, "Created container: " + response.ID); ID = response.ID; // #pragma warning disable CS4014 // _client.Containers.StartContainerAsync(response.ID, null, cts.Token).GetAwaiter().GetResult(); _client.Containers.StartContainerAsync(response.ID, null).GetAwaiter().GetResult(); Logger.Write(Logger.Tag.INFO, "Started container: " + response.ID); (bool running, string ID)info = await IsContainerRunning(config.ID); ID = info.ID; status = info.running; Logger.Write(Logger.Tag.COMMIT, "Container now running: " + response.ID); // // }).Wait(8000, cts.Token); // }).Wait(8000); if (ID == null || !status) { Logger.Write(Logger.Tag.ERROR, "Did not manage to spin up container."); } // else CurrentState.Instance.SetHIEVar(true); return(ID); } catch { CurrentState.Instance.SetHIEVar(false); return(ID); } }