From a9f3d1491ae95d0ce6b824d51ff07a9541e8f9ec Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Mon, 2 Dec 2024 13:50:06 +0200 Subject: [PATCH] JPA Refactoring (3) (#2109) Signed-off-by: Avgustin Marinov --- .../rest/resource/DdiRootControllerTest.java | 3 +- .../app/ddi/PreAuthorizeEnabledTest.java | 11 ++-- .../hawkbit/amqp/BaseAmqpServiceTest.java | 9 ++-- ...pMessageHandlerServiceIntegrationTest.java | 45 ++++++---------- .../app/mgmt/AbstractSecurityTest.java | 3 +- .../eclipse/hawkbit/app/mgmt/CorsTest.java | 2 +- .../app/mgmt/PreAuthorizeEnabledTest.java | 29 +++++----- .../org/eclipse/hawkbit/app/CorsTest.java | 2 +- .../hawkbit/app/PreAuthorizeEnabledTest.java | 34 +++++------- .../hawkbit/repository/SystemManagement.java | 3 -- .../RepositoryApplicationConfiguration.java | 11 ---- .../management/JpaConfirmationManagement.java | 21 +++----- .../management/JpaControllerManagement.java | 21 +++----- .../management/JpaDeploymentManagement.java | 11 ++-- .../jpa/management/JpaSystemManagement.java | 8 +-- .../jpa/management/JpaTargetManagement.java | 7 ++- .../AbstractJpaTenantAwareBaseEntity.java | 2 - .../jpa/repository/BaseEntityRepository.java | 54 ++++++------------- .../repository/BaseEntityRepositoryACM.java | 6 ++- .../jpa/repository/TargetRepository.java | 12 +++++ .../TargetAccessControllerTest.java | 20 +++---- .../controller/TestAccessControlManger.java | 1 - .../management/ArtifactManagementTest.java | 6 +-- .../management/DeploymentManagementTest.java | 6 +-- .../DistributionSetTagManagementTest.java | 3 +- .../DistributionSetTypeManagementTest.java | 3 +- .../RolloutGroupManagementTest.java | 3 +- .../jpa/management/RolloutManagementTest.java | 3 +- .../SoftwareModuleManagementTest.java | 6 +-- .../SoftwareModuleTypeManagementTest.java | 6 +-- .../TargetFilterQueryManagementTest.java | 3 +- .../jpa/management/TargetManagementTest.java | 18 +++---- .../management/TargetTagManagementTest.java | 3 +- .../management/TargetTypeManagementTest.java | 6 +-- .../repository/test/TestConfiguration.java | 12 +++++ .../test/util/SecurityContextSwitch.java | 2 +- .../test/util}/SystemManagementHolder.java | 2 +- 37 files changed, 151 insertions(+), 246 deletions(-) rename hawkbit-repository/{hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper => hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util}/SystemManagementHolder.java (95%) diff --git a/hawkbit-ddi/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java b/hawkbit-ddi/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java index da81bc76a..2818f3b60 100644 --- a/hawkbit-ddi/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java +++ b/hawkbit-ddi/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootControllerTest.java @@ -146,8 +146,7 @@ class DdiRootControllerTest extends AbstractDDiApiIntegrationTest { @Test @Description("Ensures that server returns a not found response in case of empty controller ID.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) void rootRsWithoutId() throws Exception { mvc.perform(get("/controller/v1/")) .andDo(MockMvcResultPrinter.print()) diff --git a/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/PreAuthorizeEnabledTest.java b/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/PreAuthorizeEnabledTest.java index 1f45abde4..e9f5a8829 100644 --- a/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/PreAuthorizeEnabledTest.java +++ b/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/PreAuthorizeEnabledTest.java @@ -28,20 +28,17 @@ public class PreAuthorizeEnabledTest extends AbstractSecurityTest { @Test @Description("Tests whether request fail if a role is forbidden for the user") - @WithUser(authorities = { SpPermission.READ_TARGET }) + @WithUser(authorities = { SpPermission.READ_TARGET }, autoCreateTenant = false) public void failIfNoRole() throws Exception { mvc.perform(get("/DEFAULT/controller/v1/controllerId")) - .andExpect(result -> - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.FORBIDDEN.value())); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.FORBIDDEN.value())); } @Test @Description("Tests whether request succeed if a role is granted for the user") - @WithUser(authorities = { SpPermission.SpringEvalExpressions.CONTROLLER_ROLE }) + @WithUser(authorities = { SpPermission.SpringEvalExpressions.CONTROLLER_ROLE }, autoCreateTenant = false) public void successIfHasRole() throws Exception { mvc.perform(get("/DEFAULT/controller/v1/controllerId")) - .andExpect(result -> { - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - }); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } } \ No newline at end of file diff --git a/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/BaseAmqpServiceTest.java b/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/BaseAmqpServiceTest.java index 3f08cfe3d..189ede489 100644 --- a/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/BaseAmqpServiceTest.java +++ b/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/BaseAmqpServiceTest.java @@ -63,8 +63,7 @@ public class BaseAmqpServiceTest { @Test @Description("Tests invalid null message content") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) public void convertMessageWithNullContent() { final Message message = createMessage("".getBytes()); assertThatExceptionOfType(MessageConversionException.class) @@ -74,8 +73,7 @@ public class BaseAmqpServiceTest { @Test @Description("Tests invalid empty message content") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) public void updateActionStatusWithEmptyContent() { final Message message = createMessage("".getBytes()); assertThatExceptionOfType(MessageConversionException.class) @@ -85,8 +83,7 @@ public class BaseAmqpServiceTest { @Test @Description("Tests invalid json message content") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) public void updateActionStatusWithInvalidJsonContent() { final Message message = createMessage("Invalid Json".getBytes()); when(rabbitTemplate.getMessageConverter()).thenReturn(new Jackson2JsonMessageConverter()); diff --git a/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/integration/AmqpMessageHandlerServiceIntegrationTest.java b/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/integration/AmqpMessageHandlerServiceIntegrationTest.java index 0073933ef..1d12a11cd 100644 --- a/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/integration/AmqpMessageHandlerServiceIntegrationTest.java +++ b/hawkbit-dmf/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/integration/AmqpMessageHandlerServiceIntegrationTest.java @@ -187,8 +187,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @ValueSource(strings = { "", "Invalid Invalid" }) @NullSource @Description("Tests register invalid target with empty controller id.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void shouldNotRegisterTargetsWithInvalidControllerIds(String controllerId) { createAndSendThingCreated(controllerId); assertAllTargetsCount(0); @@ -197,8 +196,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests register invalid target with too long controller id") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void registerInvalidTargetWithTooLongControllerId() { createAndSendThingCreated(RandomStringUtils.randomAlphabetic(Target.CONTROLLER_ID_MAX_SIZE + 1)); assertAllTargetsCount(0); @@ -207,8 +205,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests null reply to property in message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void missingReplyToProperty() { final String controllerId = TARGET_PREFIX + "missingReplyToProperty"; final Message createTargetMessage = createTargetMessage(controllerId, TENANT_EXIST); @@ -221,8 +218,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests missing reply to property in message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void emptyReplyToProperty() { final String controllerId = TARGET_PREFIX + "emptyReplyToProperty"; final Message createTargetMessage = createTargetMessage(controllerId, TENANT_EXIST); @@ -235,8 +231,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests missing thing id property in message. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void missingThingIdProperty() { final Message createTargetMessage = createTargetMessage(null, TENANT_EXIST); createTargetMessage.getMessageProperties().getHeaders().remove(MessageHeaderKey.THING_ID); @@ -248,8 +243,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests null thing id property in message. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void nullThingIdProperty() { final Message createTargetMessage = createTargetMessage(null, TENANT_EXIST); getDmfClient().send(createTargetMessage); @@ -260,8 +254,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests missing tenant message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void missingTenantHeader() { final String controllerId = TARGET_PREFIX + "missingTenantHeader"; final Message createTargetMessage = createTargetMessage(controllerId, TENANT_EXIST); @@ -274,8 +267,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests null tenant message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void nullTenantHeader() { final String controllerId = TARGET_PREFIX + "nullTenantHeader"; final Message createTargetMessage = createTargetMessage(controllerId, null); @@ -287,8 +279,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests empty tenant message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void emptyTenantHeader() { final String controllerId = TARGET_PREFIX + "emptyTenantHeader"; final Message createTargetMessage = createTargetMessage(controllerId, ""); @@ -300,8 +291,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests missing type message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void missingTypeHeader() { final Message createTargetMessage = createTargetMessage(null, TENANT_EXIST); createTargetMessage.getMessageProperties().getHeaders().remove(MessageHeaderKey.TYPE); @@ -315,8 +305,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @ValueSource(strings = { "", "NotExist" }) @NullSource @Description("Tests null type message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void shouldNotCreateTargetsWithInvalidTypeInHeader(String type) { final Message createTargetMessage = createTargetMessage(null, TENANT_EXIST); createTargetMessage.getMessageProperties().getHeaders().put(MessageHeaderKey.TYPE, type); @@ -330,8 +319,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @ValueSource(strings = { "", "NotExist" }) @NullSource @Description("Tests null topic message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void shouldNotSendMessagesWithInvalidTopic(String topic) { final Message eventMessage = createUpdateActionEventMessage(""); eventMessage.getMessageProperties().getHeaders().put(MessageHeaderKey.TOPIC, topic); @@ -342,8 +330,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests missing topic message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void missingTopicHeader() { final Message eventMessage = createUpdateActionEventMessage(""); eventMessage.getMessageProperties().getHeaders().remove(MessageHeaderKey.TOPIC); @@ -356,8 +343,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @ValueSource(strings = { "", "Invalid Content" }) @NullSource @Description("Tests invalid null message content. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void shouldMoveUpdateActionStatusWithInvalidPayloadIntoDeadLetter(String payload) { final Message eventMessage = createUpdateActionEventMessage(payload); getDmfClient().send(eventMessage); @@ -366,8 +352,7 @@ class AmqpMessageHandlerServiceIntegrationTest extends AbstractAmqpServiceIntegr @Test @Description("Tests invalid topic message header. This message should forwarded to the deadletter queue") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void updateActionStatusWithInvalidActionId() { final DmfActionUpdateStatus actionUpdateStatus = new DmfActionUpdateStatus(1L, DmfActionStatus.RUNNING); final Message eventMessage = createUpdateActionEventMessage(actionUpdateStatus); diff --git a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/AbstractSecurityTest.java b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/AbstractSecurityTest.java index 8f055259c..a2a52cbd8 100644 --- a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/AbstractSecurityTest.java +++ b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/AbstractSecurityTest.java @@ -34,5 +34,4 @@ public abstract class AbstractSecurityTest { .apply(SecurityMockMvcConfigurers.springSecurity()).dispatchOptions(true); mvc = builder.build(); } - -} +} \ No newline at end of file diff --git a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/CorsTest.java b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/CorsTest.java index e927360bd..c0e7a8b2f 100644 --- a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/CorsTest.java +++ b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/CorsTest.java @@ -46,7 +46,7 @@ public class CorsTest extends AbstractSecurityTest { @Test @Description("Ensures that Cors is working.") - @WithUser(authorities = SpRole.TENANT_ADMIN) + @WithUser(authorities = SpRole.TENANT_ADMIN, autoCreateTenant = false) public void validateCorsRequest() throws Exception { performOptionsRequestToRestWithOrigin(ALLOWED_ORIGIN_FIRST).andExpect(status().isOk()) .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, ALLOWED_ORIGIN_FIRST)); diff --git a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/PreAuthorizeEnabledTest.java b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/PreAuthorizeEnabledTest.java index 736e6f121..9d08452cc 100644 --- a/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/PreAuthorizeEnabledTest.java +++ b/hawkbit-mgmt/hawkbit-mgmt-server/src/test/java/org/eclipse/hawkbit/app/mgmt/PreAuthorizeEnabledTest.java @@ -30,7 +30,7 @@ public class PreAuthorizeEnabledTest extends AbstractSecurityTest { @Test @Description("Tests whether request fail if a role is forbidden for the user") - @WithUser(authorities = { SpPermission.READ_TARGET }) + @WithUser(authorities = { SpPermission.READ_TARGET }, autoCreateTenant = false) public void failIfNoRole() throws Exception { mvc.perform(get("/rest/v1/distributionsets")).andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.FORBIDDEN.value())); @@ -38,41 +38,36 @@ public class PreAuthorizeEnabledTest extends AbstractSecurityTest { @Test @Description("Tests whether request succeed if a role is granted for the user") - @WithUser(authorities = { SpPermission.READ_REPOSITORY }) + @WithUser(authorities = { SpPermission.READ_REPOSITORY }, autoCreateTenant = false) public void successIfHasRole() throws Exception { - mvc.perform(get("/rest/v1/distributionsets")).andExpect(result -> { - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - }); + mvc.perform(get("/rest/v1/distributionsets")).andExpect(result -> + assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } @Test @Description("Tests whether request succeed if a role is granted for the user") - @WithUser(authorities = { SpRole.TENANT_ADMIN }) + @WithUser(authorities = { SpRole.TENANT_ADMIN }, autoCreateTenant = false) public void successIfHasTenantAdminRole() throws Exception { - mvc.perform(get("/rest/v1/distributionsets")).andExpect(result -> { - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - }); + mvc.perform(get("/rest/v1/distributionsets")).andExpect(result -> + assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } @Test - @Description("Tests whether read tenant config request fail if a tenant config (or read read) is not " + - "granted for the user") - @WithUser(authorities = { SpPermission.READ_TARGET }) + @Description("Tests whether read tenant config request fail if a tenant config (or read read) is not granted for the user") + @WithUser(authorities = { SpPermission.READ_TARGET }, autoCreateTenant = false) public void onlyDSIfNoTenantConfig() throws Exception { mvc.perform(get("/rest/v1/system/configs")).andExpect(result -> { // returns default DS type because of READ_TARGET assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); assertThat( - new ObjectMapper().reader().readValue(result.getResponse().getContentAsString(), HashMap.class) - .size()) + new ObjectMapper().reader().readValue(result.getResponse().getContentAsString(), HashMap.class).size()) .isEqualTo(1); }); } @Test - @Description("Tests whether read tenant config request succeed if a tenant config (not read explicitly) is " + - "granted for the user") - @WithUser(authorities = { SpPermission.TENANT_CONFIGURATION }) + @Description("Tests whether read tenant config request succeed if a tenant config (not read explicitly) is granted for the user") + @WithUser(authorities = { SpPermission.TENANT_CONFIGURATION }, autoCreateTenant = false) public void successIfHasTenantConfig() throws Exception { mvc.perform(get("/rest/v1/system/configs")).andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); diff --git a/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/CorsTest.java b/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/CorsTest.java index cce98e2a8..8269dd4c1 100644 --- a/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/CorsTest.java +++ b/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/CorsTest.java @@ -46,7 +46,7 @@ public class CorsTest extends AbstractSecurityTest { @Test @Description("Ensures that Cors is working.") - @WithUser(authorities = SpRole.TENANT_ADMIN) + @WithUser(authorities = SpRole.TENANT_ADMIN, autoCreateTenant = false) public void validateCorsRequest() throws Exception { performOptionsRequestToRestWithOrigin(ALLOWED_ORIGIN_FIRST).andExpect(status().isOk()) .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, ALLOWED_ORIGIN_FIRST)); diff --git a/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/PreAuthorizeEnabledTest.java b/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/PreAuthorizeEnabledTest.java index 1ef0bb055..d658d27ee 100644 --- a/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/PreAuthorizeEnabledTest.java +++ b/hawkbit-monolith/hawkbit-update-server/src/test/java/org/eclipse/hawkbit/app/PreAuthorizeEnabledTest.java @@ -30,56 +30,46 @@ public class PreAuthorizeEnabledTest extends AbstractSecurityTest { @Test @Description("Tests whether request fail if a role is forbidden for the user") - @WithUser(authorities = { SpPermission.READ_TARGET }) + @WithUser(authorities = { SpPermission.READ_TARGET }, autoCreateTenant = false) public void failIfNoRole() throws Exception { mvc.perform(get("/rest/v1/distributionsets")) - .andExpect(result -> - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.FORBIDDEN.value())); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.FORBIDDEN.value())); } @Test @Description("Tests whether request succeed if a role is granted for the user") - @WithUser(authorities = { SpPermission.READ_REPOSITORY }) + @WithUser(authorities = { SpPermission.READ_REPOSITORY }, autoCreateTenant = false) public void successIfHasRole() throws Exception { mvc.perform(get("/rest/v1/distributionsets")) - .andExpect(result -> { - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - }); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } @Test @Description("Tests whether request succeed if a role is granted for the user") - @WithUser(authorities = { SpRole.TENANT_ADMIN }) + @WithUser(authorities = { SpRole.TENANT_ADMIN }, autoCreateTenant = false) public void successIfHasTenantAdminRole() throws Exception { mvc.perform(get("/rest/v1/distributionsets")) - .andExpect(result -> { - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - }); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } @Test - @Description("Tests whether read tenant config request fail if a tenant config (or read read) is not " + - "granted for the user") - @WithUser(authorities = { SpPermission.READ_TARGET }) + @Description("Tests whether read tenant config request fail if a tenant config (or read read) is not granted for the user") + @WithUser(authorities = { SpPermission.READ_TARGET }, autoCreateTenant = false) public void onlyDSIfNoTenantConfig() throws Exception { mvc.perform(get("/rest/v1/system/configs")) .andExpect(result -> { // returns default DS type because of READ_TARGET assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat( - new ObjectMapper().reader().readValue(result.getResponse().getContentAsString(), HashMap.class) - .size()) + assertThat(new ObjectMapper().reader().readValue(result.getResponse().getContentAsString(), HashMap.class).size()) .isEqualTo(1); }); } @Test - @Description("Tests whether read tenant config request succeed if a tenant config (not read explicitly) is " + - "granted for the user") - @WithUser(authorities = { SpPermission.TENANT_CONFIGURATION }) + @Description("Tests whether read tenant config request succeed if a tenant config (not read explicitly) is granted for the user") + @WithUser(authorities = { SpPermission.TENANT_CONFIGURATION }, autoCreateTenant = false) public void successIfHasTenantConfig() throws Exception { mvc.perform(get("/rest/v1/system/configs")) - .andExpect(result -> - assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); + .andExpect(result -> assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value())); } } \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/SystemManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/SystemManagement.java index 30b56e777..bcd2395b2 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/SystemManagement.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/SystemManagement.java @@ -109,7 +109,4 @@ public interface SystemManagement { @PreAuthorize(SpringEvalExpressions.IS_SYSTEM_CODE) TenantMetaData getTenantMetadata(long tenantId); - - @PreAuthorize(SpringEvalExpressions.IS_SYSTEM_CODE) - boolean tenantExists(String tenant); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java index c292cf983..ff0d08a1a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java @@ -154,7 +154,6 @@ import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetFilterQuery; import org.eclipse.hawkbit.repository.model.TargetType; import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; -import org.eclipse.hawkbit.repository.model.helper.SystemManagementHolder; import org.eclipse.hawkbit.repository.model.helper.SystemSecurityContextHolder; import org.eclipse.hawkbit.repository.model.helper.TenantConfigurationManagementHolder; import org.eclipse.hawkbit.repository.rsql.RsqlConfigHolder; @@ -488,16 +487,6 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { return TenantConfigurationManagementHolder.getInstance(); } - /** - * @return the {@link SystemManagementHolder} singleton bean which holds the - * current {@link SystemManagement} service and make it accessible in - * beans which cannot access the service directly, e.g. JPA entities. - */ - @Bean - SystemManagementHolder systemManagementHolder() { - return SystemManagementHolder.getInstance(); - } - /** * @return the {@link TenantAwareHolder} singleton bean which holds the current * {@link TenantAware} service and make it accessible in beans which diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java index 2a160c499..89f9abc1a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java @@ -24,7 +24,6 @@ import org.eclipse.hawkbit.repository.RepositoryConstants; import org.eclipse.hawkbit.repository.RepositoryProperties; import org.eclipse.hawkbit.repository.builder.ActionStatusCreate; import org.eclipse.hawkbit.repository.exception.AutoConfirmationAlreadyActiveException; -import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.exception.InvalidConfirmationFeedbackException; import org.eclipse.hawkbit.repository.jpa.builder.JpaActionStatusCreate; import org.eclipse.hawkbit.repository.jpa.configuration.Constants; @@ -35,7 +34,6 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.repository.ActionRepository; import org.eclipse.hawkbit.repository.jpa.repository.ActionStatusRepository; import org.eclipse.hawkbit.repository.jpa.repository.TargetRepository; -import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action.Status; import org.eclipse.hawkbit.repository.model.AutoConfirmationStatus; @@ -81,7 +79,7 @@ public class JpaConfirmationManagement extends JpaActionManagement implements Co public AutoConfirmationStatus activateAutoConfirmation(final String controllerId, final String initiator, final String remark) { log.trace( "'activateAutoConfirmation' was called with values: controllerId={}; initiator={}; remark={}", controllerId, initiator, remark); - final JpaTarget target = getTargetByControllerIdAndThrowIfNotFound(controllerId); + final JpaTarget target = targetRepository.getByControllerId(controllerId); if (target.getAutoConfirmationStatus() != null) { log.debug("'activateAutoConfirmation' was called for an controller id {} with active auto confirmation.", controllerId); throw new AutoConfirmationAlreadyActiveException(controllerId); @@ -104,13 +102,13 @@ public class JpaConfirmationManagement extends JpaActionManagement implements Co @Override public Optional getStatus(final String controllerId) { - return Optional.of(getTargetByControllerIdAndThrowIfNotFound(controllerId)).map(JpaTarget::getAutoConfirmationStatus); + return Optional.of(targetRepository.getByControllerId(controllerId)).map(JpaTarget::getAutoConfirmationStatus); } @Override @Transactional public List autoConfirmActiveActions(final String controllerId) { - final JpaTarget target = getTargetByControllerIdAndThrowIfNotFound(controllerId); + final JpaTarget target = targetRepository.getByControllerId(controllerId); if (target.getAutoConfirmationStatus() == null) { // auto-confirmation is not active return Collections.emptyList(); @@ -159,7 +157,7 @@ public class JpaConfirmationManagement extends JpaActionManagement implements Co @Transactional public void deactivateAutoConfirmation(String controllerId) { log.debug("Deactivate auto confirmation for controllerId '{}'", controllerId); - final JpaTarget target = getTargetByControllerIdAndThrowIfNotFound(controllerId); + final JpaTarget target = targetRepository.getByControllerId(controllerId); target.setAutoConfirmationStatus(null); targetRepository.save(target); } @@ -220,19 +218,12 @@ public class JpaConfirmationManagement extends JpaActionManagement implements Co "Automatically confirm actionId '{}' due to active auto-confirmation initiated by '{}' and rollouts system user '{}'", action.getId(), autoConfirmationStatus.getInitiator(), autoConfirmationStatus.getCreatedBy()); - // do not make use of - // org.eclipse.hawkbit.repository.jpa.management.JpaActionManagement.handleAddUpdateActionStatus - // to bypass the quota check. Otherwise, the action will not be confirmed in case - // of exceeded action status quota. + // do not make use of org.eclipse.hawkbit.repository.jpa.management.JpaActionManagement.handleAddUpdateActionStatus + // to bypass the quota check. Otherwise, the action will not be confirmed in case of exceeded action status quota. action.setStatus(Status.RUNNING); actionStatus.setAction(action); actionStatusRepository.save(actionStatus); return actionRepository.save(action); } - - private JpaTarget getTargetByControllerIdAndThrowIfNotFound(final String controllerId) { - return targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); - } } \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaControllerManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaControllerManagement.java index 142dba926..a8283f3f9 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaControllerManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaControllerManagement.java @@ -414,8 +414,7 @@ public class JpaControllerManagement extends JpaActionManagement implements Cont throw new InvalidTargetAttributeException(); } - final JpaTarget target = targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); + final JpaTarget target = targetRepository.getByControllerId(controllerId); // get the modifiable attribute map final Map controllerAttributes = target.getControllerAttributes(); @@ -447,7 +446,7 @@ public class JpaControllerManagement extends JpaActionManagement implements Cont @Override public Optional getByControllerId(final String controllerId) { - return targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)).map(Target.class::cast); + return targetRepository.findByControllerId(controllerId).map(Target.class::cast); } @Override @@ -541,20 +540,16 @@ public class JpaControllerManagement extends JpaActionManagement implements Cont @Override public void deleteExistingTarget(@NotEmpty final String controllerId) { - final Target target = targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); - targetRepository.deleteById(target.getId()); + targetRepository.deleteById(targetRepository.getByControllerId(controllerId).getId()); } @Override public Optional getInstalledActionByTarget(final String controllerId) { - final JpaTarget jpaTarget = targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); - - final JpaDistributionSet installedDistributionSet = jpaTarget.getInstalledDistributionSet(); - if (null != installedDistributionSet) { - return actionRepository.findFirstByTargetIdAndDistributionSetIdAndStatusOrderByIdDesc(jpaTarget.getId(), - installedDistributionSet.getId(), FINISHED); + final JpaDistributionSet installedDistributionSet = targetRepository.getByControllerId(controllerId).getInstalledDistributionSet(); + if (installedDistributionSet != null) { + final JpaTarget jpaTarget = targetRepository.getByControllerId(controllerId); + return actionRepository.findFirstByTargetIdAndDistributionSetIdAndStatusOrderByIdDesc( + jpaTarget.getId(), installedDistributionSet.getId(), FINISHED); } else { return Optional.empty(); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java index fd553e779..4709b0113 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java @@ -486,16 +486,12 @@ public class JpaDeploymentManagement extends JpaActionManagement implements Depl @Override public Optional getAssignedDistributionSet(final String controllerId) { - return targetRepository - .findOne(TargetSpecifications.hasControllerId(controllerId)) - .map(JpaTarget::getAssignedDistributionSet); + return targetRepository.findByControllerId(controllerId).map(JpaTarget::getAssignedDistributionSet); } @Override public Optional getInstalledDistributionSet(final String controllerId) { - return targetRepository - .findOne(TargetSpecifications.hasControllerId(controllerId)) - .map(JpaTarget::getInstalledDistributionSet); + return targetRepository.findByControllerId(controllerId).map(JpaTarget::getInstalledDistributionSet); } @Override @@ -710,8 +706,7 @@ public class JpaDeploymentManagement extends JpaActionManagement implements Depl } private void checkCompatibilityForMultiDsAssignment(final String controllerId, final List distSetIds) { - final Target target = targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); + final Target target = targetRepository.getByControllerId(controllerId); if (target.getTargetType() != null) { // we assume that list of assigned DS is less than diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaSystemManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaSystemManagement.java index b6d4ff47a..56dfd7b69 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaSystemManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaSystemManagement.java @@ -73,8 +73,10 @@ import org.springframework.validation.annotation.Validated; public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, SystemManagement { private static final int MAX_TENANTS_QUERY = 1000; + private final String countArtifactQuery; private final String countSoftwareModulesQuery; + @Autowired private EntityManager entityManager; @Autowired @@ -284,12 +286,6 @@ public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, Syst .orElseThrow(() -> new EntityNotFoundException(TenantMetaData.class, tenantId)); } - @Override - @Cacheable(value = "currentTenant", keyGenerator = "currentTenantKeyGenerator", cacheManager = "directCacheManager", unless = "#result == null") - public boolean tenantExists(final String tenant) { - return tenantMetaDataRepository.findByTenantIgnoreCase(tenant) != null; - } - private static boolean isPostgreSql(final JpaProperties properties) { return Database.POSTGRESQL == properties.getDatabase(); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java index fee718386..358ab1962 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java @@ -410,7 +410,7 @@ public class JpaTargetManagement implements TargetManagement { @Override public Optional getByControllerID(final String controllerId) { - return targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)).map(Target.class::cast); + return targetRepository.findByControllerId(controllerId).map(Target.class::cast); } @Override @@ -892,8 +892,7 @@ public class JpaTargetManagement implements TargetManagement { } private JpaTarget getByControllerIdAndThrowIfNotFound(final String controllerId) { - return targetRepository.findOne(TargetSpecifications.hasControllerId(controllerId)) - .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); + return targetRepository.getByControllerId(controllerId); } private JpaTargetType getTargetTypeByIdAndThrowIfNotFound(final long id) { @@ -960,7 +959,7 @@ public class JpaTargetManagement implements TargetManagement { final JpaTargetTag tag = targetTagRepository.findById(targetTagId) .orElseThrow(() -> new EntityNotFoundException(TargetTag.class, targetTagId)); final List targets = controllerIds.size() == 1 ? - targetRepository.findOne(TargetSpecifications.hasControllerId(controllerIds.iterator().next())) + targetRepository.findByControllerId(controllerIds.iterator().next()) .map(List::of) .orElseGet(Collections::emptyList) : targetRepository diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/AbstractJpaTenantAwareBaseEntity.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/AbstractJpaTenantAwareBaseEntity.java index f90646805..d1e7ec7df 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/AbstractJpaTenantAwareBaseEntity.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/AbstractJpaTenantAwareBaseEntity.java @@ -24,11 +24,9 @@ import lombok.Setter; import org.eclipse.hawkbit.repository.exception.TenantNotExistException; import org.eclipse.hawkbit.repository.jpa.model.helper.TenantAwareHolder; import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; -import org.eclipse.hawkbit.repository.model.helper.SystemManagementHolder; import org.eclipse.persistence.annotations.Multitenant; import org.eclipse.persistence.annotations.MultitenantType; import org.eclipse.persistence.annotations.TenantDiscriminatorColumn; -import org.hibernate.annotations.TenantId; /** * Holder of the base attributes common to all tenant aware entities. diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepository.java index cda97aeec..3dbffc6a6 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepository.java @@ -37,15 +37,13 @@ import org.springframework.transaction.annotation.Transactional; @NoRepositoryBean @Transactional(readOnly = true) public interface BaseEntityRepository - extends PagingAndSortingRepository, CrudRepository, JpaSpecificationExecutor, - NoCountSliceRepository, ACMRepository { + extends PagingAndSortingRepository, CrudRepository, JpaSpecificationExecutor, NoCountSliceRepository, + ACMRepository { /** - * Overrides - * {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)} - * to return a list of created entities instead of an instance of - * {@link Iterable} to be able to work with it directly in further code - * processing instead of converting the {@link Iterable}. + * Overrides {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)} to return a list of created entities instead + * of an instance of {@link Iterable} to be able to work with it directly in further code processing instead of converting the + * {@link Iterable}. * * @param entities to persist in the database * @return the created entities @@ -55,11 +53,9 @@ public interface BaseEntityRepository List saveAll(Iterable entities); /** - * Overrides - * {@link org.springframework.data.repository.CrudRepository#findAll()} - * to return a list of found entities instead of an instance of - * {@link Iterable} to be able to work with it directly in further code - * processing instead of converting the {@link Iterable}. + * Overrides {@link org.springframework.data.repository.CrudRepository#findAll()} to return a list of found entities instead of + * an instance of {@link Iterable} to be able to work with it directly in further code processing instead of converting the + * {@link Iterable}. * * @return the found entities */ @@ -67,22 +63,9 @@ public interface BaseEntityRepository findAll(); /** - * Gets by id requiring entity to exists - * - * @param id the entity id - * @return the existing entity. - * @throws EntityNotFoundException if the entity doesn't exist - */ - default T getById(final Long id) { - return findById(id).orElseThrow(() -> new EntityNotFoundException(getDomainClass(), id)); - } - - /** - * Overrides - * {@link org.springframework.data.repository.CrudRepository#findAllById(Iterable)} - * to return a list of found entities instead of an instance of - * {@link Iterable} to be able to work with it directly in further code - * processing instead of converting the {@link Iterable}. + * Overrides {@link org.springframework.data.repository.CrudRepository#findAllById(Iterable)} to return a list of found entities instead + * of an instance of {@link Iterable} to be able to work with it directly in further code processing instead of converting the + * {@link Iterable}. * * @param ids to search in the database for * @return the found entities @@ -92,10 +75,8 @@ public interface BaseEntityRepository * * @param tenant to delete data from @@ -103,11 +84,9 @@ public interface BaseEntityRepositorynull of this repository that - * supports ACM. + * Returns a wrapper (or the same instance if access controller is null of this repository that supports ACM. *

- * Note: To use ACM support the returned object shall be used! this object will not achieve ACM - * support! + * Note: To use ACM support the returned object shall be used! this object will not achieve ACM support! *

* Notes on ACM support (if enabled, i.e. accessController is not null): *

    @@ -123,7 +102,6 @@ public interface BaseEntityRepository * * @param accessController access controller to be applied to the result - * @param entityType the entity type of the repository * @return a repository that supports ACM. */ default BaseEntityRepository withACM(@Nullable final AccessController accessController) { @@ -152,4 +130,4 @@ public interface BaseEntityRepository> getAccessController() { return Optional.empty(); } -} +} \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java index 19f425fa3..a1b695840 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java @@ -322,7 +322,11 @@ public class BaseEntityRepositoryACM .filter(value -> repository.getDomainClass().isAssignableFrom(value.getClass())) .isPresent()) { return ((Optional) result).filter( - t -> isOperationAllowed(AccessController.Operation.READ, t, accessController)); + t -> { + // if not accessible - throws exception (as for iterables or single entities) + accessController.assertOperationAllowed(AccessController.Operation.READ, t); + return true; + }); } else if (repository.getDomainClass().isAssignableFrom(method.getReturnType())) { accessController.assertOperationAllowed(AccessController.Operation.READ, (T) result); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetRepository.java index 3ec5e7a79..87b7a8495 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetRepository.java @@ -10,11 +10,14 @@ package org.eclipse.hawkbit.repository.jpa.repository; import java.util.Collection; +import java.util.Optional; import jakarta.persistence.EntityManager; +import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; +import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; @@ -29,6 +32,15 @@ import org.springframework.transaction.annotation.Transactional; @Transactional(readOnly = true) public interface TargetRepository extends BaseEntityRepository { + default Optional findByControllerId(final String controllerId) { + return findOne(TargetSpecifications.hasControllerId(controllerId)); + } + + default JpaTarget getByControllerId(final String controllerId) { + return findOne(TargetSpecifications.hasControllerId(controllerId)) + .orElseThrow(() -> new EntityNotFoundException(Target.class, controllerId)); + } + // TODO AC - remove it and use specification /** diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TargetAccessControllerTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TargetAccessControllerTest.java index f803b9d2f..ffc9a8b4a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TargetAccessControllerTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TargetAccessControllerTest.java @@ -21,7 +21,6 @@ import io.qameta.allure.Feature; import io.qameta.allure.Story; import org.eclipse.hawkbit.repository.FilterParams; import org.eclipse.hawkbit.repository.Identifiable; -import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.exception.InsufficientPermissionException; import org.eclipse.hawkbit.repository.jpa.acm.AccessController; import org.eclipse.hawkbit.repository.jpa.autoassign.AutoAssignChecker; @@ -76,7 +75,9 @@ class TargetAccessControllerTest extends AbstractAccessControllerTest { // verify targetManagement#getByControllerID assertThat(targetManagement.getByControllerID(permittedTarget.getControllerId())).isPresent(); - assertThat(targetManagement.getByControllerID(hiddenTarget.getControllerId())).isEmpty(); + assertThatThrownBy(() -> targetManagement.getByControllerID(hiddenTarget.getControllerId())) + .as("Missing read permissions for hidden target.") + .isInstanceOf(InsufficientPermissionException.class); // verify targetManagement#getByControllerID assertThat(targetManagement @@ -95,7 +96,7 @@ class TargetAccessControllerTest extends AbstractAccessControllerTest { assertThat(targetManagement.getControllerAttributes(permittedTarget.getControllerId())).isEmpty(); assertThatThrownBy(() -> { assertThat(targetManagement.getControllerAttributes(hiddenTarget.getControllerId())).isEmpty(); - }).as("Target should not be found.").isInstanceOf(EntityNotFoundException.class); + }).as("Target should not be found.").isInstanceOf(InsufficientPermissionException.class); final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement .create(entityFactory.targetFilterQuery().create().name("test").query("id==*")); @@ -176,7 +177,7 @@ class TargetAccessControllerTest extends AbstractAccessControllerTest { assertThatThrownBy(() -> { targetManagement.assignTag(Collections.singletonList(readOnlyTarget.getControllerId()), myTag.getId()); }).as("Missing update permissions for target to toggle tag assignment.") - .isInstanceOfAny(InsufficientPermissionException.class, EntityNotFoundException.class); + .isInstanceOfAny(InsufficientPermissionException.class); // assignment is denied for readOnlyTarget (read, but no update permissions) assertThatThrownBy(() -> { @@ -190,19 +191,18 @@ class TargetAccessControllerTest extends AbstractAccessControllerTest { .assignTag(Collections.singletonList(hiddenTarget.getControllerId()), myTag.getId()) .size(); }).as("Missing update permissions for target to toggle tag assignment.") - .isInstanceOf(EntityNotFoundException.class); + .isInstanceOf(InsufficientPermissionException.class); // assignment is denied for hiddenTarget since it's hidden assertThatThrownBy(() -> { targetManagement.assignTag(Collections.singletonList(hiddenTarget.getControllerId()), myTag.getId()); }).as("Missing update permissions for target to toggle tag assignment.") - .isInstanceOf(EntityNotFoundException.class); + .isInstanceOf(InsufficientPermissionException.class); // assignment is denied for hiddenTarget since it's hidden - assertThatThrownBy(() -> { - targetManagement.unassignTag(hiddenTarget.getControllerId(), myTag.getId()); - }).as("Missing update permissions for target to toggle tag assignment.") - .isInstanceOf(EntityNotFoundException.class); + assertThatThrownBy(() -> targetManagement.unassignTag(hiddenTarget.getControllerId(), myTag.getId())) + .as("Missing update permissions for target to toggle tag assignment.") + .isInstanceOf(InsufficientPermissionException.class); } @Test diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TestAccessControlManger.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TestAccessControlManger.java index bb53f1242..bd1e69dbf 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TestAccessControlManger.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/controller/TestAccessControlManger.java @@ -57,7 +57,6 @@ public class TestAccessControlManger { "Access to " + ruleClass.getName() + "/" + entity + " not allowed by checker!"); } } - return; } } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ArtifactManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ArtifactManagementTest.java index df97560ab..caba65f21 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ArtifactManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ArtifactManagementTest.java @@ -68,8 +68,7 @@ public class ArtifactManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access react as specfied on calls for non existing entities by means of Optional not present.") - @ExpectEvents({ - @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) public void nonExistingEntityAccessReturnsNotPresent() { final SoftwareModule module = testdataFactory.createSoftwareModuleOs(); @@ -85,8 +84,7 @@ public class ArtifactManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management queries react as specfied on calls for non existing entities " + " by means of throwing EntityNotFoundException.") - @ExpectEvents({ - @Expect(type = SoftwareModuleDeletedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = SoftwareModuleDeletedEvent.class, count = 0) }) public void entityQueriesReferringToNotExistingEntitiesThrowsException() throws URISyntaxException { final String artifactData = "test"; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DeploymentManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DeploymentManagementTest.java index 6e2a3b8a8..c7920d9ca 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DeploymentManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DeploymentManagementTest.java @@ -146,8 +146,7 @@ class DeploymentManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access react as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(deploymentManagement.findAction(1234L)).isNotPresent(); assertThat(deploymentManagement.findActionWithDetails(NOT_EXIST_IDL)).isNotPresent(); @@ -156,8 +155,7 @@ class DeploymentManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management queries react as specified on calls for non existing entities " + " by means of throwing EntityNotFoundException.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 1) }) void entityQueriesReferringToNotExistingEntitiesThrowsException() { final Target target = testdataFactory.createTarget(); final String dsName = "DistributionSet"; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java index 0f036abb9..3cef72444 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java @@ -54,8 +54,7 @@ class DistributionSetTagManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access reacts as specified on calls for non existing entities by means of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(distributionSetTagManagement.getByName(NOT_EXIST_ID)).isNotPresent(); assertThat(distributionSetTagManagement.get(NOT_EXIST_IDL)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTypeManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTypeManagementTest.java index 7f10ba7b7..2013f2f6b 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTypeManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTypeManagementTest.java @@ -55,8 +55,7 @@ public class DistributionSetTypeManagementTest extends AbstractJpaIntegrationTes @Test @Description("Verifies that management get access react as specfied on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = DistributionSetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = DistributionSetCreatedEvent.class, count = 0) }) public void nonExistingEntityAccessReturnsNotPresent() { assertThat(distributionSetTypeManagement.get(NOT_EXIST_IDL)).isNotPresent(); assertThat(distributionSetTypeManagement.getByKey(NOT_EXIST_ID)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutGroupManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutGroupManagementTest.java index da65b5830..08ceb7005 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutGroupManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutGroupManagementTest.java @@ -49,8 +49,7 @@ class RolloutGroupManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access reacts as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(rolloutGroupManagement.get(NOT_EXIST_IDL)).isNotPresent(); assertThat(rolloutGroupManagement.getWithDetailedStatus(NOT_EXIST_IDL)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutManagementTest.java index 4f92f5171..53cd47b4a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/RolloutManagementTest.java @@ -283,8 +283,7 @@ class RolloutManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access reacts as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(rolloutManagement.get(NOT_EXIST_IDL)).isNotPresent(); assertThat(rolloutManagement.getByName(NOT_EXIST_ID)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleManagementTest.java index 2b2e278a7..6b0ab0240 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleManagementTest.java @@ -62,8 +62,7 @@ public class SoftwareModuleManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access reacts as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) public void nonExistingEntityAccessReturnsNotPresent() { final SoftwareModule module = testdataFactory.createSoftwareModuleApp(); @@ -78,8 +77,7 @@ public class SoftwareModuleManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management queries react as specfied on calls for non existing entities " + " by means of throwing EntityNotFoundException.") - @ExpectEvents({ - @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = SoftwareModuleCreatedEvent.class, count = 1) }) public void entityQueriesReferringToNotExistingEntitiesThrowsException() { final SoftwareModule module = testdataFactory.createSoftwareModuleApp(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleTypeManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleTypeManagementTest.java index 0c817ac5d..78759980c 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleTypeManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/SoftwareModuleTypeManagementTest.java @@ -37,8 +37,7 @@ public class SoftwareModuleTypeManagementTest extends AbstractJpaIntegrationTest @Test @Description("Verifies that management get access reacts as specfied on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = SoftwareModuleCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = SoftwareModuleCreatedEvent.class, count = 0) }) public void nonExistingEntityAccessReturnsNotPresent() { assertThat(softwareModuleTypeManagement.get(NOT_EXIST_IDL)).isNotPresent(); @@ -49,8 +48,7 @@ public class SoftwareModuleTypeManagementTest extends AbstractJpaIntegrationTest @Test @Description("Verifies that management queries react as specfied on calls for non existing entities " + " by means of throwing EntityNotFoundException.") - @ExpectEvents({ - @Expect(type = SoftwareModuleCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = SoftwareModuleCreatedEvent.class, count = 0) }) public void entityQueriesReferringToNotExistingEntitiesThrowsException() { verifyThrownExceptionBy(() -> softwareModuleTypeManagement.delete(NOT_EXIST_IDL), "SoftwareModuleType"); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java index a83fea042..a9cccdb64 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java @@ -66,8 +66,7 @@ public class TargetFilterQueryManagementTest extends AbstractJpaIntegrationTest @Test @Description("Verifies that management get access reacts as specfied on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 0) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 0) }) public void nonExistingEntityAccessReturnsNotPresent() { assertThat(targetFilterQueryManagement.get(NOT_EXIST_IDL)).isNotPresent(); assertThat(targetFilterQueryManagement.getByName(NOT_EXIST_ID)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java index 15b9192a9..18e4b9fcd 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java @@ -96,8 +96,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access react as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 1) }) void nonExistingEntityAccessReturnsNotPresent() { final Target target = testdataFactory.createTarget(); assertThat(targetManagement.getByControllerID(NOT_EXIST_ID)).isNotPresent(); @@ -184,8 +183,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Ensures that retrieving the target security is only permitted with the necessary permissions.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 1) }) void getTargetSecurityTokenOnlyWithCorrectPermission() throws Exception { final Target createdTarget = targetManagement .create(entityFactory.target().create().controllerId("targetWithSecurityToken").securityToken("token")); @@ -221,8 +219,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verify that a target with same controller ID than another device cannot be created.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 1) }) void createTargetThatViolatesUniqueConstraintFails() { targetManagement.create(entityFactory.target().create().controllerId("123")); @@ -388,8 +385,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Checks if the EntityAlreadyExistsException is thrown if the targets with the same controller ID are created twice.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 5) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 5) }) void createMultipleTargetsDuplicate() { testdataFactory.createTargets(5, "mySimpleTargs", "my simple targets"); try { @@ -402,8 +398,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Checks if the EntityAlreadyExistsException is thrown if a single target with the same controller ID are created twice.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 1) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 1) }) void createTargetDuplicate() { targetManagement.create(entityFactory.target().create().controllerId("4711")); try { @@ -743,8 +738,7 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verify that the find all targets by ids method contains the entities that we are looking for") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class, count = 12) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class, count = 12) }) void verifyFindTargetAllById() { final List searchIds = Arrays.asList(testdataFactory.createTarget("target-4").getId(), testdataFactory.createTarget("target-5").getId(), testdataFactory.createTarget("target-6").getId()); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java index adbd5e3c2..cd28df9db 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java @@ -90,8 +90,7 @@ class TargetTagManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access reacts as specfied on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetCreatedEvent.class) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(targetTagManagement.getByName(NOT_EXIST_ID)).isNotPresent(); assertThat(targetTagManagement.get(NOT_EXIST_IDL)).isNotPresent(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTypeManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTypeManagementTest.java index 7ff86b503..9dff10bc3 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTypeManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTypeManagementTest.java @@ -43,8 +43,7 @@ class TargetTypeManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management get access react as specified on calls for non existing entities by means " + "of Optional not present.") - @ExpectEvents({ - @Expect(type = TargetTypeCreatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetTypeCreatedEvent.class) }) void nonExistingEntityAccessReturnsNotPresent() { assertThat(targetTypeManagement.get(NOT_EXIST_IDL)).isNotPresent(); assertThat(targetTypeManagement.getByName(NOT_EXIST_ID)).isNotPresent(); @@ -53,8 +52,7 @@ class TargetTypeManagementTest extends AbstractJpaIntegrationTest { @Test @Description("Verifies that management queries react as specified on calls for non existing entities " + " by means of throwing EntityNotFoundException.") - @ExpectEvents({ - @Expect(type = TargetTypeUpdatedEvent.class) }) + @ExpectEvents({ @Expect(type = TargetTypeUpdatedEvent.class) }) void entityQueriesReferringToNotExistingEntitiesThrowsException() { verifyThrownExceptionBy(() -> targetTypeManagement.delete(NOT_EXIST_IDL), "TargetType"); verifyThrownExceptionBy(() -> targetTypeManagement.update(entityFactory.targetType().update(NOT_EXIST_IDL)), diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/TestConfiguration.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/TestConfiguration.java index 4e0d8d8f5..899bb4a86 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/TestConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/TestConfiguration.java @@ -27,11 +27,13 @@ import org.eclipse.hawkbit.event.BusProtoStuffMessageConverter; import org.eclipse.hawkbit.im.authentication.SpRole; import org.eclipse.hawkbit.repository.RolloutApprovalStrategy; import org.eclipse.hawkbit.repository.RolloutStatusCache; +import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.event.ApplicationEventFilter; import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.repository.test.util.RolloutTestApprovalStrategy; +import org.eclipse.hawkbit.repository.test.util.SystemManagementHolder; import org.eclipse.hawkbit.repository.test.util.TestdataFactory; import org.eclipse.hawkbit.security.DdiSecurityProperties; import org.eclipse.hawkbit.security.HawkbitSecurityProperties; @@ -131,6 +133,16 @@ public class TestConfiguration implements AsyncConfigurer { return new ArtifactFilesystemRepository(artifactFilesystemProperties); } + /** + * @return the {@link org.eclipse.hawkbit.repository.test.util.SystemManagementHolder} singleton bean which holds the + * current {@link SystemManagement} service and make it accessible in + * beans which cannot access the service directly, e.g. JPA entities. + */ + @Bean + SystemManagementHolder systemManagementHolder() { + return SystemManagementHolder.getInstance(); + } + @Bean TestdataFactory testdataFactory() { return new TestdataFactory(); diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SecurityContextSwitch.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SecurityContextSwitch.java index b35828631..d5979e554 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SecurityContextSwitch.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SecurityContextSwitch.java @@ -18,7 +18,6 @@ import java.util.Objects; import java.util.concurrent.Callable; import org.eclipse.hawkbit.im.authentication.SpPermission; -import org.eclipse.hawkbit.repository.model.helper.SystemManagementHolder; import org.eclipse.hawkbit.tenancy.TenantAwareAuthenticationDetails; import org.eclipse.hawkbit.tenancy.TenantAwareUser; import org.springframework.security.authentication.TestingAuthenticationToken; @@ -29,6 +28,7 @@ import org.springframework.security.core.context.SecurityContextHolder; public class SecurityContextSwitch { public static final String DEFAULT_TENANT = "DEFAULT"; + private static final WithUser PRIVILEDGED_USER = createWithUser("bumlux", DEFAULT_TENANT, false, true, false, "ROLE_CONTROLLER", "ROLE_SYSTEM_CODE"); diff --git a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/SystemManagementHolder.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SystemManagementHolder.java similarity index 95% rename from hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/SystemManagementHolder.java rename to hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SystemManagementHolder.java index 7d5ee8255..04b000db6 100644 --- a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/SystemManagementHolder.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/SystemManagementHolder.java @@ -7,7 +7,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.hawkbit.repository.model.helper; +package org.eclipse.hawkbit.repository.test.util; import lombok.AccessLevel; import lombok.Getter;