diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java index 1868fbeb2a07d97477c0881f8ad74550dc66e9a5..5dc245d58d83df76e485be624375778d89fa7ccb 100644 --- a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java +++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java @@ -10,8 +10,11 @@ import co.elastic.clients.elasticsearch._types.ElasticsearchException; import co.elastic.clients.elasticsearch.indices.ExistsRequest; import co.elastic.clients.elasticsearch.security.GetRoleRequest; import co.elastic.clients.elasticsearch.security.GetUserRequest; +import co.elastic.clients.elasticsearch.security.IndicesPrivileges; import co.elastic.clients.elasticsearch.security.PutRoleRequest; import co.elastic.clients.elasticsearch.security.PutUserRequest; +import de.ozgcloud.operator.user.PutRoleRequestData; +import de.ozgcloud.operator.user.PutUserRequestData; import lombok.RequiredArgsConstructor; import lombok.extern.java.Log; @@ -25,7 +28,7 @@ class OzgCloudElasticsearchRemoteService { public boolean existsIndex(String index) throws Exception { try { log.info("Exists index " + index + "..."); - var exists = client.indices().exists(ExistsRequest.of(builder -> builder.index(index))).value(); + var exists = client.indices().exists(createExistsRequestOf(index)).value(); log.info("Exists index: " + exists); return exists; } catch (ElasticsearchException | IOException e) { @@ -34,6 +37,10 @@ class OzgCloudElasticsearchRemoteService { } } + private ExistsRequest createExistsRequestOf(String index) { + return ExistsRequest.of(builder -> builder.index(index)); + } + public void createIndex(String indexName) throws Exception { try { log.info("Create index " + indexName + "..."); @@ -46,14 +53,18 @@ class OzgCloudElasticsearchRemoteService { } public boolean existsSecurityRole(String roleName) throws Exception { - var role = client.security().getRole(GetRoleRequest.of(builder -> builder.name(roleName))); + var role = client.security().getRole(createGetRoleRequestOf(roleName)); return !role.result().isEmpty(); } - public void createSecurityRole(PutRoleRequest request) throws Exception { + private GetRoleRequest createGetRoleRequestOf(String name) { + return GetRoleRequest.of(builder -> builder.name(name)); + } + + public void createSecurityRole(PutRoleRequestData requestData) throws Exception { try { - log.info("Create SecurityRole " + request.name() + "..."); - client.security().putRole(request); + log.info("Create SecurityRole " + requestData.getName() + "..."); + client.security().putRole(createPutRoleRequestOf(requestData)); log.info("Create SecurityRole successful."); } catch(Exception e) { log.log(Level.SEVERE, "Create SecurityRole failed." + e); @@ -61,19 +72,53 @@ class OzgCloudElasticsearchRemoteService { } } + PutRoleRequest createPutRoleRequestOf(PutRoleRequestData requestData) { + return PutRoleRequest.of(requestBuilder -> buildRequest(requestBuilder, requestData)); + } + + private PutRoleRequest.Builder buildRequest(PutRoleRequest.Builder requestBuilder, PutRoleRequestData requestData) { + requestBuilder.name(requestData.getName()); + requestBuilder.indices(builder -> buildIndicesPrivilegesRequest(builder, requestData)); + + return requestBuilder; + } + + private IndicesPrivileges.Builder buildIndicesPrivilegesRequest(IndicesPrivileges.Builder builder, PutRoleRequestData requestData) { + builder.names(requestData.getIndivesPrivilegesData().getNames()); + builder.privileges(requestData.getIndivesPrivilegesData().getPrivileges()); + + return builder; + } + public boolean existsSecurityUser(String userName) throws Exception { - var user = client.security().getUser(GetUserRequest.of(builder -> builder.username(userName))); + var user = client.security().getUser(createGetUserRequestOf(userName)); return !user.result().isEmpty(); } - public void createSecurityUser(PutUserRequest request) throws Exception { + private GetUserRequest createGetUserRequestOf(String userName) { + return GetUserRequest.of(builder -> builder.username(userName)); + } + + public void createSecurityUser(PutUserRequestData requestData) throws Exception { try { - log.info("Create SecurityUser " + request.username() + "..."); - client.security().putUser(request); + log.info("Create SecurityUser " + requestData.getUsername() + "..."); + client.security().putUser(createPutUserRequestOf(requestData)); log.info("Create SecurityUser successful."); } catch(Exception e) { log.log(Level.SEVERE, "Create SecurityUser failed." + e); throw e; } } + + PutUserRequest createPutUserRequestOf(PutUserRequestData requestData) { + return PutUserRequest.of(requestBuilder -> buildPutUserRequest(requestBuilder, requestData)); + } + + private PutUserRequest.Builder buildPutUserRequest(PutUserRequest.Builder builder, PutUserRequestData requestData) { + builder.username(requestData.getUsername()); + builder.roles(requestData.getRoles()); + builder.password(requestData.getPassword()); + + return builder; + } } \ No newline at end of file diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java index 8b4730d09bb308fbd4873fe3008c0c69aa8cd583..06982f71f21c0839c70131ed095e804422b6268b 100644 --- a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java +++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java @@ -2,9 +2,9 @@ package de.ozgcloud.operator.common.elasticsearch; import org.springframework.stereotype.Component; -import co.elastic.clients.elasticsearch.security.IndicesPrivileges; -import co.elastic.clients.elasticsearch.security.PutRoleRequest; -import co.elastic.clients.elasticsearch.security.PutUserRequest; +import de.ozgcloud.operator.user.PutRoleRequestData; +import de.ozgcloud.operator.user.PutRoleRequestData.IndicesPrivilegesData; +import de.ozgcloud.operator.user.PutUserRequestData; import lombok.RequiredArgsConstructor; import lombok.extern.java.Log; @@ -31,27 +31,17 @@ public class OzgCloudElasticsearchService { public void checkSecurityRole(String namespace) throws Exception { log.info("Check security role..."); if(!remoteService.existsSecurityRole(namespace)) { - remoteService.createSecurityRole(createPutRoleRequest(namespace)); + remoteService.createSecurityRole(buildPutRoleRequestData(namespace)); } log.info("Check security role successful."); } - PutRoleRequest createPutRoleRequest(String namespace) { - return PutRoleRequest.of(requestBuilder -> buildRequest(requestBuilder, namespace)); + PutRoleRequestData buildPutRoleRequestData(String namespace){ + return PutRoleRequestData.builder().name(namespace).indivesPrivilegesData(buildIndicesPrivilegesData(namespace)).build(); } - private PutRoleRequest.Builder buildRequest(PutRoleRequest.Builder requestBuilder, String namespace) { - requestBuilder.name(namespace); - requestBuilder.indices(builder -> buildIndicesPrivilegesRequest(builder, namespace)); - - return requestBuilder; - } - - private IndicesPrivileges.Builder buildIndicesPrivilegesRequest(IndicesPrivileges.Builder builder, String namespace) { - builder.names(namespace); - builder.privileges(PRIVILEGES_ALL); - - return builder; + private IndicesPrivilegesData buildIndicesPrivilegesData(String namespace) { + return IndicesPrivilegesData.builder().names(namespace).privileges(PRIVILEGES_ALL).build(); } // curl -k -X POST -u elastic:$ELASTICSEARCH_PASSWORD -H 'Content-Type: application/json' @@ -59,20 +49,12 @@ public class OzgCloudElasticsearchService { public void checkSecurityUser(String namespace, String password) throws Exception { log.info("Check security user..."); if(!remoteService.existsSecurityUser(namespace)) { - remoteService.createSecurityUser(createPutUserRequest(namespace, password)); + remoteService.createSecurityUser(buildPutUserRequestData(namespace, password)); } log.info("Check security user successful."); } - PutUserRequest createPutUserRequest(String namespace, String password) { - return PutUserRequest.of(requestBuilder -> buildPutUserRequest(requestBuilder, namespace, password)); - } - - private PutUserRequest.Builder buildPutUserRequest(PutUserRequest.Builder requestBuilder, String namespace, String password) { - requestBuilder.username(namespace); - requestBuilder.roles(namespace); - requestBuilder.password(password); - - return requestBuilder; + PutUserRequestData buildPutUserRequestData(String namespace, String password){ + return PutUserRequestData.builder().username(namespace).roles(namespace).password(password).build(); } } \ No newline at end of file diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java new file mode 100644 index 0000000000000000000000000000000000000000..05dfbc64ecd1f9dd9467fe3b873ed81f97f0b181 --- /dev/null +++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java @@ -0,0 +1,23 @@ +package de.ozgcloud.operator.user; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class PutRoleRequestData { + + private String name; + private IndicesPrivilegesData indivesPrivilegesData; + + @Builder + @Getter + @Setter + public static class IndicesPrivilegesData { + + private String names; + private String privileges; + } +} \ No newline at end of file diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java new file mode 100644 index 0000000000000000000000000000000000000000..73d60a685ffc19645be2f3ae49be27cb03aa4917 --- /dev/null +++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java @@ -0,0 +1,15 @@ +package de.ozgcloud.operator.user; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class PutUserRequestData { + + private String username; + private String roles; + private String password; +} diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java similarity index 97% rename from ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java rename to ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java index 62c092c1b6ec7c695896357a05c49c5d6dce0297..7493298aea4d592a5d395b64e7bd33ec533a7ae4 100644 --- a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java +++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java @@ -17,7 +17,7 @@ import org.testcontainers.elasticsearch.ElasticsearchContainer; import de.ozgcloud.operator.common.kubernetes.KubernetesService; import lombok.SneakyThrows; -class OzgCloudElasticsearchRemoteServiceTest { +class OzgCloudElasticsearchRemoteServiceITCase { @Spy @InjectMocks diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java index f44a9baf96cdd0c6715fa274cfd9e2d61a1f7c68..e3d604520ca9501d812874f50349199e58737eea 100644 --- a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java +++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java @@ -12,8 +12,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import co.elastic.clients.elasticsearch.security.PutRoleRequest; -import co.elastic.clients.elasticsearch.security.PutUserRequest; +import de.ozgcloud.operator.user.PutRoleRequestData; +import de.ozgcloud.operator.user.PutRoleRequestDataTestFactory; +import de.ozgcloud.operator.user.PutUserRequestData; +import de.ozgcloud.operator.user.PutUserRequestDataTestFactory; import lombok.SneakyThrows; class OzgCloudElasticsearchServiceTest { @@ -51,7 +53,7 @@ class OzgCloudElasticsearchServiceTest { @Nested class TestCheckSecurityRole { - private final PutRoleRequest putRoleRequest = PutRoleRequest.of(b -> b.name("DummyName")); + private final PutRoleRequestData putRoleRequest = PutRoleRequestDataTestFactory.create(); @SneakyThrows @Test @@ -60,52 +62,45 @@ class OzgCloudElasticsearchServiceTest { verify(remoteService).existsSecurityRole(NAMESPACE); } + @SneakyThrows @Test void shouldCreateSecurityRoleIfMissing() { when(remoteService.existsSecurityRole(any())).thenReturn(false); - doReturn(putRoleRequest).when(service).createPutRoleRequest(any()); + doReturn(putRoleRequest).when(service).buildPutRoleRequestData(any()); service.checkSecurityRole(NAMESPACE); verify(remoteService).createSecurityRole(putRoleRequest); } - - @DisplayName("create put role request") + @DisplayName("create put role request data") @Nested - class TestCreatePutRoleRequest { + class TestCreatePutRoleRequestData { @Test void shouldContainName() { - var request = service.createPutRoleRequest(NAMESPACE); + var requestData = service.buildPutRoleRequestData(NAMESPACE); - assertThat(request.name()).isEqualTo(NAMESPACE); + assertThat(requestData.getName()).isEqualTo(NAMESPACE); } - @DisplayName("indices") + @DisplayName("indices privileges data") @Nested - class TestIndices { - - @Test - void shouldHaveSize() { - var request = service.createPutRoleRequest(NAMESPACE); - - assertThat(request.indices()).hasSize(1); - } + class TestIndicesPrivilegesData { @Test void shouldContainName() { - var request = service.createPutRoleRequest(NAMESPACE); + var request = service.buildPutRoleRequestData(NAMESPACE); - assertThat(request.indices().get(0).names()).containsExactly(NAMESPACE); + assertThat(request.getIndivesPrivilegesData().getNames()).isEqualTo(NAMESPACE); } @Test void shouldContainPrivileges() { - var request = service.createPutRoleRequest(NAMESPACE); + var request = service.buildPutRoleRequestData(NAMESPACE); - assertThat(request.indices().get(0).privileges()).containsExactly(OzgCloudElasticsearchService.PRIVILEGES_ALL); + assertThat(request.getIndivesPrivilegesData().getPrivileges()).isEqualTo(OzgCloudElasticsearchService.PRIVILEGES_ALL); } } } @@ -116,7 +111,7 @@ class OzgCloudElasticsearchServiceTest { class TestCheckSecurityUser { private final static String PASSWORD = "DummyPassword"; - private final PutUserRequest putUserRequest = PutUserRequest.of(b -> b.username("DummyName")); + private final PutUserRequestData putUserRequestData = PutUserRequestDataTestFactory.create(); @SneakyThrows @Test @@ -125,41 +120,42 @@ class OzgCloudElasticsearchServiceTest { verify(remoteService).existsSecurityUser(NAMESPACE); } + @SneakyThrows @Test void shouldCreateSecurityUserIfMissing() { when(remoteService.existsSecurityUser(any())).thenReturn(false); - doReturn(putUserRequest).when(service).createPutUserRequest(any(), any()); + doReturn(putUserRequestData).when(service).buildPutUserRequestData(any(), any()); service.checkSecurityUser(NAMESPACE, PASSWORD); - verify(remoteService).createSecurityUser(putUserRequest); + verify(remoteService).createSecurityUser(putUserRequestData); } - @DisplayName("create put user request") + @DisplayName("create put user request data") @Nested - class TestCreatePutUserRequest { + class TestCreatePutUserRequestData { @Test - void shouldContainUser() { - var request = service.createPutUserRequest(NAMESPACE, PASSWORD); + void shouldContainUsername() { + var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD); - assertThat(request.username()).isEqualTo(NAMESPACE); + assertThat(request.getUsername()).isEqualTo(NAMESPACE); } @Test - void shouldContainRole() { - var request = service.createPutUserRequest(NAMESPACE, PASSWORD); + void shouldContainRoles() { + var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD); - assertThat(request.roles()).containsExactly(NAMESPACE); + assertThat(request.getRoles()).isEqualTo(NAMESPACE); } @Test void shouldContainPassword() { - var request = service.createPutUserRequest(NAMESPACE, PASSWORD); + var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD); - assertThat(request.password()).isEqualTo(PASSWORD); + assertThat(request.getPassword()).isEqualTo(PASSWORD); } } } -} +} \ No newline at end of file diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..e6056bb7e1408c660612997278f42e44731e800b --- /dev/null +++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java @@ -0,0 +1,21 @@ +package de.ozgcloud.operator.user; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.operator.user.PutRoleRequestData.IndicesPrivilegesData; + +public class IndicesPrivilegesDataTestFactory { + + public static final String NAME = LoremIpsum.getInstance().getFirstName(); + public static final String PRIVILEGES = "all"; + + public static IndicesPrivilegesData create() { + return createBuilder().build(); + } + + public static IndicesPrivilegesData.IndicesPrivilegesDataBuilder createBuilder(){ + return IndicesPrivilegesData.builder() + .names(NAME) + .privileges(PRIVILEGES); + } +} diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..a8fe8c7744b03d3629c90b2d45787435a97ece0e --- /dev/null +++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java @@ -0,0 +1,18 @@ +package de.ozgcloud.operator.user; + +import com.thedeanda.lorem.LoremIpsum; + +public class PutRoleRequestDataTestFactory { + + public static final String NAME = LoremIpsum.getInstance().getFirstName(); + + public static PutRoleRequestData create() { + return createBuilder().build(); + } + + public static PutRoleRequestData.PutRoleRequestDataBuilder createBuilder(){ + return PutRoleRequestData.builder() + .name(NAME) + .indivesPrivilegesData(IndicesPrivilegesDataTestFactory.create()); + } +} diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..bb4ce94ba2c31f43f7443032202c40f01bed9e01 --- /dev/null +++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java @@ -0,0 +1,21 @@ +package de.ozgcloud.operator.user; + +import com.thedeanda.lorem.LoremIpsum; + +public class PutUserRequestDataTestFactory { + + public static final String USERNAME = LoremIpsum.getInstance().getFirstName(); + public static final String ROLES = LoremIpsum.getInstance().getWords(1); + public static final String PASSWORD = LoremIpsum.getInstance().getWords(1); + + public static PutUserRequestData create() { + return createBuilder().build(); + } + + public static PutUserRequestData.PutUserRequestDataBuilder createBuilder(){ + return PutUserRequestData.builder() + .username(USERNAME) + .roles(ROLES) + .password(PASSWORD); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index a1ebe4949309025ebed0e22ba4c320a243eab55d..abf8d351a4840655c794e57f48314c2fd94545fa 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ <keycloak-adapter.version>20.0.5</keycloak-adapter.version> <reflections.version>0.10.2</reflections.version> <validation-api.version>2.0.1.Final</validation-api.version> + <lorem.version>2.2</lorem.version> <!-- test --> <junit-jupiter.version>5.9.3</junit-jupiter.version> @@ -61,6 +62,11 @@ <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> </dependency> + <dependency> + <groupId>com.thedeanda</groupId> + <artifactId>lorem</artifactId> + </dependency> + <!-- test --> <dependency> @@ -139,6 +145,11 @@ <artifactId>commons-beanutils</artifactId> <version>${commons-beanutils.version}</version> </dependency> + <dependency> + <groupId>com.thedeanda</groupId> + <artifactId>lorem</artifactId> + <version>${lorem.version}</version> + </dependency> <!-- javax --> <dependency>