Skip to content

Commit

Permalink
Lifecycle state "suspended" (backend impl)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Jun 19, 2023
1 parent a1f7368 commit 712c6f5
Show file tree
Hide file tree
Showing 6 changed files with 211 additions and 2 deletions.
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 @@ -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

0 comments on commit 712c6f5

Please sign in to comment.