Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All"/>
<PackageReference Include="Nerdbank.GitVersioning" Version="3.1.91">
<PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
Expand Down
45 changes: 23 additions & 22 deletions src/Docker.DotNet/Endpoints/StreamUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Docker.DotNet.Models
{
internal static class StreamUtil
{
private static Newtonsoft.Json.JsonSerializer _serializer = new Newtonsoft.Json.JsonSerializer();

internal static async Task MonitorStreamAsync(Task<Stream> streamTask, DockerClient client, CancellationToken cancel, IProgress<string> progress)
{
using (var stream = await streamTask)
Expand All @@ -31,29 +34,13 @@ internal static async Task MonitorStreamAsync(Task<Stream> streamTask, DockerCli
internal static async Task MonitorStreamForMessagesAsync<T>(Task<Stream> streamTask, DockerClient client, CancellationToken cancel, IProgress<T> progress)
{
using (var stream = await streamTask)
using (var reader = new StreamReader(stream, new UTF8Encoding(false)))
using (var jsonReader = new JsonTextReader(reader) { SupportMultipleContent = true })
{
// ReadLineAsync must be cancelled by closing the whole stream.
using (cancel.Register(() => stream.Dispose()))
while (await jsonReader.ReadAsync().WithCancellation(cancel))
{
using (var reader = new StreamReader(stream, new UTF8Encoding(false)))
{
string line;
try
{
while ((line = await reader.ReadLineAsync()) != null)
{
var prog = client.JsonSerializer.DeserializeObject<T>(line);
if (prog == null) continue;

progress.Report(prog);
}
}
catch (ObjectDisposedException)
{
// The subsequent call to reader.ReadLineAsync() after cancellation
// will fail because we disposed the stream. Just ignore here.
}
}
var ev = _serializer.Deserialize<T>(jsonReader);
progress?.Report(ev);
}
}
}
Expand Down Expand Up @@ -92,5 +79,19 @@ internal static async Task MonitorResponseForMessagesAsync<T>(Task<HttpResponseM
}
}
}

private static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
var tcs = new TaskCompletionSource<bool>();
using (cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs))
{
if (task != await Task.WhenAny(task, tcs.Task))
{
throw new OperationCanceledException(cancellationToken);
}
}

return await task;
}
}
}
}
2 changes: 1 addition & 1 deletion src/Docker.DotNet/Endpoints/SwarmOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ async Task<ServiceUpdateResponse> ISwarmOperations.UpdateServiceAsync(string id,
return this._client.JsonSerializer.DeserializeObject<ServiceUpdateResponse>(response.Body);
}

async Task ISwarmOperations.UpdateSwarmAsync(SwarmUpdateParameters parameters, CancellationToken cancellationToken)
async Task ISwarmOperations.UpdateSwarmAsync(SwarmUpdateParameters parameters, CancellationToken cancellationToken)
{
var query = new QueryString<SwarmUpdateParameters>(parameters ?? throw new ArgumentNullException(nameof(parameters)));
var body = new JsonRequestContent<Spec>(parameters.Spec ?? throw new ArgumentNullException(nameof(parameters.Spec)), this._client.JsonSerializer);
Expand Down
31 changes: 31 additions & 0 deletions src/Docker.DotNet/JsonBase64Converter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Docker.DotNet
{
internal class JsonBase64Converter : JsonConverter
{
private static readonly Type _byteListType = typeof(IList<byte>);
public override bool CanRead => true;

public override bool CanWrite => false;

public override void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
var strVal = reader.Value as string;

return Convert.FromBase64String(strVal);
}

public override bool CanConvert(Type objectType)
{
return objectType == _byteListType;
}
}
}
3 changes: 2 additions & 1 deletion src/Docker.DotNet/JsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ internal class JsonSerializer
new JsonVersionConverter(),
new StringEnumConverter(),
new TimeSpanSecondsConverter(),
new TimeSpanNanosecondsConverter()
new TimeSpanNanosecondsConverter(),
new JsonBase64Converter()
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Docker.DotNet.Models
[DataContract]
public class ContainerExecInspectResponse // (types.ContainerExecInspect)
{
[DataMember(Name = "ExecID", EmitDefaultValue = false)]
[DataMember(Name = "ID", EmitDefaultValue = false)]
public string ExecID { get; set; }

[DataMember(Name = "ContainerID", EmitDefaultValue = false)]
Expand Down
10 changes: 8 additions & 2 deletions src/Docker.DotNet/Models/ContainerSpec.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,13 @@ public class ContainerSpec // (swarm.ContainerSpec)
[DataMember(Name = "Sysctls", EmitDefaultValue = false)]
public IDictionary<string, string> Sysctls { get; set; }

[DataMember(Name = "Capabilities", EmitDefaultValue = false)]
public IList<string> Capabilities { get; set; }
[DataMember(Name = "CapabilityAdd", EmitDefaultValue = false)]
public IList<string> CapabilityAdd { get; set; }

[DataMember(Name = "CapabilityDrop", EmitDefaultValue = false)]
public IList<string> CapabilityDrop { get; set; }

[DataMember(Name = "Ulimits", EmitDefaultValue = false)]
public IList<Ulimit> Ulimits { get; set; }
}
}
9 changes: 9 additions & 0 deletions src/Docker.DotNet/Models/GlobalJob.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class GlobalJob // (swarm.GlobalJob)
{
}
}
3 changes: 0 additions & 3 deletions src/Docker.DotNet/Models/HostConfig.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,6 @@ public HostConfig(Resources Resources)
[DataMember(Name = "CapDrop", EmitDefaultValue = false)]
public IList<string> CapDrop { get; set; }

[DataMember(Name = "Capabilities", EmitDefaultValue = false)]
public IList<string> Capabilities { get; set; }

[DataMember(Name = "CgroupnsMode", EmitDefaultValue = false)]
public string CgroupnsMode { get; set; }

Expand Down
3 changes: 0 additions & 3 deletions src/Docker.DotNet/Models/ImagesListParameters.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ namespace Docker.DotNet.Models
[DataContract]
public class ImagesListParameters // (main.ImagesListParameters)
{
[QueryStringParameter("filter", false)]
public string MatchName { get; set; }

[QueryStringParameter("all", false, typeof(BoolQueryStringConverter))]
public bool? All { get; set; }

Expand Down
7 changes: 7 additions & 0 deletions src/Docker.DotNet/Models/ImagesSearchParameters.Generated.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
Expand All @@ -8,6 +9,12 @@ public class ImagesSearchParameters // (main.ImagesSearchParameters)
[QueryStringParameter("term", false)]
public string Term { get; set; }

[QueryStringParameter("limit", false)]
public long? Limit { get; set; }

[QueryStringParameter("filters", false, typeof(MapQueryStringConverter))]
public IDictionary<string, IDictionary<string, bool>> Filters { get; set; }

[DataMember(Name = "RegistryAuth", EmitDefaultValue = false)]
public AuthConfig RegistryAuth { get; set; }
}
Expand Down
15 changes: 15 additions & 0 deletions src/Docker.DotNet/Models/JobStatus.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class JobStatus // (swarm.JobStatus)
{
[DataMember(Name = "JobIteration", EmitDefaultValue = false)]
public Version JobIteration { get; set; }

[DataMember(Name = "LastExecution", EmitDefaultValue = false)]
public DateTime LastExecution { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/Docker.DotNet/Models/NetworkAddressPool.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class NetworkAddressPool // (types.NetworkAddressPool)
{
[DataMember(Name = "Base", EmitDefaultValue = false)]
public string Base { get; set; }

[DataMember(Name = "Size", EmitDefaultValue = false)]
public long Size { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/Docker.DotNet/Models/ReplicatedJob.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class ReplicatedJob // (swarm.ReplicatedJob)
{
[DataMember(Name = "MaxConcurrent", EmitDefaultValue = false)]
public ulong? MaxConcurrent { get; set; }

[DataMember(Name = "TotalCompletions", EmitDefaultValue = false)]
public ulong? TotalCompletions { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/Docker.DotNet/Models/ResourceRequirements.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Docker.DotNet.Models
public class ResourceRequirements // (swarm.ResourceRequirements)
{
[DataMember(Name = "Limits", EmitDefaultValue = false)]
public SwarmResources Limits { get; set; }
public SwarmLimit Limits { get; set; }

[DataMember(Name = "Reservations", EmitDefaultValue = false)]
public SwarmResources Reservations { get; set; }
Expand Down
16 changes: 7 additions & 9 deletions src/Docker.DotNet/Models/ServiceFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,28 @@ public class ServicesListParameters
[QueryStringParameter("filters", false, typeof(MapQueryStringConverter))]
public ServiceFilter Filters { get; set; }
}

public class ServiceFilter : Dictionary<string, string>
public class ServiceFilter : Dictionary<string, string[]>
{
public string Id
public string[] Id
{
get => this["id"];
set => this["id"] = value;
}
public string Label
public string[] Label
{
get => this["label"];
set => this["label"] = value;
}
public ServiceCreationMode Mode
public ServiceCreationMode[] Mode
{
get => !Enum.TryParse(this["mode"], out ServiceCreationMode mode) ? ServiceCreationMode.Replicated : mode;
set => this["mode"] = value.ToString();
get => this["mode"]?.ToList().Select(m => (ServiceCreationMode)Enum.Parse(typeof(ServiceCreationMode), m)).ToArray();
set => this["mode"] = value?.Select(m => m.ToString()).ToArray();
}
public string Name
public string[] Name
{
get => this["name"];
set => this["name"] = value;
}

}

public enum ServiceCreationMode
Expand Down
15 changes: 15 additions & 0 deletions src/Docker.DotNet/Models/ServiceListParameters.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class ServiceListParameters // (main.ServiceListParameters)
{
[QueryStringParameter("filters", false, typeof(MapQueryStringConverter))]
public IDictionary<string, IDictionary<string, bool>> Filters { get; set; }

[QueryStringParameter("status", false, typeof(BoolQueryStringConverter))]
public bool? Status { get; set; }
}
}
29 changes: 29 additions & 0 deletions src/Docker.DotNet/Models/ServiceLogsParameters.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class ServiceLogsParameters // (main.ServiceLogsParameters)
{
[QueryStringParameter("stdout", false, typeof(BoolQueryStringConverter))]
public bool? ShowStdout { get; set; }

[QueryStringParameter("stderr", false, typeof(BoolQueryStringConverter))]
public bool? ShowStderr { get; set; }

[QueryStringParameter("since", false)]
public string Since { get; set; }

[QueryStringParameter("timestamps", false, typeof(BoolQueryStringConverter))]
public bool? Timestamps { get; set; }

[QueryStringParameter("follow", false, typeof(BoolQueryStringConverter))]
public bool? Follow { get; set; }

[QueryStringParameter("tail", false)]
public string Tail { get; set; }

[QueryStringParameter("details", false, typeof(BoolQueryStringConverter))]
public bool? Details { get; set; }
}
}
6 changes: 6 additions & 0 deletions src/Docker.DotNet/Models/ServiceMode.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,11 @@ public class ServiceMode // (swarm.ServiceMode)

[DataMember(Name = "Global", EmitDefaultValue = false)]
public GlobalService Global { get; set; }

[DataMember(Name = "ReplicatedJob", EmitDefaultValue = false)]
public ReplicatedJob ReplicatedJob { get; set; }

[DataMember(Name = "GlobalJob", EmitDefaultValue = false)]
public GlobalJob GlobalJob { get; set; }
}
}
3 changes: 3 additions & 0 deletions src/Docker.DotNet/Models/ServiceStatus.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,8 @@ public class ServiceStatus // (swarm.ServiceStatus)

[DataMember(Name = "DesiredTasks", EmitDefaultValue = false)]
public ulong DesiredTasks { get; set; }

[DataMember(Name = "CompletedTasks", EmitDefaultValue = false)]
public ulong CompletedTasks { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/Docker.DotNet/Models/ShimConfig.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class ShimConfig // (types.ShimConfig)
{
[DataMember(Name = "Binary", EmitDefaultValue = false)]
public string Binary { get; set; }

[DataMember(Name = "Opts", EmitDefaultValue = false)]
public object Opts { get; set; }
}
}
Loading