Fixed bug where DS could not be delete as it was assigned to a rollout.
Signed-off-by: Kai Zimmermann <kai.zimmermann@bosch-si.com>
This commit is contained in:
@@ -16,7 +16,9 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet;
|
|||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetTag;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetTag;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule;
|
||||||
|
import org.eclipse.hawkbit.repository.model.Action;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||||
|
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||||
import org.eclipse.hawkbit.repository.model.Tag;
|
import org.eclipse.hawkbit.repository.model.Tag;
|
||||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
@@ -82,15 +84,26 @@ public interface DistributionSetRepository
|
|||||||
List<DistributionSet> findByModules(JpaSoftwareModule module);
|
List<DistributionSet> findByModules(JpaSoftwareModule module);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds {@link DistributionSet}s based on given ID if they are not assigned
|
* Finds {@link DistributionSet}s based on given ID that are assigned yet to
|
||||||
* yet to an {@link UpdateAction}, i.e. unused.
|
* an {@link Action}, i.e. in use.
|
||||||
*
|
*
|
||||||
* @param ids
|
* @param ids
|
||||||
* to search for
|
* to search for
|
||||||
* @return
|
* @return list of {@link DistributionSet#getId()}
|
||||||
*/
|
*/
|
||||||
@Query("select ac.distributionSet.id from JpaAction ac where ac.distributionSet.id in :ids")
|
@Query("select ac.distributionSet.id from JpaAction ac where ac.distributionSet.id in :ids")
|
||||||
List<Long> findAssignedDistributionSetsById(@Param("ids") Long... ids);
|
List<Long> findAssignedToTargetDistributionSetsById(@Param("ids") Long... ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds {@link DistributionSet}s based on given ID that are assigned yet to
|
||||||
|
* an {@link Rollout}, i.e. in use.
|
||||||
|
*
|
||||||
|
* @param ids
|
||||||
|
* to search for
|
||||||
|
* @return list of {@link DistributionSet#getId()}
|
||||||
|
*/
|
||||||
|
@Query("select ra.distributionSet.id from JpaRollout ra where ra.distributionSet.id in :ids")
|
||||||
|
List<Long> findAssignedToRolloutDistributionSetsById(@Param("ids") Long... ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves all given {@link DistributionSet}s.
|
* Saves all given {@link DistributionSet}s.
|
||||||
|
|||||||
@@ -173,7 +173,9 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
|
|||||||
public void deleteDistributionSet(final Long... distributionSetIDs) {
|
public void deleteDistributionSet(final Long... distributionSetIDs) {
|
||||||
final List<Long> toHardDelete = new ArrayList<>();
|
final List<Long> toHardDelete = new ArrayList<>();
|
||||||
|
|
||||||
final List<Long> assigned = distributionSetRepository.findAssignedDistributionSetsById(distributionSetIDs);
|
final List<Long> assigned = distributionSetRepository
|
||||||
|
.findAssignedToTargetDistributionSetsById(distributionSetIDs);
|
||||||
|
assigned.addAll(distributionSetRepository.findAssignedToRolloutDistributionSetsById(distributionSetIDs));
|
||||||
|
|
||||||
// soft delete assigned
|
// soft delete assigned
|
||||||
if (!assigned.isEmpty()) {
|
if (!assigned.isEmpty()) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet;
|
|||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetMetadata;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetMetadata;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetTag;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetTag;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType;
|
||||||
|
import org.eclipse.hawkbit.repository.jpa.model.JpaRollout;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule;
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
|
||||||
import org.eclipse.hawkbit.repository.model.Action;
|
import org.eclipse.hawkbit.repository.model.Action;
|
||||||
@@ -34,12 +35,18 @@ import org.eclipse.hawkbit.repository.model.Action.Status;
|
|||||||
import org.eclipse.hawkbit.repository.model.ActionStatus;
|
import org.eclipse.hawkbit.repository.model.ActionStatus;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSetFilter.DistributionSetFilterBuilder;
|
import org.eclipse.hawkbit.repository.model.DistributionSetFilter.DistributionSetFilterBuilder;
|
||||||
import org.eclipse.hawkbit.repository.test.util.WithUser;
|
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSetMetadata;
|
import org.eclipse.hawkbit.repository.model.DistributionSetMetadata;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSetTag;
|
import org.eclipse.hawkbit.repository.model.DistributionSetTag;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSetType;
|
import org.eclipse.hawkbit.repository.model.DistributionSetType;
|
||||||
|
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupErrorAction;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupErrorCondition;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupSuccessCondition;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroupConditionBuilder;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroupConditions;
|
||||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||||
import org.eclipse.hawkbit.repository.model.Target;
|
import org.eclipse.hawkbit.repository.model.Target;
|
||||||
|
import org.eclipse.hawkbit.repository.test.util.WithUser;
|
||||||
import org.fest.assertions.core.Condition;
|
import org.fest.assertions.core.Condition;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@@ -777,36 +784,55 @@ public class DistributionSetManagementTest extends AbstractJpaIntegrationTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Description("Deltes a DS that is no in use. Expected behaviour is a soft delete on the database, i.e. only marked as "
|
@Description("Deletes a DS that is in use by either target assignment or rollout. Expected behaviour is a soft delete on the database, i.e. only marked as "
|
||||||
+ "deleted, kept eas refernce and unavailable for future use..")
|
+ "deleted, kept as refernce but unavailable for future use..")
|
||||||
public void deleteAssignedDistributionSet() {
|
public void deleteAssignedDistributionSet() {
|
||||||
DistributionSet ds1 = testdataFactory.createDistributionSet("ds-1");
|
DistributionSet ds1 = testdataFactory.createDistributionSet("ds-1");
|
||||||
DistributionSet ds2 = testdataFactory.createDistributionSet("ds-2");
|
DistributionSet ds2 = testdataFactory.createDistributionSet("ds-2");
|
||||||
DistributionSet dsAssigned = testdataFactory.createDistributionSet("ds-3");
|
DistributionSet dsToTargetAssigned = testdataFactory.createDistributionSet("ds-3");
|
||||||
|
final DistributionSet dsToRolloutAssigned = testdataFactory.createDistributionSet("ds-4");
|
||||||
|
|
||||||
ds1 = distributionSetManagement.findDistributionSetByNameAndVersion(ds1.getName(), ds1.getVersion());
|
ds1 = distributionSetManagement.findDistributionSetByNameAndVersion(ds1.getName(), ds1.getVersion());
|
||||||
ds2 = distributionSetManagement.findDistributionSetByNameAndVersion(ds2.getName(), ds2.getVersion());
|
ds2 = distributionSetManagement.findDistributionSetByNameAndVersion(ds2.getName(), ds2.getVersion());
|
||||||
|
|
||||||
// create assigned DS
|
// create assigned DS
|
||||||
dsAssigned = distributionSetManagement.findDistributionSetByNameAndVersion(dsAssigned.getName(),
|
dsToTargetAssigned = distributionSetManagement.findDistributionSetByNameAndVersion(dsToTargetAssigned.getName(),
|
||||||
dsAssigned.getVersion());
|
dsToTargetAssigned.getVersion());
|
||||||
final Target target = new JpaTarget("4712");
|
final Target target = new JpaTarget("4712");
|
||||||
final Target savedTarget = targetManagement.createTarget(target);
|
final Target savedTarget = targetManagement.createTarget(target);
|
||||||
final List<Target> toAssign = new ArrayList<>();
|
final List<Target> toAssign = new ArrayList<>();
|
||||||
toAssign.add(savedTarget);
|
toAssign.add(savedTarget);
|
||||||
deploymentManagement.assignDistributionSet(dsAssigned, toAssign);
|
deploymentManagement.assignDistributionSet(dsToTargetAssigned, toAssign);
|
||||||
|
|
||||||
// delete a ds
|
// create assigned rollout
|
||||||
assertThat(distributionSetRepository.findAll()).hasSize(3);
|
createRolloutByVariables("test", "test", 5, "name==*", dsToRolloutAssigned, "50", "5");
|
||||||
distributionSetManagement.deleteDistributionSet(dsAssigned.getId());
|
|
||||||
|
// delete assigned ds
|
||||||
|
assertThat(distributionSetRepository.findAll()).hasSize(4);
|
||||||
|
distributionSetManagement.deleteDistributionSet(dsToTargetAssigned.getId(), dsToRolloutAssigned.getId());
|
||||||
|
|
||||||
// not assigned so not marked as deleted
|
// not assigned so not marked as deleted
|
||||||
assertThat(distributionSetRepository.findAll()).hasSize(3);
|
assertThat(distributionSetRepository.findAll()).hasSize(4);
|
||||||
assertThat(distributionSetManagement
|
assertThat(distributionSetManagement
|
||||||
.findDistributionSetsByDeletedAndOrCompleted(pageReq, Boolean.FALSE, Boolean.TRUE).getTotalElements())
|
.findDistributionSetsByDeletedAndOrCompleted(pageReq, Boolean.FALSE, Boolean.TRUE).getTotalElements())
|
||||||
.isEqualTo(2);
|
.isEqualTo(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Rollout createRolloutByVariables(final String rolloutName, final String rolloutDescription,
|
||||||
|
final int groupSize, final String filterQuery, final DistributionSet distributionSet,
|
||||||
|
final String successCondition, final String errorCondition) {
|
||||||
|
final RolloutGroupConditions conditions = new RolloutGroupConditionBuilder()
|
||||||
|
.successCondition(RolloutGroupSuccessCondition.THRESHOLD, successCondition)
|
||||||
|
.errorCondition(RolloutGroupErrorCondition.THRESHOLD, errorCondition)
|
||||||
|
.errorAction(RolloutGroupErrorAction.PAUSE, null).build();
|
||||||
|
final Rollout rolloutToCreate = new JpaRollout();
|
||||||
|
rolloutToCreate.setName(rolloutName);
|
||||||
|
rolloutToCreate.setDescription(rolloutDescription);
|
||||||
|
rolloutToCreate.setTargetFilterQuery(filterQuery);
|
||||||
|
rolloutToCreate.setDistributionSet(distributionSet);
|
||||||
|
return rolloutManagement.createRollout(rolloutToCreate, groupSize, conditions);
|
||||||
|
}
|
||||||
|
|
||||||
private Target sendUpdateActionStatusToTarget(final Status status, final Action updActA, final Target t,
|
private Target sendUpdateActionStatusToTarget(final Status status, final Action updActA, final Target t,
|
||||||
final String... msgs) {
|
final String... msgs) {
|
||||||
updActA.setStatus(status);
|
updActA.setStatus(status);
|
||||||
|
|||||||
Reference in New Issue
Block a user