Improve target management (#1260)
* Fix join type for targets with their assignedDs Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io> * Override saveAll method and make use of it in the JpaTargetManagement Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io> * Use unmodifiable list and flip transactional logic Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io> * Initialize new list instead of an unmodifiable list. Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io> * Fix testdata factory Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
package org.eclipse.hawkbit.repository.jpa;
|
package org.eclipse.hawkbit.repository.jpa;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.jpa.model.AbstractJpaTenantAwareBaseEntity;
|
import org.eclipse.hawkbit.repository.jpa.model.AbstractJpaTenantAwareBaseEntity;
|
||||||
@@ -40,4 +41,18 @@ public interface BaseEntityRepository<T extends AbstractJpaTenantAwareBaseEntity
|
|||||||
*/
|
*/
|
||||||
Optional<T> findById(I id);
|
Optional<T> findById(I id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides
|
||||||
|
* {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)}
|
||||||
|
* to return a list of created entities instead of an instance of
|
||||||
|
* {@link Iterable} to be able to work with it directly in further code
|
||||||
|
* processing instead of converting the {@link Iterable}.
|
||||||
|
*
|
||||||
|
* @param entities
|
||||||
|
* to persist in the database
|
||||||
|
* @return the created entities
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
<S extends T> List<S> saveAll(Iterable<S> entities);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -748,7 +748,9 @@ public class JpaTargetManagement implements TargetManagement {
|
|||||||
@Retryable(include = {
|
@Retryable(include = {
|
||||||
ConcurrencyFailureException.class }, maxAttempts = Constants.TX_RT_MAX, backoff = @Backoff(delay = Constants.TX_RT_DELAY))
|
ConcurrencyFailureException.class }, maxAttempts = Constants.TX_RT_MAX, backoff = @Backoff(delay = Constants.TX_RT_DELAY))
|
||||||
public List<Target> create(final Collection<TargetCreate> targets) {
|
public List<Target> create(final Collection<TargetCreate> targets) {
|
||||||
return targets.stream().map(this::create).collect(Collectors.toList());
|
final List<JpaTarget> targetList = targets.stream().map(JpaTargetCreate.class::cast).map(JpaTargetCreate::build)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return Collections.unmodifiableList(targetRepository.saveAll(targetList));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet;
|
|||||||
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
|
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
|
||||||
import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications;
|
import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications;
|
||||||
import org.eclipse.hawkbit.repository.model.Target;
|
import org.eclipse.hawkbit.repository.model.Target;
|
||||||
import org.eclipse.hawkbit.repository.model.TargetType;
|
|
||||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||||
import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
|
import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ public final class TargetSpecifications {
|
|||||||
return (targetRoot, query, cb) -> {
|
return (targetRoot, query, cb) -> {
|
||||||
|
|
||||||
final Predicate predicate = targetRoot.get(JpaTarget_.controllerId).in(controllerIDs);
|
final Predicate predicate = targetRoot.get(JpaTarget_.controllerId).in(controllerIDs);
|
||||||
targetRoot.fetch(JpaTarget_.assignedDistributionSet);
|
targetRoot.fetch(JpaTarget_.assignedDistributionSet, JoinType.LEFT);
|
||||||
return predicate;
|
return predicate;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -880,7 +880,7 @@ public class TestdataFactory {
|
|||||||
targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i));
|
targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i));
|
||||||
}
|
}
|
||||||
|
|
||||||
return targetManagement.create(targets);
|
return createTargets(targets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -904,7 +904,7 @@ public class TestdataFactory {
|
|||||||
.targetType(targetType.getId()));
|
.targetType(targetType.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return targetManagement.create(targets);
|
return createTargets(targets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -922,7 +922,7 @@ public class TestdataFactory {
|
|||||||
targets.add(entityFactory.target().create().controllerId(targetId));
|
targets.add(entityFactory.target().create().controllerId(targetId));
|
||||||
}
|
}
|
||||||
|
|
||||||
return targetManagement.create(targets);
|
return createTargets(targets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -987,11 +987,19 @@ public class TestdataFactory {
|
|||||||
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
|
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
|
||||||
final String descriptionPrefix) {
|
final String descriptionPrefix) {
|
||||||
|
|
||||||
return targetManagement.create(IntStream.range(0, numberOfTargets)
|
final List<TargetCreate> targets = IntStream.range(0, numberOfTargets)
|
||||||
.mapToObj(i -> entityFactory.target().create()
|
.mapToObj(i -> entityFactory.target().create()
|
||||||
.controllerId(String.format("%s-%05d", controllerIdPrefix, i))
|
.controllerId(String.format("%s-%05d", controllerIdPrefix, i))
|
||||||
.description(descriptionPrefix + i))
|
.description(descriptionPrefix + i))
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList());
|
||||||
|
return createTargets(targets);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Target> createTargets(final Collection<TargetCreate> targetCreates) {
|
||||||
|
// init new instance of array list since the TargetManagement#create will
|
||||||
|
// provide a unmodifiable list
|
||||||
|
final List<Target> createdTargets = targetManagement.create(targetCreates);
|
||||||
|
return new ArrayList<>(createdTargets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1010,11 +1018,12 @@ public class TestdataFactory {
|
|||||||
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
|
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
|
||||||
final String descriptionPrefix, final Long lastTargetQuery) {
|
final String descriptionPrefix, final Long lastTargetQuery) {
|
||||||
|
|
||||||
return targetManagement.create(IntStream.range(0, numberOfTargets)
|
final List<TargetCreate> targets = IntStream.range(0, numberOfTargets)
|
||||||
.mapToObj(i -> entityFactory.target().create()
|
.mapToObj(i -> entityFactory.target().create()
|
||||||
.controllerId(String.format("%s-%05d", controllerIdPrefix, i))
|
.controllerId(String.format("%s-%05d", controllerIdPrefix, i))
|
||||||
.description(descriptionPrefix + i).lastTargetQuery(lastTargetQuery))
|
.description(descriptionPrefix + i).lastTargetQuery(lastTargetQuery))
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList());
|
||||||
|
return createTargets(targets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user