/// <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)); }
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); } } }
internal static string BuildQueryString(ContainersPruneConfig pruneConfig) { return(BuildFilterParam(pruneConfig.Filters)); }