From ea8fd89328d2a9cbef1ec8af995ab2e4944345c8 Mon Sep 17 00:00:00 2001 From: Mark Needham Date: Wed, 29 Jun 2016 16:07:45 +0100 Subject: [PATCH] Added IT for the Cluster Overview IT --- ...ure.java => ClusterOverviewProcedure.java} | 13 +- .../core/EnterpriseCoreEditionModule.java | 2 +- .../coreedge/scenarios/ClusterOverviewIT.java | 137 ++++++++++++++++++ ...java => ClusterOverviewProcedureTest.java} | 4 +- 4 files changed, 145 insertions(+), 11 deletions(-) rename enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/{SysInfoProcedure.java => ClusterOverviewProcedure.java} (91%) create mode 100644 enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/ClusterOverviewIT.java rename enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/{SysInfoProcedureTest.java => ClusterOverviewProcedureTest.java} (95%) diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/SysInfoProcedure.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedure.java similarity index 91% rename from enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/SysInfoProcedure.java rename to enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedure.java index 46e03b1a5ea4a..52d804f678668 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/SysInfoProcedure.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedure.java @@ -25,7 +25,6 @@ import org.neo4j.collection.RawIterator; import org.neo4j.coreedge.discovery.ClusterTopology; -import org.neo4j.coreedge.discovery.CoreAddresses; import org.neo4j.coreedge.discovery.CoreTopologyService; import org.neo4j.coreedge.raft.LeaderLocator; import org.neo4j.coreedge.raft.NoLeaderFoundException; @@ -37,22 +36,20 @@ import org.neo4j.kernel.api.proc.CallableProcedure; import org.neo4j.kernel.api.proc.Neo4jTypes; import org.neo4j.kernel.api.proc.ProcedureSignature; -import org.neo4j.logging.Log; -import org.neo4j.logging.LogProvider; -import static org.neo4j.coreedge.server.core.SysInfoProcedure.ReadWriteEndPoint.follower; -import static org.neo4j.coreedge.server.core.SysInfoProcedure.ReadWriteEndPoint.leader; +import static org.neo4j.coreedge.server.core.ClusterOverviewProcedure.ReadWriteEndPoint.follower; +import static org.neo4j.coreedge.server.core.ClusterOverviewProcedure.ReadWriteEndPoint.leader; import static org.neo4j.helpers.collection.Iterators.asRawIterator; import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; -class SysInfoProcedure extends CallableProcedure.BasicProcedure +public class ClusterOverviewProcedure extends CallableProcedure.BasicProcedure { public static final String NAME = "overview"; private final CoreTopologyService discoveryService; private final LeaderLocator leaderLocator; - SysInfoProcedure(CoreTopologyService discoveryService, - LeaderLocator leaderLocator) + ClusterOverviewProcedure( CoreTopologyService discoveryService, + LeaderLocator leaderLocator) { super( procedureSignature( new ProcedureSignature.ProcedureName( new String[]{"dbms", "cluster"}, NAME ) ) .out( "id", Neo4jTypes.NTString ) diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java index b590659238f11..98ef12845148d 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java @@ -183,7 +183,7 @@ public void registerProcedures( Procedures procedures ) { procedures.register( new DiscoverMembersProcedure( discoveryService, logProvider ) ); procedures.register( new AcquireEndpointsProcedure( discoveryService, raft, logProvider ) ); - procedures.register(new SysInfoProcedure( discoveryService, raft ) ); + procedures.register(new ClusterOverviewProcedure( discoveryService, raft ) ); } catch ( ProcedureException e ) { diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/ClusterOverviewIT.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/ClusterOverviewIT.java new file mode 100644 index 0000000000000..5dbeb915f9ec6 --- /dev/null +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/ClusterOverviewIT.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.coreedge.scenarios; + +import java.util.List; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Rule; +import org.junit.Test; + +import org.neo4j.coreedge.discovery.Cluster; +import org.neo4j.coreedge.server.core.ClusterOverviewProcedure; +import org.neo4j.kernel.api.KernelAPI; +import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.kernel.api.KernelTransaction.Type; +import org.neo4j.kernel.api.Statement; +import org.neo4j.kernel.api.exceptions.ProcedureException; +import org.neo4j.kernel.api.exceptions.TransactionFailureException; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.test.coreedge.ClusterRule; + +import static org.hamcrest.MatcherAssert.assertThat; + +import static org.neo4j.helpers.collection.Iterators.asList; +import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureName; +import static org.neo4j.kernel.api.security.AccessMode.Static.READ; + +public class ClusterOverviewIT +{ + @Rule + public final ClusterRule clusterRule = new ClusterRule( getClass() ) + .withNumberOfCoreServers( 3 ); + + @Test + public void shouldDiscoverCoreClusterMembers() throws Exception + { + // when + Cluster cluster = clusterRule.withNumberOfEdgeServers( 0 ).startCluster(); + + // then + + List overview; + for ( int i = 0; i < 3; i++ ) + { + overview = clusterOverview( cluster.getCoreServerById( i ) ); + + assertThat( overview, containsLeader() ); + assertThat( overview, containsAddress( "127.0.0.1:8000" ) ); + assertThat( overview, containsAddress( "127.0.0.1:8001" ) ); + assertThat( overview, containsAddress( "127.0.0.1:8002" ) ); + } + } + + private Matcher> containsAddress(String address) + { + return new TypeSafeMatcher>() + { + @Override + public boolean matchesSafely( List overview ) + { + for ( Object[] row : overview ) + { + if ( row[1].toString().equals( address ) ) + { + return true; + } + } + + return false; + } + + @Override + public void describeTo( Description description ) + { + description.appendText( "Expected to find leader in the cluster but didn't" ); + } + }; + } + + private Matcher> containsLeader() + { + return new TypeSafeMatcher>() + { + @Override + public boolean matchesSafely( List overview ) + { + for ( Object[] row : overview ) + { + if ( row[2].toString().equals( "leader" ) ) + { + return true; + } + } + + return false; + } + + @Override + public void describeTo( Description description ) + { + description.appendText( "Expected to find leader in the cluster but didn't" ); + } + }; + } + + private List clusterOverview( GraphDatabaseFacade db ) throws TransactionFailureException, + ProcedureException + { + KernelAPI kernel = db.getDependencyResolver().resolveDependency( KernelAPI.class ); + KernelTransaction transaction = kernel.newTransaction( Type.implicit, READ ); + Statement statement = transaction.acquireStatement(); + + // when + return asList( statement.readOperations().procedureCallRead( + procedureName( "dbms", "cluster", ClusterOverviewProcedure.NAME ), + new Object[0] ) ); + } +} diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/SysInfoProcedureTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedureTest.java similarity index 95% rename from enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/SysInfoProcedureTest.java rename to enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedureTest.java index 3aab720ac5e05..7201801ce393e 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/SysInfoProcedureTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/ClusterOverviewProcedureTest.java @@ -45,7 +45,7 @@ import static org.neo4j.coreedge.server.core.DiscoverMembersProcedureTest.coreAddresses; import static org.neo4j.helpers.collection.Iterators.asList; -public class SysInfoProcedureTest +public class ClusterOverviewProcedureTest { @Test public void shouldRecommendTheCoreLeaderForWriteAndEdgeForRead() throws Exception @@ -70,7 +70,7 @@ public void shouldRecommendTheCoreLeaderForWriteAndEdgeForRead() throws Exceptio LeaderLocator leaderLocator = mock( LeaderLocator.class ); when( leaderLocator.getLeader() ).thenReturn( theLeader ); - SysInfoProcedure procedure = new SysInfoProcedure( topologyService, leaderLocator ); + ClusterOverviewProcedure procedure = new ClusterOverviewProcedure( topologyService, leaderLocator ); // when final List members = asList( procedure.apply( null, new Object[0] ) );