Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into feature/upgrade-pro…
Browse files Browse the repository at this point in the history
…cess
  • Loading branch information
1azyman committed Jun 20, 2023
2 parents fe9189c + c3e5ed5 commit b82d9f7
Show file tree
Hide file tree
Showing 10 changed files with 239 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,9 @@
<key>failed</key>
<label>Failed</label>
</row>
<row>
<key>suspended</key>
<label>Suspended</label>
</row>

</lookupTable>
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ private boolean defaultLifecycleHasActiveAssignments(
if (!taskExecutionMode.isProductionConfiguration() && SchemaConstants.LIFECYCLE_PROPOSED.equals(lifecycleStatus)) {
return true; // FIXME TEMPORARY IMPLEMENTATION
}
if (SchemaConstants.LIFECYCLE_SUSPENDED.equals(lifecycleStatus)) {
return true; // FIXME TEMPORARY IMPLEMENTATION, need to do something smarter when we have full lifecycle model
}

ActivationStatusType forcedLifecycleActivationStatus = getForcedLifecycleActivationStatus(lifecycleStatus, stateModel);
if (forcedLifecycleActivationStatus == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -327,12 +327,15 @@ protected void testCompute(
testCompute(null, now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testComputeDraft(now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testComputeProposed(now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testComputeSuspended(now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testCompute(SchemaConstants.LIFECYCLE_ACTIVE, now, administrativeStatus,
validFrom, validTo, expectedEffective, expectedValidity);
testCompute(SchemaConstants.LIFECYCLE_DEPRECATED, now, administrativeStatus,
validFrom, validTo, expectedEffective, expectedValidity);
testCompute(SchemaConstants.LIFECYCLE_FAILED, now, administrativeStatus,
validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
testCompute(SchemaConstants.LIFECYCLE_SUSPENDED, now, administrativeStatus,
validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
testCompute(SchemaConstants.LIFECYCLE_ARCHIVED, now, administrativeStatus,
validFrom, validTo, ActivationStatusType.ARCHIVED, expectedValidity);
testComputeLimbo(now, administrativeStatus, validFrom, validTo, expectedValidity);
Expand All @@ -358,6 +361,15 @@ protected void testComputeProposed(
validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
}

protected void testComputeSuspended(
XMLGregorianCalendar now, ActivationStatusType administrativeStatus,
XMLGregorianCalendar validFrom, XMLGregorianCalendar validTo,
ActivationStatusType expectedEffective, TimeIntervalStatusType expectedValidity)
throws SchemaException, IOException {
testCompute(SchemaConstants.LIFECYCLE_SUSPENDED, now, administrativeStatus,
validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
}

protected void testComputeLimbo(
XMLGregorianCalendar now, ActivationStatusType administrativeStatus,
XMLGregorianCalendar validFrom, XMLGregorianCalendar validTo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,20 @@ public void testGetProposedAdministrativeEnabled() {
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}

@Test
public void testGetSuspendedAdministrativeEnabled() {
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(
ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);

// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(
SchemaConstants.LIFECYCLE_SUSPENDED, activationType, createLifecycleModel());

// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,16 @@ protected void testComputeProposed(
validFrom, validTo, expectedEffective, expectedValidity);
}

@Override
protected void testComputeSuspended(
XMLGregorianCalendar now, ActivationStatusType administrativeStatus,
XMLGregorianCalendar validFrom, XMLGregorianCalendar validTo,
ActivationStatusType expectedEffective, TimeIntervalStatusType expectedValidity)
throws SchemaException, IOException {
testCompute(SchemaConstants.LIFECYCLE_SUSPENDED, now, administrativeStatus,
validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
}

@Override
protected void testComputeCharmed(
XMLGregorianCalendar now, ActivationStatusType administrativeStatus,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,7 @@ public abstract class SchemaConstants {
public static final String LIFECYCLE_DRAFT = "draft";
public static final String LIFECYCLE_PROPOSED = "proposed";
public static final String LIFECYCLE_ACTIVE = "active";
public static final String LIFECYCLE_SUSPENDED = "suspended";
public static final String LIFECYCLE_DEPRECATED = "deprecated";
public static final String LIFECYCLE_ARCHIVED = "archived";
public static final String LIFECYCLE_FAILED = "failed";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public static ProvisioningService createProvisioningService() {
@NotNull Class<T> type,
@NotNull String oid,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
throw new UnsupportedOperationException();
Expand All @@ -54,7 +54,7 @@ public <T extends ObjectType> String addObject(
@NotNull PrismObject<T> object,
@Nullable OperationProvisioningScriptsType scripts,
@Nullable ProvisioningOperationOptions options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
return null;
Expand Down Expand Up @@ -86,7 +86,7 @@ public <T extends ObjectType> SearchResultList<PrismObject<T>> searchObjects(
@NotNull Class<T> type,
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
return new SearchResultList<>(new ArrayList<>(0));
Expand All @@ -97,7 +97,7 @@ public <T extends ObjectType> Integer countObjects(
@NotNull Class<T> type,
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
return null;
Expand All @@ -109,7 +109,7 @@ public <T extends ObjectType> SearchResultMetadata searchObjectsIterative(
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@NotNull ResultHandler<T> handler,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
return null;
Expand All @@ -122,7 +122,7 @@ public <T extends ObjectType> String modifyObject(
@NotNull Collection<? extends ItemDelta<?, ?>> modifications,
@Nullable OperationProvisioningScriptsType scripts,
@Nullable ProvisioningOperationOptions options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) {
return null;
Expand All @@ -134,7 +134,7 @@ public <T extends ObjectType> PrismObject<T> deleteObject(
String oid,
ProvisioningOperationOptions option,
OperationProvisioningScriptsType scripts,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
Task task,
OperationResult parentResult) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,35 @@ public void test065ModifyUserJackLifecycleDeprecated() throws Exception {
TestUtil.assertModifyTimestamp(userJack, start, end);
}

@Test
public void test066ModifyUserJackLifecycleSuspended() throws Exception {
// GIVEN
Task task = getTestTask();
OperationResult result = task.getResult();
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL);

XMLGregorianCalendar start = clock.currentTimeXMLGregorianCalendar();

// WHEN
modifyUserReplace(USER_JACK_OID, UserType.F_LIFECYCLE_STATE, task, result, SchemaConstants.LIFECYCLE_SUSPENDED);

// THEN
XMLGregorianCalendar end = clock.currentTimeXMLGregorianCalendar();
result.computeStatus();
TestUtil.assertSuccess(result);

PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack, "Jack Sparrow");

assertAdministrativeStatusEnabled(userJack);
assertValidity(userJack, null);
assertEffectiveStatus(userJack, ActivationStatusType.DISABLED);
assertDisableTimestampFocus(userJack, start, end);

TestUtil.assertModifyTimestamp(userJack, start, end);
}

@Test
public void test068ModifyUserJackLifecycleArchived() throws Exception {
// GIVEN
Expand Down Expand Up @@ -1967,7 +1996,7 @@ public void test242RappAssignCaptain() throws Exception {
* MID-3689, MID-3737
*/
@Test
public void test245ActivateRapp() throws Exception {
public void test244ActivateRapp() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

Expand All @@ -1983,7 +2012,145 @@ public void test245ActivateRapp() throws Exception {

PrismObject<UserType> userAfter = getUser(USER_RAPP_OID);
display("user after", userAfter);
assertEffectiveActivation(userAfter, ActivationStatusType.ENABLED);
assertUser(userAfter, "user after")
.activation()
.assertNoAdministrativeStatus()
.assertEffectiveStatus(ActivationStatusType.ENABLED);

assertAssignedRoles(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_CAPTAIN_OID);
assertAssignments(userAfter, 2);
assertLiveLinks(userAfter, 1);

assertRoleMembershipRef(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_PIRATE_OID, ROLE_CAPTAIN_OID);

DummyAccount dummyAccount = assertDummyAccount(null, USER_RAPP_USERNAME);
displayDumpable("dummy account", dummyAccount);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_WEAPON_NAME, ROLE_PIRATE_WEAPON);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_QUOTE_NAME, RESOURCE_DUMMY_QUOTE);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, ROLE_PIRATE_TITLE);
}

/**
* Switch Rapp to suspended state.
* User should be disabled, however the assignments should still be active.
*/
@Test
public void test245SuspendRapp() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

assertUserBefore(USER_RAPP_OID)
.activation()
.assertNoAdministrativeStatus()
.assertEffectiveStatus(ActivationStatusType.ENABLED);

// WHEN
when();
modifyUserReplace(USER_RAPP_OID, UserType.F_LIFECYCLE_STATE, task, result,
SchemaConstants.LIFECYCLE_SUSPENDED);

// THEN
then();
result.computeStatus();
TestUtil.assertSuccess(result);

PrismObject<UserType> userAfter = getUser(USER_RAPP_OID);
display("user after", userAfter);
assertUser(userAfter, "user after")
.activation()
// DISABLED administrative status gets propagated here from inbound mapping on dummy resource
// This is not ideal configuration ... it dates back to early midpoint.
// But we need to live with it ... for now.
.assertAdministrativeStatus(ActivationStatusType.DISABLED)
.assertEffectiveStatus(ActivationStatusType.DISABLED);


assertAssignedRoles(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_CAPTAIN_OID);
assertAssignments(userAfter, 2);
assertLiveLinks(userAfter, 1);

assertRoleMembershipRef(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_PIRATE_OID, ROLE_CAPTAIN_OID);

DummyAccount dummyAccount = assertDummyAccount(null, USER_RAPP_USERNAME);
displayDumpable("dummy account", dummyAccount);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_WEAPON_NAME, ROLE_PIRATE_WEAPON);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_QUOTE_NAME, RESOURCE_DUMMY_QUOTE);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, ROLE_PIRATE_TITLE);
}

/**
* Switch Rapp administrative status to enabled.
* Nothing should really happen, as lifecycle state is still SUSPENDED.
*/
@Test
public void test246AlmostReactivateRapp() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

// WHEN
when();
modifyUserReplace(USER_RAPP_OID, ACTIVATION_ADMINISTRATIVE_STATUS_PATH, task, result,
ActivationStatusType.ENABLED);

// THEN
then();
result.computeStatus();
TestUtil.assertSuccess(result);

PrismObject<UserType> userAfter = getUser(USER_RAPP_OID);
display("user after", userAfter);
assertUser(userAfter, "user after")
.activation()
.assertAdministrativeStatus(ActivationStatusType.ENABLED)
.assertEffectiveStatus(ActivationStatusType.DISABLED);

assertAssignedRoles(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_CAPTAIN_OID);
assertAssignments(userAfter, 2);
assertLiveLinks(userAfter, 1);

assertRoleMembershipRef(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_PIRATE_OID, ROLE_CAPTAIN_OID);

DummyAccount dummyAccount = assertDummyAccount(null, USER_RAPP_USERNAME);
displayDumpable("dummy account", dummyAccount);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_WEAPON_NAME, ROLE_PIRATE_WEAPON);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_QUOTE_NAME, RESOURCE_DUMMY_QUOTE);
assertDummyAccountAttribute(null, USER_RAPP_USERNAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, ROLE_PIRATE_TITLE);
}

/**
* Switch Rapp to active state again.
* User should be enabled, and the assignments should be still active.
*/
@Test
public void test247ReactivateRapp() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

// WHEN
when();
modifyUserReplace(USER_RAPP_OID, UserType.F_LIFECYCLE_STATE, task, result,
SchemaConstants.LIFECYCLE_ACTIVE);

// THEN
then();
result.computeStatus();
TestUtil.assertSuccess(result);

PrismObject<UserType> userAfter = getUser(USER_RAPP_OID);
display("user after", userAfter);
assertUser(userAfter, "user after")
.activation()
.assertAdministrativeStatus(ActivationStatusType.ENABLED)
.assertEffectiveStatus(ActivationStatusType.ENABLED);

assertAssignedRoles(userAfter, ROLE_CARIBBEAN_PIRATE_OID, ROLE_CAPTAIN_OID);
assertAssignments(userAfter, 2);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ <T extends ObjectType> String addObject(
@NotNull PrismObject<T> object,
@Nullable OperationProvisioningScriptsType scripts,
@Nullable ProvisioningOperationOptions options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws ObjectAlreadyExistsException, SchemaException, CommunicationException, ObjectNotFoundException,
Expand Down Expand Up @@ -616,7 +616,7 @@ <T extends ObjectType> SearchResultList<PrismObject<T>> searchObjects(
@NotNull Class<T> type,
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException,
Expand Down Expand Up @@ -665,7 +665,7 @@ <T extends ObjectType> Integer countObjects(
@NotNull Class<T> type,
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException,
Expand Down Expand Up @@ -712,7 +712,7 @@ <T extends ObjectType> SearchResultMetadata searchObjectsIterative(
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@NotNull ResultHandler<T> handler,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException,
Expand Down Expand Up @@ -777,7 +777,7 @@ <T extends ObjectType> String modifyObject(
@NotNull Collection<? extends ItemDelta<?, ?>> modifications,
@Nullable OperationProvisioningScriptsType scripts,
@Nullable ProvisioningOperationOptions options,
@Nullable ProvisioningOperationContext context,
@NotNull ProvisioningOperationContext context,
@NotNull Task task,
@NotNull OperationResult parentResult) throws ObjectNotFoundException, SchemaException,
CommunicationException, ConfigurationException, SecurityViolationException, PolicyViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException;
Expand Down

0 comments on commit b82d9f7

Please sign in to comment.