Sniffing role detectionedit

When we sniff the cluster state, we detect the role of the node, whether it’s master eligible and holds data. We use this information when selecting a node to perform an API call on.

var audit = new Auditor(() => Framework.Cluster
    .Nodes(10)
    .Sniff(s => s.Fails(Always))
    .Sniff(s => s.OnPort(9202)
        .Succeeds(Always, Framework.Cluster.Nodes(8).StoresNoData(9200, 9201, 9202))
    )
    .SniffingConnectionPool()
    .AllDefaults()
)
{
    AssertPoolBeforeCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(10);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(10);
    },

    AssertPoolAfterCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(8);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(5);
    }
};

await audit.TraceStartup();
var audit = new Auditor(() => Framework.Cluster
    .Nodes(10)
    .Sniff(s => s.SucceedAlways()
        .Succeeds(Always, Framework.Cluster.Nodes(8).StoresNoData(9200, 9201, 9202).HttpDisabled(9201))
    )
    .SniffingConnectionPool()
    .AllDefaults()
)
{
    AssertPoolBeforeCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(10);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(10);
        pool.Nodes.Where(n => n.HttpEnabled).Should().HaveCount(10);
        pool.Nodes.Should().OnlyContain(n => n.Uri.Host == "localhost");
    },

    AssertPoolAfterCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(7, "we filtered the node that stores no data");
        pool.Nodes.Should().NotContain(n=>n.Uri.Port == 9201);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(5);
    }
};

await audit.TraceStartup();
var audit = new Auditor(() => Framework.Cluster
    .Nodes(10)
    .Sniff(s => s.SucceedAlways()
        .Succeeds(Always, Framework.Cluster.Nodes(8).StoresNoData(9200, 9201, 9202).SniffShouldReturnFqdn())
    )
    .SniffingConnectionPool()
    .AllDefaults()
)
{
    AssertPoolBeforeCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(10);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(10);
        pool.Nodes.Should().OnlyContain(n => n.Uri.Host == "localhost");
    },

    AssertPoolAfterCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(8);
        pool.Nodes.Where(n => n.HoldsData).Should().HaveCount(5);
        pool.Nodes.Should().OnlyContain(n => n.Uri.Host.StartsWith("fqdn") && !n.Uri.Host.Contains("/"));
    }
};

await audit.TraceStartup();
var node = SniffAndReturnNode();

node.MasterEligible.Should().BeTrue();

node.HoldsData.Should().BeFalse();

node = await SniffAndReturnNodeAsync();

node.MasterEligible.Should().BeTrue();

node.HoldsData.Should().BeFalse();
var pipeline = CreatePipeline();

pipeline.Sniff();
var pipeline = CreatePipeline();

await pipeline.SniffAsync(default(CancellationToken));
var uri = TestClient.CreateUri(this._cluster.Node.Port);

this._settings = new ConnectionSettings(new SniffingConnectionPool(new[] { uri }));

var pipeline = new RequestPipeline(this._settings, DateTimeProvider.Default, new MemoryStreamFactory(),
    new SearchRequestParameters());
var nodes = this._settings.ConnectionPool.Nodes;

nodes.Should().NotBeEmpty().And.HaveCount(1);

var node = nodes.First();
var audit = new Auditor(() => Framework.Cluster
    .Nodes(10)
    .Sniff(s => s.Fails(Always))
    .Sniff(s => s.OnPort(9202)
        .Succeeds(Always, Framework.Cluster.Nodes(8).MasterEligible(9200, 9201, 9202))
    )
    .SniffingConnectionPool()
    .AllDefaults()
)
{
    AssertPoolBeforeCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(10);
        pool.Nodes.Where(n => n.MasterEligible).Should().HaveCount(10);
    },
    AssertPoolAfterCall = (pool) =>
    {
        pool.Should().NotBeNull();
        pool.Nodes.Should().HaveCount(8);
        pool.Nodes.Where(n => n.MasterEligible).Should().HaveCount(3);
    }
};
await audit.TraceStartup();