예제 #1
0
        public async Task <String> createExperimentServiceAsync(String taskName, String dockerImage,
                                                                String experimenterPath, String jsonExperiment)
        {
            ServiceCreateParameters parameters = new ServiceCreateParameters();

            parameters.Service              = new ServiceSpec();
            parameters.Service.Name         = taskName;
            parameters.Service.TaskTemplate = new TaskSpec();
            parameters.Service.TaskTemplate.RestartPolicy           = new SwarmRestartPolicy();
            parameters.Service.TaskTemplate.RestartPolicy.Condition = "none";
            parameters.Service.Mode                     = new ServiceMode();
            parameters.Service.Mode.Replicated          = new ReplicatedService();
            parameters.Service.Mode.Replicated.Replicas = 1;
            NetworkAttachmentConfig networkAttach1 = new NetworkAttachmentConfig();

            networkAttach1.Target = "host";
            IList <NetworkAttachmentConfig> networks = new List <NetworkAttachmentConfig>();

            networks.Add(networkAttach1);
            parameters.Service.TaskTemplate.Networks = networks;

            parameters.Service.TaskTemplate.ContainerSpec       = new ContainerSpec();
            parameters.Service.TaskTemplate.ContainerSpec.Image = dockerImage;
            IList <String> containerCommand = new List <String>();

            containerCommand.Add(experimenterPath);
            containerCommand.Add("--experiment-data '" + jsonExperiment + "'");
            parameters.Service.TaskTemplate.ContainerSpec.Command = containerCommand;

            ServiceCreateResponse response = await this.client.Swarm.CreateServiceAsync(parameters);

            return(response.ID);
        }
예제 #2
0
        public async Task <bool> Reinitialize(ReinitServiceHttpParams reinitParams, SwarmService swarmService)
        {
            try
            {
                Logger.Log("Start server reinitializing");
                this.DockerServiceId = swarmService.ID;
                Id              = reinitParams.Id;
                UserId          = reinitParams.UserId;
                Base64File      = reinitParams.FileBase64;
                CountOfReplicas = reinitParams.CountOfReplicas;
                DockerServiceId = swarmService.ID;
                Dependencies    = reinitParams.Dependencies;
                FilePath        = FileWorker.makeDirectoryName(Id, UserId);
                Port            = reinitParams.Port;
                Logger.Log($"{reinitParams.UserId}-{reinitParams.Id} ({DockerServiceId}): Main parameters filled successfull");
                NetworkAttachmentConfig networkAttachmentConfig = swarmService.Spec.Networks.FirstOrDefault();
                Network = await Client.Docker.Networks.InspectNetworkAsync(networkAttachmentConfig.Target);

                Logger.Log($"{reinitParams.UserId}-{reinitParams.Id}: Network created successfull");
                return(true);
            }
            catch (Exception e)
            {
                Logger.Fail($"{reinitParams.UserId}-{reinitParams.Id}: {e.Message}");
                return(false);
            }
        }
예제 #3
0
        public async Task <bool> Update(string FileBase64)
        {
            try
            {
                Logger.Log($"updating service id : {Id} with DockerId {DockerServiceId}");
                this.FilePath = CombineProgram(Id, UserId, FileBase64);
                var serviceInfo = await Client.Docker.Swarm.InspectServiceAsync(DockerServiceId);

                var Image = this.Image();
                Logger.Log($"Service info gotten! Name is : {Name}, Version is: {serviceInfo.Version.Index}, Network ID is {Network.ID}, Image Id : {Image.ID}, Port: {Port}, this.FilePath: {this.FilePath}");
                NetworkAttachmentConfig networkConfig = new NetworkAttachmentConfig()
                {
                    Target = Network.ID
                };
                EndpointSpec endpointSpec = new EndpointSpec()
                {
                    Ports = new List <PortConfig>()
                    {
                        new PortConfig()
                        {
                            Protocol      = "tcp",
                            PublishedPort = uint.Parse(Port),
                            TargetPort    = uint.Parse(Port)
                        }
                    }
                };
                Logger.Log("Endpoint created");
                IList <Mount> mounts = new List <Mount>
                {
                    new Mount()
                    {
                        Target = "/home/node/",
                        Source = this.FilePath,
                    }
                };
                Logger.Log("Mounts created");
                TaskSpec taskSpec = new TaskSpec()
                {
                    ForceUpdate   = 1,
                    RestartPolicy = new SwarmRestartPolicy()
                    {
                        Condition   = "any",
                        MaxAttempts = 0
                    },
                    ContainerSpec = new ContainerSpec()
                    {
                        Image = Image.ID,
                        Env   = new List <string>()
                        {
                            $"PORT={Port}"
                        },
                        Hosts = new List <string>()
                        {
                            $"{Port}:{Port}"
                        },
                        Mounts  = mounts,
                        Dir     = "/home/node/",
                        Command = new List <string>()
                        {
                            "/bin/bash", "build.sh"
                        },
                    },
                };
                Logger.Log("Task spec created!");
                ServiceSpec serviceSpec = new ServiceSpec()
                {
                    Name     = Name,
                    Networks = new List <NetworkAttachmentConfig>()
                    {
                        networkConfig
                    },
                    EndpointSpec = endpointSpec,
                    TaskTemplate = taskSpec,
                };
                Logger.Log("Service spec created!");
                var serviceParams = new ServiceUpdateParameters()
                {
                    Version = Convert.ToInt64(serviceInfo.Version.Index),
                    Service = serviceSpec
                };
                Logger.Log("Configuration is ready, updating...");
                await Client.Docker.Swarm.UpdateServiceAsync(DockerServiceId, serviceParams);

                Logger.Success($"Updated successful!");
                return(true);
            }
            catch (Exception e)
            {
                Logger.Fail($"Cant update service {DockerServiceId} : {e.Message}");
                return(false);
            }
        }
예제 #4
0
        public async Task <bool> Create()
        {
            var networkParams = new NetworksCreateParameters()
            {
                Name   = Name,
                Driver = "overlay"
            };
            var networkList = await Client.Docker.Networks.ListNetworksAsync();

            var             existingNetwork = networkList.Where(el => el.Name == Name).ToList();
            NetworkResponse network         = null;

            if (existingNetwork.Count == 0)
            {
                Logger.Log($"Network for service {Name} is existing!");
                var createdNetwork = await Client.Docker.Networks.CreateNetworkAsync(networkParams);

                network = await Client.Docker.Networks.InspectNetworkAsync(createdNetwork.ID);
            }
            else
            {
                network = existingNetwork.First();
            }

            Network = network;

            Logger.Success($"Use network with Name : {network.Name}, count of replicas {CountOfReplicas}");
            NetworkAttachmentConfig networkConfig = new NetworkAttachmentConfig()
            {
                Target = network.ID
            };



            Port = (3000 + ServiceLogic.Services.Count).ToString();
            Logger.Success($"Predicted port is {Port}");
            var serviceParams = new ServiceCreateParameters()
            {
                Service = new ServiceSpec()
                {
                    Name     = Name,
                    Networks = new List <NetworkAttachmentConfig>()
                    {
                        networkConfig
                    },
                    EndpointSpec = new EndpointSpec()
                    {
                        Ports = new List <PortConfig>()
                        {
                            new PortConfig()
                            {
                                Protocol      = "tcp",
                                PublishedPort = uint.Parse(Port),
                                TargetPort    = uint.Parse(Port)
                            }
                        }
                    },
                    Mode = new ServiceMode()
                    {
                        Replicated = new ReplicatedService()
                        {
                            Replicas = (ulong)(CountOfReplicas)
                        }
                    },
                    TaskTemplate = new TaskSpec()
                    {
                        ContainerSpec = new ContainerSpec()
                        {
                            Image = Image().ID,
                            Env   = new List <string>()
                            {
                                $"PORT={Port}"
                            },
                            Hosts = new List <string>()
                            {
                                $"{Port}:${Port}"
                            },
                            Mounts = new List <Mount>
                            {
                                new Mount()
                                {
                                    Target = "/home/node/",
                                    Source = $"{this.FilePath}",
                                }
                            },
                            Dir     = "/home/node/",
                            Command = new List <string>()
                            {
                                "/bin/bash", "build.sh"
                            },
                        },
                    }
                }
            };

            try
            {
                var service = await Client.Docker.Swarm.CreateServiceAsync(serviceParams);

                DockerServiceId = service.ID;
                Logger.Success($"Service {service.ID} is Up!");
                return(true);
            }
            catch (Exception e)
            {
                Logger.Fail($"Cant create the container: {e.Message}");
                return(false);
            }
        }