diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetAssignmentResult.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetAssignmentResult.java index 3e61e4499..8b1df00da 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetAssignmentResult.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetAssignmentResult.java @@ -55,7 +55,7 @@ public class DistributionSetAssignmentResult extends AssignmentResult { * @return the assignedTargets */ public List getAssignedTargets() { - return targetManagement.findTargetsByControllerID(assignedTargets); + return targetManagement.findTargetByControllerID(assignedTargets); } /** diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/TargetManagement.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/TargetManagement.java index 9cf487641..4f89c8263 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/TargetManagement.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/TargetManagement.java @@ -53,7 +53,6 @@ import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; @@ -155,7 +154,7 @@ public class TargetManagement { * @return List of found{@link Target}s */ @PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_TARGET) - public List findTargetsByControllerID(@NotEmpty final Collection controllerIDs) { + public List findTargetByControllerID(@NotEmpty final Collection controllerIDs) { return targetRepository.findAll(TargetSpecifications.byControllerIdWithStatusAndAssignedInJoin(controllerIDs)); } @@ -331,10 +330,10 @@ public class TargetManagement { } /** - * retrieves {@link Target}s by the assigned {@link DistributionSet} without + * Retrieves {@link Target}s by the assigned {@link DistributionSet} without * details, i.e. NO {@link Target#getTags()} and - * {@link Target#getActiveActions()} possible including the filtering based - * on the given {@code spec}. + * {@link Target#getActiveActions()} possible including additional filtering + * based on the given {@code spec}. * * @param distributionSetID * the ID of the {@link DistributionSet} @@ -374,7 +373,8 @@ public class TargetManagement { /** * retrieves {@link Target}s by the installed {@link DistributionSet}without * details, i.e. NO {@link Target#getTags()} and - * {@link Target#getActiveActions()} possible. + * {@link Target#getActiveActions()} possible including additional filtering + * based on the given {@code spec}. * * @param distributionSetId * the ID of the {@link DistributionSet} @@ -490,7 +490,7 @@ public class TargetManagement { if (!Strings.isNullOrEmpty(searchText)) { specList.add(TargetSpecifications.likeNameOrDescriptionOrIp(searchText)); } - if (selectTargetWithNoTag || (tagNames != null && tagNames.length > 0)) { + if (selectTargetWithNoTag != null && (selectTargetWithNoTag || (tagNames != null && tagNames.length > 0))) { specList.add(TargetSpecifications.hasTags(tagNames, selectTargetWithNoTag)); } return specList; @@ -810,14 +810,12 @@ public class TargetManagement { } /** - * finds all {@link Target#getControllerId()} for all the given parameters. + * Finds all targets for all the given parameters but returns not the full + * target but {@link TargetIdName}. * * @param pageRequest * the pageRequest to enhance the query for paging and sorting - * @param filterByDistributionId - * to find targets having the {@link DistributionSet} as - * installed or assigned. Set to null in case this - * is not required. + * * @param filterByStatus * find targets having this {@link TargetUpdateStatus}s. Set to * null in case this is not required. @@ -825,28 +823,38 @@ public class TargetManagement { * to find targets having the text anywhere in name or * description. Set null in case this is not * required. + * @param installedOrAssignedDistributionSetId + * to find targets having the {@link DistributionSet} as + * installed or assigned. Set to null in case this + * is not required. * @param filterByTagNames * to find targets which are having any one in this tag names. * Set null in case this is not required. * @param selectTargetWithNoTag * flag to select targets with no tag assigned * - * @return the found {@link Target}s + * @return the found {@link TargetIdName}s */ @PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_TARGET) - public List findAllTargetIdsByFilters(final PageRequest pageRequest, - final Long filterByDistributionId, final Collection filterByStatus, - final String filterBySearchText, final Boolean selectTargetWithNoTag, final String... filterByTagNames) { + public List findAllTargetIdsByFilters(@NotNull final Pageable pageRequest, + final Collection filterByStatus, final String filterBySearchText, + final Long installedOrAssignedDistributionSetId, final Boolean selectTargetWithNoTag, + final String... filterByTagNames) { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery(Object[].class); final Root targetRoot = query.from(Target.class); List resultList; + + String sortProperty = Target_.id.getName(); + if (pageRequest.getSort() != null && pageRequest.getSort().iterator().hasNext()) { + sortProperty = pageRequest.getSort().iterator().next().getProperty(); + } + final CriteriaQuery multiselect = query.multiselect(targetRoot.get(Target_.id), - targetRoot.get(Target_.controllerId), targetRoot.get(Target_.name), - targetRoot.get(pageRequest.getSort().iterator().next().getProperty())); + targetRoot.get(Target_.controllerId), targetRoot.get(Target_.name), targetRoot.get(sortProperty)); final Predicate[] specificationsForMultiSelect = specificationsToPredicate( - buildSpecificationList(filterByStatus, filterBySearchText, filterByDistributionId, + buildSpecificationList(filterByStatus, filterBySearchText, installedOrAssignedDistributionSetId, selectTargetWithNoTag, false, filterByTagNames), targetRoot, multiselect, cb); @@ -862,24 +870,29 @@ public class TargetManagement { } /** - * Finds all {@link Target#getControllerId()} for all the given parameter - * {@link TargetFilterQuery}. + * Finds all targets for all the given parameter {@link TargetFilterQuery} + * and returns not the full target but {@link TargetIdName}. * * @param pageRequest * the pageRequest to enhance the query for paging and sorting * @param targetFilterQuery * {@link TargetFilterQuery} - * @return the found {@link Target}s + * @return the found {@link TargetIdName}s */ @PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_TARGET) - public List findAllTargetIdsByTargetFilterQuery(final PageRequest pageRequest, + public List findAllTargetIdsByTargetFilterQuery(final Pageable pageRequest, @NotNull final TargetFilterQuery targetFilterQuery) { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery(Object[].class); final Root targetRoot = query.from(Target.class); + + String sortProperty = Target_.id.getName(); + if (pageRequest.getSort() != null && pageRequest.getSort().iterator().hasNext()) { + sortProperty = pageRequest.getSort().iterator().next().getProperty(); + } + final CriteriaQuery multiselect = query.multiselect(targetRoot.get(Target_.id), - targetRoot.get(Target_.controllerId), targetRoot.get(Target_.name), - targetRoot.get(pageRequest.getSort().iterator().next().getProperty())); + targetRoot.get(Target_.controllerId), targetRoot.get(Target_.name), targetRoot.get(sortProperty)); final Specification spec = RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class); final List> specList = new ArrayList<>(); @@ -1072,7 +1085,7 @@ public class TargetManagement { return targetRepository.count(specs); } - private List getTargetIdNameResultSet(final PageRequest pageRequest, final CriteriaBuilder cb, + private List getTargetIdNameResultSet(final Pageable pageRequest, final CriteriaBuilder cb, final Root targetRoot, final CriteriaQuery multiselect) { List resultList; if (pageRequest.getSort() != null) { diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetFilterQuery.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetFilterQuery.java index f14fc26e2..80721a3d2 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetFilterQuery.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetFilterQuery.java @@ -15,18 +15,14 @@ import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** - * + * Stored target filter. * */ @Entity @Table(name = "sp_target_filter_query", indexes = { @Index(name = "sp_idx_target_filter_query_01", columnList = "tenant,name") }, uniqueConstraints = @UniqueConstraint(columnNames = { - "name", "tenant" }, name = "uk_tenant_custom_filter_name") ) + "name", "tenant" }, name = "uk_tenant_custom_filter_name")) public class TargetFilterQuery extends TenantAwareBaseEntity { - /** - * - * - */ private static final long serialVersionUID = 7493966984413479089L; @Column(name = "name", length = 64) @@ -36,8 +32,7 @@ public class TargetFilterQuery extends TenantAwareBaseEntity { private String query; public TargetFilterQuery() { - name = null; - query = null; + // Default constructor for JPA. } public TargetFilterQuery(final String name, final String query) { @@ -45,32 +40,18 @@ public class TargetFilterQuery extends TenantAwareBaseEntity { this.query = query; } - /** - * @return the name - */ public String getName() { return name; } - /** - * @param name - * the name to set - */ public void setName(final String name) { this.name = name; } - /** - * @return the query - */ public String getQuery() { return query; } - /** - * @param query - * the query to set - */ public void setQuery(final String query) { this.query = query; } diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetIdName.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetIdName.java index f7a63b775..f06fa8cf0 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetIdName.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetIdName.java @@ -13,19 +13,12 @@ import java.io.Serializable; /** * ID class of the {@link Target} which contains the * {@link Target#getControllerId()} and the {@link Target#getName()} in one - * object. Often it's necessary to remeber the IDs of the {@link Target} and the - * resolve for e.g. the UI the name of the target, this is very costly + * object. Often it's necessary to remember the IDs of the {@link Target} and + * the resolve for e.g. the UI the name of the target, this is very costly * operation, so it's much better if the ID and the name of the {@link Target} * is already in memory available. - * - * - * - * */ public class TargetIdName implements Serializable { - /** - * - */ private static final long serialVersionUID = 1L; private final long targetId; diff --git a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetFilterQueryManagenmentTest.java b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetFilterQueryManagenmentTest.java index 73528ca5b..87fdff253 100644 --- a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetFilterQueryManagenmentTest.java +++ b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetFilterQueryManagenmentTest.java @@ -22,10 +22,7 @@ import ru.yandex.qatools.allure.annotations.Stories; /** * Test class for {@link TargetFilterQueryManagement}. * - * - * */ - @Features("Component Tests - Repository") @Stories("Target Filter Query Management") public class TargetFilterQueryManagenmentTest extends AbstractIntegrationTest { diff --git a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementSearchTest.java b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementSearchTest.java index 93806e626..0438ac512 100644 --- a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementSearchTest.java +++ b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementSearchTest.java @@ -11,28 +11,34 @@ package org.eclipse.hawkbit.repository; import static org.fest.assertions.api.Assertions.assertThat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import org.eclipse.hawkbit.AbstractIntegrationTest; import org.eclipse.hawkbit.TestDataUtil; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action.Status; import org.eclipse.hawkbit.repository.model.ActionStatus; -import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.Target; +import org.eclipse.hawkbit.repository.model.TargetFilterQuery; +import org.eclipse.hawkbit.repository.model.TargetIdName; import org.eclipse.hawkbit.repository.model.TargetTag; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; +import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; +import org.eclipse.hawkbit.repository.specifications.TargetSpecifications; import org.junit.Test; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; +import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import ru.yandex.qatools.allure.annotations.Description; import ru.yandex.qatools.allure.annotations.Features; +import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.allure.annotations.Stories; @Features("Component Tests - Repository") @@ -40,152 +46,626 @@ import ru.yandex.qatools.allure.annotations.Stories; public class TargetManagementSearchTest extends AbstractIntegrationTest { @Test - @Description("Tests different parameter combinations for target search operations. That includes both the test itself as a count operation with the same filters.") + @Description("Tests different parameter combinations for target search operations. " + + "That includes both the test itself, as a count operation with the same filters " + + "and query definitions by RSQL (named and un-named).") public void targetSearchWithVariousFilterCombinations() { - final TargetTag targTagA = tagManagement.createTargetTag(new TargetTag("TargTag-A")); - final TargetTag targTagB = tagManagement.createTargetTag(new TargetTag("TargTag-B")); - final TargetTag targTagC = tagManagement.createTargetTag(new TargetTag("TargTag-C")); - final TargetTag targTagD = tagManagement.createTargetTag(new TargetTag("TargTag-D")); - - // TODO kaizimmerm: test also installedDS (not only assignedDS) + final TargetTag targTagX = tagManagement.createTargetTag(new TargetTag("TargTag-X")); + final TargetTag targTagY = tagManagement.createTargetTag(new TargetTag("TargTag-Y")); + final TargetTag targTagZ = tagManagement.createTargetTag(new TargetTag("TargTag-Z")); + final TargetTag targTagW = tagManagement.createTargetTag(new TargetTag("TargTag-W")); final DistributionSet setA = TestDataUtil.generateDistributionSet("", softwareManagement, distributionSetManagement); + final DistributionSet installedSet = TestDataUtil.generateDistributionSet("another", softwareManagement, + distributionSetManagement); + final String targetDsAIdPref = "targ-A"; List targAs = targetManagement.createTargets( TestDataUtil.buildTargetFixtures(100, targetDsAIdPref, targetDsAIdPref.concat(" description"))); - targAs = targetManagement.toggleTagAssignment(targAs, targTagA).getAssignedTargets(); + targAs = targetManagement.toggleTagAssignment(targAs, targTagX).getAssignedTargets(); final String targetDsBIdPref = "targ-B"; List targBs = targetManagement.createTargets( TestDataUtil.buildTargetFixtures(100, targetDsBIdPref, targetDsBIdPref.concat(" description"))); - targBs = targetManagement.toggleTagAssignment(targBs, targTagB).getAssignedTargets(); - targBs = targetManagement.toggleTagAssignment(targBs, targTagD).getAssignedTargets(); + targBs = targetManagement.toggleTagAssignment(targBs, targTagY).getAssignedTargets(); + targBs = targetManagement.toggleTagAssignment(targBs, targTagW).getAssignedTargets(); final String targetDsCIdPref = "targ-C"; List targCs = targetManagement.createTargets( TestDataUtil.buildTargetFixtures(100, targetDsCIdPref, targetDsCIdPref.concat(" description"))); - targCs = targetManagement.toggleTagAssignment(targCs, targTagC).getAssignedTargets(); - targCs = targetManagement.toggleTagAssignment(targCs, targTagD).getAssignedTargets(); + targCs = targetManagement.toggleTagAssignment(targCs, targTagZ).getAssignedTargets(); + targCs = targetManagement.toggleTagAssignment(targCs, targTagW).getAssignedTargets(); final String targetDsDIdPref = "targ-D"; - final Iterable targDs = targetManagement.createTargets( + final List targDs = targetManagement.createTargets( TestDataUtil.buildTargetFixtures(100, targetDsDIdPref, targetDsDIdPref.concat(" description"))); - deploymentManagement.assignDistributionSet(setA.getId(), targCs.iterator().next().getControllerId()); - deploymentManagement.assignDistributionSet(setA.getId(), targAs.iterator().next().getControllerId()); - deploymentManagement.assignDistributionSet(setA.getId(), targBs.iterator().next().getControllerId()); + final String assignedC = targCs.iterator().next().getControllerId(); + deploymentManagement.assignDistributionSet(setA.getId(), assignedC); + final String assignedA = targAs.iterator().next().getControllerId(); + deploymentManagement.assignDistributionSet(setA.getId(), assignedA); + final String assignedB = targBs.iterator().next().getControllerId(); + deploymentManagement.assignDistributionSet(setA.getId(), assignedB); + final String installedC = targCs.iterator().next().getControllerId(); + final Long actionId = deploymentManagement.assignDistributionSet(installedSet.getId(), assignedC).getActions() + .get(0); - final List unknown = new ArrayList(); + // set one installed DS also + final Action action = deploymentManagement.findActionWithDetails(actionId); + action.setStatus(Status.FINISHED); + controllerManagament.addUpdateActionStatus( + new ActionStatus(action, Status.FINISHED, System.currentTimeMillis(), "message"), action); + deploymentManagement.assignDistributionSet(setA.getId(), installedC); + + final List unknown = new ArrayList<>(); unknown.add(TargetUpdateStatus.UNKNOWN); - final List pending = new ArrayList(); + final List pending = new ArrayList<>(); pending.add(TargetUpdateStatus.PENDING); - final List both = new ArrayList(); + final List both = new ArrayList<>(); both.add(TargetUpdateStatus.UNKNOWN); both.add(TargetUpdateStatus.PENDING); - final PageRequest pageReq = new PageRequest(0, 500); // try to find several targets with different filter settings + verifyThatRepositoryContains400Targets(); + verifyThat200TargetsHaveTagD(targTagW, concat(targBs, targCs)); + verifyThat100TargetsContainsGivenTextAndHaveTagAssigned(targTagY, targTagW, targBs); + verifyThat1TargetHasTagHasDescOrNameAndDs(targTagW, setA, targetManagement.findTargetByControllerID(assignedC)); + verifyThat0TargetsWithTagAndDescOrNameHasDS(targTagW, setA); + verifyThat0TargetsWithNameOrdescAndDSHaveTag(targTagX, setA); + verifyThat3TargetsHaveDSAssigned(setA, + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedA, assignedB, assignedC))); + verifyThat1TargetWithDescOrNameHasDS(setA, targetManagement.findTargetByControllerID(assignedA)); + List expected = concat(targAs, targBs, targCs, targDs); + expected.removeAll( + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedA, assignedB, assignedC))); + verifyThat397TargetsAreInStatusUnknown(unknown, expected); + expected = concat(targBs, targCs); + expected.removeAll(targetManagement.findTargetByControllerID(Lists.newArrayList(assignedB, assignedC))); + verifyThat198TargetsAreInStatusUnknownAndHaveGivenTags(targTagY, targTagW, unknown, expected); + verfyThat0TargetsAreInStatusUnknownAndHaveDSAssigned(setA, unknown); + expected = concat(targAs); + expected.remove(targetManagement.findTargetByControllerID(assignedA)); + verifyThat99TargetsWithNameOrDescriptionAreInGivenStatus(unknown, expected); + expected = concat(targBs); + expected.remove(targetManagement.findTargetByControllerID(assignedB)); + verifyThat99TargetsWithGivenNameOrDescAndTagAreInStatusUnknown(targTagW, unknown, expected); + verifyThat3TargetsAreInStatusPending(pending, + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedA, assignedB, assignedC))); + verifyThat3TargetsWithGivenDSAreInPending(setA, pending, + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedA, assignedB, assignedC))); + verifyThat1TargetWithGivenNameOrDescAndDSIsInPending(setA, pending, + targetManagement.findTargetByControllerID(assignedA)); + verifyThat1TargetWithGivenNameOrDescAndTagAndDSIsInPending(targTagW, setA, pending, + targetManagement.findTargetByControllerID(assignedB)); + verifyThat2TargetsWithGivenTagAndDSIsInPending(targTagW, setA, pending, + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedB, assignedC))); + verifyThat2TargetsWithGivenTagAreInPending(targTagW, pending, + targetManagement.findTargetByControllerID(Lists.newArrayList(assignedB, assignedC))); + verifyThat200targetsWithGivenTagAreInStatusPendingorUnknown(targTagW, both, concat(targBs, targCs)); + verfiyThat1TargetAIsInStatusPendingAndHasDSInstalled(installedSet, pending, + targetManagement.findTargetByControllerID(installedC)); + } - // TODO kaizimmerm: comment and check also the content itself, not only - // the numbers - // (containsOnly) - assertThat(targetManagement.countTargetsAll()).isEqualTo(400); + @Step + private void verfiyThat1TargetAIsInStatusPendingAndHasDSInstalled(final DistributionSet installedSet, + final List pending, final Target expected) { + final TargetIdName expectedIdName = convertToIdName(expected); + final String query = "updatestatus==pending and installedds.name==" + installedSet.getName(); - assertThat(targetManagement.findTargetByFilters(pageReq, null, null, null, Boolean.FALSE, targTagD.getName()) - .getNumberOfElements()).isEqualTo(200).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(null, null, null, Boolean.FALSE, targTagD.getName()))); + assertThat(targetManagement + .findTargetByFilters(pageReq, pending, null, installedSet.getId(), Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(1) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, + installedSet.getId(), Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsExactly(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); - Slice x = targetManagement.findTargetByFilters(pageReq, null, "%targ-B%", null, Boolean.FALSE, - targTagB.getName(), targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(100).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(null, "%targ-B%", null, Boolean.FALSE, targTagB.getName(), targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, - targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(1).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(null, "%targ-C%", setA.getId(), Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, - targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(0).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(null, "%targ-A%", setA.getId(), Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, - targTagA.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(0).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(null, "%targ-C%", setA.getId(), Boolean.FALSE, targTagA.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, null, null, setA.getId(), Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(3).isEqualTo(Ints - .saturatedCast(targetManagement.countTargetByFilters(null, null, setA.getId(), Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(1).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(null, "%targ-A%", setA.getId(), Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, null, null, Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(397).isEqualTo( - Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, null, null, Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, null, null, Boolean.FALSE, targTagB.getName(), - targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(198).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(unknown, null, null, Boolean.FALSE, targTagB.getName(), targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, null, setA.getId(), Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(0).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(unknown, null, setA.getId(), Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, "%targ-A%", null, Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(99).isEqualTo(Ints - .saturatedCast(targetManagement.countTargetByFilters(unknown, "%targ-A%", null, Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, "%targ-B%", null, Boolean.FALSE, targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(99).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(unknown, "%targ-B%", null, Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, unknown, null, null, Boolean.FALSE, targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(198).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(unknown, null, null, Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, pending, null, null, Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(3).isEqualTo( - Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, null, Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, pending, null, setA.getId(), Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(3).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(pending, null, setA.getId(), Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, pending, "%targ-A%", setA.getId(), Boolean.FALSE, null); - assertThat(x.getNumberOfElements()).isEqualTo(1).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(pending, "%targ-A%", setA.getId(), Boolean.FALSE, null))); - - x = targetManagement.findTargetByFilters(pageReq, pending, "%targ-B%", setA.getId(), Boolean.FALSE, - targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(1).isEqualTo(Ints.saturatedCast(targetManagement - .countTargetByFilters(pending, "%targ-B%", setA.getId(), Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, pending, null, setA.getId(), Boolean.FALSE, - targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(2).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(pending, null, setA.getId(), Boolean.FALSE, targTagD.getName()))); - - x = targetManagement.findTargetByFilters(pageReq, pending, null, null, Boolean.FALSE, targTagD.getName()); - assertThat(x.getNumberOfElements()).isEqualTo(2).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(pending, null, null, Boolean.FALSE, targTagD.getName()))); - - // Both status: 2 pending and 198 unknown - assertThat(targetManagement.findTargetByFilters(pageReq, both, null, null, Boolean.FALSE, targTagD.getName()) - .getNumberOfElements()).isEqualTo(200).isEqualTo(Ints.saturatedCast( - targetManagement.countTargetByFilters(both, null, null, Boolean.FALSE, targTagD.getName()))); + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, null, installedSet.getId(), + Boolean.FALSE, new String[0])).as("has number of elements").hasSize(1) + .as("and contains the following elements").containsExactly(expectedIdName) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + + } + + @Step + private void verifyThat200targetsWithGivenTagAreInStatusPendingorUnknown(final TargetTag targTagW, + final List both, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + + final String query = "(updatestatus==pending or updatestatus==unknown) and tag==" + targTagW.getName(); + + assertThat(targetManagement.findTargetByFilters(pageReq, both, null, null, Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(200) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(both, null, null, + Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, both, null, null, Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(200).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + private static List convertToIdNames(final List expected) { + return expected.stream() + .map(target -> new TargetIdName(target.getId(), target.getControllerId(), target.getName())) + .collect(Collectors.toList()); + } + + private static TargetIdName convertToIdName(final Target target) { + return new TargetIdName(target.getId(), target.getControllerId(), target.getName()); + } + + @Step + private void verifyThat2TargetsWithGivenTagAreInPending(final TargetTag targTagW, + final List pending, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==pending and tag==" + targTagW.getName(); + + assertThat(targetManagement.findTargetByFilters(pageReq, pending, null, null, Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(2) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, null, + Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, null, null, Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(2).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat2TargetsWithGivenTagAndDSIsInPending(final TargetTag targTagW, final DistributionSet setA, + final List pending, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==pending and (assignedds.name==" + setA.getName() + " or installedds.name==" + + setA.getName() + ") and tag==" + targTagW.getName(); + + assertThat(targetManagement + .findTargetByFilters(pageReq, pending, null, setA.getId(), Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(2) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, setA.getId(), + Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, null, null, Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(2).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat1TargetWithGivenNameOrDescAndTagAndDSIsInPending(final TargetTag targTagW, + final DistributionSet setA, final List pending, final Target expected) { + final TargetIdName expectedIdName = convertToIdName(expected); + final String query = "updatestatus==pending and (assignedds.name==" + setA.getName() + " or installedds.name==" + + setA.getName() + ") and (name==*targ-B* or description==*targ-B*) and tag==" + targTagW.getName(); + + assertThat(targetManagement + .findTargetByFilters(pageReq, pending, "%targ-B%", setA.getId(), Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(1) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, "%targ-B%", + setA.getId(), Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsExactly(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, "%targ-B%", setA.getId(), Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(1).as("and contains the following elements") + .containsExactly(expectedIdName).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat1TargetWithGivenNameOrDescAndDSIsInPending(final DistributionSet setA, + final List pending, final Target expected) { + final TargetIdName expectedIdName = convertToIdName(expected); + final String query = "updatestatus==pending and (assignedds.name==" + setA.getName() + " or installedds.name==" + + setA.getName() + ") and (name==*targ-A* or description==*targ-A*)"; + + assertThat(targetManagement + .findTargetByFilters(pageReq, pending, "%targ-A%", setA.getId(), Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(1) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, "%targ-A%", + setA.getId(), Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsExactly(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, "%targ-A%", setA.getId(), Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(1).as("and contains the following elements") + .containsExactly(expectedIdName).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat3TargetsWithGivenDSAreInPending(final DistributionSet setA, + final List pending, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==pending and (assignedds.name==" + setA.getName() + " or installedds.name==" + + setA.getName() + ")"; + + assertThat(targetManagement + .findTargetByFilters(pageReq, pending, null, setA.getId(), Boolean.FALSE, new String[0]).getContent()) + .as("has number of elements").hasSize(3).as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, setA.getId(), + Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, pending, null, setA.getId(), Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(3).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat3TargetsAreInStatusPending(final List pending, + final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==pending"; + + assertThat(targetManagement.findTargetByFilters(pageReq, pending, null, null, Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(3) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(pending, null, null, + Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat( + targetManagement.findAllTargetIdsByFilters(pageReq, pending, null, null, Boolean.FALSE, new String[0])) + .as("has number of elements").hasSize(3).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat99TargetsWithGivenNameOrDescAndTagAreInStatusUnknown(final TargetTag targTagW, + final List unknown, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==unknown and (name==*targ-B* or description==*targ-B*) and tag==" + + targTagW.getName(); + + assertThat(targetManagement + .findTargetByFilters(pageReq, unknown, "%targ-B%", null, Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(99) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, "%targ-B%", null, + Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, unknown, "%targ-B%", null, Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(99).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat99TargetsWithNameOrDescriptionAreInGivenStatus(final List unknown, + final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==unknown and (name==*targ-A* or description==*targ-A*)"; + + assertThat(targetManagement + .findTargetByFilters(pageReq, unknown, "%targ-A%", null, Boolean.FALSE, new String[0]).getContent()) + .as("has number of elements").hasSize(99).as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, "%targ-A%", null, + Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, unknown, "%targ-A%", null, Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(99).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verfyThat0TargetsAreInStatusUnknownAndHaveDSAssigned(final DistributionSet setA, + final List unknown) { + final String query = "updatestatus==unknown and (assignedds.name==" + setA.getName() + " or installedds.name==" + + setA.getName() + ")"; + + assertThat(targetManagement + .findTargetByFilters(pageReq, unknown, null, setA.getId(), Boolean.FALSE, new String[0]).getContent()) + .as("has number of elements").hasSize(0).as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, null, setA.getId(), + Boolean.FALSE, new String[0]))) + .as("and filter query returns the same result") + .hasSize(targetManagement.findTargetsAll(query, pageReq).getContent().size()) + .as("and NAMED filter query returns the same result").hasSize(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent().size()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, unknown, null, setA.getId(), Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(0) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat198TargetsAreInStatusUnknownAndHaveGivenTags(final TargetTag targTagY, + final TargetTag targTagW, final List unknown, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==unknown and (tag==" + targTagY.getName() + " or tag==" + targTagW.getName() + + ")"; + + assertThat(targetManagement.findTargetByFilters(pageReq, unknown, null, null, Boolean.FALSE, targTagY.getName(), + targTagW.getName()).getContent()).as("has number of elements").hasSize(198) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, null, null, + Boolean.FALSE, targTagY.getName(), targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, unknown, null, null, Boolean.FALSE, + targTagY.getName(), targTagW.getName())).as("has number of elements").hasSize(198) + .as("and contains the following elements").containsAll(expectedIdNames) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat397TargetsAreInStatusUnknown(final List unknown, + final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "updatestatus==unknown"; + + assertThat(targetManagement.findTargetByFilters(pageReq, unknown, null, null, Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(397) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(unknown, null, null, + Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat( + targetManagement.findAllTargetIdsByFilters(pageReq, unknown, null, null, Boolean.FALSE, new String[0])) + .as("has number of elements").hasSize(397).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat1TargetWithDescOrNameHasDS(final DistributionSet setA, final Target expected) { + final TargetIdName expectedIdName = convertToIdName(expected); + final String query = "(name==*targ-A* or description==*targ-A*) and (assignedds.name==" + setA.getName() + + " or installedds.name==" + setA.getName() + ")"; + + assertThat(targetManagement + .findTargetByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(1) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, "%targ-A%", + setA.getId(), Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsExactly(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(1).as("and contains the following elements") + .containsExactly(expectedIdName).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat3TargetsHaveDSAssigned(final DistributionSet setA, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "assignedds.name==" + setA.getName() + " or installedds.name==" + setA.getName(); + + assertThat(targetManagement.findTargetByFilters(pageReq, null, null, setA.getId(), Boolean.FALSE, new String[0]) + .getContent()).as("has number of elements").hasSize(3) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, null, setA.getId(), + Boolean.FALSE, new String[0]))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, null, setA.getId(), Boolean.FALSE, + new String[0])).as("has number of elements").hasSize(3).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat0TargetsWithNameOrdescAndDSHaveTag(final TargetTag targTagX, final DistributionSet setA) { + final String query = "(name==*targ-C* or description==*targ-C*) and tag==" + targTagX.getName() + + " and (assignedds.name==" + setA.getName() + " or installedds.name==" + setA.getName() + ")"; + assertThat(targetManagement + .findTargetByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, targTagX.getName()) + .getContent()).as("has number of elements").hasSize(0) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, "%targ-C%", + setA.getId(), Boolean.FALSE, targTagX.getName()))) + .as("and filter query returns the same result") + .hasSize(targetManagement.findTargetsAll(query, pageReq).getContent().size()) + .as("and NAMED filter query returns the same result").hasSize(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent().size()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, + targTagX.getName())).as("has number of elements").hasSize(0) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat0TargetsWithTagAndDescOrNameHasDS(final TargetTag targTagW, final DistributionSet setA) { + final String query = "(name==*targ-A* or description==*targ-A*) and tag==" + targTagW.getName() + + " and (assignedds.name==" + setA.getName() + " or installedds.name==" + setA.getName() + ")"; + assertThat(targetManagement + .findTargetByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(0) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, "%targ-A%", + setA.getId(), Boolean.FALSE, targTagW.getName()))) + .as("and filter query returns the same result") + .hasSize(targetManagement.findTargetsAll(query, pageReq).getContent().size()) + .as("and NAMED filter query returns the same result").hasSize(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent().size()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, "%targ-A%", setA.getId(), Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(0) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat1TargetHasTagHasDescOrNameAndDs(final TargetTag targTagW, final DistributionSet setA, + final Target expected) { + final TargetIdName expectedIdName = convertToIdName(expected); + final String query = "(name==*targ-c* or description==*targ-C*) and tag==" + targTagW.getName() + + " and (assignedds.name==" + setA.getName() + " or installedds.name==" + setA.getName() + ")"; + assertThat(targetManagement + .findTargetByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, targTagW.getName()) + .getContent()).as("has number of elements").hasSize(1) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, "%targ-C%", + setA.getId(), Boolean.FALSE, targTagW.getName()))) + .as("and contains the following elements").containsExactly(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, "%targ-C%", setA.getId(), Boolean.FALSE, + targTagW.getName())).as("has number of elements").hasSize(1).as("and contains the following elements") + .containsExactly(expectedIdName).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + } + + @Step + private void verifyThat100TargetsContainsGivenTextAndHaveTagAssigned(final TargetTag targTagY, + final TargetTag targTagW, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "(name==*targ-B* or description==*targ-B*) and (tag==" + targTagY.getName() + " or tag==" + + targTagW.getName() + ")"; + assertThat(targetManagement.findTargetByFilters(pageReq, null, "%targ-B%", null, Boolean.FALSE, + targTagY.getName(), targTagW.getName()).getContent()).as("has number of elements").hasSize(100) + .as("that number is also returned by count query") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, "%targ-B%", null, + Boolean.FALSE, targTagY.getName(), targTagW.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, "%targ-B%", null, Boolean.FALSE, + targTagY.getName(), targTagW.getName())).as("has number of elements").hasSize(100) + .as("and contains the following elements").containsAll(expectedIdNames) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findAllTargetIdsByTargetFilterQuery(pageReq, new TargetFilterQuery("test", query))); + + } + + @SafeVarargs + private final List concat(final List... targets) { + final List result = new ArrayList<>(); + Arrays.asList(targets).forEach(result::addAll); + return result; + } + + @Step + private void verifyThat200TargetsHaveTagD(final TargetTag targTagD, final List expected) { + final List expectedIdNames = convertToIdNames(expected); + final String query = "tag==" + targTagD.getName(); + assertThat(targetManagement.findTargetByFilters(pageReq, null, null, null, Boolean.FALSE, targTagD.getName()) + .getContent()).as("Expected number of results is").hasSize(200) + .as("and is expected number of results is equal to ") + .hasSize(Ints.saturatedCast(targetManagement.countTargetByFilters(null, null, null, + Boolean.FALSE, targTagD.getName()))) + .as("and contains the following elements").containsAll(expected) + .as("and filter query returns the same result") + .containsAll(targetManagement.findTargetsAll(query, pageReq).getContent()) + .as("and NAMED filter query returns the same result").containsAll(targetManagement + .findTargetsAll(new TargetFilterQuery("test", query), pageReq).getContent()); + + assertThat(targetManagement.findAllTargetIdsByFilters(pageReq, null, null, null, Boolean.FALSE, + targTagD.getName())).as("has number of elements").hasSize(200).as("and contains the following elements") + .containsAll(expectedIdNames).as("and NAMED filter query returns the same result") + .containsAll(targetManagement.findAllTargetIdsByTargetFilterQuery(pageReq, + new TargetFilterQuery("test", query))); + + } + + @Step + private void verifyThatRepositoryContains400Targets() { + assertThat(targetManagement.findTargetByFilters(pageReq, null, null, null, null, new String[0]).getContent()) + .as("Overall we expect that many targets in the repository").hasSize(400) + .as("which is also reflected by repository count") + .hasSize(Ints.saturatedCast(targetManagement.countTargetsAll())) + .as("which is also reflected by call without specification") + .containsAll(targetManagement.findTargetsAll(pageReq).getContent()); } - // TODO kaizimmerm: add filter tests @Test @Description("Tests the correct order of targets based on selected distribution set. The system expects to have an order based on installed, assigned DS.") public void targetSearchWithVariousFilterCombinationsAndOrderByDistributionSet() { @@ -205,7 +685,7 @@ public class TargetManagementSearchTest extends AbstractIntegrationTest { targInstalled = sendUpdateActionStatusToTargets(ds, targInstalled, Status.FINISHED, "installed"); final Slice result = targetManagement.findTargetsAllOrderByLinkedDistributionSet(pageReq, ds.getId(), - null, null, null, Boolean.FALSE, null); + null, null, null, Boolean.FALSE, new String[0]); final Comparator byId = (e1, e2) -> Long.compare(e2.getId(), e1.getId()); @@ -222,6 +702,103 @@ public class TargetManagementSearchTest extends AbstractIntegrationTest { } + @Test + @Description("Verfies that targets with given assigned DS are returned from repository.") + public void findTargetByAssignedDistributionSet() { + final DistributionSet assignedSet = TestDataUtil.generateDistributionSet("", softwareManagement, + distributionSetManagement); + targetManagement.createTargets(TestDataUtil.generateTargets(10, "unassigned")); + final List assignedtargets = targetManagement + .createTargets(TestDataUtil.generateTargets(10, "assigned")); + + deploymentManagement.assignDistributionSet(assignedSet, assignedtargets); + + assertThat(targetManagement.findTargetByAssignedDistributionSet(assignedSet.getId(), pageReq)) + .as("Contains the assigned targets").containsAll(assignedtargets) + .as("and that means the following expected amount").hasSize(10); + + } + + @Test + @Description("Verfies that targets with given assigned DS and additonal specification are returned from repository.") + public void findTargetByAssignedDistributionSetWithAdditonalSpecification() { + final DistributionSet assignedSet = TestDataUtil.generateDistributionSet("", softwareManagement, + distributionSetManagement); + final DistributionSet installedSet = TestDataUtil.generateDistributionSet("another", softwareManagement, + distributionSetManagement); + targetManagement.createTargets(TestDataUtil.generateTargets(10, "unassigned")); + final List assignedtargets = targetManagement + .createTargets(TestDataUtil.generateTargets(10, "assigned")); + + // set on installed and assign another one + deploymentManagement.assignDistributionSet(installedSet, assignedtargets).getActions().forEach(actionId -> { + final Action action = deploymentManagement.findActionWithDetails(actionId); + action.setStatus(Status.FINISHED); + controllerManagament.addUpdateActionStatus( + new ActionStatus(action, Status.FINISHED, System.currentTimeMillis(), "message"), action); + }); + deploymentManagement.assignDistributionSet(assignedSet, assignedtargets); + + assertThat(targetManagement.findTargetByAssignedDistributionSet(assignedSet.getId(), + TargetSpecifications.hasInstalledDistributionSet(installedSet.getId()), pageReq)) + .as("Contains the assigned targets").containsAll(assignedtargets) + .as("and that means the following expected amount").hasSize(10); + + } + + @Test + @Description("Verfies that targets with given installed DS are returned from repository.") + public void findTargetByInstalledDistributionSet() { + final DistributionSet assignedSet = TestDataUtil.generateDistributionSet("", softwareManagement, + distributionSetManagement); + final DistributionSet installedSet = TestDataUtil.generateDistributionSet("another", softwareManagement, + distributionSetManagement); + targetManagement.createTargets(TestDataUtil.generateTargets(10, "unassigned")); + final List installedtargets = targetManagement + .createTargets(TestDataUtil.generateTargets(10, "assigned")); + + // set on installed and assign another one + deploymentManagement.assignDistributionSet(installedSet, installedtargets).getActions().forEach(actionId -> { + final Action action = deploymentManagement.findActionWithDetails(actionId); + action.setStatus(Status.FINISHED); + controllerManagament.addUpdateActionStatus( + new ActionStatus(action, Status.FINISHED, System.currentTimeMillis(), "message"), action); + }); + deploymentManagement.assignDistributionSet(assignedSet, installedtargets); + + assertThat(targetManagement.findTargetByInstalledDistributionSet(installedSet.getId(), pageReq)) + .as("Contains the assigned targets").containsAll(installedtargets) + .as("and that means the following expected amount").hasSize(10); + + } + + @Test + @Description("Verfies that targets with given installed DS and additonal specification are returned from repository.") + public void findTargetByInstalledDistributionSetWithAdditonalSpecification() { + final DistributionSet assignedSet = TestDataUtil.generateDistributionSet("", softwareManagement, + distributionSetManagement); + final DistributionSet installedSet = TestDataUtil.generateDistributionSet("another", softwareManagement, + distributionSetManagement); + targetManagement.createTargets(TestDataUtil.generateTargets(10, "unassigned")); + final List installedtargets = targetManagement + .createTargets(TestDataUtil.generateTargets(10, "assigned")); + + // set on installed and assign another one + deploymentManagement.assignDistributionSet(installedSet, installedtargets).getActions().forEach(actionId -> { + final Action action = deploymentManagement.findActionWithDetails(actionId); + action.setStatus(Status.FINISHED); + controllerManagament.addUpdateActionStatus( + new ActionStatus(action, Status.FINISHED, System.currentTimeMillis(), "message"), action); + }); + deploymentManagement.assignDistributionSet(assignedSet, installedtargets); + + assertThat(targetManagement.findTargetByInstalledDistributionSet(installedSet.getId(), + TargetSpecifications.hasAssignedDistributionSet(assignedSet.getId()), pageReq)) + .as("Contains the assigned targets").containsAll(installedtargets) + .as("and that means the following expected amount").hasSize(10); + + } + private List sendUpdateActionStatusToTargets(final DistributionSet dsA, final Iterable targs, final Status status, final String... msgs) { final List result = new ArrayList(); diff --git a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementTest.java b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementTest.java index c7a4cb136..4a664f5b8 100644 --- a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementTest.java +++ b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/repository/TargetManagementTest.java @@ -202,6 +202,12 @@ public class TargetManagementTest extends AbstractIntegrationTest { } + @Test + @Description("Ensures that repositoy returns null if given controller ID does not exist without exception.") + public void findTargetByControllerIDWithDetailsReturnsNullForNonexisting() { + assertThat(targetManagement.findTargetByControllerIDWithDetails("dsfsdfsdfsd")).as("Expected as").isNull(); + } + @Test @Description("Checks if the EntityAlreadyExistsException is thrown if the targets with the same controller ID are created twice.") public void createMultipleTargetsDuplicate() { diff --git a/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/rest/resource/SystemManagementResource.java b/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/rest/resource/SystemManagementResource.java index b3a461915..27cfdb924 100644 --- a/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/rest/resource/SystemManagementResource.java +++ b/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/rest/resource/SystemManagementResource.java @@ -88,7 +88,7 @@ public class SystemManagementResource { .setOverallTargets(report.getOverallTargets()).setOverallTenants(report.getTenants().size()); result.setTenantStats( - report.getTenants().stream().map(tenant -> convertTenant(tenant)).collect(Collectors.toList())); + report.getTenants().stream().map(SystemManagementResource::convertTenant).collect(Collectors.toList())); return ResponseEntity.ok(result); } @@ -104,7 +104,7 @@ public class SystemManagementResource { } /** - * Returns a list of all caches containing currently. + * Returns a list of all caches. * * @return a list of caches for all tenants */ @@ -112,8 +112,8 @@ public class SystemManagementResource { @PreAuthorize(SpringEvalExpressions.HAS_AUTH_SYSTEM_ADMIN) public ResponseEntity> getCaches() { final Collection cacheNames = cacheManager.getCacheNames(); - return ResponseEntity.ok(cacheNames.stream().map(cacheName -> cacheManager.getCache(cacheName)) - .map(cache -> cacheRest(cache)).collect(Collectors.toList())); + return ResponseEntity + .ok(cacheNames.stream().map(cacheManager::getCache).map(this::cacheRest).collect(Collectors.toList())); } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index 960553a6a..88d82bd9d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -15,7 +15,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -141,8 +140,6 @@ public class TargetTable extends AbstractTable implements Handler { private Boolean isTargetPinned = Boolean.FALSE; private ShortcutAction actionSelectAll; private ShortcutAction actionUnSelectAll; - - @Override @PostConstruct @@ -1038,7 +1035,7 @@ public class TargetTable extends AbstractTable implements Handler { final String[] tagArray = tagList.toArray(new String[tagList.size()]); List targetIdList; - targetIdList = targetManagement.findAllTargetIdsByFilters(pageRequest, filterByDistId, statusList, searchText, + targetIdList = targetManagement.findAllTargetIdsByFilters(pageRequest, statusList, searchText, filterByDistId, noTagSelected, tagList.toArray(tagArray)); Collections.reverse(targetIdList); return targetIdList;