Esempio n. 1
0
        internal async Task should_handle_node_preference_from_gossip(
            ClusterMessages.VNodeState nodeState,
            NodePreference nodePreference)
        {
            var response = new ClusterMessages.ClusterInfoDto {
                Members = new[] {
                    new ClusterMessages.MemberInfoDto {
                        State           = nodeState,
                        IsAlive         = true,
                        ExternalTcpIp   = "127.0.0.1",
                        ExternalTcpPort = 1113
                    },
                    new ClusterMessages.MemberInfoDto {
                        State           = ClusterMessages.VNodeState.Unknown,
                        IsAlive         = true,
                        ExternalTcpIp   = "127.0.0.1",
                        ExternalTcpPort = 2113
                    }
                }
            };

            var sut = new ClusterDnsEndPointDiscoverer(new ConsoleLogger(), "dns", 1, 1111,
                                                       new[] { new GossipSeed(new IPEndPoint(IPAddress.Any, 2113)) }, TimeSpan.FromSeconds(1),
                                                       nodePreference,
                                                       new NoCompatibilityMode(),
                                                       new TestHttpClient(response.ToJson()));

            var result = await sut.DiscoverAsync(new IPEndPoint(IPAddress.Any, 1113));

            Assert.Equal(1113, EndPointExtensions.GetPort(result.TcpEndPoint));
        }
Esempio n. 2
0
        internal async Task should_not_be_able_to_pick_invalid_node(bool useHttps,
                                                                    ClusterMessages.VNodeState invalidState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State      = invalidState,
                        InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 4444),
                        IsAlive    = true,
                    },
                }
            };

            var sut = new GossipBasedEndpointDiscoverer(
                new EventStoreClientConnectivitySettings {
                MaxDiscoverAttempts = 1,
                GossipTimeout       = System.Threading.Timeout.InfiniteTimeSpan,
                Insecure            = !useHttps,
                DiscoveryInterval   = TimeSpan.Zero,
                NodePreference      = NodePreference.Leader,
                DnsGossipSeeds      = new[] { _gossipSeed }
            }, new CallbackTestGossipClient(gossip));

            var ex = await Assert.ThrowsAsync <DiscoveryException>(async() => await sut.DiscoverAsync());

            Assert.Equal(1, ex.MaxDiscoverAttempts);
        }
Esempio n. 3
0
        public async Task should_pick_node_based_on_preference(NodePreference preference,
                                                               ClusterMessages.VNodeState expectedState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State               = ClusterMessages.VNodeState.Leader,
                        InstanceId          = Guid.NewGuid(),
                        HttpEndPointAddress = IPAddress.Any.ToString(),
                        HttpEndPointPort    = 1111,
                        IsAlive             = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State               = ClusterMessages.VNodeState.Follower,
                        InstanceId          = Guid.NewGuid(),
                        HttpEndPointAddress = IPAddress.Any.ToString(),
                        HttpEndPointPort    = 2222,
                        IsAlive             = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless
                                                        ? expectedState
                                                        : ClusterMessages.VNodeState.ReadOnlyReplica,
                        InstanceId          = Guid.NewGuid(),
                        HttpEndPointAddress = IPAddress.Any.ToString(),
                        HttpEndPointPort    = 3333,
                        IsAlive             = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State               = ClusterMessages.VNodeState.Manager,
                        InstanceId          = Guid.NewGuid(),
                        HttpEndPointAddress = IPAddress.Any.ToString(),
                        HttpEndPointPort    = 4444,
                        IsAlive             = true,
                    },
                }
            };
            var handler = new CustomMessageHandler(req => {
                _fixture.CurrentClusterInfo.Members = gossip.Members;
            });

            var sut = new ClusterEndpointDiscoverer(1, new[] {
                new DnsEndPoint(_fixture.Host, _fixture.Port)
            }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, preference, handler);

            var result = await sut.DiscoverAsync();

            Assert.Equal(result.GetPort(),
                         gossip.Members.Last(x => x.State == expectedState).HttpEndPointPort);
        }
Esempio n. 4
0
        public async Task should_pick_node_based_on_preference(NodePreference preference,
                                                               ClusterMessages.VNodeState expectedState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State            = ClusterMessages.VNodeState.Leader,
                        InstanceId       = Guid.NewGuid(),
                        ExternalHttpIp   = IPAddress.Any.ToString(),
                        ExternalHttpPort = 1111,
                        IsAlive          = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State            = ClusterMessages.VNodeState.Follower,
                        InstanceId       = Guid.NewGuid(),
                        ExternalHttpIp   = IPAddress.Any.ToString(),
                        ExternalHttpPort = 2222,
                        IsAlive          = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless
                                                        ? expectedState
                                                        : ClusterMessages.VNodeState.ReadOnlyReplica,
                        InstanceId       = Guid.NewGuid(),
                        ExternalHttpIp   = IPAddress.Any.ToString(),
                        ExternalHttpPort = 3333,
                        IsAlive          = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State            = ClusterMessages.VNodeState.Manager,
                        InstanceId       = Guid.NewGuid(),
                        ExternalHttpIp   = IPAddress.Any.ToString(),
                        ExternalHttpPort = 4444,
                        IsAlive          = true,
                    },
                }
            };
            var handler = new FakeMessageHandler(req => ResponseFromGossip(gossip));

            var sut = new ClusterEndpointDiscoverer(1, new[] {
                new DnsEndPoint("localhost", 1113)
            }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, preference, handler);

            var result = await sut.DiscoverAsync();

            Assert.Equal(result.Port,
                         gossip.Members.Last(x => x.State == expectedState).ExternalHttpPort);
        }
Esempio n. 5
0
        internal async Task should_pick_node_based_on_preference(bool useHttps, NodePreference preference,
                                                                 ClusterMessages.VNodeState expectedState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State      = ClusterMessages.VNodeState.Leader,
                        InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 1111),
                        IsAlive    = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State      = ClusterMessages.VNodeState.Follower,
                        InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 2222),
                        IsAlive    = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless
                                                        ? expectedState
                                                        : ClusterMessages.VNodeState.ReadOnlyReplica,
                        InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 3333),
                        IsAlive    = true,
                    },
                    new ClusterMessages.MemberInfo {
                        State      = ClusterMessages.VNodeState.Manager,
                        InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 4444),
                        IsAlive    = true,
                    },
                }
            };

            var sut = new GossipBasedEndpointDiscoverer(
                new EventStoreClientConnectivitySettings {
                MaxDiscoverAttempts = 1,
                GossipTimeout       = System.Threading.Timeout.InfiniteTimeSpan,
                Insecure            = !useHttps,
                DiscoveryInterval   = TimeSpan.Zero,
                NodePreference      = preference,
                DnsGossipSeeds      = new[] { _gossipSeed }
            }, new CallbackTestGossipClient(gossip));

            var result = await sut.DiscoverAsync();

            Assert.Equal(result.GetPort(),
                         gossip.Members.Last(x => x.State == expectedState).EndPoint.Port);
        }
Esempio n. 6
0
        public async Task should_not_be_able_to_pick_invalid_node(ClusterMessages.VNodeState invalidState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State            = invalidState,
                        InstanceId       = Guid.NewGuid(),
                        ExternalHttpIp   = IPAddress.Any.ToString(),
                        ExternalHttpPort = 4444,
                        IsAlive          = true,
                    },
                }
            };

            var handler = new FakeMessageHandler(req => ResponseFromGossip(gossip));

            var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint("localhost", 1113), }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, NodePreference.Leader, handler);

            await Assert.ThrowsAsync <DiscoveryException>(() => sut.DiscoverAsync());
        }
Esempio n. 7
0
        public async Task should_not_be_able_to_pick_invalid_node(ClusterMessages.VNodeState invalidState)
        {
            var gossip = new ClusterMessages.ClusterInfo {
                Members = new[] {
                    new ClusterMessages.MemberInfo {
                        State               = invalidState,
                        InstanceId          = Guid.NewGuid(),
                        HttpEndPointAddress = IPAddress.Any.ToString(),
                        HttpEndPointPort    = 4444,
                        IsAlive             = true,
                    },
                }
            };

            var handler = new CustomMessageHandler(req => {
                _fixture.CurrentClusterInfo.Members = gossip.Members;
            });

            var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint(_fixture.Host, _fixture.Port), }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, NodePreference.Leader, handler);

            await Assert.ThrowsAsync <DiscoveryException>(() => sut.DiscoverAsync());
        }
 private bool IsReadOnlyReplicaState(ClusterMessages.VNodeState state)
 {
     return(state == ClusterMessages.VNodeState.ReadOnlyLeaderless ||
            state == ClusterMessages.VNodeState.PreReadOnlyReplica ||
            state == ClusterMessages.VNodeState.ReadOnlyReplica);
 }
 private bool IsReadOnlyReplicaState(ClusterMessages.VNodeState state) =>
 state is ClusterMessages.VNodeState.ReadOnlyLeaderless or ClusterMessages.VNodeState.ReadOnlyReplica;