Exemplo n.º 1
0
        public void RequestRecentUpgrade()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.UtcNow,
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
            });

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "name"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = kg.KnownGoodVersions["d"],
                }),
            };

            var o = f.Create(kg, lv, pods);

            Assert.IsNull(o.GetDataRequest(pods[0].Id, "d"), $"Should not give a new request because still in probation");
        }
Exemplo n.º 2
0
        public void RequestNoLkg()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.UtcNow + TimeSpan.FromDays(1),
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
            });

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "name"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = lv.UpgradeInfo["d"],
                }),
            };

            var o = f.Create(kg, lv, pods);

            Assert.IsNull(o.GetDataRequest(pods[0].Id, "d"));
        }
Exemplo n.º 3
0
        public void RequestMatchesLastKnownGood()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.FromUnixTimeSeconds(1_000),
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "name"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = kg.KnownGoodVersions["d"],
                }),
            };

            var o = f.Create(kg, lv, pods);

            Assert.IsNull(o.GetDataRequest(pods[0].Id, "d"), "Request should return nothing if upgrade would be same as LKG");
        }
Exemplo n.º 4
0
        public void WatchdogsFailingDoNotUpgrade()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.UtcNow + TimeSpan.FromDays(1),
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
            });

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod1"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
                }),
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod2"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
                }),
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod3"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
                }),
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod4"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataDependsOn}"] = "d, e, f",
                    [$"{WatchdogStatus.Prefix}x"]          = $"{WatchdogStatus.ErrorLevel}/ohno",
                }),
            };

            var o = f.Create(kg, lv, pods);


            Assert.IsNull(o.GetDataRequest(pods[0].Id, "d"), "watchdog failure on pod 4");
            Assert.IsNull(o.GetDataRequest(pods[1].Id, "d"), "watchdog failure on pod 4");
            Assert.IsNull(o.GetDataRequest(pods[2].Id, "d"), "watchdog failure on pod 4");
        }
Exemplo n.º 5
0
        public void FinishUpgradeToLatest()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.UtcNow + TimeSpan.FromDays(1),
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
            });

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod1"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
                }),
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod2"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
                }),
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "pod3"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
                }),
            };

            var o = f.Create(kg, lv, pods);

            // upgrade 1 to latest
            var pod1 = o.GetDataRequest(pods[0].Id, "d");
            var pod2 = o.GetDataRequest(pods[1].Id, "d");
            var pod3 = o.GetDataRequest(pods[2].Id, "d");

            AssertSameData(lv.UpgradeInfo["d"], pod1, "upgrade to latest");
            AssertSameData(lv.UpgradeInfo["d"], pod2, "upgrade to latest");
            Assert.IsNull(pod3, "pod already on latest");
        }
Exemplo n.º 6
0
            public DataRepositoryUpgradeOracle(DataRepositoryKnownGoods knownGoods, DataRepositoryLatestVersionInfo latestVersionInfo, IReadOnlyList <PodDataRequestInfo> pods, ILogger <DataRepositoryUpgradeOracle> logger, IClock clock, IWatchdogStatusAggregator watchdogStatusAggregator)
            {
                this.knownGoods        = knownGoods;
                this.latestVersionInfo = latestVersionInfo;
                this.pods   = pods;
                this.logger = logger;
                this.clock  = clock;
                this.watchdogStatusAggregator = watchdogStatusAggregator;

                // this is likely a list of data deployment daemonsets
                this.podsWithRepo = new Dictionary <string, List <PodDataRequestInfo> >();
                foreach (var pod in pods)
                {
                    foreach (var repoSpec in pod.DataSources)
                    {
                        if (!this.podsWithRepo.TryGetValue(repoSpec, out var list))
                        {
                            list = new List <PodDataRequestInfo>();
                            this.podsWithRepo[repoSpec] = list;
                        }

                        list.Add(pod);
                    }
                }

                // this is a list of pods mounting volumes to the daemonsets supplying the data
                // we look at their watchdogs
                this.podsDependingOnRepo = new Dictionary <string, List <PodDataRequestInfo> >();
                foreach (var pod in pods)
                {
                    foreach (var repo in pod.DependsOn)
                    {
                        if (!this.podsDependingOnRepo.TryGetValue(repo, out var list))
                        {
                            list = new List <PodDataRequestInfo>();
                            this.podsDependingOnRepo[repo] = list;
                        }

                        list.Add(pod);
                    }
                }
            }
Exemplo n.º 7
0
        public void RequestResetNoTimestampVersionToLKG()
        {
            var fakeClock = new ManualClock()
            {
                Time = DateTimeOffset.UtcNow + TimeSpan.FromDays(1),
            };

            var f  = new DataRepositoryUpgradeOracleFactory(new LoggerFactory(), fakeClock, new WatchdogStatusAggregator());
            var kg = new DataRepositoryKnownGoods(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("a", "a").ToBase64String(),
            });

            var lv = new DataRepositoryLatestVersionInfo(new Dictionary <string, string>()
            {
                ["d"] = new DataDownloadRequestDetails("b", "b").ToBase64String(),
            });

            var badReq = new DataDownloadRequestDetails("b", "b")
            {
                UnixTimestampSeconds = null
            };

            var pods = new List <PodDataRequestInfo>()
            {
                new PodDataRequestInfo(
                    new PodIdentifier("ns", "name"),
                    new Dictionary <string, string>()
                {
                    [$"{CommonAnnotations.DataSources}"]        = "d",
                    [$"{CommonAnnotations.DataRequestPrefix}d"] = badReq.ToBase64String(),
                }),
            };

            var o = f.Create(kg, lv, pods);

            AssertSameData(kg.KnownGoodVersions["d"], o.GetDataRequest(pods[0].Id, "d"), $"Reset to LKG on bad timestamp");
        }
Exemplo n.º 8
0
 public IDataRepositoryUpgradeOracle Create(DataRepositoryKnownGoods knownGoods, DataRepositoryLatestVersionInfo latestVersionInfo, IReadOnlyList <PodDataRequestInfo> pods)
 {
     return(new DataRepositoryUpgradeOracle(knownGoods, latestVersionInfo, pods, this.logger, this.clock, this.watchdogStatusAggregator));
 }