Support user consent flow (#1293)
* Introduce user consent flow * Add permissions to confirmation management * rename from consent to confirmation * Reformat code. Remove unused imports. Change and add permission checks when configuring auto-confirmation. * Do not include null values for DDI confirmation base endpoint * fix confirmation required checkbox id * Remove unused import. Fix consume/produce type of new API's. * Change term processing to proceeding when activating user consent flow * Align formatting and extend integration test cases for DMF and DDI. * Extend DMF test cases to consider auto-confirmation * Refactor action management to fix problem of handling action status updates on closed actions. * remove unsupported validation * use new confirmation api for DMF. Extend test cases., * Remove unnecessary fields. * Extend API documentation for DDI and MGMT API. * adapt ddi api docs adoc file * Fixed the duplicate migration version for db files * fix method to support confirmation * Fixed PR comments * Addressed PR comments * Fixed after merge compilation issue * Fixed after merge compilation issue * Fix failing tests in MgmtRolloutResourceTest * Fixed the permissions issue reflected by integration tests * Added back the missing line of code lost during merge * Fix the failing test on Jenkins Signed-off-by: Stanislav Trailov <stanislav.trailov@bosch.io> Signed-off-by: Dimitar Shterev <dimitar.shterev@bosch.io> Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io> Signed-off-by: Shruthi Manavalli Ramanna <shruthimanavalli.ramanna@bosch-si.com> Co-authored-by: Shruthi Manavalli Ramanna <shruthimanavalli.ramanna@bosch-si.com>
This commit is contained in:
@@ -28,6 +28,7 @@ import org.apache.commons.lang3.RandomStringUtils;
|
||||
import org.eclipse.hawkbit.artifact.repository.ArtifactRepository;
|
||||
import org.eclipse.hawkbit.cache.TenantAwareCacheManager;
|
||||
import org.eclipse.hawkbit.repository.ArtifactManagement;
|
||||
import org.eclipse.hawkbit.repository.ConfirmationManagement;
|
||||
import org.eclipse.hawkbit.repository.ControllerManagement;
|
||||
import org.eclipse.hawkbit.repository.DeploymentManagement;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetInvalidationManagement;
|
||||
@@ -158,6 +159,8 @@ public abstract class AbstractIntegrationTest {
|
||||
@Autowired
|
||||
protected DeploymentManagement deploymentManagement;
|
||||
|
||||
@Autowired
|
||||
protected ConfirmationManagement confirmationManagement;
|
||||
@Autowired
|
||||
protected DistributionSetInvalidationManagement distributionSetInvalidationManagement;
|
||||
|
||||
@@ -235,9 +238,12 @@ public abstract class AbstractIntegrationTest {
|
||||
|
||||
protected DistributionSetAssignmentResult assignDistributionSet(final long dsID, final List<String> controllerIds,
|
||||
final ActionType actionType, final long forcedTime, final Integer weight) {
|
||||
final boolean confirmationFlowActive = isConfirmationFlowActive();
|
||||
|
||||
final List<DeploymentRequest> deploymentRequests = controllerIds.stream()
|
||||
.map(id -> DeploymentManagement.deploymentRequest(id, dsID).setActionType(actionType)
|
||||
.setForceTime(forcedTime).setWeight(weight).build())
|
||||
.setForceTime(forcedTime).setWeight(weight).setConfirmationRequired(confirmationFlowActive)
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
final List<DistributionSetAssignmentResult> results = deploymentManagement
|
||||
.assignDistributionSets(deploymentRequests);
|
||||
@@ -245,6 +251,13 @@ public abstract class AbstractIntegrationTest {
|
||||
return results.get(0);
|
||||
}
|
||||
|
||||
protected List<DistributionSetAssignmentResult> assignDistributionSets(final List<DeploymentRequest> requests) {
|
||||
final List<DistributionSetAssignmentResult> distributionSetAssignmentResults = deploymentManagement
|
||||
.assignDistributionSets(requests);
|
||||
assertThat(distributionSetAssignmentResults).hasSize(requests.size());
|
||||
return distributionSetAssignmentResults;
|
||||
}
|
||||
|
||||
protected DistributionSetAssignmentResult assignDistributionSet(final DistributionSet ds,
|
||||
final List<Target> targets) {
|
||||
final List<String> targetIds = targets.stream().map(Target::getControllerId).collect(Collectors.toList());
|
||||
@@ -296,7 +309,7 @@ public abstract class AbstractIntegrationTest {
|
||||
|
||||
return makeAssignment(DeploymentManagement.deploymentRequest(controllerId, dsID)
|
||||
.setMaintenance(maintenanceWindowSchedule, maintenanceWindowDuration, maintenanceWindowTimeZone)
|
||||
.build());
|
||||
.setConfirmationRequired(true).build());
|
||||
}
|
||||
|
||||
protected DistributionSetAssignmentResult assignDistributionSet(final DistributionSet pset, final Target target) {
|
||||
@@ -312,6 +325,19 @@ public abstract class AbstractIntegrationTest {
|
||||
tenantConfigurationManagement.addOrUpdateConfiguration(TenantConfigurationKey.MULTI_ASSIGNMENTS_ENABLED, true);
|
||||
}
|
||||
|
||||
protected void enableConfirmationFlow() {
|
||||
tenantConfigurationManagement.addOrUpdateConfiguration(TenantConfigurationKey.USER_CONFIRMATION_ENABLED, true);
|
||||
}
|
||||
|
||||
protected void disableConfirmationFlow() {
|
||||
tenantConfigurationManagement.addOrUpdateConfiguration(TenantConfigurationKey.USER_CONFIRMATION_ENABLED, false);
|
||||
}
|
||||
|
||||
protected boolean isConfirmationFlowActive() {
|
||||
return tenantConfigurationManagement.getConfigurationValue(TenantConfigurationKey.USER_CONFIRMATION_ENABLED,
|
||||
Boolean.class).getValue();
|
||||
}
|
||||
|
||||
protected DistributionSetMetadata createDistributionSetMetadata(final long dsId, final MetaData md) {
|
||||
return createDistributionSetMetadata(dsId, Collections.singletonList(md)).get(0);
|
||||
}
|
||||
@@ -345,6 +371,10 @@ public abstract class AbstractIntegrationTest {
|
||||
Action savedAction = deploymentManagement.findActiveActionsByTarget(PAGE, savedTarget.getControllerId())
|
||||
.getContent().get(0);
|
||||
|
||||
if (savedAction.getStatus() == Action.Status.WAIT_FOR_CONFIRMATION) {
|
||||
confirmationManagement.confirmAction(savedAction.getId(), null, null);
|
||||
}
|
||||
|
||||
savedAction = controllerManagement.addUpdateActionStatus(
|
||||
entityFactory.actionStatus().create(savedAction.getId()).status(Action.Status.RUNNING));
|
||||
|
||||
@@ -473,4 +503,10 @@ public abstract class AbstractIntegrationTest {
|
||||
protected void disableBatchAssignments() {
|
||||
tenantConfigurationManagement.addOrUpdateConfiguration(TenantConfigurationKey.BATCH_ASSIGNMENTS_ENABLED, false);
|
||||
}
|
||||
|
||||
protected boolean isConfirmationFlowEnabled() {
|
||||
return tenantConfigurationManagement
|
||||
.getConfigurationValue(TenantConfigurationKey.USER_CONFIRMATION_ENABLED, Boolean.class).getValue();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -877,10 +877,14 @@ public class TestdataFactory {
|
||||
* @return {@link List} of {@link Target} entities
|
||||
*/
|
||||
public List<Target> createTargets(final int number) {
|
||||
return createTargets(DEFAULT_CONTROLLER_ID, number);
|
||||
}
|
||||
|
||||
public List<Target> createTargets(final String prefix, final int number) {
|
||||
|
||||
final List<TargetCreate> targets = Lists.newArrayListWithExpectedSize(number);
|
||||
for (int i = 0; i < number; i++) {
|
||||
targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i));
|
||||
targets.add(entityFactory.target().create().controllerId(prefix + i));
|
||||
}
|
||||
|
||||
return createTargets(targets);
|
||||
@@ -1140,7 +1144,14 @@ public class TestdataFactory {
|
||||
final int groupSize, final String filterQuery, final DistributionSet distributionSet,
|
||||
final String successCondition, final String errorCondition) {
|
||||
return createRolloutByVariables(rolloutName, rolloutDescription, groupSize, filterQuery, distributionSet,
|
||||
successCondition, errorCondition, Action.ActionType.FORCED, null);
|
||||
successCondition, errorCondition, Action.ActionType.FORCED, null, false);
|
||||
}
|
||||
|
||||
public Rollout createRolloutByVariables(final String rolloutName, final String rolloutDescription,
|
||||
final int groupSize, final String filterQuery, final DistributionSet distributionSet,
|
||||
final String successCondition, final String errorCondition, final boolean confirmationRequired) {
|
||||
return createRolloutByVariables(rolloutName, rolloutDescription, groupSize, filterQuery, distributionSet,
|
||||
successCondition, errorCondition, Action.ActionType.FORCED, null, confirmationRequired);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1164,12 +1175,15 @@ public class TestdataFactory {
|
||||
* the type of the Rollout
|
||||
* @param weight
|
||||
* weight of the Rollout
|
||||
* @param confirmationRequired
|
||||
* if the confirmation is required (considered with confirmation flow
|
||||
* active)
|
||||
* @return created {@link Rollout}
|
||||
*/
|
||||
public Rollout createRolloutByVariables(final String rolloutName, final String rolloutDescription,
|
||||
final int groupSize, final String filterQuery, final DistributionSet distributionSet,
|
||||
final String successCondition, final String errorCondition, final Action.ActionType actionType,
|
||||
final Integer weight) {
|
||||
final Integer weight, final boolean confirmationRequired) {
|
||||
final RolloutGroupConditions conditions = new RolloutGroupConditionBuilder().withDefaults()
|
||||
.successCondition(RolloutGroupSuccessCondition.THRESHOLD, successCondition)
|
||||
.errorCondition(RolloutGroupErrorCondition.THRESHOLD, errorCondition)
|
||||
@@ -1178,7 +1192,7 @@ public class TestdataFactory {
|
||||
final Rollout rollout = rolloutManagement.create(
|
||||
entityFactory.rollout().create().name(rolloutName).description(rolloutDescription)
|
||||
.targetFilterQuery(filterQuery).set(distributionSet).actionType(actionType).weight(weight),
|
||||
groupSize, conditions);
|
||||
groupSize, confirmationRequired, conditions);
|
||||
|
||||
// Run here, because Scheduler is disabled during tests
|
||||
rolloutManagement.handleRollouts();
|
||||
@@ -1314,7 +1328,7 @@ public class TestdataFactory {
|
||||
createTargets(amountOtherTargets, "others-" + suffix + "-", "rollout");
|
||||
final String filterQuery = "controllerId==rollout-" + suffix + "-*";
|
||||
return createRolloutByVariables("rollout-" + suffix, "test-rollout-description", amountOfGroups,
|
||||
filterQuery, rolloutDS, successCondition, errorCondition, actionType, weight);
|
||||
filterQuery, rolloutDS, successCondition, errorCondition, actionType, weight, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user