예제 #1
0
 public EdgeHubDockerRuntimeModule(
     ModuleStatus desiredStatus,
     RestartPolicy restartPolicy,
     DockerConfig config,
     int exitCode,
     string statusDescription,
     DateTime lastStartTime,
     DateTime lastExitTime,
     int restartCount,
     DateTime lastRestartTime,
     ModuleStatus runtimeStatus,
     ImagePullPolicy imagePullPolicy,
     uint startupOrder,
     ConfigurationInfo configuration,
     IDictionary <string, EnvVal> env,
     string version = "")
     : base(
         Core.Constants.EdgeHubModuleName,
         version,
         desiredStatus,
         restartPolicy,
         config,
         exitCode,
         statusDescription,
         lastStartTime,
         lastExitTime,
         restartCount,
         lastRestartTime,
         runtimeStatus,
         imagePullPolicy,
         startupOrder,
         configuration,
         env)
 {
     // You maybe wondering why we are setting this here again even though
     // the base class does this assignment. This is due to a behavior
     // in C# where if you have an assignment to a read-only virtual property
     // from a base constructor when it has been overriden in a sub-class, the
     // assignment becomes a no-op.  In order to fix this we need to assign
     // this here again so that the correct property assignment happens for real!
     this.RestartPolicy = Preconditions.CheckIsDefined(restartPolicy);
     this.Version       = version ?? string.Empty;
 }
예제 #2
0
 public DockerModule(
     string name,
     string version,
     ModuleStatus desiredStatus,
     RestartPolicy restartPolicy,
     DockerConfig config,
     ImagePullPolicy imagePullPolicy,
     ConfigurationInfo configurationInfo,
     IDictionary <string, EnvVal> env)
 {
     this.Name              = name;
     this.Version           = version ?? string.Empty;
     this.DesiredStatus     = Preconditions.CheckIsDefined(desiredStatus);
     this.Config            = Preconditions.CheckNotNull(config, nameof(config));
     this.RestartPolicy     = Preconditions.CheckIsDefined(restartPolicy);
     this.ImagePullPolicy   = Preconditions.CheckIsDefined(imagePullPolicy);
     this.ConfigurationInfo = configurationInfo ?? new ConfigurationInfo(string.Empty);
     this.Env = env?.ToImmutableDictionary() ?? ImmutableDictionary <string, EnvVal> .Empty;
 }
예제 #3
0
 public KubernetesModule(
     string name,
     string version,
     string type,
     ModuleStatus status,
     RestartPolicy restartPolicy,
     ConfigurationInfo configurationInfo,
     IDictionary <string, EnvVal> env,
     CombinedDockerConfig settings,
     ImagePullPolicy imagePullPolicy)
 {
     this.Name              = name;
     this.Version           = version;
     this.Type              = type;
     this.DesiredStatus     = status;
     this.RestartPolicy     = restartPolicy;
     this.ConfigurationInfo = configurationInfo;
     this.Env             = env?.ToImmutableDictionary() ?? ImmutableDictionary <string, EnvVal> .Empty;
     this.Config          = settings;
     this.ImagePullPolicy = imagePullPolicy;
 }
예제 #4
0
        /// <inheritdoc/>
        public void Normalize()
        {
            ContainerSpec = ContainerSpec ?? new ServiceContainerSpec();
            Resources     = Resources ?? new ServiceResources();
            RestartPolicy = RestartPolicy ?? new ServiceRestartPolicy();
            Placement     = Placement ?? new ServicePlacement();
            Networks      = Networks ?? new List <ServiceNetwork>();
            EndpointSpec  = EndpointSpec ?? new ServiceEndpointSpec();

            ContainerSpec?.Normalize();
            Resources?.Normalize();
            RestartPolicy?.Normalize();
            Placement?.Normalize();
            LogDriver?.Normalize();
            EndpointSpec?.Normalize();

            foreach (var item in Networks)
            {
                item?.Normalize();
            }
        }
예제 #5
0
 public TestModuleBase(
     string name,
     string version,
     string type,
     ModuleStatus desiredStatus,
     TConfig config,
     RestartPolicy restartPolicy,
     ImagePullPolicy imagePullPolicy,
     ConfigurationInfo configuration,
     IDictionary <string, EnvVal> env)
 {
     this.Name              = name;
     this.Version           = Preconditions.CheckNotNull(version, nameof(version));
     this.Type              = Preconditions.CheckNotNull(type, nameof(type));
     this.DesiredStatus     = Preconditions.CheckNotNull(desiredStatus, nameof(desiredStatus));
     this.Config            = Preconditions.CheckNotNull(config, nameof(config));
     this.RestartPolicy     = Preconditions.CheckIsDefined(restartPolicy);
     this.ImagePullPolicy   = Preconditions.CheckIsDefined(imagePullPolicy);
     this.ConfigurationInfo = configuration ?? new ConfigurationInfo();
     this.Env = env?.ToImmutableDictionary() ?? ImmutableDictionary <string, EnvVal> .Empty;
 }
 DockerRuntimeModule(
     string name,
     string version,
     string type,
     ModuleStatus status,
     RestartPolicy restartPolicy,
     DockerConfig config,
     int?exitCode,
     string statusDescription,
     DateTime lastStartTimeUtc,
     DateTime lastExitTimeUtc,
     int restartCount,
     DateTime lastRestartTimeUtc,
     ModuleStatus runtimeStatus,
     ImagePullPolicy imagePullPolicy,
     uint priority,
     ConfigurationInfo configurationInfo,
     IDictionary <string, EnvVal> env,
     IDictionary <string, string> secrets)
     : this(
         name,
         version,
         status,
         restartPolicy,
         config,
         exitCode ?? 0,
         statusDescription,
         lastStartTimeUtc,
         lastExitTimeUtc,
         restartCount,
         lastRestartTimeUtc,
         runtimeStatus,
         imagePullPolicy,
         priority,
         configurationInfo,
         env,
         secrets)
 {
     Preconditions.CheckArgument(type?.Equals("docker") ?? false);
 }
예제 #7
0
 public KubernetesModule(
     string name,
     string version,
     string type,
     ModuleStatus status,
     RestartPolicy restartPolicy,
     ConfigurationInfo configurationInfo,
     IDictionary <string, EnvVal> env,
     KubernetesConfig settings,
     ImagePullPolicy imagePullPolicy,
     KubernetesModuleOwner owner)
 {
     this.Name              = name;
     this.Version           = version;
     this.Type              = type;
     this.DesiredStatus     = status;
     this.RestartPolicy     = restartPolicy;
     this.ConfigurationInfo = configurationInfo ?? new ConfigurationInfo(string.Empty);
     this.Env             = env?.ToImmutableDictionary() ?? ImmutableDictionary <string, EnvVal> .Empty;
     this.Config          = settings;
     this.ImagePullPolicy = imagePullPolicy;
     this.StartupOrder    = Core.Constants.DefaultStartupOrder;
     this.Owner           = owner;
 }
        public async static Task RunNewContainer(RunNewContainerParameters parameters, IProducer <Null, string> p)
        {
            try {
                var exposedPorts     = new Dictionary <string, EmptyStruct>();
                var hostPortBindings = new Dictionary <string, IList <PortBinding> >();

                if (parameters.Ports != null)
                {
                    foreach (var portBinding in parameters.Ports)
                    {
                        exposedPorts.Add(portBinding.HostPort, default(EmptyStruct));
                        hostPortBindings.Add(portBinding.ContainerPort, new List <PortBinding> {
                            new PortBinding {
                                HostPort = portBinding.HostPort
                            }
                        });
                    }
                }

                RestartPolicy restartPolicy = new RestartPolicy {
                    Name = RestartPolicyKind.No
                };
                if (parameters.RestartPolicy != null)
                {
                    restartPolicy.MaximumRetryCount = parameters.RestartPolicy.MaximumRetryCount ?? 0;
                    switch (parameters.RestartPolicy.RestartPolicy)
                    {
                    case ContainerRestartPolicy.Always:
                        restartPolicy.Name = RestartPolicyKind.Always;
                        break;

                    case ContainerRestartPolicy.OnFailure:
                        restartPolicy.Name = RestartPolicyKind.OnFailure;
                        break;

                    case ContainerRestartPolicy.UnlessStopped:
                        restartPolicy.Name = RestartPolicyKind.UnlessStopped;
                        break;
                    }
                }
                var environment = new List <string>();
                if (parameters.Environment != null)
                {
                    foreach (var environmentEntry in parameters.Environment)
                    {
                        environment.Add(environmentEntry.Key + "=" + environmentEntry.Value);
                    }
                }
                var volumes = new List <string>();
                if (parameters.Volumes != null)
                {
                    foreach (var volumeEntry in parameters.Volumes)
                    {
                        volumes.Add(volumeEntry.HostPath + ":" + volumeEntry.ContainerPath);
                    }
                }
                var dockerResponse = await client.Containers.CreateContainerAsync(new CreateContainerParameters {
                    Image        = parameters.Image,
                    Cmd          = parameters.Command == null ? null : parameters.Command.Split(" "),
                    Name         = parameters.Name,
                    ExposedPorts = exposedPorts,
                    HostConfig   = new HostConfig {
                        PortBindings    = hostPortBindings,
                        PublishAllPorts = true,
                        RestartPolicy   = restartPolicy,
                        VolumesFrom     = parameters.VolumesFrom,
                        Binds           = volumes,
                        NetworkMode     = parameters.NetworkMode,
                    },
                    Env = environment,
                });

                // Update general info as quickly as possible and send it out so clients can see the newly created container quickly
                var updatedContainers = await DockerUpdater.FetchOverviewData();

                var overviewContainerUpdate = DockerUpdater.CreateOverViewData(updatedContainers);
                await KafkaHelpers.SendMessageAsync(DockerUpdater.OverviewTopic, overviewContainerUpdate, p);

                // Send response
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 201,
                    Message            = ResponseMessageContracts.CONTAINER_CREATED,
                    ContainerIds       = new string[] { dockerResponse.ID }
                }, p);

                await StartContainer(new StartContainerParameters { ContainerId = dockerResponse.ID }, p);
            } catch (DockerApiException ex) {
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 400,
                    Message            = ex.Message,
                    ContainerIds       = null
                }, p); // TODO: create contract for these error messages
            }
        }
예제 #9
0
        public ModuleStatus ComputeModuleStatusFromRestartPolicy(ModuleStatus status, RestartPolicy restartPolicy, int restartCount, DateTime lastExitTimeUtc)
        {
            // TODO: If the module state is "running", when we have health-probes implemented,
            // check whether the module is in a healthy state and update appropriately if not.

            // we don't really know what status "Unknown" means
            if (status == ModuleStatus.Unknown)
            {
                throw new ArgumentException("ModuleStatus unknown is not a valid status.", nameof(status));
            }

            if (status != ModuleStatus.Running && restartPolicy > RestartPolicy.Never)
            {
                // we need to act only if restart policy is "Always" (which means the module
                // state doesn't matter - it just needs to be not "Running") or it is "OnFailure" or
                // "OnUnhealthy" (which it would be if it isn't "Always" since we'd be in this
                // "if" block  only if the restart policy was greater than "Never") and the module
                // state is "Failed" or "Unhealthy"
                if (restartPolicy == RestartPolicy.Always || (status == ModuleStatus.Failed || status == ModuleStatus.Unhealthy))
                {
                    // if restart count is >= maxRestartCount then the module "failed" - otherwise
                    // it is going to be restarted and is in "Backoff" state
                    if (restartCount >= this.maxRestartCount)
                    {
                        // if the module is "Unhealthy" this will transition it to "Failed"
                        return(ModuleStatus.Failed);
                    }
                    else
                    {
                        return(ModuleStatus.Backoff);
                    }
                }
            }

            return(status);
        }
예제 #10
0
 public NonDockerModule(string name, string version, string type, ModuleStatus desiredStatus, RestartPolicy restartPolicy, ImagePullPolicy imagePullPolicy, ConfigurationInfo configurationInfo, IDictionary <string, EnvVal> env, string config)
 {
     this.Name              = name;
     this.Version           = version;
     this.Type              = type;
     this.DesiredStatus     = desiredStatus;
     this.RestartPolicy     = restartPolicy;
     this.ImagePullPolicy   = imagePullPolicy;
     this.ConfigurationInfo = configurationInfo;
     this.Env    = env;
     this.Config = config;
 }
예제 #11
0
 public TestHubModule(string name, string type, ModuleStatus desiredStatus, TestConfig config, RestartPolicy restartPolicy, ImagePullPolicy imagePullPolicy, uint startupOrder, ConfigurationInfo configuration, IDictionary <string, EnvVal> env)
     : base(name ?? Constants.EdgeHubModuleName, string.Empty, type, desiredStatus, config, restartPolicy, imagePullPolicy, startupOrder, configuration, env)
 {
     this.Version = string.Empty;
 }
예제 #12
0
        public void TestComputeModuleStatusFromRestartPolicy(ModuleStatus status, RestartPolicy restartPolicy, int restartCount, ModuleStatus expectedStatus)
        {
            var manager = new RestartPolicyManager(MaxRestartCount, CoolOffTimeUnitInSeconds);

            Assert.Equal(expectedStatus, manager.ComputeModuleStatusFromRestartPolicy(status, restartPolicy, restartCount, DateTime.MinValue));
        }
예제 #13
0
 public TestModule(string name, string version, string type, ModuleStatus desiredStatus,
                   TestConfig config, RestartPolicy restartPolicy, ConfigurationInfo configuration,
                   IDictionary <string, EnvVal> env)
     : base(name, version, type, desiredStatus, config, restartPolicy, configuration, env)
 {
 }
예제 #14
0
 public ComposeServiceBuilder Restart(RestartPolicy policy)
 {
     _config.Restart = policy;
     return(this);
 }