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