Пример #1
0
        /// <summary>
        ///  Expected return error code:
        ///     200 No error
        ///     500 server error
        /// </summary>
        internal async Task <ContainersPruneResponse> PruneContainersAsync(
            ContainersPruneConfig pruneConfig,
            TimeSpan timeout)
        {
            var requestPath = "containers/prune";
            var queryString = QueryParameterHelper.BuildQueryString(pruneConfig);

            var response = await this.client.MakeRequestAsync(
                HttpMethod.Post,
                requestPath,
                queryString,
                null,
                timeout).ConfigureAwait(false);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new ContainerApiException(response.StatusCode, response.Body);
            }

            return(ContainerServiceClient.JsonSerializer.DeserializeObject <ContainersPruneResponse>(response.Body));
        }
Пример #2
0
        internal async Task PruneContainers()
        {
            if (HostingConfig.Config.ContainerCleanupScanIntervalInMinutes <= 0)
            {
                HostingTrace.Source.WriteInfo(
                    TraceType,
                    "Container pruning is disabled as ContainerCleanupScanIntervalInMinutes is set to {0}.",
                    HostingConfig.Config.ContainerCleanupScanIntervalInMinutes);

                return;
            }

            var pruneInterval  = TimeSpan.FromMinutes(HostingConfig.Config.ContainerCleanupScanIntervalInMinutes);
            var untilFilterVal = $"{HostingConfig.Config.DeadContainerCleanupUntilInMinutes}m";
            var labelFilterVal = $"{ConfigHelper.PlatformLabelKeyName}={ConfigHelper.PlatformLabelKeyValue}";

            var pruneConfig = new ContainersPruneConfig()
            {
                Filters = new Dictionary <string, IList <string> >()
                {
                    { "until", new List <string> ()
                      {
                          untilFilterVal
                      } },
                    { "label", new List <string> ()
                      {
                          labelFilterVal
                      } }
                }
            };

            while (true)
            {
                try
                {
                    await Task.Delay(pruneInterval);

                    var pruneResp = await this.client.ContainerOperation.PruneContainersAsync(
                        pruneConfig,
                        HostingConfig.Config.DockerRequestTimeout);

                    HostingTrace.Source.WriteInfo(
                        TraceType,
                        "PruneContainers finished successfully. ContainersDeletedCount={0}, SpaceReclaimed={1} bytes.",
                        pruneResp.ContainersDeleted == null ? 0 : pruneResp.ContainersDeleted.Count,
                        pruneResp.SpaceReclaimed);
                }
                catch (ContainerApiException ex)
                {
                    HostingTrace.Source.WriteWarning(
                        TraceType,
                        "PruneContainers failed with StatusCode={0} with ResponseBody={1}.",
                        ex.StatusCode,
                        ex.ResponseBody);
                }
                catch (Exception ex)
                {
                    HostingTrace.Source.WriteWarning(
                        TraceType,
                        "PruneContainers failed with Exception={0}.",
                        ex);
                }
            }
        }
Пример #3
0
 internal static string BuildQueryString(ContainersPruneConfig pruneConfig)
 {
     return(BuildFilterParam(pruneConfig.Filters));
 }