Skip to content

Commit

Permalink
Fixing connector initialization during test resource connection
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Aug 1, 2017
1 parent ee9f26d commit dca88dc
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 24 deletions.
Expand Up @@ -115,6 +115,8 @@ public class DummyConnector implements PoolableConnector, AuthenticateOp, Resolv

private DummyResource resource;

private boolean connected = false;

private static String staticVal;

/**
Expand Down Expand Up @@ -166,6 +168,11 @@ public void init(Configuration configuration) {
}
resource.setMonsterization(this.configuration.isMonsterized());

if (connected) {
throw new IllegalStateException("Double connect in "+this);
}
connected = true;

resource.connect();

if (staticVal == null) {
Expand All @@ -181,13 +188,16 @@ public void init(Configuration configuration) {
* @see Connector#dispose()
*/
public void dispose() {
connected = false;
resource.disconnect();
log.info("Disconnected from dummy resource instance {0} ({1} connections still open)", resource, resource.getConnectionCount());
}

@Override
public void checkAlive() {
// notthig to do. always alive.
if (!connected) {
throw new IllegalStateException("checkAlive on non-connected connector instance "+this);
}
}

/******************
Expand Down Expand Up @@ -1591,6 +1601,11 @@ public SyncToken getLatestSyncToken(ObjectClass objectClass) {
*/
public void test() {
log.info("test::begin");

if (!connected) {
throw new IllegalStateException("Attempt to test non-connected connector instance "+this);
}

log.info("Validating configuration.");
configuration.validate();

Expand Down
Expand Up @@ -59,6 +59,7 @@
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceSchema;
Expand Down Expand Up @@ -216,6 +217,9 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
userWillOid = userWill.getOid();

assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL);

// Turns on checks for connection in manual connector
InternalsConfig.setSanityChecks(true);

}

Expand Down
Expand Up @@ -824,8 +824,6 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
return;
}



LOGGER.debug("Testing connection using {}", connectorSpec);

// === test CONFIGURATION ===
Expand All @@ -840,7 +838,15 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
PrismContainerValue<ConnectorConfigurationType> connectorConfiguration = connectorSpec.getConnectorConfiguration().getValue();

connector.configure(connectorConfiguration, configResult);


// We need to explicitly initialize the instance, e.g. in case that the schema and capabilities
// cannot be detected by the connector and therefore are provided in the resource
// TODO: this is not entirely correct. Maybe it needs its own test step. Or maybe
// there must be a larger refactoring.
ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(connectorSpec.getResource(), prismContext);
Collection<Object> capabilities = ResourceTypeUtil.getNativeCapabilitiesCollection(connectorSpec.getResource().asObjectable());
connector.initialize(resourceSchema, capabilities, ResourceTypeUtil.isCaseIgnoreAttributeNames(connectorSpec.getResource().asObjectable()), configResult);

configResult.recordSuccess();
} catch (CommunicationException e) {
modifyResourceAvailabilityStatus(connectorSpec.getResource(), AvailabilityStatusType.BROKEN, parentResult);
Expand Down Expand Up @@ -871,7 +877,7 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
configResult.recordFatalError("Unexpected runtime error", e);
return;
}

// === test CONNECTION ===

// delegate the main part of the test to the connector
Expand All @@ -892,14 +898,6 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
.createSubresult(ConnectorTestOperation.CONNECTOR_CAPABILITIES.getOperation());

try {
// We need to explicitly initialize the instance, e.g. in case that the schema and capabilities
// cannot be detected by the connector and therefore are provided in the resource
// TODO: maybe this is not entirely correct. Maybe it needs its own test step. Or maybe
// there must be a larger refactoring.
ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(connectorSpec.getResource(), prismContext);
Collection<Object> capabilities = ResourceTypeUtil.getNativeCapabilitiesCollection(connectorSpec.getResource().asObjectable());
connector.initialize(resourceSchema, capabilities, ResourceTypeUtil.isCaseIgnoreAttributeNames(connectorSpec.getResource().asObjectable()), configResult);

InternalMonitor.recordCount(InternalCounters.CONNECTOR_CAPABILITIES_FETCH_COUNT);
Collection<Object> retrievedCapabilities = connector.fetchCapabilities(capabilitiesResult);
capabilityMap.put(connectorSpec.getConnectorName(), retrievedCapabilities);
Expand All @@ -916,10 +914,6 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
modifyResourceAvailabilityStatus(connectorSpec.getResource(), AvailabilityStatusType.BROKEN, parentResult);
capabilitiesResult.recordFatalError("Configuration error", e);
return;
} catch (SchemaException e) {
modifyResourceAvailabilityStatus(connectorSpec.getResource(), AvailabilityStatusType.BROKEN, parentResult);
capabilitiesResult.recordFatalError("Schema error", e);
return;
} catch (RuntimeException | Error e) {
modifyResourceAvailabilityStatus(connectorSpec.getResource(), AvailabilityStatusType.BROKEN, parentResult);
capabilitiesResult.recordFatalError("Unexpected runtime error", e);
Expand Down
Expand Up @@ -174,6 +174,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
InternalsConfig.encryptionChecks = false;

super.initSystem(initTask, initResult);

InternalsConfig.setSanityChecks(true);
}

protected abstract File getResourceFile();
Expand Down
Expand Up @@ -2857,10 +2857,11 @@ public void test713ConnectionBadCredentials() throws Exception {
TestUtil.assertFailure(testResult);

OperationResult connectorResult = assertSingleConnectorTestResult(testResult);
OperationResult connectResult = connectorResult.findSubresult(ConnectorTestOperation.CONNECTOR_CONNECTION.getOperation());
OperationResult connectResult = connectorResult.findSubresult(ConnectorTestOperation.CONNECTOR_CONFIGURATION.getOperation());
assertNotNull("No connector connect result", connectResult);
assertTrue("Unexpected connector initialization message: "+connectResult.getMessage(), connectResult.getMessage().contains("invalidCredentials"));
assertTrue("Unexpected connector initialization message: "+connectResult.getMessage(), connectResult.getMessage().contains("49"));
// MID-4103
// assertTrue("Unexpected connector initialization message: "+connectResult.getMessage(), connectResult.getMessage().contains("invalidCredentials"));
// assertTrue("Unexpected connector initialization message: "+connectResult.getMessage(), connectResult.getMessage().contains("49"));
}

@Test
Expand Down Expand Up @@ -2900,9 +2901,10 @@ public void test723ConnectionBadBindDn() throws Exception {
TestUtil.assertFailure(testResult);

OperationResult connectorResult = assertSingleConnectorTestResult(testResult);
OperationResult initResult = connectorResult.findSubresult(ConnectorTestOperation.CONNECTOR_CONNECTION.getOperation());
assertTrue("Unexpected connector initialization message: "+initResult.getMessage(), initResult.getMessage().contains("invalidCredentials"));
assertTrue("Unexpected connector initialization message: "+initResult.getMessage(), initResult.getMessage().contains("49"));
OperationResult initResult = connectorResult.findSubresult(ConnectorTestOperation.CONNECTOR_CONFIGURATION.getOperation());
// MID-4103
// assertTrue("Unexpected connector initialization message: "+initResult.getMessage(), initResult.getMessage().contains("invalidCredentials"));
// assertTrue("Unexpected connector initialization message: "+initResult.getMessage(), initResult.getMessage().contains("49"));
}

protected void assertEntitlementGroup(PrismObject<ShadowType> account, String entitlementOid) {
Expand Down
Expand Up @@ -65,6 +65,8 @@ public class ManualConnectorInstance extends AbstractManualConnectorInstance imp

private RepositoryService repositoryService;

private boolean connected = false;

private static int randomDelayRange = 0;

protected static final Random RND = new Random();
Expand All @@ -78,6 +80,10 @@ public void setConfiguration(ManualConnectorConfiguration configuration) {
this.configuration = configuration;
}

public boolean isConnected() {
return connected;
}

@Override
public RepositoryService getRepositoryService() {
return repositoryService;
Expand Down Expand Up @@ -219,7 +225,11 @@ private OperationResultStatus translateOutcome(String outcome) {

@Override
protected void connect(OperationResult result) {
// Nothing to do
if (connected && InternalsConfig.isSanityChecks()) {
throw new IllegalStateException("Double connect in "+this);
}
connected = true;
// Nothing else to do
}

@Override
Expand All @@ -234,12 +244,17 @@ public void test(OperationResult parentResult) {
return;
}

if (!connected && InternalsConfig.isSanityChecks()) {
throw new IllegalStateException("Attempt to test non-connected connector instance "+this);
}

connectionResult.recordSuccess();
}

@Override
public void dispose() {
// Nothing to dispose
connected = false;
}

public static int getRandomDelayRange() {
Expand Down

0 comments on commit dca88dc

Please sign in to comment.