Skip to content

Commit 27cef85

Browse files
authored
Fix #518, #522 (#586)
* fix(#518): Dispose HttpClient * fix(#522): Remove extra properties from ImageBuildParameters * fix: Disable CreateContainerAsync_TimeoutExpires_Fails (not deterministic), await containerLogsTask at the end of the GetContainerLogs_* tests
1 parent 13ad3a1 commit 27cef85

File tree

4 files changed

+50
-133
lines changed

4 files changed

+50
-133
lines changed

src/Docker.DotNet/DockerClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ await sock.ConnectAsync(new Microsoft.Net.Http.Client.UnixDomainSocketEndPoint(p
151151
public void Dispose()
152152
{
153153
Configuration.Dispose();
154+
_client.Dispose();
154155
}
155156

156157
internal Task<DockerApiResponse> MakeRequestAsync(

src/Docker.DotNet/Models/ImageBuildParameters.Generated.cs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,12 @@ public class ImageBuildParameters // (main.ImageBuildParameters)
2424
[QueryStringParameter("forcerm", false, typeof(BoolQueryStringConverter))]
2525
public bool? ForceRemove { get; set; }
2626

27-
[QueryStringParameter("pullparent", false, typeof(BoolQueryStringConverter))]
28-
public bool? PullParent { get; set; }
29-
3027
[QueryStringParameter("pull", false)]
3128
public string Pull { get; set; }
3229

33-
[QueryStringParameter("isolation", false)]
34-
public string Isolation { get; set; }
35-
3630
[QueryStringParameter("cpusetcpus", false)]
3731
public string CPUSetCPUs { get; set; }
3832

39-
[QueryStringParameter("cpusetmems", false)]
40-
public string CPUSetMems { get; set; }
41-
4233
[QueryStringParameter("cpushares", false)]
4334
public long? CPUShares { get; set; }
4435

@@ -54,9 +45,6 @@ public class ImageBuildParameters // (main.ImageBuildParameters)
5445
[QueryStringParameter("memswap", false)]
5546
public long? MemorySwap { get; set; }
5647

57-
[QueryStringParameter("cgroupparent", false)]
58-
public string CgroupParent { get; set; }
59-
6048
[QueryStringParameter("networkmode", false)]
6149
public string NetworkMode { get; set; }
6250

@@ -66,9 +54,6 @@ public class ImageBuildParameters // (main.ImageBuildParameters)
6654
[QueryStringParameter("dockerfile", false)]
6755
public string Dockerfile { get; set; }
6856

69-
[QueryStringParameter("ulimits", false, typeof(EnumerableQueryStringConverter))]
70-
public IList<Ulimit> Ulimits { get; set; }
71-
7257
[QueryStringParameter("buildargs", false, typeof(MapQueryStringConverter))]
7358
public IDictionary<string, string> BuildArgs { get; set; }
7459

@@ -81,18 +66,12 @@ public class ImageBuildParameters // (main.ImageBuildParameters)
8166
[QueryStringParameter("cachefrom", false, typeof(EnumerableQueryStringConverter))]
8267
public IList<string> CacheFrom { get; set; }
8368

84-
[QueryStringParameter("securityopt", false, typeof(EnumerableQueryStringConverter))]
85-
public IList<string> SecurityOpt { get; set; }
86-
8769
[QueryStringParameter("extrahosts", false, typeof(EnumerableQueryStringConverter))]
8870
public IList<string> ExtraHosts { get; set; }
8971

9072
[QueryStringParameter("target", false)]
9173
public string Target { get; set; }
9274

93-
[QueryStringParameter("session", false)]
94-
public string SessionID { get; set; }
95-
9675
[QueryStringParameter("platform", false)]
9776
public string Platform { get; set; }
9877

test/Docker.DotNet.Tests/IContainerOperationsTests.cs

Lines changed: 49 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public async Task CreateContainerAsync_CreatesContainer()
5454
}
5555

5656
// Timeout causing task to be cancelled
57-
[Theory]
57+
[Theory(Skip = "There is nothing we can do to delay CreateContainerAsync (aka HttpClient.SendAsync) deterministic. We cannot control if it responses successful before the timeout.")]
5858
[InlineData(1)]
5959
[InlineData(5)]
6060
[InlineData(10)]
@@ -87,10 +87,9 @@ public async Task CreateContainerAsync_TimeoutExpires_Fails(int millisecondsTime
8787
}
8888

8989
[Fact]
90-
public async Task GetContainerLogs_Follow_False_TaskIsCompleted()
90+
public async Task GetContainerLogs_Tty_False_Follow_True_TaskIsCompleted()
9191
{
9292
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
93-
var logList = new List<string>();
9493

9594
var createContainerResponse = await _dockerClient.Containers.CreateContainerAsync(
9695
new CreateContainerParameters()
@@ -108,7 +107,7 @@ await _dockerClient.Containers.StartContainerAsync(
108107
_cts.Token
109108
);
110109

111-
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(20));
110+
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(5));
112111

113112
var containerLogsTask = _dockerClient.Containers.GetContainerLogsAsync(
114113
createContainerResponse.ID,
@@ -120,7 +119,7 @@ await _dockerClient.Containers.StartContainerAsync(
120119
Follow = true
121120
},
122121
containerLogsCts.Token,
123-
new Progress<string>((m) => { _output.WriteLine(m); logList.Add(m); })
122+
new Progress<string>(m => _output.WriteLine(m))
124123
);
125124

126125
await _dockerClient.Containers.StopContainerAsync(
@@ -136,7 +135,7 @@ await _dockerClient.Containers.StopContainerAsync(
136135
[Fact]
137136
public async Task GetContainerLogs_Tty_False_Follow_False_ReadsLogs()
138137
{
139-
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(50));
138+
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
140139
var logList = new List<string>();
141140

142141
var createContainerResponse = await _dockerClient.Containers.CreateContainerAsync(
@@ -155,7 +154,9 @@ await _dockerClient.Containers.StartContainerAsync(
155154
_cts.Token
156155
);
157156

158-
await _dockerClient.Containers.GetContainerLogsAsync(
157+
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(5));
158+
159+
var containerLogsTask = _dockerClient.Containers.GetContainerLogsAsync(
159160
createContainerResponse.ID,
160161
new ContainerLogsParameters
161162
{
@@ -165,33 +166,33 @@ await _dockerClient.Containers.GetContainerLogsAsync(
165166
Follow = false
166167
},
167168
containerLogsCts.Token,
168-
new Progress<string>((m) => { logList.Add(m); _output.WriteLine(m); })
169+
new Progress<string>(m => { logList.Add(m); _output.WriteLine(m); })
169170
);
170171

171172
await _dockerClient.Containers.StopContainerAsync(
172173
createContainerResponse.ID,
173174
new ContainerStopParameters(),
174175
_cts.Token
175-
);
176+
);
176177

178+
await containerLogsTask;
177179
_output.WriteLine($"Line count: {logList.Count}");
178180

179181
Assert.NotEmpty(logList);
180182
}
181183

182184
[Fact]
183-
public async Task GetContainerLogs_Tty_False_Follow_True_Requires_Task_To_Be_Cancelled()
185+
public async Task GetContainerLogs_Tty_True_Follow_False_ReadsLogs()
184186
{
185-
using var containerLogsCts = CancellationTokenSource.CreateLinkedTokenSource(_cts.Token);
186-
187+
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
187188
var logList = new List<string>();
188189

189190
var createContainerResponse = await _dockerClient.Containers.CreateContainerAsync(
190191
new CreateContainerParameters()
191192
{
192193
Image = _imageId,
193194
Name = Guid.NewGuid().ToString(),
194-
Tty = false
195+
Tty = true
195196
},
196197
_cts.Token
197198
);
@@ -204,33 +205,44 @@ await _dockerClient.Containers.StartContainerAsync(
204205

205206
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(5));
206207

207-
// Will be cancelled after CancellationTokenSource interval, would run forever otherwise
208-
await Assert.ThrowsAsync<TaskCanceledException>(() => _dockerClient.Containers.GetContainerLogsAsync(
208+
var containerLogsTask = _dockerClient.Containers.GetContainerLogsAsync(
209209
createContainerResponse.ID,
210210
new ContainerLogsParameters
211211
{
212212
ShowStderr = true,
213213
ShowStdout = true,
214214
Timestamps = true,
215-
Follow = true
215+
Follow = false
216216
},
217217
containerLogsCts.Token,
218-
new Progress<string>((m) => { _output.WriteLine(JsonConvert.SerializeObject(m)); logList.Add(m); })
219-
));
218+
new Progress<string>(m => { _output.WriteLine(m); logList.Add(m); })
219+
);
220+
221+
await Task.Delay(TimeSpan.FromSeconds(5));
222+
223+
await _dockerClient.Containers.StopContainerAsync(
224+
createContainerResponse.ID,
225+
new ContainerStopParameters(),
226+
_cts.Token
227+
);
228+
229+
await containerLogsTask;
230+
_output.WriteLine($"Line count: {logList.Count}");
231+
232+
Assert.NotEmpty(logList);
220233
}
221234

222235
[Fact]
223-
public async Task GetContainerLogs_Tty_True_Follow_True_Requires_Task_To_Be_Cancelled()
236+
public async Task GetContainerLogs_Tty_False_Follow_True_Requires_Task_To_Be_Cancelled()
224237
{
225238
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
226-
var logList = new List<string>();
227239

228240
var createContainerResponse = await _dockerClient.Containers.CreateContainerAsync(
229241
new CreateContainerParameters()
230242
{
231243
Image = _imageId,
232244
Name = Guid.NewGuid().ToString(),
233-
Tty = true
245+
Tty = false
234246
},
235247
_cts.Token
236248
);
@@ -241,9 +253,9 @@ await _dockerClient.Containers.StartContainerAsync(
241253
_cts.Token
242254
);
243255

244-
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(10));
256+
containerLogsCts.CancelAfter(TimeSpan.FromSeconds(5));
245257

246-
var containerLogsTask = _dockerClient.Containers.GetContainerLogsAsync(
258+
await Assert.ThrowsAsync<TaskCanceledException>(() => _dockerClient.Containers.GetContainerLogsAsync(
247259
createContainerResponse.ID,
248260
new ContainerLogsParameters
249261
{
@@ -253,17 +265,14 @@ await _dockerClient.Containers.StartContainerAsync(
253265
Follow = true
254266
},
255267
containerLogsCts.Token,
256-
new Progress<string>((m) => { _output.WriteLine(m); logList.Add(m); })
257-
);
258-
259-
await Assert.ThrowsAsync<TaskCanceledException>(() => containerLogsTask);
268+
new Progress<string>(m => _output.WriteLine(m))
269+
));
260270
}
261271

262272
[Fact]
263-
public async Task GetContainerLogs_Tty_True_Follow_True_StreamLogs_TaskIsCancelled()
273+
public async Task GetContainerLogs_Tty_True_Follow_True_Requires_Task_To_Be_Cancelled()
264274
{
265275
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
266-
var logList = new List<string>();
267276

268277
var createContainerResponse = await _dockerClient.Containers.CreateContainerAsync(
269278
new CreateContainerParameters()
@@ -293,53 +302,14 @@ await _dockerClient.Containers.StartContainerAsync(
293302
Follow = true
294303
},
295304
containerLogsCts.Token,
296-
new Progress<string>((m) => { _output.WriteLine(m); logList.Add(m); })
297-
);
298-
299-
await Task.Delay(TimeSpan.FromSeconds(10));
300-
301-
await _dockerClient.Containers.StopContainerAsync(
302-
createContainerResponse.ID,
303-
new ContainerStopParameters
304-
{
305-
WaitBeforeKillSeconds = 0
306-
},
307-
_cts.Token
308-
);
309-
310-
await _dockerClient.Containers.RemoveContainerAsync(
311-
createContainerResponse.ID,
312-
new ContainerRemoveParameters
313-
{
314-
Force = true
315-
},
316-
_cts.Token
305+
new Progress<string>(m => _output.WriteLine(m))
317306
);
318307

319308
await Assert.ThrowsAsync<TaskCanceledException>(() => containerLogsTask);
320-
321-
_output.WriteLine(JsonConvert.SerializeObject(new
322-
{
323-
AsyncState = containerLogsTask.AsyncState,
324-
CreationOptions = containerLogsTask.CreationOptions,
325-
Exception = containerLogsTask.Exception,
326-
Id = containerLogsTask.Id,
327-
IsCanceled = containerLogsTask.IsCanceled,
328-
IsCompleted = containerLogsTask.IsCompleted,
329-
IsCompletedSuccessfully = containerLogsTask.IsCompletedSuccessfully,
330-
Status = containerLogsTask.Status
331-
}
332-
));
333-
334-
_output.WriteLine($"Line count: {logList.Count}");
335-
336-
await Task.Delay(TimeSpan.FromSeconds(1));
337-
338-
Assert.NotEmpty(logList);
339309
}
340310

341311
[Fact]
342-
public async Task GetContainerLogs_Tty_True_ReadsLogs()
312+
public async Task GetContainerLogs_Tty_True_Follow_True_ReadsLogs_TaskIsCancelled()
343313
{
344314
using var containerLogsCts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
345315
var logList = new List<string>();
@@ -369,47 +339,22 @@ await _dockerClient.Containers.StartContainerAsync(
369339
ShowStderr = true,
370340
ShowStdout = true,
371341
Timestamps = true,
372-
Follow = false
342+
Follow = true
373343
},
374344
containerLogsCts.Token,
375-
new Progress<string>((m) => { _output.WriteLine(m); logList.Add(m); })
345+
new Progress<string>(m => { _output.WriteLine(m); logList.Add(m); })
376346
);
377347

378-
await Task.Delay(TimeSpan.FromSeconds(10));
348+
await Task.Delay(TimeSpan.FromSeconds(5));
379349

380350
await _dockerClient.Containers.StopContainerAsync(
381351
createContainerResponse.ID,
382-
new ContainerStopParameters
383-
{
384-
WaitBeforeKillSeconds = 0
385-
},
386-
_cts.Token
387-
);
388-
389-
await _dockerClient.Containers.RemoveContainerAsync(
390-
createContainerResponse.ID,
391-
new ContainerRemoveParameters
392-
{
393-
Force = true
394-
},
352+
new ContainerStopParameters(),
395353
_cts.Token
396354
);
397355

398-
await containerLogsTask;
399-
400-
_output.WriteLine(JsonConvert.SerializeObject(new
401-
{
402-
AsyncState = containerLogsTask.AsyncState,
403-
CreationOptions = containerLogsTask.CreationOptions,
404-
Exception = containerLogsTask.Exception,
405-
Id = containerLogsTask.Id,
406-
IsCanceled = containerLogsTask.IsCanceled,
407-
IsCompleted = containerLogsTask.IsCompleted,
408-
IsCompletedSuccessfully = containerLogsTask.IsCompletedSuccessfully,
409-
Status = containerLogsTask.Status
410-
}
411-
));
412356

357+
await Assert.ThrowsAsync<TaskCanceledException>(() => containerLogsTask);
413358
_output.WriteLine($"Line count: {logList.Count}");
414359

415360
Assert.NotEmpty(logList);
@@ -445,7 +390,7 @@ await _dockerClient.Containers.GetContainerStatsAsync(
445390
{
446391
Stream = false
447392
},
448-
new Progress<ContainerStatsResponse>((m) => { _output.WriteLine(m.ID); containerStatsList.Add(m); }),
393+
new Progress<ContainerStatsResponse>(m => { _output.WriteLine(m.ID); containerStatsList.Add(m); }),
449394
tcs.Token
450395
);
451396

@@ -492,7 +437,7 @@ await _dockerClient.Containers.GetContainerStatsAsync(
492437
{
493438
Stream = true
494439
},
495-
new Progress<ContainerStatsResponse>((m) => { containerStatsList.Add(m); _output.WriteLine(JsonConvert.SerializeObject(m)); }),
440+
new Progress<ContainerStatsResponse>(m => { containerStatsList.Add(m); _output.WriteLine(JsonConvert.SerializeObject(m)); }),
496441
linkedCts.Token
497442
);
498443
}
@@ -536,7 +481,7 @@ await _dockerClient.Containers.GetContainerStatsAsync(
536481
{
537482
Stream = false
538483
},
539-
new Progress<ContainerStatsResponse>((m) => { _output.WriteLine(m.ID); containerStatsList.Add(m); }),
484+
new Progress<ContainerStatsResponse>(m => { _output.WriteLine(m.ID); containerStatsList.Add(m); }),
540485
tcs.Token
541486
);
542487

@@ -585,7 +530,7 @@ await _dockerClient.Containers.GetContainerStatsAsync(
585530
{
586531
Stream = true
587532
},
588-
new Progress<ContainerStatsResponse>((m) => { containerStatsList.Add(m); _output.WriteLine(JsonConvert.SerializeObject(m)); }),
533+
new Progress<ContainerStatsResponse>(m => { containerStatsList.Add(m); _output.WriteLine(JsonConvert.SerializeObject(m)); }),
589534
linkedTcs.Token
590535
);
591536
}

0 commit comments

Comments
 (0)