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

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

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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-cypher</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>

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

@Override
public void registerProcedures( Procedures procedures ) throws KernelException
public void setupProcedures( Procedures procedures ) throws KernelException
{
try
{
procedures.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "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 AcquireEndpointsProcedure( 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;

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

@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.registerComponent( SecurityLog.class, (ctx) -> securityLog );
registerProceduresFromProvider( "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.Test;

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

import org.neo4j.coreedge.core.CoreGraphDatabase;
import org.neo4j.coreedge.core.consensus.roles.Role;
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.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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class ClusterFormationIT
{
Expand All @@ -49,6 +58,38 @@ public void setup() throws Exception
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
public void shouldBeAbleToAddAndRemoveCoreMembers() throws Exception
{
Expand Down
Expand Up @@ -194,8 +194,11 @@ protected Log authManagerLog()
}

@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 );
registerProceduresFromProvider( "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;

import java.io.IOException;

import org.neo4j.graphdb.security.AuthorizationViolationException;
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.
Expand All @@ -44,4 +49,92 @@ static <T extends EnterpriseAuthSubject> T castOrFail( Class<T> clazz, AuthSubje
}
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.exceptions.KernelException;
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.enterprise.id.EnterpriseIdTypeConfigurationProvider;
import org.neo4j.kernel.impl.enterprise.transaction.log.checkpoint.ConfigurableIOLimiter;
Expand All @@ -51,13 +50,15 @@
public class EnterpriseEditionModule extends CommunityEditionModule
{
@Override
public void registerProcedures( Procedures procedures ) throws KernelException
public void setupProcedures( Procedures procedures ) throws KernelException
{
super.registerProcedures( procedures );
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.enterprise.builtinprocs.BuiltInProcedures.class );

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

private SecurityLog securityLog;

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

import org.neo4j.consistency.checking.full.ConsistencyCheckIncompleteException;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.EnterpriseGraphDatabaseFactory;
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.impl.coreapi.InternalTransaction;
import org.neo4j.kernel.impl.ha.ClusterManager;
import org.neo4j.kernel.impl.storemigration.LogFiles;
import org.neo4j.test.ha.ClusterRule;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
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.clusterOfSize;
Expand Down Expand Up @@ -79,6 +85,41 @@ public void setup() throws Throwable
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
public void aSlaveWithoutAnyGraphDBFilesShouldBeAbleToJoinACluster() throws Throwable
{
Expand Down

0 comments on commit b6ff150

Please sign in to comment.