From a55c34d0bbd63426601f94c537e3132f573348af Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Mon, 19 Mar 2018 11:31:26 +0100 Subject: [PATCH] Add missing index on tag.name (#660) * Add missing tag name filter for RSQL queries. Signed-off-by: kaizimmerm * Add schabdo as commiter. Signed-off-by: kaizimmerm * DDI API rename and add test. Signed-off-by: kaizimmerm * Remove unneeded text. Signed-off-by: kaizimmerm * Add missing auto close. Signed-off-by: kaizimmerm --- .../hawkbit/ddi/json/model/DdiDeployment.java | 10 ++++---- .../ddi/rest/resource/DdiRootController.java | 10 ++++---- .../rest/resource/DdiRootControllerTest.java | 6 +++-- .../resource/MgmtSoftwareModuleResource.java | 5 ++-- .../rest/resource/MgmtTargetResourceTest.java | 23 +++++++------------ .../jpa/model/JpaDistributionSetTag.java | 3 ++- .../repository/jpa/model/JpaTargetTag.java | 4 ++-- .../DB2/V1_12_6__add_index___DB2.sql | 2 ++ .../migration/H2/V1_12_6__add_index___H2.sql | 2 ++ .../MYSQL/V1_12_6__add_index___MYSQL.sql | 2 ++ .../V1_12_6__add_index___SQL_SERVER.sql | 2 ++ pom.xml | 11 ++++++++- 12 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/DB2/V1_12_6__add_index___DB2.sql create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/H2/V1_12_6__add_index___H2.sql create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/MYSQL/V1_12_6__add_index___MYSQL.sql create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/SQL_SERVER/V1_12_6__add_index___SQL_SERVER.sql diff --git a/hawkbit-ddi-api/src/main/java/org/eclipse/hawkbit/ddi/json/model/DdiDeployment.java b/hawkbit-ddi-api/src/main/java/org/eclipse/hawkbit/ddi/json/model/DdiDeployment.java index 42fc9f3d8..9aba2f487 100644 --- a/hawkbit-ddi-api/src/main/java/org/eclipse/hawkbit/ddi/json/model/DdiDeployment.java +++ b/hawkbit-ddi-api/src/main/java/org/eclipse/hawkbit/ddi/json/model/DdiDeployment.java @@ -31,7 +31,7 @@ public class DdiDeployment { @NotNull private List chunks; - private MaintenanceWindowStatus maintenanceWindow; + private DdiMaintenanceWindowStatus maintenanceWindow; /** * Constructor. @@ -59,7 +59,7 @@ public class DdiDeployment { * the parameter is null. */ public DdiDeployment(final HandlingType download, final HandlingType update, final List chunks, - final MaintenanceWindowStatus maintenanceWindow) { + final DdiMaintenanceWindowStatus maintenanceWindow) { this.download = download; this.update = update; this.chunks = chunks; @@ -82,7 +82,7 @@ public class DdiDeployment { return Collections.unmodifiableList(chunks); } - public MaintenanceWindowStatus getMaintenanceWindow() { + public DdiMaintenanceWindowStatus getMaintenanceWindow() { return this.maintenanceWindow; } @@ -121,7 +121,7 @@ public class DdiDeployment { /** * Status of the maintenance window for action. */ - public enum MaintenanceWindowStatus { + public enum DdiMaintenanceWindowStatus { /** * A window is currently available, target can go ahead with * installation. @@ -136,7 +136,7 @@ public class DdiDeployment { private String status; - MaintenanceWindowStatus(final String status) { + DdiMaintenanceWindowStatus(final String status) { this.status = status; } diff --git a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java index 88eed4c95..f83755f68 100644 --- a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java +++ b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java @@ -29,7 +29,7 @@ import org.eclipse.hawkbit.ddi.json.model.DdiConfigData; import org.eclipse.hawkbit.ddi.json.model.DdiControllerBase; import org.eclipse.hawkbit.ddi.json.model.DdiDeployment; import org.eclipse.hawkbit.ddi.json.model.DdiDeployment.HandlingType; -import org.eclipse.hawkbit.ddi.json.model.DdiDeployment.MaintenanceWindowStatus; +import org.eclipse.hawkbit.ddi.json.model.DdiDeployment.DdiMaintenanceWindowStatus; import org.eclipse.hawkbit.ddi.json.model.DdiDeploymentBase; import org.eclipse.hawkbit.ddi.json.model.DdiResult.FinalResult; import org.eclipse.hawkbit.ddi.rest.api.DdiRestConstants; @@ -295,7 +295,7 @@ public class DdiRootController implements DdiRootControllerRestApi { final HandlingType downloadType = action.isForce() ? HandlingType.FORCED : HandlingType.ATTEMPT; final HandlingType updateType = calculateUpdateType(action, downloadType); - final MaintenanceWindowStatus maintenanceWindow = calculateMaintenanceWindow(action); + final DdiMaintenanceWindowStatus maintenanceWindow = calculateMaintenanceWindow(action); final DdiDeploymentBase base = new DdiDeploymentBase(Long.toString(action.getId()), new DdiDeployment(downloadType, updateType, chunks, maintenanceWindow), actionHistory); @@ -311,10 +311,10 @@ public class DdiRootController implements DdiRootControllerRestApi { return ResponseEntity.notFound().build(); } - private static MaintenanceWindowStatus calculateMaintenanceWindow(final Action action) { + private static DdiMaintenanceWindowStatus calculateMaintenanceWindow(final Action action) { if (action.hasMaintenanceSchedule()) { - return action.isMaintenanceWindowAvailable() ? MaintenanceWindowStatus.AVAILABLE - : MaintenanceWindowStatus.UNAVAILABLE; + return action.isMaintenanceWindowAvailable() ? DdiMaintenanceWindowStatus.AVAILABLE + : DdiMaintenanceWindowStatus.UNAVAILABLE; } return null; } diff --git a/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java b/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java index 67da0c4a7..c0619e8e1 100644 --- a/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java +++ b/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java @@ -564,7 +564,8 @@ public class DdiRootControllerTest extends AbstractDDiApiIntegrationTest { mvc.perform(get("/{tenant}/controller/v1/1911/deploymentBase/{actionId}", tenantAware.getCurrentTenant(), action.getId()).accept(MediaType.APPLICATION_JSON)).andDo(MockMvcResultPrinter.print()) .andExpect(status().isOk()).andExpect(jsonPath("$.deployment.download", equalTo("forced"))) - .andExpect(jsonPath("$.deployment.update", equalTo("skip"))); + .andExpect(jsonPath("$.deployment.update", equalTo("skip"))) + .andExpect(jsonPath("$.deployment.maintenanceWindow", equalTo("unavailable"))); } @Test @@ -583,6 +584,7 @@ public class DdiRootControllerTest extends AbstractDDiApiIntegrationTest { mvc.perform(get("/{tenant}/controller/v1/1911/deploymentBase/{actionId}", tenantAware.getCurrentTenant(), action.getId()).accept(MediaType.APPLICATION_JSON)).andDo(MockMvcResultPrinter.print()) .andExpect(status().isOk()).andExpect(jsonPath("$.deployment.download", equalTo("forced"))) - .andExpect(jsonPath("$.deployment.update", equalTo("forced"))); + .andExpect(jsonPath("$.deployment.update", equalTo("forced"))) + .andExpect(jsonPath("$.deployment.maintenanceWindow", equalTo("available"))); } } diff --git a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleResource.java b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleResource.java index ab9ad091a..76dda3f28 100644 --- a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleResource.java +++ b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleResource.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.mgmt.rest.resource; import java.io.IOException; +import java.io.InputStream; import java.util.Collection; import java.util.List; @@ -79,8 +80,8 @@ public class MgmtSoftwareModuleResource implements MgmtSoftwareModuleRestApi { fileName = file.getOriginalFilename(); } - try { - final Artifact result = artifactManagement.create(file.getInputStream(), softwareModuleId, fileName, + try (InputStream in = file.getInputStream()) { + final Artifact result = artifactManagement.create(in, softwareModuleId, fileName, md5Sum == null ? null : md5Sum.toLowerCase(), sha1Sum == null ? null : sha1Sum.toLowerCase(), false, file.getContentType()); diff --git a/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetResourceTest.java b/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetResourceTest.java index 2ec283404..ed286c939 100644 --- a/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetResourceTest.java +++ b/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetResourceTest.java @@ -48,7 +48,6 @@ import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; -import org.eclipse.hawkbit.repository.test.util.AbstractIntegrationTest; import org.eclipse.hawkbit.repository.test.util.WithUser; import org.eclipse.hawkbit.rest.exception.MessageNotReadableException; import org.eclipse.hawkbit.rest.json.model.ExceptionInfo; @@ -60,10 +59,10 @@ import org.junit.Test; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort.Direction; +import org.springframework.hateoas.MediaTypes; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.hateoas.MediaTypes; import com.jayway.jsonpath.JsonPath; @@ -1227,9 +1226,8 @@ public class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest final Target target = testdataFactory.createTarget("fsdfsd"); final DistributionSet set = testdataFactory.createDistributionSet("one"); - final String body = new JSONObject().put("id", set.getId()).put("type", "forced").put("maintenanceWindow", - AbstractIntegrationTest.getMaintenanceWindow(AbstractIntegrationTest.getTestSchedule(0), "", "")) - .toString(); + final String body = new JSONObject().put("id", set.getId()).put("type", "forced") + .put("maintenanceWindow", getMaintenanceWindow(getTestSchedule(0), "", "")).toString(); mvc.perform(post(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + target.getControllerId() + "/assignedDS") .content(body).contentType(MediaType.APPLICATION_JSON)).andDo(MockMvcResultPrinter.print()) @@ -1243,9 +1241,8 @@ public class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest final Target target = testdataFactory.createTarget("fsdfsd"); final DistributionSet set = testdataFactory.createDistributionSet("one"); - final String body = new JSONObject().put("id", set.getId()).put("type", "forced").put("maintenanceWindow", - AbstractIntegrationTest.getMaintenanceWindow("", AbstractIntegrationTest.getTestDuration(10), "")) - .toString(); + final String body = new JSONObject().put("id", set.getId()).put("type", "forced") + .put("maintenanceWindow", getMaintenanceWindow("", getTestDuration(10), "")).toString(); mvc.perform(post(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + target.getControllerId() + "/assignedDS") .content(body).contentType(MediaTypes.HAL_JSON_VALUE)).andDo(MockMvcResultPrinter.print()) @@ -1261,8 +1258,7 @@ public class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest final String body = new JSONObject().put("id", set.getId()).put("type", "forced").put("forcetime", "0") .put("maintenanceWindow", - AbstractIntegrationTest.getMaintenanceWindow(AbstractIntegrationTest.getTestSchedule(10), - AbstractIntegrationTest.getTestDuration(10), AbstractIntegrationTest.getTestTimeZone())) + getMaintenanceWindow(getTestSchedule(10), getTestDuration(10), getTestTimeZone())) .toString(); mvc.perform(post(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + target.getControllerId() + "/assignedDS") @@ -1277,11 +1273,8 @@ public class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest final Target target = testdataFactory.createTarget("fsdfsd"); final DistributionSet set = testdataFactory.createDistributionSet("one"); - final String body = new JSONObject().put("id", set.getId()).put("type", "forced") - .put("maintenanceWindow", - AbstractIntegrationTest.getMaintenanceWindow(AbstractIntegrationTest.getTestSchedule(-30), - AbstractIntegrationTest.getTestDuration(5), AbstractIntegrationTest.getTestTimeZone())) - .toString(); + final String body = new JSONObject().put("id", set.getId()).put("type", "forced").put("maintenanceWindow", + getMaintenanceWindow(getTestSchedule(-30), getTestDuration(5), getTestTimeZone())).toString(); mvc.perform(post(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + target.getControllerId() + "/assignedDS") .content(body).contentType(MediaType.APPLICATION_JSON)).andDo(MockMvcResultPrinter.print()) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetTag.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetTag.java index 253138e02..ef4e68017 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetTag.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetTag.java @@ -34,7 +34,8 @@ import org.eclipse.persistence.descriptors.DescriptorEvent; */ @Entity @Table(name = "sp_distributionset_tag", indexes = { - @Index(name = "sp_idx_distribution_set_tag_prim", columnList = "tenant,id") }, uniqueConstraints = @UniqueConstraint(columnNames = { + @Index(name = "sp_idx_distribution_set_tag_prim", columnList = "tenant,id"), + @Index(name = "sp_idx_distribution_set_tag_01", columnList = "tenant,name") }, uniqueConstraints = @UniqueConstraint(columnNames = { "name", "tenant" }, name = "uk_ds_tag")) public class JpaDistributionSetTag extends JpaTag implements DistributionSetTag, EventAwareEntity { private static final long serialVersionUID = 1L; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTargetTag.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTargetTag.java index 722ffe262..72e730d51 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTargetTag.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTargetTag.java @@ -33,8 +33,8 @@ import org.eclipse.persistence.descriptors.DescriptorEvent; * */ @Entity -@Table(name = "sp_target_tag", indexes = { - @Index(name = "sp_idx_target_tag_prim", columnList = "tenant,id") }, uniqueConstraints = @UniqueConstraint(columnNames = { +@Table(name = "sp_target_tag", indexes = { @Index(name = "sp_idx_target_tag_prim", columnList = "tenant,id"), + @Index(name = "sp_idx_target_tag_01", columnList = "tenant,name") }, uniqueConstraints = @UniqueConstraint(columnNames = { "name", "tenant" }, name = "uk_targ_tag")) public class JpaTargetTag extends JpaTag implements TargetTag, EventAwareEntity { private static final long serialVersionUID = 1L; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/DB2/V1_12_6__add_index___DB2.sql b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/DB2/V1_12_6__add_index___DB2.sql new file mode 100644 index 000000000..d7d7d6cc7 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/DB2/V1_12_6__add_index___DB2.sql @@ -0,0 +1,2 @@ +CREATE INDEX sp_idx_target_tag_01 ON sp_target_tag (tenant, name); +CREATE INDEX sp_idx_distribution_set_tag_01 ON sp_distributionset_tag (tenant, name); \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/H2/V1_12_6__add_index___H2.sql b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/H2/V1_12_6__add_index___H2.sql new file mode 100644 index 000000000..d7d7d6cc7 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/H2/V1_12_6__add_index___H2.sql @@ -0,0 +1,2 @@ +CREATE INDEX sp_idx_target_tag_01 ON sp_target_tag (tenant, name); +CREATE INDEX sp_idx_distribution_set_tag_01 ON sp_distributionset_tag (tenant, name); \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/MYSQL/V1_12_6__add_index___MYSQL.sql b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/MYSQL/V1_12_6__add_index___MYSQL.sql new file mode 100644 index 000000000..d7d7d6cc7 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/MYSQL/V1_12_6__add_index___MYSQL.sql @@ -0,0 +1,2 @@ +CREATE INDEX sp_idx_target_tag_01 ON sp_target_tag (tenant, name); +CREATE INDEX sp_idx_distribution_set_tag_01 ON sp_distributionset_tag (tenant, name); \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/SQL_SERVER/V1_12_6__add_index___SQL_SERVER.sql b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/SQL_SERVER/V1_12_6__add_index___SQL_SERVER.sql new file mode 100644 index 000000000..d7d7d6cc7 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/resources/db/migration/SQL_SERVER/V1_12_6__add_index___SQL_SERVER.sql @@ -0,0 +1,2 @@ +CREATE INDEX sp_idx_target_tag_01 ON sp_target_tag (tenant, name); +CREATE INDEX sp_idx_distribution_set_tag_01 ON sp_distributionset_tag (tenant, name); \ No newline at end of file diff --git a/pom.xml b/pom.xml index cc31f69c9..52a8e0b78 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ - Hudson + Jenkins https://hudson.eclipse.org/hawkbit/ @@ -81,6 +81,15 @@ Committer + + schabdo + Dominic.Schabel@bosch-si.com + Bosch Software Innovations GmbH + https://www.bosch-si.com + + Committer + +