mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noel Rouvignac
04.02.2014 5b9814c760180c15c6338c270a32547cc59836c3
OPENDJ-1545 Remove Workflow, NetworkGroups and related attempts at building a proxy


Reduced dependency towards NetworkGroup class.

ClientConnection.java:
Removed the dependency to NetworkGroup.

NetworkGroup.java:
Made getWorkflowCandidate() static. Hid the instance method.
Removed several unused methods.

DirectoryServer.java:
Renamed a few methods.
12 files modified
334 ■■■■ changed files
opendj3-server-dev/src/server/org/opends/server/api/ClientConnection.java 12 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/RootDSEBackend.java 3 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/AddOperationBasis.java 9 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/BindOperationBasis.java 9 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/CompareOperationBasis.java 12 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/DeleteOperationBasis.java 10 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/DirectoryServer.java 13 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/ModifyDNOperationBasis.java 3 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/ModifyOperationBasis.java 10 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/SearchOperationBasis.java 4 ●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java 59 ●●●● patch | view | raw | blame | history
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java 190 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/api/ClientConnection.java
@@ -46,7 +46,6 @@
import org.opends.server.core.PersistentSearch;
import org.opends.server.core.PluginConfigManager;
import org.opends.server.core.SearchOperation;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AuthenticationInfo;
@@ -1585,17 +1584,6 @@
   */
  public abstract void toString(StringBuilder buffer);
  /**
   * Returns the network group to which the connection belongs.
   *
   * @return the network group attached to the connection
   */
  public NetworkGroup getNetworkGroup()
  {
    return NetworkGroup.getDefaultNetworkGroup();
  }
  /**
   * Retrieves the length of time in milliseconds that this client
   * connection has been idle.
opendj3-server-dev/src/server/org/opends/server/backends/RootDSEBackend.java
@@ -60,6 +60,7 @@
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.SearchOperation;
import org.opends.server.core.WorkflowTopologyNode;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.opends.server.types.*;
import org.opends.server.util.BuildVersion;
import org.opends.server.util.LDIFWriter;
@@ -472,7 +473,7 @@
    else
    {
      namingContexts = new LinkedList<DN>();
      for (WorkflowTopologyNode node : connection.getNetworkGroup()
      for (WorkflowTopologyNode node : NetworkGroup.getDefaultNetworkGroup()
          .getNamingContexts().getPublicNamingContexts())
      {
        namingContexts.add(node.getBaseDN());
opendj3-server-dev/src/server/org/opends/server/core/AddOperationBasis.java
@@ -36,15 +36,15 @@
import java.util.List;
import java.util.Map;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.protocols.ldap.LDAPResultCode;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.types.operation.PostResponseAddOperation;
import org.opends.server.types.operation.PreParseAddOperation;
import org.opends.server.workflowelement.localbackend.LocalBackendAddOperation;
@@ -572,8 +572,7 @@
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(entryDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(entryDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/BindOperationBasis.java
@@ -33,13 +33,13 @@
import java.util.List;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.types.operation.PreParseBindOperation;
import org.opends.server.workflowelement.localbackend.LocalBackendBindOperation;
@@ -716,8 +716,7 @@
      } else {
        // Retrieve the network group attached to the client connection
        // and get a workflow to process the operation.
        NetworkGroup ng = getClientConnection().getNetworkGroup();
        workflow = ng.getWorkflowCandidate(bindDN);
        workflow = NetworkGroup.getWorkflowCandidate(bindDN);
      }
      if (workflow == null)
      {
opendj3-server-dev/src/server/org/opends/server/core/CompareOperationBasis.java
@@ -35,16 +35,16 @@
import java.util.List;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.types.operation.PostResponseCompareOperation;
import org.opends.server.types.operation.PreParseCompareOperation;
import org.opends.server.workflowelement.localbackend.*;
import org.opends.server.workflowelement.localbackend.LocalBackendCompareOperation;
/**
 * This class defines an operation that may be used to determine whether a
@@ -466,11 +466,9 @@
        return;
      }
      // Retrieve the network group registered with the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(entryDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(entryDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/DeleteOperationBasis.java
@@ -31,13 +31,13 @@
import java.util.ArrayList;
import java.util.List;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.types.operation.PostResponseDeleteOperation;
import org.opends.server.types.operation.PreParseDeleteOperation;
import org.opends.server.workflowelement.localbackend.LocalBackendDeleteOperation;
@@ -263,11 +263,9 @@
        return;
      }
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(entryDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(entryDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/DirectoryServer.java
@@ -2141,18 +2141,17 @@
   *                              workflow conflicts with the workflow
   *                              ID of an existing workflow.
   */
  private static void createAndRegisterWorkflowsWithDefaultNetworkGroup(Backend<?> backend) throws DirectoryException
  private static void createAndRegisterWorkflows(Backend<?> backend) throws DirectoryException
  {
    // Create a workflow for each backend base DN and register the workflow
    // with the default/internal/admin network group.
    for (DN curBaseDN: backend.getBaseDNs())
    {
      createAndRegisterWorkflowWithDefaultNetworkGroup(curBaseDN, backend);
      createAndRegisterWorkflow(curBaseDN, backend);
    }
  }
  private static void createAndRegisterWorkflowWithDefaultNetworkGroup(DN baseDN, Backend<?> backend)
      throws DirectoryException
  private static void createAndRegisterWorkflow(DN baseDN, Backend<?> backend) throws DirectoryException
  {
    WorkflowImpl workflowImpl = createWorkflow(baseDN, backend);
    NetworkGroup.getDefaultNetworkGroup().registerWorkflow(workflowImpl);
@@ -2211,8 +2210,8 @@
  {
    try
    {
      createAndRegisterWorkflowsWithDefaultNetworkGroup(configHandler);
      createAndRegisterWorkflowsWithDefaultNetworkGroup(rootDSEBackend);
      createAndRegisterWorkflows(configHandler);
      createAndRegisterWorkflows(rootDSEBackend);
    }
    catch (DirectoryException de)
    {
@@ -5559,7 +5558,7 @@
        // the workflow with the default network group, but don't register
        // the workflow if the backend happens to be the configuration
        // backend because it's too soon for the config backend.
        createAndRegisterWorkflowWithDefaultNetworkGroup(baseDN, backend);
        createAndRegisterWorkflow(baseDN, backend);
      }
    }
  }
opendj3-server-dev/src/server/org/opends/server/core/ModifyDNOperationBasis.java
@@ -451,8 +451,7 @@
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(entryDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(entryDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/ModifyOperationBasis.java
@@ -29,16 +29,16 @@
import java.util.ArrayList;
import java.util.List;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.networkgroups.NetworkGroup;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.protocols.ldap.LDAPModification;
import org.opends.server.protocols.ldap.LDAPResultCode;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.types.operation.PostResponseModifyOperation;
import org.opends.server.types.operation.PreParseModifyOperation;
import org.opends.server.workflowelement.localbackend.LocalBackendModifyOperation;
@@ -368,11 +368,9 @@
        return;
      }
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(entryDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(entryDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/SearchOperationBasis.java
@@ -1089,11 +1089,9 @@
        return;
      }
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
      Workflow workflow = ng.getWorkflowCandidate(baseDN);
      Workflow workflow = NetworkGroup.getWorkflowCandidate(baseDN);
      if (workflow == null)
      {
        // We have found no workflow for the requested base DN, just return
opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java
@@ -30,7 +30,6 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ResultCode;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.RootDseWorkflowTopology;
import org.opends.server.core.Workflow;
import org.opends.server.core.WorkflowImpl;
@@ -184,31 +183,6 @@
  }
  /**
   * Retrieves the network group ID.
   *
   * @return a string indicating the network group ID
   */
  public String getID()
  {
    return networkGroupID;
  }
  /**
   * Gets the minimum string length of a substring filter in a search
   * operation.
   *
   * @return the minimum substring length
   */
  public int getMinSubstring()
  {
    return 0;
  }
  /**
   * Returns the list of naming contexts handled by the network group.
   *
   * @return the list of naming contexts
@@ -221,32 +195,6 @@
  /**
   * Gets the search size limit, i.e. the maximum number of entries
   * returned by a search.
   *
   * @return the maximum number of entries returned by a search
   */
  public int getSizeLimit()
  {
    return DirectoryServer.getSizeLimit();
  }
  /**
   * Gets the search duration limit, i.e. the maximum duration of a
   * search operation.
   *
   * @return the maximum duration in ms of a search operation
   */
  public int getTimeLimit()
  {
    return DirectoryServer.getTimeLimit();
  }
  /**
   * Gets the highest workflow in the topology that can handle the
   * baseDN.
   *
@@ -255,7 +203,12 @@
   * @return the highest workflow in the topology that can handle the
   *         base DN, <code>null</code> if none was found
   */
  public Workflow getWorkflowCandidate(DN baseDN)
  public static Workflow getWorkflowCandidate(DN baseDN)
  {
    return getDefaultNetworkGroup().getWorkflowCandidatePriv(baseDN);
  }
  private Workflow getWorkflowCandidatePriv(DN baseDN)
  {
    // the top workflow to return
    Workflow workflowCandidate = null;
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
@@ -152,51 +152,13 @@
    // Sets of DNs
    return new Object[][] {
        { dnRootDSE,  null,                 true,  true,  true },
        { dnConfig,   dnSubordinateConfig,  true,  true,  true },
        { dnMonitor,  dnSubordinateMonitor, true,  true,  true },
        { dnTasks,    dnSubordinateTasks,   true,  true,  true },
        { dnSchema,   null,                 true,  true,  true },
        { dnBackups,  null,                 true,  true,  true },
        { dnDummy,    null,                 false, false, false },
    };
  }
  /**
   * Provides information to create a network group with resource limits.
   */
  @DataProvider (name = "DNSet_3")
  public Object[][] initDNSet_3() throws Exception
  {
    // Network group definition
    String networkGroupID = "networkGroup1";
    DN  dn = DN.valueOf("o=test1");
    int prio = 1;
    // Resource limits
    int maxConnections = 10;
    int maxConnectionsFromSameClient = 5;
    int maxOpsPerConn = 4;
    int maxConcurrentOpsPerConn = 2;
    int searchTimeLimit = 100;
    int searchSizeLimit = 50;
    int minSubstringLength = 4;
    // Network group info
    return new Object[][] {
        // Test1: one DN for one workflow
        {
          networkGroupID,
          dn,
          prio,
          maxConnections,
          maxConnectionsFromSameClient,
          maxOpsPerConn,
          maxConcurrentOpsPerConn,
          searchTimeLimit,
          searchSizeLimit,
          minSubstringLength
        }
        { dnRootDSE,  null,                 true,  },
        { dnConfig,   dnSubordinateConfig,  true,  },
        { dnMonitor,  dnSubordinateMonitor, true,  },
        { dnTasks,    dnSubordinateTasks,   true,  },
        { dnSchema,   null,                 true,  },
        { dnBackups,  null,                 true,  },
        { dnDummy,    null,                 false, },
    };
  }
@@ -281,9 +243,7 @@
  public void checkDefaultNetworkGroup(
      DN      dnToSearch,
      DN      dnSubordinate,
      boolean existsInDefault,
      boolean existsInAdmin,
      boolean existsInInternal
      boolean exists
      )
  {
    // let's get the default network group -- it should always exist
@@ -291,21 +251,7 @@
    assertNotNull(defaultNG);
    // let's check the routing through the network group
    doCheckNetworkGroup(defaultNG, dnToSearch, dnSubordinate, null, existsInDefault);
    // let's get the admin network group -- it should always exist
    NetworkGroup adminNG = NetworkGroup.getDefaultNetworkGroup();
    assertNotNull(adminNG);
    // let's check the routing through the network group
    doCheckNetworkGroup(adminNG, dnToSearch, dnSubordinate, null, existsInAdmin);
    // let's get the internal network group -- it should always exist
    NetworkGroup internalNG = NetworkGroup.getDefaultNetworkGroup();
    assertNotNull(internalNG);
    // let's check the routing through the network group
    doCheckNetworkGroup(internalNG, dnToSearch, dnSubordinate, null, existsInInternal);
    doCheckNetworkGroup(defaultNG, dnToSearch, dnSubordinate, null, exists);
  }
  /**
@@ -430,90 +376,6 @@
    }
  }
  /**
   * Tests the network group resource limits
   * <p>
   * Disabled because NGs are not supported (issue OPENDJ-335).
   *
   * @param networkGroupID   the ID of the network group to register
   * @param workflowBaseDN1  the base DN of the first workflow node to register
   *                         in the network group
   */
  @Test (dataProvider = "DNSet_3", groups = "virtual", enabled=false)
  public void testNetworkGroupResourceLimits(
      String networkGroupID,
      DN     workflowBaseDN,
      int    priority,
      final int    maxConnections,
      final int    maxConnectionsFromSameClient,
      final int    maxOpsPerConn,
      final int    maxConcurrentOpsPerConn,
      final int    searchTimeLimit,
      final int    searchSizeLimit,
      final int    minSubstringLength
      )
      throws Exception
  {
    // Create and register the network group with the server.
    TestCaseUtils.dsconfig(
        "set-global-configuration-prop",
        "--set", "workflow-configuration-mode:manual");
    try
    {
      TestCaseUtils.dsconfig(
          "create-network-group",
          "--group-name", networkGroupID,
          "--set", "enabled:true",
          "--set", "priority:" + priority);
      try
      {
        // Ensure that the network group was created ok.
        NetworkGroup networkGroup = NetworkGroup.getDefaultNetworkGroup();
        assertNotNull(networkGroup, "The network group does not seem to be registered.");
        TestCaseUtils.dsconfig(
            "create-network-group-qos-policy",
            "--group-name", networkGroupID,
            "--type", "resource-limits",
            "--set", "max-concurrent-ops-per-connection:" + maxConcurrentOpsPerConn,
            "--set", "max-connections:" + maxConnections,
            "--set", "max-connections-from-same-ip:" + maxConnectionsFromSameClient,
            "--set", "max-ops-per-connection:" + maxOpsPerConn,
            "--set", "min-substring-length:" + minSubstringLength,
            "--set", "size-limit:" + searchSizeLimit,
            "--set", "time-limit:" + searchTimeLimit + "s");
        // Check the resource limits are set properly.
        assertEquals(networkGroup.getTimeLimit(), searchTimeLimit);
        assertEquals(networkGroup.getSizeLimit(), searchSizeLimit);
        assertEquals(networkGroup.getMinSubstring(), minSubstringLength);
        TestCaseUtils.dsconfig(
            "delete-network-group-qos-policy",
            "--group-name", networkGroupID,
            "--policy-type", "resource-limits");
      }
      finally
      {
        // The policy will get removed by this as well.
        TestCaseUtils.dsconfig("delete-network-group", "--group-name",
            networkGroupID);
      }
    }
    finally
    {
      TestCaseUtils.dsconfig(
          "set-global-configuration-prop",
          "--set", "workflow-configuration-mode:auto");
    }
  }
  /**
   * Tests the mechanism to attribute a network group to a client connection,
   * comparing the priority.
@@ -729,38 +591,4 @@
    }
  }
  /**
   * Creates a workflow and register it with a network group.
   *
   * @param networkGroup     a network group to register the workflow with
   * @param workflowBaseDN   the base DN of the workflow to register; may be
   *                         null
   * @throws  DirectoryException  If the workflow ID for the provided
   *                              workflow conflicts with the workflow
   *                              ID of an existing workflow.
   */
  private WorkflowImpl createAndRegisterWorkflow(
      NetworkGroup networkGroup,
      DN           workflowBaseDN
      ) throws DirectoryException
  {
    assertNotNull(networkGroup);
    if (workflowBaseDN == null)
    {
      return null;
    }
    // Create a workflow with no task inside. The workflow identifier
    // is the a string representation of the workflow base DN.
    WorkflowImpl workflow = new WorkflowImpl(workflowBaseDN.toString(), workflowBaseDN, null);
    assertNotNull(workflow);
    // Register the workflow with the network group.
    networkGroup.registerWorkflow(workflow);
    return workflow;
  }
}