Skip to content

Commit

Permalink
Merge branch 'martin-lizner-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Sep 3, 2020
2 parents c58fe48 + e2615a7 commit b1a1ff7
Show file tree
Hide file tree
Showing 12 changed files with 254 additions and 49 deletions.
Expand Up @@ -751,4 +751,22 @@ public static ErrorSelectorType getConnectorErrorCriticality(ResourceType resour
}
return consistency.getConnectorErrorCriticality();
}

public static boolean isInMaintenance(ResourceType resource) {
if (resource == null)
return false;

AdministrativeOperationalStateType administrativeOperationalState = resource.getAdministrativeOperationalState();
if (administrativeOperationalState == null)
return false;

AdministrativeAvailabilityStatusType administrativeAvailabilityStatus = administrativeOperationalState.getAdministrativeAvailabilityStatus();
if (administrativeAvailabilityStatus == null)
return false;

if (AdministrativeAvailabilityStatusType.MAINTENANCE == administrativeAvailabilityStatus)
return true;

return false;
}
}
Expand Up @@ -17,6 +17,7 @@
import com.evolveum.midpoint.repo.api.PreconditionViolationException;
import com.evolveum.midpoint.repo.common.util.RepoCommonUtils;
import com.evolveum.midpoint.schema.cache.CacheConfigurationManager;
import com.evolveum.midpoint.schema.util.ResourceTypeUtil;
import com.evolveum.midpoint.task.api.*;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
Expand Down Expand Up @@ -199,13 +200,21 @@ public TaskWorkBucketProcessingResult run(RunningTask localCoordinatorTask, Work
try {
resource = provisioningService.getObject(ResourceType.class, resourceOid, null, localCoordinatorTask, opResult);

if (ResourceTypeUtil.isInMaintenance(resource.asObjectable()))
throw new MaintenanceException("Resource " + resource + " is in the maintenance");

RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext);
objectclassDef = ModelImplUtils.determineObjectClass(refinedSchema, localCoordinatorTask);
} catch (ObjectNotFoundException ex) {
// This is bad. The resource does not exist. Permanent problem.
processErrorPartial(runResult, "Resource does not exist, OID: " + resourceOid, ex,
TaskRunResultStatus.PERMANENT_ERROR, opResult);
return runResult;
} catch (MaintenanceException ex) {
LOGGER.warn("Reconciliation: {}-{}", new Object[]{ex.getMessage(), ex});
opResult.recordHandledError(ex.getMessage(), ex);
runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); // Resource is in the maintenance, do not suspend the task
return runResult;
} catch (CommunicationException ex) {
// Error, but not critical. Just try later.
processErrorPartial(runResult, "Communication error", ex, TaskRunResultStatus.TEMPORARY_ERROR, opResult);
Expand Down
Expand Up @@ -159,6 +159,9 @@ void processException(Trace LOGGER, Throwable t, OperationResult opResult, TaskR
// This is bad. The resource or task or something like that does not exist. Permanent problem.
opResult.recordFatalError("A required object does not exist, OID: " + oid, t);
setRunResultStatus(t, partition, CriticalityType.FATAL, runResult);
} else if (t instanceof MaintenanceException) {
opResult.recordHandledError("Maintenance exception: "+t.getMessage(), t);
runResult.setRunResultStatus(TaskRunResult.TaskRunResultStatus.TEMPORARY_ERROR); // Resource is in the maintenance, do not suspend the task
} else if (t instanceof CommunicationException) {
LOGGER.error("{}: Communication error: {}", ctx, t.getMessage(), t);
// Error, but not critical. Just try later.
Expand Down
Expand Up @@ -13,7 +13,6 @@

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand All @@ -24,6 +23,7 @@
import com.evolveum.midpoint.repo.api.SystemConfigurationChangeListener;
import com.evolveum.midpoint.schema.cache.CacheConfigurationManager;
import com.evolveum.midpoint.schema.cache.CacheType;
import com.evolveum.midpoint.schema.util.ResourceTypeUtil;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.Validate;
Expand All @@ -44,7 +44,6 @@
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.query.NoneFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.provisioning.api.ConstraintViolationConfirmer;
import com.evolveum.midpoint.provisioning.api.ConstraintsCheckingResult;
Expand All @@ -70,7 +69,6 @@
import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.logging.Trace;
Expand Down Expand Up @@ -341,11 +339,17 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task,
PrismObject<ResourceType> resource = getObject(ResourceType.class, resourceOid, null, task, result);
ResourceType resourceType = resource.asObjectable();

if (ResourceTypeUtil.isInMaintenance(resourceType))
throw new MaintenanceException("Resource " + resource + " is in the maintenance");

LOGGER.trace("Start synchronization of resource {} ", resourceType);

liveSyncResult = liveSynchronizer.synchronize(shadowCoordinates, task, taskPartition, result);
LOGGER.debug("Synchronization of {} done, result: {}", resource, liveSyncResult);

} catch (MaintenanceException e) {
result.recordHandledError(e.getMessage(), e);
throw e;
} catch (ObjectNotFoundException | CommunicationException | SchemaException | SecurityViolationException | ConfigurationException | ExpressionEvaluationException | RuntimeException | Error e) {
ProvisioningUtil.recordFatalError(LOGGER, result, null, e);
result.summarize(true);
Expand Down
Expand Up @@ -190,7 +190,7 @@ public PrismObject<ShadowType> getShadow(String oid, PrismObject<ShadowType> rep
throw e;
}

if (ProvisioningUtil.resourceIsInMaintenance(resource)) {
if (ResourceTypeUtil.isInMaintenance(resource)) {
try {
MaintenanceException ex = new MaintenanceException("Resource " + resource + " is in the maintenance");
PrismObject<ShadowType> handledShadow = handleGetError(ctx, repositoryShadow, rootOptions, ex, task, parentResult);
Expand Down Expand Up @@ -559,7 +559,7 @@ private String addShadowAttempt(ProvisioningContext ctx,
LOGGER.trace("ADD {}: resource operation, execution starting", shadowToAdd);

try {
if (ProvisioningUtil.resourceIsInMaintenance(ctx.getResource())) {
if (ResourceTypeUtil.isInMaintenance(ctx.getResource())) {
throw new MaintenanceException("Resource " + ctx.getResource() + " is in the maintenance"); // this tells mp to create pending delta
}

Expand Down Expand Up @@ -1008,7 +1008,7 @@ private String modifyShadowAttempt(ProvisioningContext ctx,
ConnectorOperationOptions connOptions = createConnectorOperationOptions(ctx, options, parentResult);

try {
if (ProvisioningUtil.resourceIsInMaintenance(ctx.getResource())) {
if (ResourceTypeUtil.isInMaintenance(ctx.getResource())) {
throw new MaintenanceException("Resource " + ctx.getResource() + " is in the maintenance");
}

Expand Down Expand Up @@ -1264,7 +1264,7 @@ private PrismObject<ShadowType> deleteShadowAttempt(ProvisioningContext ctx,
LOGGER.trace("DELETE {}: resource deletion, execution starting", repoShadow);

try {
if (ProvisioningUtil.resourceIsInMaintenance(ctx.getResource())) {
if (ResourceTypeUtil.isInMaintenance(ctx.getResource())) {
throw new MaintenanceException("Resource " + ctx.getResource() + " is in the maintenance");
}

Expand Down Expand Up @@ -1399,7 +1399,7 @@ private RefreshShadowOperation refreshShadowPendingOperations(ProvisioningContex
return rso;
}

if (ProvisioningUtil.resourceIsInMaintenance(ctx.getResource())) {
if (ResourceTypeUtil.isInMaintenance(ctx.getResource())) {
LOGGER.trace("Skipping refresh of {} pending operations because resource shadow is in the maintenance.", repoShadow);
RefreshShadowOperation rso = new RefreshShadowOperation();
rso.setRefreshedShadow(repoShadow);
Expand Down
Expand Up @@ -1188,7 +1188,7 @@ private <A extends AsynchronousOperationResult> PendingOperationType checkAndRec
ResourceType resource = ctx.getResource();
ResourceConsistencyType consistencyType = resource.getConsistency();

boolean isInMaintenance = ProvisioningUtil.resourceIsInMaintenance(ctx.getResource());
boolean isInMaintenance = ResourceTypeUtil.isInMaintenance(ctx.getResource());

Boolean avoidDuplicateOperations;
if (isInMaintenance) {
Expand Down
Expand Up @@ -586,24 +586,6 @@ public static boolean resourceReadIsCachingOnly(ResourceType resource) {
return Boolean.TRUE.equals(readCapabilityType.isCachingOnly());
}

public static boolean resourceIsInMaintenance(ResourceType resource) {
if (resource == null)
return false;

AdministrativeOperationalStateType administrativeOperationalState = resource.getAdministrativeOperationalState();
if (administrativeOperationalState == null)
return false;

AdministrativeAvailabilityStatusType administrativeAvailabilityStatus = administrativeOperationalState.getAdministrativeAvailabilityStatus();
if (administrativeAvailabilityStatus == null)
return false;

if (AdministrativeAvailabilityStatusType.MAINTENANCE == administrativeAvailabilityStatus)
return true;

return false;
}

public static Duration getGracePeriod(ProvisioningContext ctx) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, ExpressionEvaluationException {
Duration gracePeriod = null;
ResourceConsistencyType consistency = ctx.getResource().getConsistency();
Expand Down

0 comments on commit b1a1ff7

Please sign in to comment.