public void ShouldRemoveImagesInLastTouchDateOrder_WhenDeletionOrderSetToByImageLastTouchDate_UsingRecords() { var eventRecord = new Dictionary <string, DateTime>() { { "A", DateTime.UtcNow.AddDays(-3) }, { "B", DateTime.UtcNow.AddDays(-2) }, }; var strategy = new ByDiskSpaceRecyclingStrategy(0, new Matchlist(), new Matchlist("dead,exited"), eventRecord, ImageDeletionOrderType.ByImageLastTouchDate); // 200MB var images = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "A", Created = DateTime.UtcNow.AddDays(-5), // 5 day Size = 100 * 1024 * 1024 // 100 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "B", Created = DateTime.UtcNow.AddDays(-10), // 10 days Size = 200 * 1024 * 1024 // 200 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "C", Created = DateTime.UtcNow.AddDays(-15), // 15 days Size = 300 * 1024 * 1024 // 300 MB }, }, }; _fixParentRef(images); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 3); Assert.True(string.Equals(imagesToBeRecycled[0].InspectResponse.ID, "A")); Assert.True(string.Equals(imagesToBeRecycled[1].InspectResponse.ID, "B")); Assert.True(string.Equals(imagesToBeRecycled[2].InspectResponse.ID, "C")); eventRecord["C"] = DateTime.UtcNow.AddDays(-5); imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 3); Assert.True(string.Equals(imagesToBeRecycled[0].InspectResponse.ID, "C")); Assert.True(string.Equals(imagesToBeRecycled[1].InspectResponse.ID, "A")); Assert.True(string.Equals(imagesToBeRecycled[2].InspectResponse.ID, "B")); }
public void ShouldNotRemoveAnyImage_WhenSpaceIsEnough() { var strategy = new ByDiskSpaceRecyclingStrategy(1, new Matchlist(), new Matchlist("dead,exited"), new Dictionary <string, DateTime>(), ImageDeletionOrderType.ByImageCreationDate); // 1GB var images = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "A", Created = DateTime.UtcNow.AddDays(-1), // 1 day, Size = 200 * 1024 * 1024 // 200 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "B", Created = DateTime.UtcNow.AddDays(-3), // 3 days Size = 700 * 1024 * 1024 // 700 MB }, }, }; _fixParentRef(images); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 0); }
public void ShouldNotRemoveAnyImage_WhenNoImagesWereFound() { var strategy = new ByDiskSpaceRecyclingStrategy(0, new Matchlist(), new Matchlist("dead,exited"), new Dictionary <string, DateTime>(), ImageDeletionOrderType.ByImageCreationDate); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(new List <DockerImageNode>()); Assert.True(imagesToBeRecycled.Count == 0); }
public void ShouldRemoveOldImages_WhenNoContainersWereFound_ByImageCreationDate() { var strategy = new ByDiskSpaceRecyclingStrategy(0.2, new Matchlist(), new Matchlist("dead,exited"), new Dictionary <string, DateTime>(), ImageDeletionOrderType.ByImageCreationDate); // 200MB var images = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "A", Created = DateTime.UtcNow.AddDays(-1), // 1 day Size = 100 * 1024 * 1024 // 100 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "B", Created = DateTime.UtcNow.AddDays(-3), // 3 days Size = 200 * 1024 * 1024 // 200 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "C", Created = DateTime.UtcNow.AddDays(-5), // 5 days Size = 300 * 1024 * 1024 // 300 MB }, }, }; _fixParentRef(images); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 2); Assert.True(string.Equals(imagesToBeRecycled[0].InspectResponse.ID, "C")); Assert.True(string.Equals(imagesToBeRecycled[1].InspectResponse.ID, "B")); }
public void ShouldRemoveOldImages_InDependencyOrder_HaveNoRunningOrRestartingContainers_Partial() { var strategy = new ByDiskSpaceRecyclingStrategy(0.5, new Matchlist(), new Matchlist("dead,exited"), new Dictionary <string, DateTime>(), ImageDeletionOrderType.ByImageCreationDate); // 500MB var images = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "A", Created = DateTime.UtcNow.AddDays(-10), // 10 days Size = 100 * 1024 * 1024 // 100 MB }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "X", Created = DateTime.UtcNow.AddDays(-8), // 8 days Size = 200 * 1024 * 1024 // 200 MB }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "Y", Created = DateTime.UtcNow.AddDays(-5), // 5 days Size = 300 * 1024 * 1024 // 300 MB }, } }, }, }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "B", Created = DateTime.UtcNow.AddDays(-14), // 14 days Size = 100 * 1024 * 1024 // 100 MB }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "M", Created = DateTime.UtcNow.AddDays(-5), // 5 days Size = 200 * 1024 * 1024 // 200 MB }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "N", Created = DateTime.UtcNow.AddDays(-11), // 11 days Size = 300 * 1024 * 1024 // 300 MB }, }, }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "C", Created = DateTime.UtcNow.AddDays(-30), // 30 days Size = 100 * 1024 * 1024 // 100 MB }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "J", Created = DateTime.UtcNow.AddDays(-20), // 20 day Size = 200 * 1024 * 1024 // 200 MB }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "L", Created = DateTime.UtcNow.AddDays(-10), // 10 days Size = 300 * 1024 * 1024 // 300 MB }, } }, }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "K", Created = DateTime.UtcNow.AddDays(-4), // 4 days Size = 200 * 1024 * 1024 // 200 MB }, }, }, }, }; _fixParentRef(images); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 5); // Expected order: N,L,J,Y,X Assert.True(string.Equals(imagesToBeRecycled[0].InspectResponse.ID, "N")); Assert.True(string.Equals(imagesToBeRecycled[1].InspectResponse.ID, "L")); Assert.True(string.Equals(imagesToBeRecycled[2].InspectResponse.ID, "J")); Assert.True(string.Equals(imagesToBeRecycled[3].InspectResponse.ID, "Y")); Assert.True(string.Equals(imagesToBeRecycled[4].InspectResponse.ID, "X")); }
public void ShouldNotRemoveImage_WhenChildImagesHaveRunningOrRestartingContainer() { var strategy = new ByDiskSpaceRecyclingStrategy(0, new Matchlist(), new Matchlist("dead,exited"), new Dictionary <string, DateTime>(), ImageDeletionOrderType.ByImageCreationDate); var images = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "A", Created = DateTime.UtcNow.AddDays(-1), // 1 day Size = 100 * 1024 * 1024 // 100 MB }, Containers = new List <ContainerInspectResponse>() { new ContainerInspectResponse() { State = new ContainerState() { Status = "exited", FinishedAt = DateTime.UtcNow.ToString(), }, } }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "C", Created = DateTime.UtcNow.AddDays(-1), // 1 day Size = 100 * 1024 * 1024 // 100 MB }, Containers = new List <ContainerInspectResponse>() { new ContainerInspectResponse() { State = new ContainerState() { Status = "running", }, } }, Children = new List <DockerImageNode>() { new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "D", Created = DateTime.UtcNow.AddDays(-1), // 1 day Size = 100 * 1024 * 1024 // 100 MB }, }, } }, } }, new DockerImageNode() { InspectResponse = new ImageInspectResponse() { ID = "B", Created = DateTime.UtcNow.AddDays(-3), // 3 days Size = 100 * 1024 * 1024 // 100 MB }, Containers = new List <ContainerInspectResponse>() { new ContainerInspectResponse() { State = new ContainerState() { Status = "restarting", }, }, new ContainerInspectResponse() { State = new ContainerState() { Status = "dead", FinishedAt = DateTime.UtcNow.ToString(), }, }, new ContainerInspectResponse() { State = new ContainerState() { Status = "paused", }, } }, }, }; _fixParentRef(images); var imagesToBeRecycled = strategy.GetImagesToBeRecycledInOrder(images); Assert.True(imagesToBeRecycled.Count == 1); Assert.Equal(imagesToBeRecycled[0].InspectResponse.ID, "D"); }