From d54223e7cd3026e260e06df39dd52c4368e7053d Mon Sep 17 00:00:00 2001 From: awudzins Date: Wed, 19 Feb 2020 13:34:32 +0100 Subject: Load CMP Servers config from volume Create Kubernetes secret to store Cmp Server config file and mount it to container as volume Issue-ID: AAF-997 Signed-off-by: Adam Wudzinski Change-Id: I163b720ce14729328af34dd61e6eb0108c76d58b --- .../configuration/CmpServersConfig.java | 21 ++++-- .../configuration/CmpServersConfigLoader.java | 26 +++---- .../src/main/resources/application.properties | 9 ++- certService/src/main/resources/cmpServers.json | 24 ------ .../configuration/CmpServersConfigLoaderTest.java | 85 ++++++++++++++++++++++ .../configuration/CmpServersConfigTest.java | 40 ++++++++-- 6 files changed, 150 insertions(+), 55 deletions(-) delete mode 100644 certService/src/main/resources/cmpServers.json create mode 100644 certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoaderTest.java (limited to 'certService/src') diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfig.java b/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfig.java index 105b10e7..414f38bb 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfig.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfig.java @@ -20,21 +20,30 @@ package org.onap.aaf.certservice.certification.configuration; -import java.util.Collections; -import java.util.List; -import javax.annotation.PostConstruct; import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import javax.annotation.PostConstruct; +import java.io.File; +import java.util.Collections; +import java.util.List; + @Configuration public class CmpServersConfig { - private static final String CMP_SERVERS_CONFIG_FILENAME = "cmpServers.json"; + + @Autowired + private CmpServersConfigLoader cmpServersConfigLoader; + @Value("${app.config.path}") + private String configPath; private List cmpServers; @PostConstruct - private void loadConfiguration() { - cmpServers = Collections.unmodifiableList(new CmpServersConfigLoader().load(CMP_SERVERS_CONFIG_FILENAME)); + void loadConfiguration() { + String configFilePath = configPath + File.separator + CMP_SERVERS_CONFIG_FILENAME; + this.cmpServers = Collections.unmodifiableList(cmpServersConfigLoader.load(configFilePath)); } public List getCmpServers() { diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoader.java b/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoader.java index b31fbcad..c8415ac0 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoader.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoader.java @@ -21,27 +21,26 @@ package org.onap.aaf.certservice.certification.configuration; import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import org.onap.aaf.certservice.certification.CertificationModelFactory; import org.onap.aaf.certservice.certification.configuration.model.CmpServers; import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +@Component class CmpServersConfigLoader { - private static final Logger LOGGER = LoggerFactory.getLogger(CertificationModelFactory.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CmpServersConfigLoader.class); List load(String path) { List result = new ArrayList<>(); try { result = loadConfigFromFile(path).getCmpv2Servers(); - } catch (FileNotFoundException e) { - LOGGER.error("CMP Servers configuration file not found: ", e); + LOGGER.info(String.format("CMP Servers configuration successfully loaded from file '%s'", path)); } catch (IOException e) { LOGGER.error("Exception occurred during CMP Servers configuration loading: ", e); } @@ -50,11 +49,6 @@ class CmpServersConfigLoader { private CmpServers loadConfigFromFile(String path) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); - URL resource = getClass().getClassLoader().getResource(path); - if (resource == null) { - throw new FileNotFoundException(); - } - String configFilePath = resource.getFile(); - return objectMapper.readValue(new File(configFilePath), CmpServers.class); + return objectMapper.readValue(new File(path), CmpServers.class); } } diff --git a/certService/src/main/resources/application.properties b/certService/src/main/resources/application.properties index b9ce108a..eab43c08 100644 --- a/certService/src/main/resources/application.properties +++ b/certService/src/main/resources/application.properties @@ -1,5 +1,10 @@ -#Actuator properties +# Actuator configuration management.endpoints.enabled-by-default=false management.endpoint.health.enabled=true -springdoc.swagger-ui.path=/docs springdoc.show-actuator=true + +# Swagger configuration +springdoc.swagger-ui.path=/docs + +# AAF CertService app specific configuration +app.config.path=/etc/onap/aaf/certservice \ No newline at end of file diff --git a/certService/src/main/resources/cmpServers.json b/certService/src/main/resources/cmpServers.json deleted file mode 100644 index ee9e72b9..00000000 --- a/certService/src/main/resources/cmpServers.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "cmpv2Servers": [ - { - "caName": "TEST", - "url": "http://127.0.0.1/ejbca/publicweb/cmp/cmp", - "issuerDN": "CN=ManagementCA", - "caMode": "CLIENT", - "authentication": { - "iak": "xxx", - "rv": "yyy" - } - }, - { - "caName": "TEST2", - "url": "http://127.0.0.1/ejbca/publicweb/cmp/cmpRA", - "issuerDN": "CN=ManagementCA2", - "caMode": "RA", - "authentication": { - "iak": "xxx", - "rv": "yyy" - } - } - ] -} \ No newline at end of file diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoaderTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoaderTest.java new file mode 100644 index 00000000..f4421ffe --- /dev/null +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoaderTest.java @@ -0,0 +1,85 @@ +/* + * ============LICENSE_START======================================================= + * PROJECT + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.certification.configuration; + +import org.junit.jupiter.api.Test; +import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class CmpServersConfigLoaderTest { + private static final String EXISTING_CONFIG_FILENAME = "cmpServers.json"; + private static final String NONEXISTING_CONFIG_FILENAME = "nonexisting_cmpServers.json"; + private static final Map EXPECTED_FIRST_CMP_SERVER = Map.of( + "CA_NAME", "TEST", + "URL", "http://127.0.0.1/ejbca/publicweb/cmp/cmp", + "ISSUER_DN", "CN=ManagementCA", + "CA_MODE", "CLIENT", + "IAK", "xxx", + "RV", "yyy" + ); + private static final Map EXPECTED_SECOND_CMP_SERVER = Map.of( + "CA_NAME", "TEST2", + "URL", "http://127.0.0.1/ejbca/publicweb/cmp/cmpRA", + "ISSUER_DN", "CN=ManagementCA2", + "CA_MODE", "RA", + "IAK", "xxx", + "RV", "yyy" + ); + + @Test + public void shouldLoadCmpServersConfigWhenFileAvailable() throws IOException { + // Given + String path = getClass().getClassLoader().getResource(EXISTING_CONFIG_FILENAME).getFile(); + + // When + List cmpServers = new CmpServersConfigLoader().load(path); + + // Then + assertThat(cmpServers).isNotNull(); + assertThat(cmpServers).hasSize(2); + verifyThatCmpServerEquals(cmpServers.get(0), EXPECTED_FIRST_CMP_SERVER); + verifyThatCmpServerEquals(cmpServers.get(1), EXPECTED_SECOND_CMP_SERVER); + } + + @Test() + public void shouldReturnEmptyListWhenFileMissing() { + // When + List cmpServers = new CmpServersConfigLoader().load(NONEXISTING_CONFIG_FILENAME); + + // Then + assertThat(cmpServers).isNotNull(); + assertThat(cmpServers).isEmpty(); + } + + private void verifyThatCmpServerEquals(Cmpv2Server cmpv2Server, Map expected) { + assertThat(cmpv2Server.getCaName()).isEqualTo(expected.get("CA_NAME")); + assertThat(cmpv2Server.getUrl()).isEqualTo(expected.get("URL")); + assertThat(cmpv2Server.getIssuerDN()).isEqualTo(expected.get("ISSUER_DN")); + assertThat(cmpv2Server.getCaMode().name()).isEqualTo(expected.get("CA_MODE")); + assertThat(cmpv2Server.getAuthentication().getIak()).isEqualTo(expected.get("IAK")); + assertThat(cmpv2Server.getAuthentication().getRv()).isEqualTo(expected.get("RV")); + } +} \ No newline at end of file diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigTest.java index 4c9c5f66..43094f09 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigTest.java @@ -20,28 +20,54 @@ package org.onap.aaf.certservice.certification.configuration; -import static org.assertj.core.api.Assertions.assertThat; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; import org.onap.aaf.certservice.CertServiceApplication; +import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.startsWith; + @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = CertServiceApplication.class) +@TestPropertySource(properties = {"app.config.path=/fake/path/to/config"}) class CmpServersConfigTest { + private static final List SAMPLE_CMP_SERVERS = List.of( + new Cmpv2Server(), + new Cmpv2Server() + ); + + @MockBean + private CmpServersConfigLoader cmpServersConfigLoader; + @Autowired private CmpServersConfig cmpServersConfig; @Test - public void shouldLoadCmpServersConfig() { + public void shouldCallLoaderWithPathFromPropertiesWhenCreated() { + Mockito.verify(cmpServersConfigLoader).load(startsWith("/fake/path/to/config")); + } + + @Test + public void shouldReturnLoadedServersWhenGetCalled() { + // Given + Mockito.when(cmpServersConfigLoader.load(any())).thenReturn(SAMPLE_CMP_SERVERS); + this.cmpServersConfig.loadConfiguration(); // Manual PostConstruct call + + // When + List receivedCmpServers = this.cmpServersConfig.getCmpServers(); + // Then - assertThat(cmpServersConfig.getCmpServers()).isNotNull(); - assertThat(cmpServersConfig.getCmpServers().size()).isEqualTo(2); - assertThat(cmpServersConfig.getCmpServers().get(0).getCaName()).isEqualTo("TEST"); - assertThat(cmpServersConfig.getCmpServers().get(1).getCaName()).isEqualTo("TEST2"); + assertThat(receivedCmpServers).hasSize(SAMPLE_CMP_SERVERS.size()); } } \ No newline at end of file -- cgit 1.2.3-korg