From b2a65a5f9dd23e302b58f1ea515cea030d476cb6 Mon Sep 17 00:00:00 2001 From: Konrad Merz Date: Wed, 15 Aug 2018 13:35:49 +0200 Subject: [PATCH] Check requirement fulfillment and show it on ShowContentPacksPage (#4966) * Check requirement fulfillment and show it on ShowContentPacksPage We want to display if a requirement of a content pack is met by the server, for that the server checkes if every constraint is met and adds the information to the json result. The frontend can now use the so send fulfilled flag to check if the requirement is met Also: - fix naming of ContentPackResource function - add download API endpoint Fixes #4950 --- .../contentpacks/ContentPackService.java | 17 ++++++-- .../constraints/ConstraintChecker.java | 4 +- .../GraylogVersionConstraintChecker.java | 20 ++++++++- .../PluginVersionConstraintChecker.java | 24 ++++++++++- .../contentpacks/model/ContentPack.java | 5 +++ .../model/constraints/Constraint.java | 2 + .../constraints/ConstraintCheckResult.java | 40 ++++++++++++++++++ .../constraints/GraylogVersionConstraint.java | 6 +++ .../constraints/PluginVersionConstraint.java | 5 +++ .../responses/ContentPackResponse.java | 41 +++++++++++++++++++ .../responses/ContentPackRevisions.java | 12 ++++-- .../contentpacks/ContentPackResource.java | 37 +++++++++++++++-- .../GraylogVersionConstraintCheckerTest.java | 9 +++- .../PluginVersionConstraintCheckerTest.java | 4 +- .../contentpacks/ContentPackResourceTest.java | 11 +++-- .../content-packs/ContentPackConstraints.jsx | 7 ++-- .../content-packs/ContentPackDetails.jsx | 5 ++- .../ContentPackDownloadControl.jsx | 2 +- .../src/pages/ShowContentPackPage.jsx | 4 +- .../src/routing/ApiRoutes.js | 1 + .../content-packs/ContentPacksStore.jsx | 5 ++- 21 files changed, 231 insertions(+), 30 deletions(-) create mode 100644 graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/ConstraintCheckResult.java create mode 100644 graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackResponse.java diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/ContentPackService.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/ContentPackService.java index d953102538a1..75cd69ab32c8 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/ContentPackService.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/ContentPackService.java @@ -44,6 +44,7 @@ import org.graylog2.contentpacks.model.ModelType; import org.graylog2.contentpacks.model.ModelTypes; import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.contentpacks.model.constraints.GraylogVersionConstraint; import org.graylog2.contentpacks.model.entities.EntitiesWithConstraints; import org.graylog2.contentpacks.model.entities.Entity; @@ -106,7 +107,7 @@ private ContentPackInstallation installContentPack(ContentPackV1 contentPack, Map parameters, String comment, String user) { - checkConstraints(contentPack.requires()); + ensureConstraints(contentPack.requires()); final Entity rootEntity = EntityV1.builder() .type(ModelTypes.ROOT) @@ -292,10 +293,10 @@ private ImmutableGraph buildEntityGraph(Entity rootEntity, return ImmutableGraph.copyOf(dependencyGraph); } - private void checkConstraints(Set requiredConstraints) { + private void ensureConstraints(Set requiredConstraints) { final Set fulfilledConstraints = new HashSet<>(); for (ConstraintChecker constraintChecker : constraintCheckers) { - fulfilledConstraints.addAll(constraintChecker.checkConstraints(requiredConstraints)); + fulfilledConstraints.addAll(constraintChecker.ensureConstraints(requiredConstraints)); } if (!fulfilledConstraints.equals(requiredConstraints)) { @@ -304,6 +305,16 @@ private void checkConstraints(Set requiredConstraints) { } } + public Set checkConstraints(ContentPack contentPackV1) { + Set requiredConstraints = contentPackV1.requires(); + final Set fulfilledConstraints = new HashSet<>(); + for (ConstraintChecker constraintChecker : constraintCheckers) { + fulfilledConstraints.addAll(constraintChecker.checkConstraints(requiredConstraints)); + } + return fulfilledConstraints; + } + + private ImmutableMap validateParameters(Map parameters, Set contentPackParameters) { final Set contentPackParameterNames = contentPackParameters.stream() diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/ConstraintChecker.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/ConstraintChecker.java index eb7d6304fa15..20c1e53fd96f 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/ConstraintChecker.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/ConstraintChecker.java @@ -17,10 +17,12 @@ package org.graylog2.contentpacks.constraints; import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import java.util.Collection; import java.util.Set; public interface ConstraintChecker { - Set checkConstraints(Collection requestedConstraints); + Set ensureConstraints(Collection requestedConstraints); + Set checkConstraints(Collection requestedConstraints); } diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintChecker.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintChecker.java index ce00439a3179..10497a812b40 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintChecker.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintChecker.java @@ -21,6 +21,7 @@ import com.vdurmont.semver4j.Requirement; import com.vdurmont.semver4j.Semver; import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.contentpacks.model.constraints.GraylogVersionConstraint; import java.util.Collection; @@ -43,14 +44,14 @@ public GraylogVersionConstraintChecker() { this.graylogVersion = graylogVersion; } + @Override - public Set checkConstraints(Collection requestedConstraints) { + public Set ensureConstraints(Collection requestedConstraints) { final ImmutableSet.Builder fulfilledConstraints = ImmutableSet.builder(); for (Constraint constraint : requestedConstraints) { if (constraint instanceof GraylogVersionConstraint) { final GraylogVersionConstraint versionConstraint = (GraylogVersionConstraint) constraint; final Requirement requiredVersion = versionConstraint.version(); - if (requiredVersion.isSatisfiedBy(graylogVersion.toString())) { fulfilledConstraints.add(constraint); } @@ -58,4 +59,19 @@ public Set checkConstraints(Collection requestedConstrai } return fulfilledConstraints.build(); } + + @Override + public Set checkConstraints(Collection requestedConstraints) { + final ImmutableSet.Builder fulfilledConstraints = ImmutableSet.builder(); + for (Constraint constraint : requestedConstraints) { + if (constraint instanceof GraylogVersionConstraint) { + final GraylogVersionConstraint versionConstraint = (GraylogVersionConstraint) constraint; + final Requirement requiredVersion = versionConstraint.version(); + final ConstraintCheckResult constraintCheckResult = ConstraintCheckResult.create(versionConstraint, + requiredVersion.isSatisfiedBy(graylogVersion.toString())); + fulfilledConstraints.add(constraintCheckResult); + } + } + return fulfilledConstraints.build(); + } } diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintChecker.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintChecker.java index e7a82c8f4e71..b2c4321e46d5 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintChecker.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintChecker.java @@ -20,6 +20,7 @@ import com.vdurmont.semver4j.Requirement; import com.vdurmont.semver4j.Semver; import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.contentpacks.model.constraints.PluginVersionConstraint; import org.graylog2.plugin.PluginMetaData; import org.graylog2.plugin.Version; @@ -42,7 +43,7 @@ public PluginVersionConstraintChecker(Set pluginMetaData) { } @Override - public Set checkConstraints(Collection requestedConstraints) { + public Set ensureConstraints(Collection requestedConstraints) { final ImmutableSet.Builder fulfilledConstraints = ImmutableSet.builder(); for (Constraint constraint : requestedConstraints) { if (constraint instanceof PluginVersionConstraint) { @@ -58,4 +59,25 @@ public Set checkConstraints(Collection requestedConstrai } return fulfilledConstraints.build(); } + + @Override + public Set checkConstraints(Collection requestedConstraints) { + final ImmutableSet.Builder fulfilledConstraints = ImmutableSet.builder(); + for (Constraint constraint : requestedConstraints) { + if (constraint instanceof PluginVersionConstraint) { + final PluginVersionConstraint versionConstraint = (PluginVersionConstraint) constraint; + final Requirement requiredVersion = versionConstraint.version(); + + boolean result = false; + for (Semver pluginVersion : pluginVersions) { + if (requiredVersion.isSatisfiedBy(pluginVersion)) { + result = true; + } + } + ConstraintCheckResult constraintCheckResult = ConstraintCheckResult.create(versionConstraint, result); + fulfilledConstraints.add(constraintCheckResult); + } + } + return fulfilledConstraints.build(); + } } diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/ContentPack.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/ContentPack.java index 8406f70d35fa..13ac2adf0c75 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/ContentPack.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/ContentPack.java @@ -18,6 +18,9 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import org.graylog2.contentpacks.model.constraints.Constraint; + +import java.util.Set; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = Versioned.FIELD_META_VERSION, defaultImpl = LegacyContentPack.class) @JsonSubTypes({ @@ -27,4 +30,6 @@ public interface ContentPack extends Identified, Revisioned, Versioned { interface ContentPackBuilder extends IdBuilder, RevisionBuilder, VersionBuilder { } + + Set requires(); } diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/Constraint.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/Constraint.java index a57f2aed8c26..02fa50022d86 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/Constraint.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/Constraint.java @@ -20,6 +20,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.graylog2.contentpacks.model.Typed; +import java.util.Optional; + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = Constraint.FIELD_META_TYPE) @JsonSubTypes({ @JsonSubTypes.Type(value = GraylogVersionConstraint.class, name = GraylogVersionConstraint.TYPE_NAME), diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/ConstraintCheckResult.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/ConstraintCheckResult.java new file mode 100644 index 000000000000..c97349170083 --- /dev/null +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/ConstraintCheckResult.java @@ -0,0 +1,40 @@ +/** + * This file is part of Graylog. + * + * Graylog is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Graylog is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Graylog. If not, see . + */ +package org.graylog2.contentpacks.model.constraints; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import org.graylog.autovalue.WithBeanGetter; + +@JsonAutoDetect + +@AutoValue +@WithBeanGetter +public abstract class ConstraintCheckResult { + @JsonProperty + public abstract Constraint constraint(); + + @JsonProperty + public abstract boolean fulfilled(); + + @JsonCreator + public static ConstraintCheckResult create(@JsonProperty("constraint") Constraint constraint, @JsonProperty("fulfilled") boolean fulfilled) { + return new AutoValue_ConstraintCheckResult(constraint, fulfilled); + } +} diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/GraylogVersionConstraint.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/GraylogVersionConstraint.java index 670abc43c6ed..df23f209cc23 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/GraylogVersionConstraint.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/GraylogVersionConstraint.java @@ -17,6 +17,7 @@ package org.graylog2.contentpacks.model.constraints; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.google.auto.value.AutoValue; @@ -24,6 +25,9 @@ import org.graylog2.contentpacks.model.ModelType; import org.graylog2.plugin.Version; +import javax.annotation.Nullable; +import java.util.Optional; + @AutoValue @JsonDeserialize(builder = AutoValue_GraylogVersionConstraint.Builder.class) public abstract class GraylogVersionConstraint implements Constraint { @@ -34,6 +38,8 @@ public abstract class GraylogVersionConstraint implements Constraint { @JsonProperty(FIELD_GRAYLOG_VERSION) public abstract Requirement version(); + public abstract Builder toBuilder(); + public static Builder builder() { return new AutoValue_GraylogVersionConstraint.Builder(); } diff --git a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/PluginVersionConstraint.java b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/PluginVersionConstraint.java index a34e8555a60a..d5e605212c66 100644 --- a/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/PluginVersionConstraint.java +++ b/graylog2-server/src/main/java/org/graylog2/contentpacks/model/constraints/PluginVersionConstraint.java @@ -17,6 +17,7 @@ package org.graylog2.contentpacks.model.constraints; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.google.auto.value.AutoValue; @@ -25,6 +26,8 @@ import org.graylog2.plugin.PluginMetaData; import org.graylog2.plugin.Version; +import java.util.Optional; + @AutoValue @JsonDeserialize(builder = AutoValue_PluginVersionConstraint.Builder.class) public abstract class PluginVersionConstraint implements Constraint { @@ -38,6 +41,8 @@ public abstract class PluginVersionConstraint implements Constraint { @JsonProperty(FIELD_PLUGIN_VERSION) public abstract Requirement version(); + public abstract Builder toBuilder(); + public static PluginVersionConstraint of(PluginMetaData pluginMetaData) { final Version version = pluginMetaData.getVersion(); final String versionString = version.toString().replace("-SNAPSHOT", ""); diff --git a/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackResponse.java b/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackResponse.java new file mode 100644 index 000000000000..73a8954aa716 --- /dev/null +++ b/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackResponse.java @@ -0,0 +1,41 @@ +/** + * This file is part of Graylog. + * + * Graylog is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Graylog is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Graylog. If not, see . + */ +package org.graylog2.rest.models.system.contenpacks.responses; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import org.graylog2.contentpacks.model.ContentPack; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; + +import java.util.Set; + +@JsonAutoDetect +@AutoValue +public abstract class ContentPackResponse { + @JsonProperty("content_pack") + public abstract ContentPack contentPack(); + + @JsonProperty("constraints_result") + public abstract Set constraints(); + + @JsonCreator + public static ContentPackResponse create(@JsonProperty("content_pack") ContentPack contentPack, @JsonProperty("constraints_result") Set constraints) { + return new AutoValue_ContentPackResponse(contentPack, constraints); + } +} diff --git a/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackRevisions.java b/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackRevisions.java index b20db50ffc9c..e4b858c22c2e 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackRevisions.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/models/system/contenpacks/responses/ContentPackRevisions.java @@ -22,19 +22,25 @@ import com.google.auto.value.AutoValue; import org.graylog.autovalue.WithBeanGetter; import org.graylog2.contentpacks.model.ContentPack; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import java.util.Map; +import java.util.Set; @JsonAutoDetect @AutoValue @WithBeanGetter public abstract class ContentPackRevisions { - @JsonProperty + @JsonProperty("content_pack_revisions") public abstract Map contentPackRevisions(); + @JsonProperty("constraints_result") + public abstract Map> constraints(); + @JsonCreator - public static ContentPackRevisions create(@JsonProperty("content_pack_revisions") Map contentPackRevisions) { - return new AutoValue_ContentPackRevisions(contentPackRevisions); + public static ContentPackRevisions create(@JsonProperty("content_pack_revisions") Map contentPackRevisions, + @JsonProperty("constraints_result")Map> constraints) { + return new AutoValue_ContentPackRevisions(contentPackRevisions, constraints); } } diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResource.java index fda42378ad64..734032f888c9 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResource.java @@ -35,10 +35,12 @@ import org.graylog2.contentpacks.model.ContentPackView; import org.graylog2.contentpacks.model.ModelId; import org.graylog2.contentpacks.model.Revisioned; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.plugin.database.users.User; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackInstallationRequest; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackInstallationsResponse; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackList; +import org.graylog2.rest.models.system.contenpacks.responses.ContentPackResponse; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackRevisions; import org.graylog2.shared.rest.resources.RestResource; import org.graylog2.shared.security.RestPermissions; @@ -128,9 +130,13 @@ public ContentPackRevisions listContentPackRevisions( @PathParam("contentPackId") ModelId id) { checkPermission(RestPermissions.CONTENT_PACK_READ, id.toString()); - Map contentPackMap = contentPackPersistenceService.findAllById(id).stream() + Set contentPacks = contentPackPersistenceService.findAllById(id); + Map contentPackMap = contentPacks.stream() .collect(Collectors.toMap(Revisioned::revision, Function.identity())); - return ContentPackRevisions.create(contentPackMap); + Map> constraintMap = contentPacks.stream() + .collect(Collectors.toMap(Revisioned::revision, contentPackService::checkConstraints)); + + return ContentPackRevisions.create(contentPackMap, constraintMap); } @GET @@ -141,7 +147,29 @@ public ContentPackRevisions listContentPackRevisions( @ApiResponse(code = 500, message = "Error loading content packs") }) @JsonView(ContentPackView.HttpView.class) - public ContentPack listContentPackRevisions( + public ContentPackResponse getContentPackRevisions( + @ApiParam(name = "contentPackId", value = "Content pack ID", required = true) + @PathParam("contentPackId") ModelId id, + @ApiParam(name = "revision", value = "Content pack revision", required = true) + @PathParam("revision") int revision + ) { + checkPermission(RestPermissions.CONTENT_PACK_READ); + + ContentPack contentPack = contentPackPersistenceService.findByIdAndRevision(id, revision) + .orElseThrow(() -> new NotFoundException("Content pack " + id + " with revision " + revision + " not found!")); + Set constraints = contentPackService.checkConstraints(contentPack); + return ContentPackResponse.create(contentPack, constraints); + } + + @GET + @Path("{contentPackId}/{revision}/download") + @Timed + @ApiOperation(value = "Download a revision of a content pack") + @ApiResponses(value = { + @ApiResponse(code = 500, message = "Error loading content packs") + }) + @JsonView(ContentPackView.HttpView.class) + public ContentPack downloadContentPackRevisions( @ApiParam(name = "contentPackId", value = "Content pack ID", required = true) @PathParam("contentPackId") ModelId id, @ApiParam(name = "revision", value = "Content pack revision", required = true) @@ -149,8 +177,9 @@ public ContentPack listContentPackRevisions( ) { checkPermission(RestPermissions.CONTENT_PACK_READ, id.toString()); - return contentPackPersistenceService.findByIdAndRevision(id, revision) + ContentPack contentPack = contentPackPersistenceService.findByIdAndRevision(id, revision) .orElseThrow(() -> new NotFoundException("Content pack " + id + " with revision " + revision + " not found!")); + return contentPack; } @POST diff --git a/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintCheckerTest.java b/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintCheckerTest.java index bd7987de3a8d..20d6ea3a8c8f 100644 --- a/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintCheckerTest.java +++ b/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/GraylogVersionConstraintCheckerTest.java @@ -18,10 +18,13 @@ import com.google.common.collect.ImmutableSet; import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.contentpacks.model.constraints.GraylogVersionConstraint; import org.graylog2.contentpacks.model.constraints.PluginVersionConstraint; import org.junit.Test; +import java.util.Set; + import static org.assertj.core.api.Assertions.assertThat; public class GraylogVersionConstraintCheckerTest { @@ -37,7 +40,8 @@ public void checkConstraints() { .version("^1.0.0") .build(); final ImmutableSet requiredConstraints = ImmutableSet.of(graylogVersionConstraint, pluginVersionConstraint); - assertThat(constraintChecker.checkConstraints(requiredConstraints)).containsOnly(graylogVersionConstraint); + final Set result = constraintChecker.checkConstraints(requiredConstraints); + assertThat(result.stream().allMatch(c -> c.fulfilled())).isTrue(); } @Test @@ -52,6 +56,7 @@ public void checkConstraintsFails() { .version("^1.0.0") .build(); final ImmutableSet requiredConstraints = ImmutableSet.of(graylogVersionConstraint, pluginVersionConstraint); - assertThat(constraintChecker.checkConstraints(requiredConstraints)).isEmpty(); + final Set result = constraintChecker.checkConstraints(requiredConstraints); + assertThat(result.stream().allMatch(c -> !c.fulfilled())).isTrue(); } } \ No newline at end of file diff --git a/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintCheckerTest.java b/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintCheckerTest.java index df727fa7e26b..9faf23874faf 100644 --- a/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintCheckerTest.java +++ b/graylog2-server/src/test/java/org/graylog2/contentpacks/constraints/PluginVersionConstraintCheckerTest.java @@ -45,7 +45,7 @@ public void checkConstraints() { .version("^1.0.0") .build(); final ImmutableSet requiredConstraints = ImmutableSet.of(graylogVersionConstraint, pluginVersionConstraint); - assertThat(constraintChecker.checkConstraints(requiredConstraints)).containsOnly(pluginVersionConstraint); + assertThat(constraintChecker.checkConstraints(requiredConstraints).stream().allMatch(c -> c.fulfilled())).isTrue(); } @Test @@ -61,7 +61,7 @@ public void checkConstraintsFails() { .version("^2.0.0") .build(); final ImmutableSet requiredConstraints = ImmutableSet.of(graylogVersionConstraint, pluginVersionConstraint); - assertThat(constraintChecker.checkConstraints(requiredConstraints)).isEmpty(); + assertThat(constraintChecker.checkConstraints(requiredConstraints).stream().allMatch(c -> !c.fulfilled())).isTrue(); } private static final class TestPluginMetaData implements PluginMetaData { diff --git a/graylog2-server/src/test/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResourceTest.java b/graylog2-server/src/test/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResourceTest.java index 4a55789a4726..7b1a062814d4 100644 --- a/graylog2-server/src/test/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResourceTest.java +++ b/graylog2-server/src/test/java/org/graylog2/rest/resources/system/contentpacks/ContentPackResourceTest.java @@ -22,8 +22,11 @@ import org.graylog2.contentpacks.ContentPackService; import org.graylog2.contentpacks.model.ContentPack; import org.graylog2.contentpacks.model.ModelId; +import org.graylog2.contentpacks.model.constraints.Constraint; +import org.graylog2.contentpacks.model.constraints.ConstraintCheckResult; import org.graylog2.jackson.AutoValueSubtypeResolver; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackList; +import org.graylog2.rest.models.system.contenpacks.responses.ContentPackResponse; import org.graylog2.rest.models.system.contenpacks.responses.ContentPackRevisions; import org.graylog2.shared.bindings.GuiceInjectorHolder; import org.graylog2.shared.bindings.providers.ObjectMapperProvider; @@ -121,9 +124,11 @@ public void listAndLatest() throws Exception { public void getContentPack() throws Exception { final ContentPack contentPack = objectMapper.readValue(CONTENT_PACK, ContentPack.class); final Set contentPackSet = Collections.singleton(contentPack); + final Set constraints = Collections.emptySet(); final Map contentPacks = Collections.singletonMap(1, contentPack); - final ContentPackRevisions expectedRevisions = ContentPackRevisions.create(contentPacks); + final Map> constraintMap = Collections.singletonMap(1, constraints); + final ContentPackRevisions expectedRevisions = ContentPackRevisions.create(contentPacks, constraintMap); final ModelId id = ModelId.of("1"); when(contentPackPersistenceService.findAllById(id)).thenReturn(contentPackSet); @@ -132,9 +137,9 @@ public void getContentPack() throws Exception { assertThat(contentPackRevisions).isEqualTo(expectedRevisions); when(contentPackPersistenceService.findByIdAndRevision(id, 1)).thenReturn(Optional.ofNullable(contentPack)); - final ContentPack contentPackResult = contentPackResource.listContentPackRevisions(id, 1); + final ContentPackResponse contentPackResponse = contentPackResource.getContentPackRevisions(id, 1); verify(contentPackPersistenceService, times(1)).findByIdAndRevision(id, 1); - assertThat(contentPackResult).isEqualTo(contentPack); + assertThat(contentPackResponse.contentPack()).isEqualTo(contentPack); } @Test diff --git a/graylog2-web-interface/src/components/content-packs/ContentPackConstraints.jsx b/graylog2-web-interface/src/components/content-packs/ContentPackConstraints.jsx index a8dc835b2445..34de4c4fc1b4 100644 --- a/graylog2-web-interface/src/components/content-packs/ContentPackConstraints.jsx +++ b/graylog2-web-interface/src/components/content-packs/ContentPackConstraints.jsx @@ -17,12 +17,13 @@ class ContentPackConstraints extends React.Component { }; _rowFormatter = (item) => { + const constraint = item.constraint || item; const fulfilledIcon = item.fulfilled || this.props.isFulfilled ? : ; const fulfilledBg = item.fulfilled || this.props.isFulfilled ? 'success' : 'failure'; return ( - - {item.type} - {item.version} + + {constraint.type} + {constraint.version} {fulfilledIcon} ); diff --git a/graylog2-web-interface/src/components/content-packs/ContentPackDetails.jsx b/graylog2-web-interface/src/components/content-packs/ContentPackDetails.jsx index 9ccf1a81e6c3..87006594b7b3 100644 --- a/graylog2-web-interface/src/components/content-packs/ContentPackDetails.jsx +++ b/graylog2-web-interface/src/components/content-packs/ContentPackDetails.jsx @@ -13,6 +13,7 @@ import 'components/content-packs/ContentPackDetails.css'; const ContentPackDetails = (props) => { const markdownDescription = markdown.toHTML(props.contentPack.description || ''); const contentPack = props.contentPack; + const constraints = props.constraints; return ( @@ -44,7 +45,7 @@ const ContentPackDetails = (props) => {
{ contentPack.requires && props.showConstraints &&
- +
} @@ -62,6 +63,7 @@ const ContentPackDetails = (props) => { ContentPackDetails.propTypes = { contentPack: PropTypes.object.isRequired, + constraints: PropTypes.arrayOf(PropTypes.object), verbose: PropTypes.bool, offset: PropTypes.number, showConstraints: PropTypes.bool, @@ -71,6 +73,7 @@ ContentPackDetails.defaultProps = { offset: 1, verbose: false, showConstraints: false, + constraints: [], }; export default ContentPackDetails; diff --git a/graylog2-web-interface/src/components/content-packs/ContentPackDownloadControl.jsx b/graylog2-web-interface/src/components/content-packs/ContentPackDownloadControl.jsx index cad0d60e471c..ca80baed9b3f 100644 --- a/graylog2-web-interface/src/components/content-packs/ContentPackDownloadControl.jsx +++ b/graylog2-web-interface/src/components/content-packs/ContentPackDownloadControl.jsx @@ -24,7 +24,7 @@ class ContentPackDownloadControl extends React.Component { _getDownloadUrl() { const url = new URI(URLUtils.qualifyUrl( - ApiRoutes.ContentPacksController.getRev(this.props.contentPackId, this.props.revision).url, + ApiRoutes.ContentPacksController.downloadRev(this.props.contentPackId, this.props.revision).url, )); if (URLUtils.areCredentialsInURLSupported()) { diff --git a/graylog2-web-interface/src/pages/ShowContentPackPage.jsx b/graylog2-web-interface/src/pages/ShowContentPackPage.jsx index 2d4d14fe338f..5fc8f73389f3 100644 --- a/graylog2-web-interface/src/pages/ShowContentPackPage.jsx +++ b/graylog2-web-interface/src/pages/ShowContentPackPage.jsx @@ -75,7 +75,7 @@ const ShowContentPackPage = createReactClass({ return (); } - const { contentPack, selectedVersion } = this.state; + const { contentPack, selectedVersion, constraints } = this.state; const lastVersion = this._getLastVersion(); const lastPack = contentPack[lastVersion]; return ( @@ -123,7 +123,7 @@ const ShowContentPackPage = createReactClass({ - +
diff --git a/graylog2-web-interface/src/routing/ApiRoutes.js b/graylog2-web-interface/src/routing/ApiRoutes.js index 702d20086848..97ac81ffb6c7 100644 --- a/graylog2-web-interface/src/routing/ApiRoutes.js +++ b/graylog2-web-interface/src/routing/ApiRoutes.js @@ -35,6 +35,7 @@ const ApiRoutes = { list: () => { return { url: '/system/content_packs/latest' }; }, get: (contentPackId) => { return { url: `/system/content_packs/${contentPackId}` }; }, getRev: (contentPackId, revision) => { return { url: `/system/content_packs/${contentPackId}/${revision}` }; }, + downloadRev: (contentPackId, revision) => { return { url: `/system/content_packs/${contentPackId}/${revision}/download` }; }, create: () => { return { url: '/system/content_packs' }; }, delete: (contentPackId) => { return { url: `/system/content_packs/${contentPackId}` }; }, deleteRev: (contentPackId, revision) => { return { url: `/system/content_packs/${contentPackId}/${revision}` }; }, diff --git a/graylog2-web-interface/src/stores/content-packs/ContentPacksStore.jsx b/graylog2-web-interface/src/stores/content-packs/ContentPacksStore.jsx index c697140bec1e..4df71444561f 100644 --- a/graylog2-web-interface/src/stores/content-packs/ContentPacksStore.jsx +++ b/graylog2-web-interface/src/stores/content-packs/ContentPacksStore.jsx @@ -15,8 +15,9 @@ const ContentPacksStore = Reflux.createStore({ const promise = fetch('GET', url) .then((result) => { const contentPack = result.content_pack_revisions; + const constraints = result.constraints_result; const versions = Object.keys(contentPack); - this.trigger({ contentPack: contentPack, selectedVersion: versions[0] }); + this.trigger({ contentPack: contentPack, selectedVersion: versions[0], constraints: constraints }); return result; }); @@ -28,7 +29,7 @@ const ContentPacksStore = Reflux.createStore({ const url = URLUtils.qualifyUrl(ApiRoutes.ContentPacksController.getRev(contentPackId, contentPackRev).url); const promise = fetch('GET', url) .then((result) => { - this.trigger({ contentPack: result }); + this.trigger({ contentPack: result.content_pack }); return result; });