Browse Source

Add cleanup for docker images

davidfowl/dependencies
Ryan Nowak 7 years ago
parent
commit
c80e6e5f0e
  1. 66
      test/E2ETest/DockerAssert.cs
  2. 67
      test/E2ETest/TyeBuildTests.cs
  3. 104
      test/E2ETest/TyeGenerateTests.cs

66
test/E2ETest/DockerAssert.cs

@ -18,13 +18,9 @@ namespace E2ETest
// wierd and confusing. // wierd and confusing.
public static async Task AssertImageExistsAsync(ITestOutputHelper output, string repository) public static async Task AssertImageExistsAsync(ITestOutputHelper output, string repository)
{ {
if (repository is null)
{
throw new ArgumentNullException(nameof(repository));
}
var builder = new StringBuilder(); var builder = new StringBuilder();
output.WriteLine($"> docker images \"{repository}\" --format \"{{{{.Repository}}}}\"");
var exitCode = await Process.ExecuteAsync( var exitCode = await Process.ExecuteAsync(
"docker", "docker",
$"images \"{repository}\" --format \"{{{{.Repository}}}}\"", $"images \"{repository}\" --format \"{{{{.Repository}}}}\"",
@ -35,7 +31,7 @@ namespace E2ETest
throw new XunitException($"Running `docker images \"{repository}\"` failed." + Environment.NewLine + builder.ToString()); throw new XunitException($"Running `docker images \"{repository}\"` failed." + Environment.NewLine + builder.ToString());
} }
var lines = builder.ToString().Split(new[] { '\r', '\n', }); var lines = builder.ToString().Split(new[] { '\r', '\n', }, StringSplitOptions.RemoveEmptyEntries);
if (lines.Any(line => line == repository)) if (lines.Any(line => line == repository))
{ {
return; return;
@ -49,5 +45,63 @@ namespace E2ETest
output.WriteLine(text); output.WriteLine(text);
} }
} }
public static async Task DeleteDockerImagesAsync(ITestOutputHelper output, string repository)
{
var ids = await ListDockerImagesIdsAsync(output, repository);
var builder = new StringBuilder();
foreach (var id in ids)
{
output.WriteLine($"> docker rmi \"{id}\"");
var exitCode = await Process.ExecuteAsync(
"docker",
$"rmi \"{id}\"",
stdOut: OnOutput,
stdErr: OnOutput);
if (exitCode != 0)
{
throw new XunitException($"Running `docker rmi \"{id}\"` failed." + Environment.NewLine + builder.ToString());
}
builder.Clear();
}
void OnOutput(string text)
{
builder.AppendLine(text);
output.WriteLine(text);
}
}
private static async Task<string[]> ListDockerImagesIdsAsync(ITestOutputHelper output, string repository)
{
// docker images -q '{repository}' returns just the ID of the image (one per line)
// It does not fail if there are no matches, just returns empty output.
var builder = new StringBuilder();
output.WriteLine($"> docker images -q \"{repository}\"");
var exitCode = await Process.ExecuteAsync(
"docker",
$"images -q \"{repository}\"",
stdOut: OnOutput,
stdErr: OnOutput);
if (exitCode != 0)
{
throw new XunitException($"Running `docker images -q \"{repository}\"` failed." + Environment.NewLine + builder.ToString());
}
var lines = builder.ToString().Split(new[] { '\r', '\n', }, StringSplitOptions.RemoveEmptyEntries);
return lines;
void OnOutput(string text)
{
builder.AppendLine(text);
output.WriteLine(text);
}
}
} }
} }

67
test/E2ETest/TyeBuildTests.cs

@ -26,6 +26,8 @@ namespace E2ETest
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task SingleProjectBuildTest() public async Task SingleProjectBuildTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/test-project");
var projectName = "single-project"; var projectName = "single-project";
var environment = "production"; var environment = "production";
@ -39,15 +41,25 @@ namespace E2ETest
application.Registry = "test"; application.Registry = "test";
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
await DockerAssert.AssertImageExistsAsync(output, "test/test-project"); await DockerAssert.AssertImageExistsAsync(output, "test/test-project");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test/test-project");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task FrontendBackendBuildTest() public async Task FrontendBackendBuildTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
var projectName = "frontend-backend"; var projectName = "frontend-backend";
var environment = "production"; var environment = "production";
@ -61,16 +73,27 @@ namespace E2ETest
application.Registry = "test"; application.Registry = "test";
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await DockerAssert.AssertImageExistsAsync(output, "test/backend"); await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task MultipleProjectBuildTest() public async Task MultipleProjectBuildTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/worker");
var projectName = "multi-project"; var projectName = "multi-project";
var environment = "production"; var environment = "production";
@ -85,17 +108,28 @@ namespace E2ETest
application.Registry = "test"; application.Registry = "test";
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await DockerAssert.AssertImageExistsAsync(output, "test/backend"); await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/worker"); await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/worker");
}
finally
{
await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/worker");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task BuildDoesNotRequireRegistry() public async Task BuildDoesNotRequireRegistry()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test-project");
var projectName = "single-project"; var projectName = "single-project";
var environment = "production"; var environment = "production";
@ -107,9 +141,16 @@ namespace E2ETest
var application = ConfigFactory.FromFile(projectFile); var application = ConfigFactory.FromFile(projectFile);
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
await DockerAssert.AssertImageExistsAsync(output, "test-project"); await DockerAssert.AssertImageExistsAsync(output, "test-project");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test-project");
}
} }
} }
} }

104
test/E2ETest/TyeGenerateTests.cs

@ -26,6 +26,8 @@ namespace E2ETest
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task SingleProjectGenerateTest() public async Task SingleProjectGenerateTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/test-project");
var projectName = "single-project"; var projectName = "single-project";
var environment = "production"; var environment = "production";
@ -40,19 +42,30 @@ namespace E2ETest
// Need to add docker registry for generate // Need to add docker registry for generate
application.Registry = "test"; application.Registry = "test";
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
// name of application is the folder await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml"); // name of application is the folder
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
Assert.Equal(expectedContent, content); var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml");
Assert.Equal(expectedContent, content);
await DockerAssert.AssertImageExistsAsync(output, "test/test-project");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test/test-project");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task FrontendBackendGenerateTest() public async Task FrontendBackendGenerateTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
var projectName = "frontend-backend"; var projectName = "frontend-backend";
var environment = "production"; var environment = "production";
@ -67,19 +80,36 @@ namespace E2ETest
// Need to add docker registry for generate // Need to add docker registry for generate
application.Registry = "test"; application.Registry = "test";
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
// name of application is the folder
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml");
Assert.Equal(expectedContent, content);
// name of application is the folder await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml");
Assert.Equal(expectedContent, content); await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task MultipleProjectGenerateTest() public async Task MultipleProjectGenerateTest()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test/backend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/frontend");
await DockerAssert.DeleteDockerImagesAsync(output, "test/worker");
var projectName = "multi-project"; var projectName = "multi-project";
var environment = "production"; var environment = "production";
@ -94,19 +124,34 @@ namespace E2ETest
// Need to add docker registry for generate // Need to add docker registry for generate
application.Registry = "test"; application.Registry = "test";
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
// name of application is the folder await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml"); // name of application is the folder
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
Assert.Equal(expectedContent, content); var expectedContent = File.ReadAllText($"testassets/generate/{projectName}.yaml");
Assert.Equal(expectedContent, content);
await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/worker");
}
finally
{
await DockerAssert.AssertImageExistsAsync(output, "test/backend");
await DockerAssert.AssertImageExistsAsync(output, "test/frontend");
await DockerAssert.AssertImageExistsAsync(output, "test/worker");
}
} }
[ConditionalFact] [ConditionalFact]
[SkipIfDockerNotRunning] [SkipIfDockerNotRunning]
public async Task GenerateWorksWithoutRegistry() public async Task GenerateWorksWithoutRegistry()
{ {
await DockerAssert.DeleteDockerImagesAsync(output, "test-project");
var projectName = "single-project"; var projectName = "single-project";
var environment = "production"; var environment = "production";
@ -118,13 +163,24 @@ namespace E2ETest
var application = ConfigFactory.FromFile(projectFile); var application = ConfigFactory.FromFile(projectFile);
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false); try
{
await GenerateHost.ExecuteGenerateAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
// name of application is the folder
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}-noregistry.yaml");
Assert.Equal(expectedContent, content);
// name of application is the folder await BuildHost.ExecuteBuildAsync(new OutputContext(sink, Verbosity.Debug), application, environment, interactive: false);
var content = File.ReadAllText(Path.Combine(tempDirectory.DirectoryPath, $"{projectName}-generate-{environment}.yaml"));
var expectedContent = File.ReadAllText($"testassets/generate/{projectName}-noregistry.yaml");
Assert.Equal(expectedContent, content); await DockerAssert.AssertImageExistsAsync(output, "test-project");
}
finally
{
await DockerAssert.DeleteDockerImagesAsync(output, "test-project");
}
} }
} }
} }

Loading…
Cancel
Save