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 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 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");
        }