예제 #1
0
        public void WhenStaleLocksAreExpired_TheLocksAreRemoved()
        {
            var thePackage = CreatePackageIdentity("Package", "1.0");

            var packageLocks = new PackageLocks
            {
                new UsageDetails(new ServerTaskId("Deployment-1"), new CacheAge(1), new DateTime(2021, 1, 1))
            };

            var journalEntry = new JournalEntry(thePackage, 1, packageLocks);

            var journalEntries = new Dictionary <PackageIdentity, JournalEntry>()
            {
                { thePackage, journalEntry }
            };

            var testJournal = new PackageJournal(new InMemoryJournalRepository(journalEntries),
                                                 Substitute.For <ILog>(),
                                                 Substitute.For <ICalamariFileSystem>(),
                                                 Substitute.For <IRetentionAlgorithm>(),
                                                 Substitute.For <ISemaphoreFactory>());

            testJournal.ExpireStaleLocks(TimeSpan.FromDays(14));

            Assert.IsFalse(journalRepository.HasLock(thePackage));
        }
예제 #2
0
        public void WhenRetentionIsAppliedAndCacheSpaceIsSufficientButDiskSpaceIsNot_ThenPackageFileAndUsageAreRemoved()
        {
            var existingPackage = CreatePackageIdentity("PackageOne", "1.0");

            var retentionAlgorithm = Substitute.For <IRetentionAlgorithm>();

            retentionAlgorithm.GetPackagesToRemove(Arg.Any <IEnumerable <JournalEntry> >()).Returns(new List <PackageIdentity>()
            {
                existingPackage
            });

            var fileSystem = Substitute.For <ICalamariFileSystem>();

            fileSystem.FileExists(existingPackage.Path.Value).Returns(true);
            fileSystem.GetDiskFreeSpace(Arg.Any <string>(), out _)
            .Returns(x =>
            {
                x[1] = 0.5M;                    // 0.5MB free
                return(true);
            });

            var thisRepository = new InMemoryJournalRepository();
            var thisJournal    = new PackageJournal(thisRepository,
                                                    Substitute.For <ILog>(),
                                                    fileSystem,
                                                    retentionAlgorithm,
                                                    Substitute.For <ISemaphoreFactory>());

            thisJournal.RegisterPackageUse(existingPackage, new ServerTaskId("Deployment-1"), 1 * 1024 * 1024); //Package is 1 MB
            thisJournal.ApplyRetention();

            thisRepository.GetUsage(existingPackage).Should().BeEmpty();
            fileSystem.Received().DeleteFile(existingPackage.Path.Value, FailureOptions.IgnoreFailure);
        }
예제 #3
0
        public void WhenRetentionIsApplied_ThenPackageFileAndUsageAreRemoved()
        {
            var packageOne = CreatePackageIdentity("PackageOne", "1.0");

            var retentionAlgorithm = Substitute.For <IRetentionAlgorithm>();

            retentionAlgorithm.GetPackagesToRemove(Arg.Any <IEnumerable <JournalEntry> >()).Returns(new List <PackageIdentity>()
            {
                packageOne
            });

            var fileSystem = Substitute.For <ICalamariFileSystem>();

            fileSystem.FileExists(packageOne.Path.Value).Returns(true);

            var thisRepository = new InMemoryJournalRepository();
            var thisJournal    = new PackageJournal(thisRepository,
                                                    Substitute.For <ILog>(),
                                                    fileSystem,
                                                    retentionAlgorithm,
                                                    Substitute.For <ISemaphoreFactory>());

            thisJournal.RegisterPackageUse(packageOne, new ServerTaskId("Deployment-1"), 1000);
            thisJournal.ApplyRetention();

            thisRepository.GetUsage(packageOne).Should().BeEmpty();
            fileSystem.Received().DeleteFile(packageOne.Path.Value, FailureOptions.IgnoreFailure);
        }
예제 #4
0
 public void Setup()
 {
     variables = new CalamariVariables();
     variables.Set(KnownVariables.Calamari.EnablePackageRetention, bool.TrueString);
     variables.Set(TentacleVariables.Agent.TentacleHome, "SomeDirectory");
     journalRepository = new InMemoryJournalRepository();
     packageJournal    = new PackageJournal(
         journalRepository,
         Substitute.For <ILog>(),
         Substitute.For <ICalamariFileSystem>(),
         Substitute.For <IRetentionAlgorithm>(),
         Substitute.For <ISemaphoreFactory>()
         );
 }
예제 #5
0
        static InMemoryJournalRepository SeedJournal()
        {
            var journalRepo = new InMemoryJournalRepository();
            var journal     = new PackageJournal(journalRepo,
                                                 Substitute.For <ILog>(),
                                                 new TestCalamariPhysicalFileSystem(),
                                                 Substitute.For <IRetentionAlgorithm>(),
                                                 new SystemSemaphoreManager());
            var serverTask = new ServerTaskId("ServerTasks-1");

            for (var i = 0; i < 50000; i++)
            {
                var package = new PackageIdentity(new PackageId($"Package-{i % 100}"), new SemanticVersion(1, 0, i), new PackagePath($"C:\\{i}"));
                journal.RegisterPackageUse(package, serverTask, 100);
            }

            journal.RemoveAllLocks(serverTask);
            return(journalRepo);
        }
예제 #6
0
        public void OnlyStaleLocksAreExpired()
        {
            var packageOne = CreatePackageIdentity("PackageOne", "1.0");
            var packageTwo = CreatePackageIdentity("PackageTwo", "1.0");

            var packageOneLocks = new PackageLocks
            {
                new UsageDetails(new ServerTaskId("Deployment-1"), new CacheAge(1), new DateTime(2021, 1, 1)),
            };

            var packageTwoLocks = new PackageLocks
            {
                new UsageDetails(new ServerTaskId("Deployment-2"), new CacheAge(1), DateTime.Now),
            };

            var packageOneJournalEntry = new JournalEntry(packageOne, 1, packageOneLocks);
            var packageTwoJournalEntry = new JournalEntry(packageTwo, 1, packageTwoLocks);

            var journalEntries = new Dictionary <PackageIdentity, JournalEntry>()
            {
                { packageOne, packageOneJournalEntry },
                { packageTwo, packageTwoJournalEntry }
            };

            var testJournalRepository = new InMemoryJournalRepository(journalEntries);
            var testJournal           = new PackageJournal(testJournalRepository,
                                                           Substitute.For <ILog>(),
                                                           Substitute.For <ICalamariFileSystem>(),
                                                           Substitute.For <IRetentionAlgorithm>(),
                                                           Substitute.For <ISemaphoreFactory>());

            testJournal.ExpireStaleLocks(TimeSpan.FromDays(14));

            Assert.IsFalse(testJournalRepository.HasLock(packageOne));
            Assert.IsTrue(testJournalRepository.HasLock(packageTwo));
        }