Skip to content

Commit

Permalink
Add testing of built in procedure support to ha and core|edge edition…
Browse files Browse the repository at this point in the history
… modules
  • Loading branch information
boggle authored and systay committed Sep 14, 2016
1 parent 17ecadd commit b6ff150
Show file tree
Hide file tree
Showing 11 changed files with 203 additions and 13 deletions.
Expand Up @@ -256,9 +256,10 @@ protected void registerRecovery( final DatabaseInfo databaseInfo, LifeSupport li
} }


@Override @Override
public void registerProcedures( Procedures procedures ) throws KernelException public void setupProcedures( Procedures procedures ) throws KernelException
{ {
procedures.registerProcedure( BuiltInProcedures.class ); // If you change this, don't forget to update the HA and Core|Edge editions, too
procedures.registerProcedure( org.neo4j.kernel.builtinprocs.BuiltInProcedures.class );
registerProceduresFromProvider( "auth-procedures-provider", procedures ); registerProceduresFromProvider( "auth-procedures-provider", procedures );
} }


Expand Down
Expand Up @@ -411,7 +411,7 @@ private Procedures setupProcedures( PlatformModule platform, EditionModule editi
// Edition procedures // Edition procedures
try try
{ {
editionModule.registerProcedures( procedures ); editionModule.setupProcedures( procedures );
} }
catch ( KernelException e ) catch ( KernelException e )
{ {
Expand Down
Expand Up @@ -68,7 +68,7 @@
*/ */
public abstract class EditionModule public abstract class EditionModule
{ {
public abstract void registerProcedures( Procedures procedures ) throws KernelException; public abstract void setupProcedures( Procedures procedures ) throws KernelException;


protected Log authManagerLog() protected Log authManagerLog()
{ {
Expand Down
6 changes: 6 additions & 0 deletions enterprise/core-edge/pom.xml
Expand Up @@ -109,6 +109,12 @@
<type>test-jar</type> <type>test-jar</type>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-cypher</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>


<dependency> <dependency>
<groupId>org.neo4j</groupId> <groupId>org.neo4j</groupId>
Expand Down
Expand Up @@ -110,14 +110,16 @@ public enum RaftLogImplementation
} }


@Override @Override
public void registerProcedures( Procedures procedures ) throws KernelException public void setupProcedures( Procedures procedures ) throws KernelException
{ {
try try
{ {
procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog ); procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "auth-procedures-provider", procedures ); registerProceduresFromProvider( "auth-procedures-provider", procedures );
registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures ); registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures );


procedures.registerProcedure( org.neo4j.kernel.builtinprocs.BuiltInProcedures.class );
procedures.registerProcedure( org.neo4j.kernel.enterprise.builtinprocs.BuiltInProcedures.class );
procedures.register( new DiscoverEndpointAcquisitionServersProcedure( topologyService, logProvider ) ); procedures.register( new DiscoverEndpointAcquisitionServersProcedure( topologyService, logProvider ) );
procedures.register( new AcquireEndpointsProcedure( topologyService, consensusModule.raftMachine(), logProvider ) ); procedures.register( new AcquireEndpointsProcedure( topologyService, consensusModule.raftMachine(), logProvider ) );
procedures.register( new ClusterOverviewProcedure( topologyService, consensusModule.raftMachine(), logProvider ) ); procedures.register( new ClusterOverviewProcedure( topologyService, consensusModule.raftMachine(), logProvider ) );
Expand Down
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.coreedge.edge; package org.neo4j.coreedge.edge;


import java.io.File; import java.io.File;
import java.io.IOException;
import java.time.Clock; import java.time.Clock;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Supplier; import java.util.function.Supplier;
Expand Down Expand Up @@ -52,7 +51,6 @@
import org.neo4j.kernel.DatabaseAvailability; import org.neo4j.kernel.DatabaseAvailability;
import org.neo4j.kernel.api.bolt.BoltConnectionTracker; import org.neo4j.kernel.api.bolt.BoltConnectionTracker;
import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.KernelException;
import org.neo4j.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.CommitProcessFactory; import org.neo4j.kernel.impl.api.CommitProcessFactory;
import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess; import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess;
Expand Down Expand Up @@ -85,6 +83,7 @@
import org.neo4j.kernel.internal.DefaultKernelData; import org.neo4j.kernel.internal.DefaultKernelData;
import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.LifecycleStatus; import org.neo4j.kernel.lifecycle.LifecycleStatus;
import org.neo4j.logging.Log;
import org.neo4j.logging.LogProvider; import org.neo4j.logging.LogProvider;
import org.neo4j.storageengine.api.StorageEngine; import org.neo4j.storageengine.api.StorageEngine;
import org.neo4j.time.Clocks; import org.neo4j.time.Clocks;
Expand All @@ -103,9 +102,12 @@ public class EnterpriseEdgeEditionModule extends EditionModule
private SecurityLog securityLog; private SecurityLog securityLog;


@Override @Override
public void registerProcedures( Procedures procedures ) throws KernelException public void setupProcedures( Procedures procedures ) throws KernelException
{ {
procedures.registerProcedure( org.neo4j.kernel.builtinprocs.BuiltInProcedures.class );
procedures.registerProcedure( org.neo4j.kernel.enterprise.builtinprocs.BuiltInProcedures.class );
procedures.register( new EdgeRoleProcedure() ); procedures.register( new EdgeRoleProcedure() );

procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog ); procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "auth-procedures-provider" , procedures ); registerProceduresFromProvider( "auth-procedures-provider" , procedures );
registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures ); registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures );
Expand Down
Expand Up @@ -23,16 +23,25 @@
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;


import java.util.Collections;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.stream.Stream;


import org.neo4j.coreedge.core.CoreGraphDatabase; import org.neo4j.coreedge.core.CoreGraphDatabase;
import org.neo4j.coreedge.core.consensus.roles.Role; import org.neo4j.coreedge.core.consensus.roles.Role;
import org.neo4j.coreedge.discovery.Cluster; import org.neo4j.coreedge.discovery.Cluster;
import org.neo4j.coreedge.discovery.CoreClusterMember;
import org.neo4j.coreedge.discovery.EdgeClusterMember;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.enterprise.api.security.EnterpriseAuthSubject;
import org.neo4j.kernel.impl.coreapi.InternalTransaction;
import org.neo4j.test.coreedge.ClusterRule; import org.neo4j.test.coreedge.ClusterRule;


import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;


public class ClusterFormationIT public class ClusterFormationIT
{ {
Expand All @@ -49,6 +58,38 @@ public void setup() throws Exception
cluster = clusterRule.startCluster(); cluster = clusterRule.startCluster();
} }


@Test
public void shouldSupportBuiltInProcedures() throws Exception
{
cluster.addEdgeMemberWithId( 0 ).start();

Stream.concat(
cluster.edgeMembers().stream().map(EdgeClusterMember::database),
cluster.coreMembers().stream().map(CoreClusterMember::database)
).forEach( gdb ->
{
// (1) BuiltInProcedures from community
{
Result result = gdb.execute( "CALL dbms.procedures()" );
assertTrue( result.hasNext() );
result.close();
}

// (2) BuiltInProcedures from enterprise
try( InternalTransaction tx = gdb.beginTransaction(
KernelTransaction.Type.explicit,
EnterpriseAuthSubject.AUTH_DISABLED
) )
{
Result result = gdb.execute( tx, "CALL dbms.listQueries()", Collections.emptyMap() );
assertTrue( result.hasNext() );
result.close();

tx.success();
}
} );
}

@Test @Test
public void shouldBeAbleToAddAndRemoveCoreMembers() throws Exception public void shouldBeAbleToAddAndRemoveCoreMembers() throws Exception
{ {
Expand Down
Expand Up @@ -194,8 +194,11 @@ protected Log authManagerLog()
} }


@Override @Override
public void registerProcedures( Procedures procedures ) throws KernelException public void setupProcedures( Procedures procedures ) throws KernelException
{ {
procedures.registerProcedure( org.neo4j.kernel.builtinprocs.BuiltInProcedures.class );
procedures.registerProcedure( org.neo4j.kernel.enterprise.builtinprocs.BuiltInProcedures.class );

procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog ); procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "auth-procedures-provider", procedures ); registerProceduresFromProvider( "auth-procedures-provider", procedures );
registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures ); registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures );
Expand Down
Expand Up @@ -19,7 +19,12 @@
*/ */
package org.neo4j.kernel.enterprise.api.security; package org.neo4j.kernel.enterprise.api.security;


import java.io.IOException;

import org.neo4j.graphdb.security.AuthorizationViolationException;
import org.neo4j.kernel.api.security.AuthSubject; import org.neo4j.kernel.api.security.AuthSubject;
import org.neo4j.kernel.api.security.AuthenticationResult;
import org.neo4j.kernel.api.security.exception.InvalidArgumentsException;


/** /**
* A logged in user. * A logged in user.
Expand All @@ -44,4 +49,92 @@ static <T extends EnterpriseAuthSubject> T castOrFail( Class<T> clazz, AuthSubje
} }
return clazz.cast( authSubject ); return clazz.cast( authSubject );
} }

EnterpriseAuthSubject AUTH_DISABLED = new EnterpriseAuthSubject()
{
@Override
public boolean allowsReads()
{
return AuthSubject.AUTH_DISABLED.allowsReads();
}

@Override
public boolean allowsWrites()
{
return AuthSubject.AUTH_DISABLED.allowsWrites();
}

@Override
public boolean allowsSchemaWrites()
{
return AuthSubject.AUTH_DISABLED.allowsSchemaWrites();
}

@Override
public boolean overrideOriginalMode()
{
return AuthSubject.AUTH_DISABLED.overrideOriginalMode();
}

@Override
public AuthorizationViolationException onViolation( String msg )
{
return AuthSubject.AUTH_DISABLED.onViolation( msg );
}

@Override
public String name()
{
return AuthSubject.AUTH_DISABLED.name();
}

@Override
public boolean isAdmin()
{
return true;
}

@Override
public void logout()
{
AuthSubject.AUTH_DISABLED.logout();
}

@Override
public AuthenticationResult getAuthenticationResult()
{
return AuthSubject.AUTH_DISABLED.getAuthenticationResult();
}

@Override
public void setPassword( String password, boolean requirePasswordChange )
throws IOException, InvalidArgumentsException
{
AuthSubject.AUTH_DISABLED.setPassword( password, requirePasswordChange );
}

@Override
public boolean allowsProcedureWith( String[] roleNames ) throws InvalidArgumentsException
{
return AuthSubject.AUTH_DISABLED.allowsProcedureWith( roleNames );
}

@Override
public String username()
{
return AuthSubject.AUTH_DISABLED.username();
}

@Override
public boolean hasUsername( String username )
{
return AuthSubject.AUTH_DISABLED.hasUsername( username );
}

@Override
public void ensureUserExistsWithName( String username ) throws InvalidArgumentsException
{
AuthSubject.AUTH_DISABLED.ensureUserExistsWithName( username );
}
};
} }
Expand Up @@ -25,7 +25,6 @@
import org.neo4j.kernel.api.bolt.BoltConnectionTracker; import org.neo4j.kernel.api.bolt.BoltConnectionTracker;
import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.KernelException;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.enterprise.builtinprocs.BuiltInProcedures;
import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.constraints.ConstraintSemantics;
import org.neo4j.kernel.impl.enterprise.id.EnterpriseIdTypeConfigurationProvider; import org.neo4j.kernel.impl.enterprise.id.EnterpriseIdTypeConfigurationProvider;
import org.neo4j.kernel.impl.enterprise.transaction.log.checkpoint.ConfigurableIOLimiter; import org.neo4j.kernel.impl.enterprise.transaction.log.checkpoint.ConfigurableIOLimiter;
Expand All @@ -51,13 +50,15 @@
public class EnterpriseEditionModule extends CommunityEditionModule public class EnterpriseEditionModule extends CommunityEditionModule
{ {
@Override @Override
public void registerProcedures( Procedures procedures ) throws KernelException public void setupProcedures( Procedures procedures ) throws KernelException
{ {
super.registerProcedures( procedures ); // If you change this, don't forget to update the HA and Core|Edge editions, too
procedures.registerProcedure( BuiltInProcedures.class ); procedures.registerProcedure( org.neo4j.kernel.enterprise.builtinprocs.BuiltInProcedures.class );

procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog ); procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures ); registerProceduresFromProvider( "enterprise-auth-procedures-provider", procedures );
} }

private SecurityLog securityLog; private SecurityLog securityLog;


public EnterpriseEditionModule( PlatformModule platformModule ) public EnterpriseEditionModule( PlatformModule platformModule )
Expand Down
Expand Up @@ -28,18 +28,24 @@
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Collections;


import org.neo4j.consistency.checking.full.ConsistencyCheckIncompleteException; import org.neo4j.consistency.checking.full.ConsistencyCheckIncompleteException;
import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.EnterpriseGraphDatabaseFactory; import org.neo4j.graphdb.factory.EnterpriseGraphDatabaseFactory;
import org.neo4j.io.fs.FileUtils; import org.neo4j.io.fs.FileUtils;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.enterprise.api.security.EnterpriseAuthSubject;
import org.neo4j.kernel.ha.HighlyAvailableGraphDatabase; import org.neo4j.kernel.ha.HighlyAvailableGraphDatabase;
import org.neo4j.kernel.impl.coreapi.InternalTransaction;
import org.neo4j.kernel.impl.ha.ClusterManager; import org.neo4j.kernel.impl.ha.ClusterManager;
import org.neo4j.kernel.impl.storemigration.LogFiles; import org.neo4j.kernel.impl.storemigration.LogFiles;
import org.neo4j.test.ha.ClusterRule; import org.neo4j.test.ha.ClusterRule;


import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.neo4j.consistency.store.StoreAssertions.assertConsistentStore; import static org.neo4j.consistency.store.StoreAssertions.assertConsistentStore;
import static org.neo4j.kernel.impl.ha.ClusterManager.allSeesAllAsAvailable; import static org.neo4j.kernel.impl.ha.ClusterManager.allSeesAllAsAvailable;
import static org.neo4j.kernel.impl.ha.ClusterManager.clusterOfSize; import static org.neo4j.kernel.impl.ha.ClusterManager.clusterOfSize;
Expand Down Expand Up @@ -79,6 +85,41 @@ public void setup() throws Throwable
assertAllStoreConsistent( cluster ); assertAllStoreConsistent( cluster );
} }


@Test
public void allClusterNodesShouldSupportTheBuiltInProcedures() throws Throwable
{
ClusterManager.ManagedCluster cluster = clusterRule.startCluster();
try
{
for ( HighlyAvailableGraphDatabase gdb : cluster.getAllMembers() )
{
// (1) BuiltInProcedures from community
{
Result result = gdb.execute( "CALL dbms.procedures()" );
assertTrue( result.hasNext() );
result.close();
}

// (2) BuiltInProcedures from enterprise
try( InternalTransaction tx = gdb.beginTransaction(
KernelTransaction.Type.explicit,
EnterpriseAuthSubject.AUTH_DISABLED
) )
{
Result result = gdb.execute( tx, "CALL dbms.listQueries()", Collections.emptyMap() );
assertTrue( result.hasNext() );
result.close();

tx.success();
}
}
}
finally
{
cluster.shutdown();
}
}

@Test @Test
public void aSlaveWithoutAnyGraphDBFilesShouldBeAbleToJoinACluster() throws Throwable public void aSlaveWithoutAnyGraphDBFilesShouldBeAbleToJoinACluster() throws Throwable
{ {
Expand Down

0 comments on commit b6ff150

Please sign in to comment.