public async Task Setup()
        {
            IDiscovery discovery = Substitute.For <IDiscovery>();

            _discoveryConfig = new DiscoveryConfig {
                Services = new ServiceDiscoveryCollection(new Dictionary <string, ServiceDiscoveryConfig>(), new ServiceDiscoveryConfig(), new PortAllocationConfig())
            };

            Dictionary <string, string> configDic = new Dictionary <string, string>();

            _currentEnvironment = Prod;
            var environment = Substitute.For <IEnvironment>();

            environment.DeploymentEnvironment.Returns(_ => _currentEnvironment);
            _unitTestingKernel = new TestingKernel <ConsoleLog>(mockConfig: configDic);
            _unitTestingKernel.Rebind <IEnvironment>().ToConstant(environment);
            _unitTestingKernel.Rebind <IDiscovery>().ToConstant(discovery);
            _unitTestingKernel.Rebind <Func <DiscoveryConfig> >().ToMethod(_ => () => _discoveryConfig);

            _loadBalancerByEnvironment = new Dictionary <string, ILoadBalancer>();
            _loadBalancerByEnvironment.Add(Prod, new MasterLoadBalancer());
            _loadBalancerByEnvironment.Add(Staging, new StagingLoadBalancer());
            _loadBalancerByEnvironment.Add(Canary, new PreferredEnvironmentLoadBalancer());
            discovery.CreateLoadBalancer(Arg.Any <DeploymentIdentifier>(), Arg.Any <ReachabilityCheck>(), TrafficRoutingStrategy.RandomByRequestID)
            .ReturnsForAnyArgs(c => _loadBalancerByEnvironment[c.Arg <DeploymentIdentifier>().DeploymentEnvironment]);
            _serviceDiscovery = _unitTestingKernel.Get <Func <string, ReachabilityCheck, IMultiEnvironmentServiceDiscovery> >()(ServiceName, (x, y) => new Task(null));

            TracingContext.SetPreferredEnvironment(null);
        }
        public async Task GotServiceFromPreferredEnvironment()
        {
            TracingContext.SetPreferredEnvironment(Canary);

            var node = await _serviceDiscovery.GetNode();

            Assert.IsInstanceOf <PreferredEnvironmentLoadBalancer>(node.LoadBalancer);
            Assert.AreEqual(node.Node.Hostname, CanaryHost);

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsTrue(hResult.IsHealthy);
        }
Exemplo n.º 3
0
        public async Task FallbackFromPreferredToMasterEnvironment()
        {
            _loadBalancerByEnvironment[Canary] = ServiceUndeployedLoadBalancer();

            TracingContext.SetPreferredEnvironment(Canary);

            var node = await _serviceDiscovery.GetNode();

            Assert.IsInstanceOf <MasterLoadBalancer>(node.LoadBalancer);
            Assert.AreEqual(node.Node.Hostname, ProdHost);

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsTrue(hResult.IsHealthy);
        }
        public async Task ServiceDiscoveryFlowAllDeployedwithoutOverrides()
        {
            _currentEnvironment = Staging;

            _discoveryConfig.EnvironmentFallbackEnabled = true;

            TracingContext.SetPreferredEnvironment(Canary);

            var node = await _serviceDiscovery.GetNode();

            Assert.IsInstanceOf <PreferredEnvironmentLoadBalancer>(node.LoadBalancer);
            Assert.AreEqual(node.Node.Hostname, CanaryHost);

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsTrue(hResult.IsHealthy);
        }
        public async Task FallbackFromPreferredToMasterEnvironment()
        {
            _loadBalancerByEnvironment[Canary] = ServiceUndeployedLoadBalancer();

            _discoveryConfig.EnvironmentFallbackEnabled = true; // Even for preferred environmet, fallback is performed only if fallback is enabled

            TracingContext.SetPreferredEnvironment(Canary);

            var node = await _serviceDiscovery.GetNode();

            Assert.IsInstanceOf <MasterLoadBalancer>(node.LoadBalancer);
            Assert.AreEqual(node.Node.Hostname, ProdHost);

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsTrue(hResult.IsHealthy);
        }
        public async Task FallbackFromPreferredToCurrentEnvironment()
        {
            _currentEnvironment = Staging;
            _loadBalancerByEnvironment[Canary] = ServiceUndeployedLoadBalancer();

            _discoveryConfig.EnvironmentFallbackEnabled = true;

            TracingContext.SetPreferredEnvironment(Canary);

            var node = await _serviceDiscovery.GetNode();

            Assert.IsInstanceOf <StagingLoadBalancer>(node.LoadBalancer);
            Assert.AreEqual(node.Node.Hostname, StagingHost);

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsTrue(hResult.IsHealthy);
        }
        public void ServiceDiscoveryFlowNoServiceDeployed()
        {
            _currentEnvironment = Staging;

            _loadBalancerByEnvironment[Prod]    = ServiceUndeployedLoadBalancer();
            _loadBalancerByEnvironment[Staging] = ServiceUndeployedLoadBalancer();
            _loadBalancerByEnvironment[Canary]  = ServiceUndeployedLoadBalancer();

            _discoveryConfig.EnvironmentFallbackEnabled = true;

            TracingContext.SetPreferredEnvironment(Canary);

            _serviceDiscovery.GetNode().ShouldThrow <ServiceUnreachableException>();

            HealthCheckResult hResult = GetHealthResult();

            Assert.IsFalse(hResult.IsHealthy);
            Assert.IsTrue(hResult.Message.Contains("Service not deployed, fallback to prod enabled but service not deployed in prod either"));
        }