Loading pom.xml +1 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ <dependency> <groupId>org.etsi.osl.hypo.core</groupId> <artifactId>common</artifactId> <version>1.4.9</version> <version>1.5.4</version> </dependency> <dependency> Loading src/main/java/org/etsi/osl/hypo/api/tmf/party/api/services/OrganizationService.java +32 −1 Original line number Diff line number Diff line Loading @@ -153,7 +153,9 @@ public class OrganizationService { organization.setHref("https://serverRoot/tmf-api/party/v4/organization/"); if (organization.getType() == null) organization.setType("organization"); organizationRepository.persist(organization); // remove sensitive characteristics // they will be stored in Vault storeOrganizationCredentials(organization); // send KAFKA message to Registry API to store the organization Auth Credentials if (StringUtils.isNotBlank(authHeader)) { Loading Loading @@ -385,6 +387,35 @@ public class OrganizationService { } } private void storeOrganizationCredentials(Organization organization) { Set<String> organizationCredentialsCharacteristicsNames = Set.of(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); Set<Characteristic> partyCharacteristic = organization.getPartyCharacteristic(); if (CollectionUtils.isEmpty(partyCharacteristic)) { organizationRepository.persist(organization); return; } // obtain characteristics for keycloak Set<Characteristic> partyCharacteristicsCredentials = partyCharacteristic.stream() .filter( characteristic -> organizationCredentialsCharacteristicsNames.contains(characteristic.getName())) .collect(Collectors.toSet()); // remove keycloak characteristics before storing them partyCharacteristic.removeAll(partyCharacteristicsCredentials); // store in db organizationRepository.persist(organization); // add back characteristics for POST response organization.getPartyCharacteristic().addAll(partyCharacteristicsCredentials); } private void sendDeleteCredentialsMessageToRegistry(String organizationId, String authHeader) { OrganizationAuthCredentials organizationAuthCredentials = this.getOrganizationAuthCredentials(organizationId, null, null); Loading src/main/java/org/etsi/osl/hypo/api/tmf/services/inventory/api/kafka/wrappers/KafkaMessagesWrapper.java +2 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import org.etsi.osl.hypo.api.tmf.services.inventory.schema.Service; import org.etsi.osl.hypo.api.tmf.value.SetValue; import org.etsi.osl.hypo.api.tmf.value.TextValue; import org.etsi.osl.hypo.core.common.OrganizationCharacteristics; import org.etsi.osl.hypo.core.common.ServiceBaseObject; import org.etsi.osl.hypo.core.common.ServiceBaseOrganizationObject; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventPlatformServiceUpdate; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceActivationState; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceTerminationData; Loading Loading @@ -427,7 +427,7 @@ public class KafkaMessagesWrapper { return organizationCharacteristicsReference; } private <T extends ServiceBaseObject> void populateServiceTerminationDataWithIds( private <T extends ServiceBaseOrganizationObject> void populateServiceTerminationDataWithIds( T serviceTerminationData, Service service) { String serviceId = service.getTmfId(); Loading src/test/java/org/etsi/osl/hypo/api/tmf/party/api/services/OrganizationServiceTest.java +39 −1 Original line number Diff line number Diff line Loading @@ -3,9 +3,12 @@ package org.etsi.osl.hypo.api.tmf.party.api.services; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; import static org.etsi.osl.hypo.api.tmf.common.api.constants.ApiConstants.DOMAIN_GATEWAY_STATUS; import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_PASSWORD; import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_USERNAME; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; Loading @@ -25,6 +28,7 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import net.joshka.junit.json.params.JsonFileSource; import org.etsi.osl.hypo.api.tmf.common.schema.ValueEntity; Loading Loading @@ -70,6 +74,15 @@ class OrganizationServiceTest { String organizationId = UUID.randomUUID().toString(); organization.setTmfId(organizationId); doAnswer( invocation -> { Organization argument = invocation.getArgument(0); assertNotExistingKeycloakCredentials(argument); return null; }) .when(organizationRepository) .persist(any(Organization.class)); // act organizationService.createOrganization(organization, authHeader); Loading @@ -83,7 +96,10 @@ class OrganizationServiceTest { any(OrganizationAuthCredentials.class), eq(authHeader))); // verify calls verify(organizationRepository, times(1)).persist(organization); ArgumentCaptor<Organization> organizationArgumentCaptor = ArgumentCaptor.captor(); verify(organizationRepository, times(1)).persist(organizationArgumentCaptor.capture()); Organization capturedOrganization = organizationArgumentCaptor.getValue(); assertExistingKeycloakCredentials(capturedOrganization); ArgumentCaptor<OrganizationAuthCredentials> captor = ArgumentCaptor.captor(); Loading @@ -97,6 +113,28 @@ class OrganizationServiceTest { assertThat(organizationAuthCredentials.getPassword()).isEqualTo(password); } private void assertNotExistingKeycloakCredentials(Organization organization) { Set<String> characteristics = organization.getPartyCharacteristic().stream() .map(Characteristic::getName) .collect(Collectors.toSet()); assertThat(characteristics) .isNotEmpty() .doesNotContain(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); } private void assertExistingKeycloakCredentials(Organization organization) { Set<String> characteristics = organization.getPartyCharacteristic().stream() .map(Characteristic::getName) .collect(Collectors.toSet()); assertThat(characteristics) .isNotEmpty() .contains(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); } @ParameterizedTest @JsonFileSource( resources = { Loading Loading
pom.xml +1 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ <dependency> <groupId>org.etsi.osl.hypo.core</groupId> <artifactId>common</artifactId> <version>1.4.9</version> <version>1.5.4</version> </dependency> <dependency> Loading
src/main/java/org/etsi/osl/hypo/api/tmf/party/api/services/OrganizationService.java +32 −1 Original line number Diff line number Diff line Loading @@ -153,7 +153,9 @@ public class OrganizationService { organization.setHref("https://serverRoot/tmf-api/party/v4/organization/"); if (organization.getType() == null) organization.setType("organization"); organizationRepository.persist(organization); // remove sensitive characteristics // they will be stored in Vault storeOrganizationCredentials(organization); // send KAFKA message to Registry API to store the organization Auth Credentials if (StringUtils.isNotBlank(authHeader)) { Loading Loading @@ -385,6 +387,35 @@ public class OrganizationService { } } private void storeOrganizationCredentials(Organization organization) { Set<String> organizationCredentialsCharacteristicsNames = Set.of(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); Set<Characteristic> partyCharacteristic = organization.getPartyCharacteristic(); if (CollectionUtils.isEmpty(partyCharacteristic)) { organizationRepository.persist(organization); return; } // obtain characteristics for keycloak Set<Characteristic> partyCharacteristicsCredentials = partyCharacteristic.stream() .filter( characteristic -> organizationCredentialsCharacteristicsNames.contains(characteristic.getName())) .collect(Collectors.toSet()); // remove keycloak characteristics before storing them partyCharacteristic.removeAll(partyCharacteristicsCredentials); // store in db organizationRepository.persist(organization); // add back characteristics for POST response organization.getPartyCharacteristic().addAll(partyCharacteristicsCredentials); } private void sendDeleteCredentialsMessageToRegistry(String organizationId, String authHeader) { OrganizationAuthCredentials organizationAuthCredentials = this.getOrganizationAuthCredentials(organizationId, null, null); Loading
src/main/java/org/etsi/osl/hypo/api/tmf/services/inventory/api/kafka/wrappers/KafkaMessagesWrapper.java +2 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import org.etsi.osl.hypo.api.tmf.services.inventory.schema.Service; import org.etsi.osl.hypo.api.tmf.value.SetValue; import org.etsi.osl.hypo.api.tmf.value.TextValue; import org.etsi.osl.hypo.core.common.OrganizationCharacteristics; import org.etsi.osl.hypo.core.common.ServiceBaseObject; import org.etsi.osl.hypo.core.common.ServiceBaseOrganizationObject; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventPlatformServiceUpdate; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceActivationState; import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceTerminationData; Loading Loading @@ -427,7 +427,7 @@ public class KafkaMessagesWrapper { return organizationCharacteristicsReference; } private <T extends ServiceBaseObject> void populateServiceTerminationDataWithIds( private <T extends ServiceBaseOrganizationObject> void populateServiceTerminationDataWithIds( T serviceTerminationData, Service service) { String serviceId = service.getTmfId(); Loading
src/test/java/org/etsi/osl/hypo/api/tmf/party/api/services/OrganizationServiceTest.java +39 −1 Original line number Diff line number Diff line Loading @@ -3,9 +3,12 @@ package org.etsi.osl.hypo.api.tmf.party.api.services; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; import static org.etsi.osl.hypo.api.tmf.common.api.constants.ApiConstants.DOMAIN_GATEWAY_STATUS; import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_PASSWORD; import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_USERNAME; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; Loading @@ -25,6 +28,7 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import net.joshka.junit.json.params.JsonFileSource; import org.etsi.osl.hypo.api.tmf.common.schema.ValueEntity; Loading Loading @@ -70,6 +74,15 @@ class OrganizationServiceTest { String organizationId = UUID.randomUUID().toString(); organization.setTmfId(organizationId); doAnswer( invocation -> { Organization argument = invocation.getArgument(0); assertNotExistingKeycloakCredentials(argument); return null; }) .when(organizationRepository) .persist(any(Organization.class)); // act organizationService.createOrganization(organization, authHeader); Loading @@ -83,7 +96,10 @@ class OrganizationServiceTest { any(OrganizationAuthCredentials.class), eq(authHeader))); // verify calls verify(organizationRepository, times(1)).persist(organization); ArgumentCaptor<Organization> organizationArgumentCaptor = ArgumentCaptor.captor(); verify(organizationRepository, times(1)).persist(organizationArgumentCaptor.capture()); Organization capturedOrganization = organizationArgumentCaptor.getValue(); assertExistingKeycloakCredentials(capturedOrganization); ArgumentCaptor<OrganizationAuthCredentials> captor = ArgumentCaptor.captor(); Loading @@ -97,6 +113,28 @@ class OrganizationServiceTest { assertThat(organizationAuthCredentials.getPassword()).isEqualTo(password); } private void assertNotExistingKeycloakCredentials(Organization organization) { Set<String> characteristics = organization.getPartyCharacteristic().stream() .map(Characteristic::getName) .collect(Collectors.toSet()); assertThat(characteristics) .isNotEmpty() .doesNotContain(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); } private void assertExistingKeycloakCredentials(Organization organization) { Set<String> characteristics = organization.getPartyCharacteristic().stream() .map(Characteristic::getName) .collect(Collectors.toSet()); assertThat(characteristics) .isNotEmpty() .contains(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD); } @ParameterizedTest @JsonFileSource( resources = { Loading