Ejemplo n.º 1
0
        private static string GetServiceArgs(bool podman, DenService service)
        {
            StringBuilder sb = new StringBuilder();
            string        variablesPrefix = service.Name.Replace("-", "");

            string cmd;

            switch (service)
            {
            case DenLucidService denLucid:
                cmd = podman ? "--healthcheck-command=\'curl -sS http://den-lucid:4242/health\'" : "--health-cmd=\'curl -sS http://den-lucid:4242/health\'";
                sb.AppendLine($"${variablesPrefix}HealthCheck = \"{cmd}\"");
                break;

            case DenServerService denServer1:
                cmd = podman ? "--healthcheck-command=\'curl -sS http://den-server:10255/health\'" : "--health-cmd=\'curl -sS http://den-server:10255/health\'";
                sb.AppendLine($"${variablesPrefix}HealthCheck = \"{cmd}\"");
                break;
            }

            if (service.GetEnvironment(out List <string> envs))
            {
                sb.AppendLine($"${variablesPrefix}Envs = @(\"{string.Join("\",`\n   \"", envs)}\")");
            }

            if (service.GetVolumes(out List <string> volumes))
            {
                List <string> updatedVolumes = new List <string>();
                if (service is DenMongoService denMongo)
                {
                    foreach (string volume in volumes)
                    {
                        updatedVolumes.Add(volume);
                    }
                }
                else
                {
                    foreach (string volume in volumes)
                    {
                        updatedVolumes.Add($"$($currentPath){System.IO.Path.DirectorySeparatorChar}{volume}");
                    }
                }

                sb.AppendLine($"${variablesPrefix}Volumes = @(\"{string.Join("\",`\n    \"", updatedVolumes)}\")");
            }

            if (service.GetPorts(out List <string> ports))
            {
                sb.AppendLine($"${variablesPrefix}Ports = @(\'{string.Join("\',`\n  \'", ports)}\')");
            }

            if (service.GetCmd(out List <string> commands))
            {
                sb.AppendLine($"${variablesPrefix}Cmd = @(\'{string.Join("\',`\n    \'", commands)}\')");
            }

            return(sb.ToString());
        }
Ejemplo n.º 2
0
        private static string CreateServiceDockerCompose(DenService service)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(string.Format("  {0}:", service.Name));
            sb.AppendLine(string.Format("    image: '{0}'", service.ImageName));
            sb.AppendLine(string.Format("    container_name: '{0}'", service.Name));
            string[] dependency     = null;
            string[] dependencyPort = null;
            switch (service)
            {
            case DenLucidService denLucid:
                sb.AppendLine("    depends_on:");
                sb.AppendLine("      - den-picky");
                break;

            case DenServerService denServer:
                dependency     = new string[] { "den-lucid" };
                dependencyPort = new string[] { "10254/healtz", "4242/health" };
                sb.AppendLine("    depends_on:");
                sb.AppendLine("        - traefik");
                break;

            case DenTraefikService denTraefik:
                break;
            }

            if (dependency != null && dependencyPort != null && dependency.Length == dependencyPort.Length)
            {
                sb.AppendLine("    healthcheck:");
                string curlString = "      test: {0}";
                string d          = string.Empty;
                for (int i = 0; i < dependency.Length; i++)
                {
                    string join = i > 0 ? " && " : string.Empty;
                    d += $"{join}curl -sS http://{dependency[i]}:{dependencyPort[i]}";
                }
                sb.AppendLine(string.Format(curlString, d));
                sb.AppendLine("      interval: 30s");
                sb.AppendLine("      timeout: 10s");
                sb.AppendLine("      retries: 5");
                sb.AppendLine("      start_period: 40s");
            }

            sb.AppendLine("    networks:");
            sb.AppendLine("      den-network:");

            if (service.GetEnvironment(out List <string> envs))
            {
                sb.AppendLine("    environment:");
                foreach (string env in envs)
                {
                    string[] splittedEnv = env.Split(new char[] { '=' }, 2);

                    if (splittedEnv.Length < 2)
                    {
                        continue;
                    }

                    string envString = "      {0}: '{1}'";

                    if (splittedEnv[1].Contains("\n"))
                    {
                        string envKeyString = "      {0}: |";
                        sb.AppendLine(string.Format(envKeyString, splittedEnv[0]));

                        foreach (string s in splittedEnv[1].Split('\n'))
                        {
                            sb.AppendLine(string.Format("        {0}", s));
                        }
                    }
                    else
                    {
                        sb.AppendLine(string.Format(envString, splittedEnv[0], splittedEnv[1]));
                    }
                }
            }

            if (service.GetVolumes(out List <string> volumes))
            {
                sb.AppendLine("    volumes:");

                string volumeString = "       - '{0}'";

                foreach (string volume in volumes)
                {
                    sb.AppendLine(string.Format(volumeString, volume));
                }
            }

            if (service.GetCmd(out List <string> commands))
            {
                sb.Append("    command:");

                foreach (string command in commands)
                {
                    string adjustcmd = command.Contains(" ") ? command.Insert(command.IndexOf('=') + 1, "\'").Insert(command.Length + 1, "\'") : command;
                    sb.Append($" {adjustcmd}");
                }

                sb.AppendLine();
            }

            if (service.GetPorts(out List <string> ports))
            {
                sb.AppendLine("    ports:");

                foreach (string port in ports)
                {
                    sb.AppendLine(string.Format("      - \"{0}\"", port));
                }
            }

            if (service.GetLogConfigs(out Dictionary <string, string> logConfigs))
            {
                if (logConfigs.TryGetValue("driver", out string driver))
                {
                    sb.AppendLine("    logging:");
                    sb.AppendLine($"      driver: \"{driver}\"");
                }

                string logOptionsFormat = "        {0}: {1}";
                sb.AppendLine($"      options:");

                if (logConfigs.TryGetValue("syslog-address", out string address))
                {
                    sb.AppendLine(string.Format(logOptionsFormat, "syslog-address", address));
                }

                if (logConfigs.TryGetValue("syslog-facility", out string facility))
                {
                    sb.AppendLine(string.Format(logOptionsFormat, "syslog-facility", facility));
                }

                if (logConfigs.TryGetValue("syslog-format", out string format))
                {
                    sb.AppendLine(string.Format(logOptionsFormat, "syslog-format", format));
                }

                if (logConfigs.TryGetValue("tag", out string tag))
                {
                    sb.AppendLine(string.Format(logOptionsFormat, "tag", tag));
                }
            }

            return(sb.ToString());
        }
Ejemplo n.º 3
0
        private async Task <bool> StartService(DenService service)
        {
            string id      = string.Empty;
            bool   started = false;

            try
            {
                if (this.OnLog != null)
                {
                    this.OnLog($"{service.Name}");
                }
                await service.CreateImage();

                CreateContainerResponse ccr = await service.CreateContainer(service.ImageName);

                if (this.OnLog != null)
                {
                    this.OnLog($"{service.Name} created");
                }
                id = ccr.ID;

                if (this.OnLog != null)
                {
                    this.OnLog($"Starting {service.Name}");
                }

                started = id != string.Empty? await service.StartContainer(id): false;

                if (!started)
                {
                    if (this.OnError != null)
                    {
                        this.OnError(new Exception($"Error running {service.Name} container"));
                    }
                }
                else
                {
                    if (this.OnLog != null)
                    {
                        this.OnLog($"{service.Name} started");
                    }

                    if (service is DenHealthCheckService denHealthCheckService)
                    {
                        if (this.OnLog != null)
                        {
                            this.OnLog($"Waiting for {service.Name} health status");
                        }

                        started = await service.IsHealthy();

                        if (started)
                        {
                            if (this.OnLog != null)
                            {
                                this.OnLog($"{service.Name} is healthy");
                            }
                        }
                    }

                    this.RunningDenServices.Add(service);
                }
            }
            catch (DockerImageNotFoundException e)
            {
                this.OnError(e);
            }
            catch (DockerApiException e)
            {
                this.OnError(e);
            }

            return(started);
        }