From 489c1728b471caefe63cd9616cd28670a18ac668 Mon Sep 17 00:00:00 2001 From: Johan Henkens Date: Fri, 14 Aug 2020 08:10:02 -0700 Subject: [PATCH] Fix ImageBuild Auth, message stream --- .gitignore | 5 ++- .../Endpoints/IImageOperations.cs | 5 ++- .../Endpoints/ImageOperations.cs | 43 ++++++++++++++++++- .../Models/ImageBuildParameters.Generated.cs | 3 -- .../Models/ImagePushParameters.Generated.cs | 6 --- 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index fe7d76462..1cda93a7f 100644 --- a/.gitignore +++ b/.gitignore @@ -187,4 +187,7 @@ packages/ .store SignClient nbgv -.vscode \ No newline at end of file +.vscode + +# OS X +.DS_Store \ No newline at end of file diff --git a/src/Docker.DotNet/Endpoints/IImageOperations.cs b/src/Docker.DotNet/Endpoints/IImageOperations.cs index 87a82a9d1..a3c2c9c79 100644 --- a/src/Docker.DotNet/Endpoints/IImageOperations.cs +++ b/src/Docker.DotNet/Endpoints/IImageOperations.cs @@ -47,10 +47,11 @@ public interface IImageOperations /// /// HTTP POST /build /// - /// 204 - No error. + /// 200 - No error. + /// 400 - Bad parameter. /// 500 - Server error. /// - Task BuildImageFromDockerfileAsync(Stream contents, ImageBuildParameters parameters, CancellationToken cancellationToken = default(CancellationToken)); + Task BuildImageFromDockerfileAsync(ImageBuildParameters parameters, Stream contents, IEnumerable authConfigs, IDictionary headers, IProgress progress, CancellationToken cancellationToken = default(CancellationToken)); /// /// Create an image. diff --git a/src/Docker.DotNet/Endpoints/ImageOperations.cs b/src/Docker.DotNet/Endpoints/ImageOperations.cs index 0252aeb23..fa1f37d13 100644 --- a/src/Docker.DotNet/Endpoints/ImageOperations.cs +++ b/src/Docker.DotNet/Endpoints/ImageOperations.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; using System.Text; @@ -21,6 +22,7 @@ internal class ImageOperations : IImageOperations }; private const string RegistryAuthHeaderKey = "X-Registry-Auth"; + private const string RegistryConfigHeaderKey = "X-Registry-Config"; private const string TarContentType = "application/x-tar"; private const string ImportFromBodySource = "-"; @@ -43,7 +45,7 @@ internal ImageOperations(DockerClient client) return this._client.JsonSerializer.DeserializeObject(response.Body); } - public Task BuildImageFromDockerfileAsync(Stream contents, ImageBuildParameters parameters, CancellationToken cancellationToken = default(CancellationToken)) + public Task BuildImageFromDockerfileAsync(ImageBuildParameters parameters, Stream contents, IEnumerable authConfigs, IDictionary headers, IProgress progress, CancellationToken cancellationToken = default(CancellationToken)) { if (contents == null) { @@ -55,9 +57,34 @@ internal ImageOperations(DockerClient client) throw new ArgumentNullException(nameof(parameters)); } + HttpMethod httpMethod = HttpMethod.Post; + var data = new BinaryRequestContent(contents, TarContentType); + IQueryString queryParameters = new QueryString(parameters); - return this._client.MakeRequestForStreamAsync(this._client.NoErrorHandlers, HttpMethod.Post, "build", queryParameters, data, cancellationToken); + + Dictionary customHeaders = RegistryConfigHeaders(authConfigs); + + if (headers != null) + { + foreach (string key in headers.Keys) + { + customHeaders[key] = headers[key]; + } + } + + return StreamUtil.MonitorResponseForMessagesAsync( + this._client.MakeRequestForRawResponseAsync( + httpMethod, + "build", + queryParameters, + data, + customHeaders, + cancellationToken), + this._client, + cancellationToken, + progress + ); } public Task CreateImageAsync(ImagesCreateParameters parameters, AuthConfig authConfig, IProgress progress, CancellationToken cancellationToken = default(CancellationToken)) @@ -269,5 +296,17 @@ private Dictionary RegistryAuthHeaders(AuthConfig authConfig) } }; } + + private Dictionary RegistryConfigHeaders(IEnumerable authConfig) + { + var configDictionary = (authConfig ?? new AuthConfig[0]).ToDictionary(e => e.ServerAddress, e => e); + return new Dictionary + { + { + RegistryConfigHeaderKey, + Convert.ToBase64String(Encoding.UTF8.GetBytes(this._client.JsonSerializer.SerializeObject(configDictionary))) + } + }; + } } } \ No newline at end of file diff --git a/src/Docker.DotNet/Models/ImageBuildParameters.Generated.cs b/src/Docker.DotNet/Models/ImageBuildParameters.Generated.cs index a108fecd6..b63a5368c 100644 --- a/src/Docker.DotNet/Models/ImageBuildParameters.Generated.cs +++ b/src/Docker.DotNet/Models/ImageBuildParameters.Generated.cs @@ -69,9 +69,6 @@ public class ImageBuildParameters // (main.ImageBuildParameters) [QueryStringParameter("buildargs", false, typeof(MapQueryStringConverter))] public IDictionary BuildArgs { get; set; } - [DataMember(Name = "AuthConfigs", EmitDefaultValue = false)] - public IDictionary AuthConfigs { get; set; } - [QueryStringParameter("labels", false, typeof(MapQueryStringConverter))] public IDictionary Labels { get; set; } diff --git a/src/Docker.DotNet/Models/ImagePushParameters.Generated.cs b/src/Docker.DotNet/Models/ImagePushParameters.Generated.cs index 8a20c6a1f..765b29093 100644 --- a/src/Docker.DotNet/Models/ImagePushParameters.Generated.cs +++ b/src/Docker.DotNet/Models/ImagePushParameters.Generated.cs @@ -5,13 +5,7 @@ namespace Docker.DotNet.Models [DataContract] public class ImagePushParameters // (main.ImagePushParameters) { - [QueryStringParameter("fromImage", false)] - public string ImageID { get; set; } - [QueryStringParameter("tag", false)] public string Tag { get; set; } - - [DataMember(Name = "RegistryAuth", EmitDefaultValue = false)] - public AuthConfig RegistryAuth { get; set; } } }