diff options
54 files changed, 1488 insertions, 154 deletions
diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..3797dc8b --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,20 @@ +--- +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details +# Required +version: 2 + +formats: + - htmlzip + +build: + image: latest + +python: + version: 3.7 + install: + - requirements: docs/requirements-docs.txt + +sphinx: + configuration: docs/conf.py diff --git a/certService/README.md b/certService/README.md index 5a650f1c..f9478bed 100644 --- a/certService/README.md +++ b/certService/README.md @@ -13,138 +13,129 @@ More information about the project and all its functionalities you can find unde For IntelliJ use [https://plugins.jetbrains.com/plugin/8527-google-java-format] For other IDEs use []https://github.com/google/google-java-format] -### Running Locally - ``` - mvn spring-boot:run +### Local project configuration + * Create directory on your system /etc/onap/aaf/certservice + * Copy sample configuration test/resources/cmpServers.json to that directory - ``` - +### Running Locally +MANDATORY SEE 'Local project configuration' section +``` +mvn spring-boot:run +``` + ### Running Locally with Developer Tools - ``` - mvn spring-boot:run -Pdev - - ``` +MANDATORY SEE 'Local project configuration' section +``` +mvn spring-boot:run -Pdev +``` ### Project building - ``` - mvn clean package - - ``` +``` +mvn clean package +``` ### Building Docker image manually Go to the certService subfolder and execute following statement (1.0.0-SNAPSHOT is related to a current project.version parameter): - ``` - docker build --build-arg VERSION=1.0.0-SNAPSHOT -t onap/org.onap.aaf.certservice.aaf-certservice-api . - ``` +``` +docker build --build-arg VERSION=1.0.0-SNAPSHOT -t onap/org.onap.aaf.certservice.aaf-certservice-api . +``` ### Install the package into the local repository - ``` - mvn clean install - - ``` +``` +mvn clean install +``` ### Building Docker image and install the package into the local repository - ``` - mvn clean install -P docker - - ``` +``` +mvn clean install -P docker +``` ### Running Docker container local - ``` - docker run -p 8080:8080 --name aaf-certservice-api onap/org.onap.aaf.certservice.aaf-certservice-api - - ``` +``` +docker run -p 8080:8080 --name aaf-certservice-api onap/org.onap.aaf.certservice.aaf-certservice-api +``` ### Running Docker container from nexus - ``` - docker run -p 8080:8080 --name aaf-certservice-api nexus3.onap.org:10001/onap/org.onap.aaf.certservice.aaf-certservice-api:1.0.0 - - ``` +``` +docker run -p 8080:8080 --name aaf-certservice-api nexus3.onap.org:10001/onap/org.onap.aaf.certservice.aaf-certservice-api:1.0.0 +``` ### Running Docker container from docker-compose with EJBCA - Docker-compose uses nexus image of certservice. - - ``` - docker-compose up - - ``` +Docker-compose uses nexus image of certservice. +``` +docker-compose up +``` + +### Running with Helm +1. Use environment/server with installed kubernetes and helm. +2. Copy helm/aaf-cert-service directory to that environment. +3. Enter that environment +4. Run ```helm install ./aaf-cert-service``` ### Health Check - Browser: - - ``` - http://<localhost>:8080/actuator/health +Browser: +``` +http://<localhost>:8080/actuator/health +``` - ``` - - Curl: - - ``` - curl localhost:8080/actuator/health - - ``` +Curl: +``` +curl localhost:8080/actuator/health +``` Should return {"status":"UP"} ### Running CSITs Pull csit repository - - ``` - https://gerrit.onap.org/r/admin/repos/integration/csit - - ``` +``` +https://gerrit.onap.org/r/admin/repos/integration/csit +``` Go to created directory and run - - ``` - sudo ./run-csit.sh plans/aaf/cert-service - - ``` +``` +sudo ./run-csit.sh plans/aaf/cert-service +``` ### Logs locally path: - - ``` - var/log/onap/aaf/certservice/ - ``` +``` +var/log/onap/aaf/certservice/ +``` ### Logs in Docker container - ``` - docker exec -it aaf-certservice-api bash - ``` +``` +docker exec -it aaf-certservice-api bash +``` path: - - ``` - cd /var/log/onap/aaf/certservice - ``` +``` +cd /var/log/onap/aaf/certservice +``` You should see: audit.log error.log trace.log ### Sonar results - ``` - https://sonarcloud.io/dashboard?id=onap_aaf-certservice - ``` +``` +https://sonarcloud.io/dashboard?id=onap_aaf-certservice +``` - ### Maven artifacts - All maven artifacts are deployed under nexus uri: - ``` - https://nexus.onap.org/content/repositories/snapshots/org/onap/aaf/certservice/ - ``` +### Maven artifacts +All maven artifacts are deployed under nexus uri: +``` +https://nexus.onap.org/content/repositories/snapshots/org/onap/aaf/certservice/ +``` - ### Docker artifacts - All docker images are hosted under nexus3 uri: - ``` - https://nexus3.onap.org/repository/docker.snapshot/v2/onap/org.onap.aaf.certservice.aaf-certservice-api/ - ``` +### Docker artifacts +All docker images are hosted under nexus3 uri: +``` +https://nexus3.onap.org/repository/docker.snapshot/v2/onap/org.onap.aaf.certservice.aaf-certservice-api/ +``` ### RestAPI API is described by Swagger ( OpenAPI 3.0 ) on endpoint /docs ( endpoint is defined in properties as springdoc.swagger-ui.path ) - - ``` - http://localchost:8080/docs - - ``` +``` +http://localchost:8080/docs +``` ### Sonar results - ``` - https://sonarcloud.io/dashboard?id=onap_aaf-certservice - ``` +``` +https://sonarcloud.io/dashboard?id=onap_aaf-certservice +``` diff --git a/certService/src/main/resources/cmpServers.json b/certService/helm/aaf-cert-service/resources/cmpServers.json index ee9e72b9..ee9e72b9 100644 --- a/certService/src/main/resources/cmpServers.json +++ b/certService/helm/aaf-cert-service/resources/cmpServers.json diff --git a/certService/helm/aaf-cert-service/templates/deployment.yaml b/certService/helm/aaf-cert-service/templates/deployment.yaml index 0b64d730..2e16cbca 100644 --- a/certService/helm/aaf-cert-service/templates/deployment.yaml +++ b/certService/helm/aaf-cert-service/templates/deployment.yaml @@ -12,6 +12,10 @@ spec: labels: app: {{ .Values.appLabel }} spec: + volumes: + - name: {{ .Values.volume.name }} + secret: + secretName: {{ .Values.secret.name }} containers: - name: aaf-cert-service image: {{ .Values.repository }}/{{ .Values.image }} @@ -30,5 +34,9 @@ spec: path: {{ .Values.healthcheck.path }} initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }} periodSeconds: {{ .Values.readiness.periodSeconds }} + volumeMounts: + - name: {{ .Values.volume.name }} + mountPath: {{ .Values.volume.mountPath }} + readOnly: true resources: {{ toYaml .Values.resources }} diff --git a/certService/helm/aaf-cert-service/templates/secret.yaml b/certService/helm/aaf-cert-service/templates/secret.yaml new file mode 100644 index 00000000..77b25f4e --- /dev/null +++ b/certService/helm/aaf-cert-service/templates/secret.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.secret.name }} +type: Opaque +data: + {{ (.Files.Glob "resources/cmpServers.json").AsSecrets }}
\ No newline at end of file diff --git a/certService/helm/aaf-cert-service/values.yaml b/certService/helm/aaf-cert-service/values.yaml index 9ec51c85..a971edd4 100644 --- a/certService/helm/aaf-cert-service/values.yaml +++ b/certService/helm/aaf-cert-service/values.yaml @@ -14,6 +14,9 @@ readiness: periodSeconds: 10 healthcheck: path: /actuator/health +volume: + name: aaf-cert-service-volume + mountPath: /etc/onap/aaf/certservice resources: limits: @@ -21,4 +24,7 @@ resources: memory: 2Gi requests: cpu: 1 - memory: 1Gi
\ No newline at end of file + memory: 1Gi + +secret: + name: aaf-cert-service-secret diff --git a/certService/src/main/java/org/onap/aaf/certservice/api/CertificationService.java b/certService/src/main/java/org/onap/aaf/certservice/api/CertificationService.java index d1a4a17a..d2de1aa0 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/api/CertificationService.java +++ b/certService/src/main/java/org/onap/aaf/certservice/api/CertificationService.java @@ -24,7 +24,7 @@ import com.google.gson.Gson; import org.onap.aaf.certservice.certification.CertificationModelFactory; import org.onap.aaf.certservice.certification.CsrModelFactory; import org.onap.aaf.certservice.certification.CsrModelFactory.StringBase64; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; import org.onap.aaf.certservice.certification.model.CertificationModel; import org.onap.aaf.certservice.certification.model.CsrModel; import org.slf4j.Logger; diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/CertificationExceptionController.java b/certService/src/main/java/org/onap/aaf/certservice/certification/CertificationExceptionController.java index 7d2c43ed..4c9d3042 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/CertificationExceptionController.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/CertificationExceptionController.java @@ -18,10 +18,12 @@ * ============LICENSE_END========================================================= */ -package org.onap.aaf.certservice.certification.exceptions; +package org.onap.aaf.certservice.certification; import com.google.gson.Gson; -import org.onap.aaf.certservice.certification.model.ErrorResponseModel; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.ErrorResponseModel; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/CsrModelFactory.java b/certService/src/main/java/org/onap/aaf/certservice/certification/CsrModelFactory.java index f89c34e5..bca30dee 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/CsrModelFactory.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/CsrModelFactory.java @@ -25,9 +25,9 @@ import java.util.Optional; import org.bouncycastle.pkcs.PKCS10CertificationRequest; import org.bouncycastle.util.io.pem.PemObject; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import org.onap.aaf.certservice.certification.model.CsrModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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<Cmpv2Server> 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<Cmpv2Server> 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<Cmpv2Server> load(String path) { List<Cmpv2Server> 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/java/org/onap/aaf/certservice/certification/exceptions/CsrDecryptionException.java b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/CsrDecryptionException.java index 929fbdb6..0bb46258 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/CsrDecryptionException.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/CsrDecryptionException.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.aaf.certservice.certification.exceptions; +package org.onap.aaf.certservice.certification.exception; public class CsrDecryptionException extends DecryptionException { public CsrDecryptionException(String message, Throwable cause) { diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/DecryptionException.java b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/DecryptionException.java index 8f5f48e6..ee0fb202 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/DecryptionException.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/DecryptionException.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.aaf.certservice.certification.exceptions; +package org.onap.aaf.certservice.certification.exception; public class DecryptionException extends Exception { public DecryptionException(String message, Throwable cause) { diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/model/ErrorResponseModel.java b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/ErrorResponseModel.java index bca7915d..8899f77c 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/model/ErrorResponseModel.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/ErrorResponseModel.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.aaf.certservice.certification.model; +package org.onap.aaf.certservice.certification.exception; public class ErrorResponseModel { diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/KeyDecryptionException.java b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/KeyDecryptionException.java index 15d53935..7970c393 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/exceptions/KeyDecryptionException.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/exception/KeyDecryptionException.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.aaf.certservice.certification.exceptions; +package org.onap.aaf.certservice.certification.exception; public class KeyDecryptionException extends DecryptionException { public KeyDecryptionException(String message, Throwable cause) { diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/model/CsrModel.java b/certService/src/main/java/org/onap/aaf/certservice/certification/model/CsrModel.java index ef76144b..2421c5a4 100644 --- a/certService/src/main/java/org/onap/aaf/certservice/certification/model/CsrModel.java +++ b/certService/src/main/java/org/onap/aaf/certservice/certification/model/CsrModel.java @@ -34,12 +34,11 @@ import org.bouncycastle.asn1.x509.GeneralNames; import org.bouncycastle.pkcs.PKCS10CertificationRequest; import org.bouncycastle.util.io.pem.PemObject; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; public class CsrModel { - private final PKCS10CertificationRequest csr; private final PemObject privateKey; 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/test/java/org/onap/aaf/certservice/api/CertificationServiceTest.java b/certService/src/test/java/org/onap/aaf/certservice/api/CertificationServiceTest.java index 0bb99d9f..ee1ce1ef 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/api/CertificationServiceTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/api/CertificationServiceTest.java @@ -28,9 +28,9 @@ import org.mockito.MockitoAnnotations; import org.onap.aaf.certservice.certification.CertificationModelFactory; import org.onap.aaf.certservice.certification.CsrModelFactory; import org.onap.aaf.certservice.certification.CsrModelFactory.StringBase64; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import org.onap.aaf.certservice.certification.model.CertificationModel; import org.onap.aaf.certservice.certification.model.CsrModel; import org.springframework.http.HttpStatus; diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/CsrModelFactoryTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/CsrModelFactoryTest.java index 5f48b2bf..772f456f 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/CsrModelFactoryTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/CsrModelFactoryTest.java @@ -24,9 +24,9 @@ import org.bouncycastle.util.encoders.Base64; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.onap.aaf.certservice.certification.CsrModelFactory.StringBase64; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import org.onap.aaf.certservice.certification.model.CsrModel; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/PemObjectFactoryTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/PemObjectFactoryTest.java index 0b70475c..90151b6d 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/PemObjectFactoryTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/PemObjectFactoryTest.java @@ -23,8 +23,7 @@ package org.onap.aaf.certservice.certification; import org.bouncycastle.util.io.pem.PemObject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/TestUtils.java b/certService/src/test/java/org/onap/aaf/certservice/certification/TestUtils.java index 39554417..11b4f84e 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/TestUtils.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/TestUtils.java @@ -22,7 +22,7 @@ package org.onap.aaf.certservice.certification; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemWriter; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import java.io.IOException; import java.io.StringWriter; 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<String, String> 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<String, String> 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<Cmpv2Server> 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<Cmpv2Server> cmpServers = new CmpServersConfigLoader().load(NONEXISTING_CONFIG_FILENAME); + + // Then + assertThat(cmpServers).isNotNull(); + assertThat(cmpServers).isEmpty(); + } + + private void verifyThatCmpServerEquals(Cmpv2Server cmpv2Server, Map<String, String> 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<Cmpv2Server> 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<Cmpv2Server> 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 diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/exception/CertificationExceptionControllerTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/exception/CertificationExceptionControllerTest.java index 58e59f45..3dc93035 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/exception/CertificationExceptionControllerTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/exception/CertificationExceptionControllerTest.java @@ -23,10 +23,7 @@ package org.onap.aaf.certservice.certification.exception; import com.google.gson.Gson; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.onap.aaf.certservice.certification.exceptions.CertificationExceptionController; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; -import org.onap.aaf.certservice.certification.model.ErrorResponseModel; +import org.onap.aaf.certservice.certification.CertificationExceptionController; import org.springframework.http.ResponseEntity; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/certService/src/test/java/org/onap/aaf/certservice/certification/model/CsrModelTest.java b/certService/src/test/java/org/onap/aaf/certservice/certification/model/CsrModelTest.java index 7df785d2..bde1dcce 100644 --- a/certService/src/test/java/org/onap/aaf/certservice/certification/model/CsrModelTest.java +++ b/certService/src/test/java/org/onap/aaf/certservice/certification/model/CsrModelTest.java @@ -26,9 +26,9 @@ import org.bouncycastle.util.io.pem.PemObject; import org.junit.jupiter.api.Test; import org.onap.aaf.certservice.certification.PKCS10CertificationRequestFactory; import org.onap.aaf.certservice.certification.PemObjectFactory; -import org.onap.aaf.certservice.certification.exceptions.CsrDecryptionException; -import org.onap.aaf.certservice.certification.exceptions.DecryptionException; -import org.onap.aaf.certservice.certification.exceptions.KeyDecryptionException; +import org.onap.aaf.certservice.certification.exception.CsrDecryptionException; +import org.onap.aaf.certservice.certification.exception.DecryptionException; +import org.onap.aaf.certservice.certification.exception.KeyDecryptionException; import java.io.IOException; diff --git a/certServiceClient/Dockerfile b/certServiceClient/Dockerfile new file mode 100644 index 00000000..9da47295 --- /dev/null +++ b/certServiceClient/Dockerfile @@ -0,0 +1,13 @@ +FROM docker.io/openjdk:11-jre-slim + +ARG VERSION=${version} + +RUN groupadd certServiceClient && useradd -g certServiceClient certServiceClient + +RUN chown -R certServiceClient:certServiceClient /var/log + +USER certServiceClient:certServiceClient + +COPY target/aaf-certservice-client-${VERSION}.jar ./opt/onap/aaf/certservice/aaf-certservice-client.jar + +ENTRYPOINT ["java","-jar","./opt/onap/aaf/certservice/aaf-certservice-client.jar"] diff --git a/certServiceClient/pom.xml b/certServiceClient/pom.xml index 84c33c72..f32501bf 100644 --- a/certServiceClient/pom.xml +++ b/certServiceClient/pom.xml @@ -24,6 +24,111 @@ </plugins> </build> + <profiles> + <profile> + <id>docker-staging</id> + <properties> + <docker.tag>${project.version}-STAGING-${maven.build.timestamp}</docker.tag> + <docker.latest.tag>${project.version}-STAGING-latest</docker.latest.tag> + </properties> + </profile> + + <profile> + <id>docker</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <properties> + <os.detected.name>linux</os.detected.name> + <os.detected.arch>x86_64</os.detected.arch> + <os.detected.classifier>${os.detected.name}-${os.detected.arch}</os.detected.classifier> + </properties> + <build> + <plugins> + <plugin> + <groupId>io.fabric8</groupId> + <artifactId>docker-maven-plugin</artifactId> + <version>${docker-maven-plugin.version}</version> + <executions> + <execution> + <id>docker-build-image</id> + <phase>package</phase> + <goals> + <goal>build</goal> + </goals> + </execution> + <execution> + <id>docker-push-image</id> + <phase>deploy</phase> + <goals> + <goal>push</goal> + </goals> + </execution> + </executions> + <configuration> + <skipPush>${skipDockerPush}</skipPush> + <verbose>true</verbose> + <imagePullPolicy>IfNotPresent</imagePullPolicy> + <images> + <image> + <alias>${project.artifactId}</alias> + <name>${docker-image.namespace}/${docker-image.name} + </name> + <registry>${docker-image.registry}</registry> + <build> + <dockerFileDir>${project.basedir}</dockerFileDir> + <tags> + <tag>${project.version}-${maven.build.timestamp}Z</tag> + <tag>${project.version}</tag> + <tag>${docker-image.latest}</tag> + </tags> + </build> + </image> + </images> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>3.2.2</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <transformers> + <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> + <mainClass>org.onap.aaf.certservice.client.CertServiceClientApp</mainClass> + </transformer> + </transformers> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> + + <distributionManagement> + <repository> + <id>ecomp-releases</id> + <name>AAF Release Repository</name> + <url>${nexusproxy}${releaseNexusPath}</url> + </repository> + <snapshotRepository> + <id>ecomp-snapshots</id> + <name>AAF Snapshot Repository</name> + <url>${nexusproxy}${snapshotNexusPath}</url> + </snapshotRepository> + <site> + <id>ecomp-site</id> + <url>dav:${nexusproxy}${sitePath}</url> + </site> + </distributionManagement> + <dependencies> <dependency> <groupId>org.mockito</groupId> @@ -34,6 +139,10 @@ <artifactId>mockito-junit-jupiter</artifactId> </dependency> <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> </dependency> @@ -45,8 +154,6 @@ <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> </dependency> - </dependencies> - </project>
\ No newline at end of file diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java index e5f1a6a0..4416d0ec 100644 --- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java @@ -16,6 +16,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aaf.certservice.client; public class CertServiceClient { diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/ClientConfigurationEnvs.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/ClientConfigurationEnvs.java new file mode 100644 index 00000000..57e46be9 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/ClientConfigurationEnvs.java @@ -0,0 +1,28 @@ +/* + * ============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.client.common; + +public enum ClientConfigurationEnvs { + REQUEST_URL, + REQUEST_TIMEOUT, + OUTPUT_PATH, + CA_NAME +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/CsrConfigurationEnvs.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/CsrConfigurationEnvs.java new file mode 100644 index 00000000..5913b73b --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/CsrConfigurationEnvs.java @@ -0,0 +1,31 @@ +/* + * ============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.client.common; + +public enum CsrConfigurationEnvs { + COMMON_NAME, + ORGANIZATION, + ORGANIZATION_UNIT, + LOCATION, + STATE, + COUNTRY, + SANS +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvProvider.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvProvider.java new file mode 100644 index 00000000..fce2568b --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvProvider.java @@ -0,0 +1,29 @@ +/* + * ============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.client.common; + +import org.onap.aaf.certservice.client.exceptions.ClientConfigurationException; + +public class EnvProvider { + public String readEnvVariable(String envVariable) throws ClientConfigurationException { + return System.getProperty(envVariable); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvValidationUtils.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvValidationUtils.java new file mode 100644 index 00000000..bd71c3cd --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvValidationUtils.java @@ -0,0 +1,68 @@ +/* + * ============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.client.common; + +import java.util.regex.Pattern; + +public final class EnvValidationUtils { + + private EnvValidationUtils() {} + + public static Boolean isPathValid(String path) { + return path.matches("^/|(/[a-zA-Z0-9_-]+)+$"); + } + + public static Boolean isAlphaNumeric(String caName) { + return caName.matches("^[a-zA-Z0-9]*$"); + } + + public static Boolean isEnvExists(String envValue) { + return envValue != null && !"".equals(envValue); + } + + public static Boolean isCountryValid(String country) { + return country.matches("^([A-Z][A-Z])$"); + } + + public static Boolean isCommonNameValid(String commonName) { + return !isSpecialCharsPresent(commonName) && + !isHttpProtocolsPresent(commonName) && + !isIpAddressPresent(commonName) && + !isPortNumberPresent(commonName); + } + + static Boolean isPortNumberPresent(String stringToCheck) { + return Pattern.compile(":[0-9]{1,5}").matcher(stringToCheck).find(); + } + + static Boolean isIpAddressPresent(String stringToCheck) { + return Pattern.compile("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}").matcher(stringToCheck).find(); + } + + static Boolean isHttpProtocolsPresent(String stringToCheck) { + return Pattern.compile("[h][t][t][p][:][/][/]|[h][t][t][p][s][:][/][/]").matcher(stringToCheck).find(); + } + + + public static Boolean isSpecialCharsPresent(String stringToCheck) { + return Pattern.compile("[~#@*$+%!()?/{}<>\\|_^]").matcher(stringToCheck).find(); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForClient.java new file mode 100644 index 00000000..1ba32a3f --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForClient.java @@ -0,0 +1,53 @@ +/* + * ============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.client.common; + +public class EnvsForClient { + + private String urlToCertService; + private String requestTimeOut; + private String outputPath; + private String caName; + + EnvsForClient() { + EnvProvider envProvider = new EnvProvider(); + this.urlToCertService = envProvider.readEnvVariable(ClientConfigurationEnvs.REQUEST_URL.toString()); + this.requestTimeOut = envProvider.readEnvVariable(ClientConfigurationEnvs.REQUEST_TIMEOUT.toString()); + this.outputPath = envProvider.readEnvVariable(ClientConfigurationEnvs.OUTPUT_PATH.toString()); + this.caName = envProvider.readEnvVariable(ClientConfigurationEnvs.CA_NAME.toString()); + } + + public String getUrlToCertService() { + return urlToCertService; + } + + public String getRequestTimeOut() { + return requestTimeOut; + } + + public String getOutputPath() { + return outputPath; + } + + public String getCaName() { + return caName; + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForCsr.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForCsr.java new file mode 100644 index 00000000..1f6c9c96 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/EnvsForCsr.java @@ -0,0 +1,71 @@ +/* + * ============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.client.common; + +public class EnvsForCsr { + private String commonName; + private String organization; + private String organizationUnit; + private String location; + private String state; + private String country; + private String subjectAlternativesName; + + EnvsForCsr() { + EnvProvider envProvider = new EnvProvider(); + this.commonName = envProvider.readEnvVariable(CsrConfigurationEnvs.COMMON_NAME.toString()); + this.organization = envProvider.readEnvVariable(CsrConfigurationEnvs.ORGANIZATION.toString()); + this.organizationUnit = envProvider.readEnvVariable(CsrConfigurationEnvs.ORGANIZATION_UNIT.toString()); + this.location = envProvider.readEnvVariable(CsrConfigurationEnvs.LOCATION.toString()); + this.state = envProvider.readEnvVariable(CsrConfigurationEnvs.STATE.toString()); + this.country = envProvider.readEnvVariable(CsrConfigurationEnvs.COUNTRY.toString()); + this.subjectAlternativesName = envProvider.readEnvVariable(CsrConfigurationEnvs.SANS.toString()); + } + + public String getCommonName() { + return commonName; + } + + public String getOrganization() { + return organization; + } + + public String getOrganizationUnit() { + return organizationUnit; + } + + public String getLocation() { + return location; + } + + public String getState() { + return state; + } + + public String getCountry() { + return country; + } + + + public String getSubjectAlternativesName() { + return subjectAlternativesName; + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/ClientConfigurationException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/ClientConfigurationException.java new file mode 100644 index 00000000..c895e176 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/ClientConfigurationException.java @@ -0,0 +1,28 @@ +/* + * ============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.client.exceptions; + + +public class ClientConfigurationException extends RuntimeException { + public ClientConfigurationException(String message) { + super(message); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/CsrConfigurationException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/CsrConfigurationException.java new file mode 100644 index 00000000..83e38c32 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/exceptions/CsrConfigurationException.java @@ -0,0 +1,28 @@ +/* + * ============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.client.exceptions; + + +public class CsrConfigurationException extends RuntimeException { + public CsrConfigurationException(String message) { + super(message); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/AbstractConfigurationFactory.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/AbstractConfigurationFactory.java new file mode 100644 index 00000000..6adbc038 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/AbstractConfigurationFactory.java @@ -0,0 +1,25 @@ +/* + * ============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.client.model; + +public interface AbstractConfigurationFactory<T extends ConfigurationModel> { + T create(); +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfiguration.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfiguration.java new file mode 100644 index 00000000..4dda61ea --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfiguration.java @@ -0,0 +1,75 @@ +/* + * ============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.client.model; + +public class ClientConfiguration implements ConfigurationModel{ + + Integer DEFAULT_TIMEOUT_MS = 30000; + String DEFAULT_REQUEST_URL = "http://cert-service:8080/v1/certificate/"; + + private String urlToCertService; + private Integer requestTimeout; + private String certsOutputPath; + private String caName; + + + public ClientConfiguration() { + urlToCertService = DEFAULT_REQUEST_URL; + requestTimeout = DEFAULT_TIMEOUT_MS; + } + + + public String getUrlToCertService() { + return urlToCertService; + } + + public ClientConfiguration setUrlToCertService(String urlToCertService) { + this.urlToCertService = urlToCertService; + return this; + } + + public Integer getRequestTimeout() { + return requestTimeout; + } + + public ClientConfiguration setRequestTimeout(Integer requestTimeout) { + this.requestTimeout = requestTimeout; + return this; + } + + public String getCertsOutputPath() { + return certsOutputPath; + } + + public ClientConfiguration setCertsOutputPath(String certsOutputPath) { + this.certsOutputPath = certsOutputPath; + return this; + } + + public String getCaName() { + return caName; + } + + public ClientConfiguration setCaName(String caName) { + this.caName = caName; + return this; + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactory.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactory.java new file mode 100644 index 00000000..43c6838c --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactory.java @@ -0,0 +1,64 @@ +/* + * ============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.client.model; + +import org.onap.aaf.certservice.client.common.ClientConfigurationEnvs; +import org.onap.aaf.certservice.client.common.EnvValidationUtils; +import org.onap.aaf.certservice.client.common.EnvsForClient; +import org.onap.aaf.certservice.client.exceptions.ClientConfigurationException; + +import java.util.Optional; + +class ClientConfigurationFactory implements AbstractConfigurationFactory<ClientConfiguration> { + + private final EnvsForClient envsForClient; + + + ClientConfigurationFactory(EnvsForClient envsForClient) { + this.envsForClient = envsForClient; + } + + + @Override + public ClientConfiguration create() throws ClientConfigurationException { + + ClientConfiguration configuration = new ClientConfiguration(); + + Optional.ofNullable(envsForClient.getUrlToCertService()).filter(EnvValidationUtils::isEnvExists) + .map(configuration::setUrlToCertService); + + Optional.ofNullable(envsForClient.getRequestTimeOut()).filter(EnvValidationUtils::isEnvExists) + .map(timeout -> configuration.setRequestTimeout(Integer.valueOf(timeout))); + + Optional.ofNullable(envsForClient.getOutputPath()).filter(EnvValidationUtils::isEnvExists) + .filter(EnvValidationUtils::isPathValid) + .map(configuration::setCertsOutputPath) + .orElseThrow(() -> new ClientConfigurationException(ClientConfigurationEnvs.OUTPUT_PATH + " is invalid.")); + + Optional.ofNullable(envsForClient.getCaName()).filter(EnvValidationUtils::isEnvExists) + .filter(EnvValidationUtils::isAlphaNumeric) + .map(configuration::setCaName) + .orElseThrow(() -> new ClientConfigurationException(ClientConfigurationEnvs.CA_NAME + " is invalid.")); + + return configuration; + } +} + diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ConfigurationModel.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ConfigurationModel.java new file mode 100644 index 00000000..ca7deb72 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/ConfigurationModel.java @@ -0,0 +1,24 @@ +/* + * ============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.client.model; + +public interface ConfigurationModel { +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfiguration.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfiguration.java new file mode 100644 index 00000000..27b6d931 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfiguration.java @@ -0,0 +1,97 @@ +/* + * ============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.client.model; + + +public class CsrConfiguration implements ConfigurationModel { + + private String commonName; + private String organization; + private String state; + private String country; + private String organizationUnit; + private String location; + private String subjectAlternativeNames; + + + public String getCommonName() { + return commonName; + } + + public CsrConfiguration setCommonName(String commonName) { + this.commonName = commonName; + return this; + } + + public String getOrganization() { + return organization; + } + + public CsrConfiguration setOrganization(String organization) { + this.organization = organization; + return this; + } + + public String getState() { + return state; + } + + public CsrConfiguration setState(String state) { + this.state = state; + return this; + } + + public String getCountry() { + return country; + } + + public CsrConfiguration setCountry(String country) { + this.country = country; + return this; + } + + public String getOrganizationUnit() { + return organizationUnit; + } + + public CsrConfiguration setOrganizationUnit(String organizationUnit) { + this.organizationUnit = organizationUnit; + return this; + } + + public String getLocation() { + return location; + } + + public CsrConfiguration setLocation(String location) { + this.location = location; + return this; + } + + public String getSubjectAlternativeNames() { + return subjectAlternativeNames; + } + + public CsrConfiguration setSubjectAlternativeNames(String subjectAlternativeNames) { + this.subjectAlternativeNames = subjectAlternativeNames; + return this; + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactory.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactory.java new file mode 100644 index 00000000..1b3a252b --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactory.java @@ -0,0 +1,75 @@ +/* + * ============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.client.model; + +import org.onap.aaf.certservice.client.common.CsrConfigurationEnvs; +import org.onap.aaf.certservice.client.common.EnvValidationUtils; +import org.onap.aaf.certservice.client.common.EnvsForCsr; +import org.onap.aaf.certservice.client.exceptions.CsrConfigurationException; + +import java.util.Optional; + +class CsrConfigurationFactory implements AbstractConfigurationFactory<CsrConfiguration> { + + private final EnvsForCsr envsForCsr; + + + CsrConfigurationFactory(EnvsForCsr envsForCsr) { + this.envsForCsr = envsForCsr; + } + + + @Override + public CsrConfiguration create() throws CsrConfigurationException { + + CsrConfiguration configuration = new CsrConfiguration(); + + Optional.ofNullable(envsForCsr.getCommonName()).filter(EnvValidationUtils::isEnvExists) + .filter(EnvValidationUtils::isCommonNameValid) + .map(configuration::setCommonName) + .orElseThrow(() -> new CsrConfigurationException(CsrConfigurationEnvs.COMMON_NAME + " is invalid.")); + + Optional.ofNullable(envsForCsr.getOrganization()).filter(EnvValidationUtils::isEnvExists) + .filter(org -> !EnvValidationUtils.isSpecialCharsPresent(org)) + .map(configuration::setOrganization) + .orElseThrow(() -> new CsrConfigurationException(CsrConfigurationEnvs.ORGANIZATION + " is invalid.")); + + Optional.ofNullable(envsForCsr.getState()).filter(EnvValidationUtils::isEnvExists) + .map(configuration::setState) + .orElseThrow(() -> new CsrConfigurationException(CsrConfigurationEnvs.STATE + " is invalid.")); + + Optional.ofNullable(envsForCsr.getCountry()).filter(EnvValidationUtils::isEnvExists) + .filter(EnvValidationUtils::isCountryValid) + .map(configuration::setCountry) + .orElseThrow(() -> new CsrConfigurationException(CsrConfigurationEnvs.COUNTRY + " is invalid.")); + + Optional.ofNullable(envsForCsr.getOrganizationUnit()).filter(EnvValidationUtils::isEnvExists) + .map(configuration::setOrganizationUnit); + + Optional.ofNullable(envsForCsr.getLocation()).filter(EnvValidationUtils::isEnvExists) + .map(configuration::setLocation); + + Optional.ofNullable(envsForCsr.getSubjectAlternativesName()).filter(EnvValidationUtils::isEnvExists) + .map(configuration::setSubjectAlternativeNames); + + return configuration; + } +} diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactoryTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactoryTest.java new file mode 100644 index 00000000..e21f2510 --- /dev/null +++ b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/ClientConfigurationFactoryTest.java @@ -0,0 +1,126 @@ +/* + * ============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.client.model; + +import org.junit.jupiter.api.Test; +import org.onap.aaf.certservice.client.common.ClientConfigurationEnvs; +import org.onap.aaf.certservice.client.common.EnvsForClient; +import org.onap.aaf.certservice.client.exceptions.ClientConfigurationException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ClientConfigurationFactoryTest { + + final String CA_NAME_VALID = "caaaftest2"; + final String TIME_OUT_VALID = "30000"; + final String OUTPUT_PATH_VALID = "/opt/app/osaaf"; + final String URL_TO_CERT_SERVICE_VALID = "http://cert-service:8080/v1/certificate/"; + final String CA_NAME_INVALID = "caaaftest2#$"; + final String OUTPUT_PATH_INVALID = "/opt//app/osaaf"; + + private EnvsForClient envsForClient = mock(EnvsForClient.class); + + + @Test + void create_shouldReturnSuccessWhenAllVariablesAreSetAndValid() { + // given + when(envsForClient.getCaName()).thenReturn(CA_NAME_VALID); + when(envsForClient.getOutputPath()).thenReturn(OUTPUT_PATH_VALID); + when(envsForClient.getRequestTimeOut()).thenReturn(TIME_OUT_VALID); + when(envsForClient.getUrlToCertService()).thenReturn(URL_TO_CERT_SERVICE_VALID); + + // when + ClientConfiguration configuration = new ClientConfigurationFactory(envsForClient).create(); + + // then + assertThat(configuration.getCaName()).isEqualTo(CA_NAME_VALID); + assertThat(configuration.getRequestTimeout()).isEqualTo(Integer.valueOf(TIME_OUT_VALID)); + assertThat(configuration.getCertsOutputPath()).isEqualTo(OUTPUT_PATH_VALID); + assertThat(configuration.getUrlToCertService()).isEqualTo(URL_TO_CERT_SERVICE_VALID); + } + + @Test + void create_shouldReturnSuccessWhenDefaultVariablesAreNotSet() { + // given + when(envsForClient.getCaName()).thenReturn(CA_NAME_VALID); + when(envsForClient.getOutputPath()).thenReturn(OUTPUT_PATH_VALID); + + // when + ClientConfiguration configuration = new ClientConfigurationFactory(envsForClient).create(); + + // then + assertThat(configuration.getCaName()).isEqualTo(CA_NAME_VALID); + assertThat(configuration.getRequestTimeout()).isEqualTo(Integer.valueOf(TIME_OUT_VALID)); + assertThat(configuration.getCertsOutputPath()).isEqualTo(OUTPUT_PATH_VALID); + assertThat(configuration.getUrlToCertService()).isEqualTo(URL_TO_CERT_SERVICE_VALID); + } + + @Test + void create_shouldReturnClientExceptionWhenRequiredVariableIsNotSet() { + // given + when(envsForClient.getOutputPath()).thenReturn(OUTPUT_PATH_VALID); + + // when + ClientConfigurationFactory configurationFactory = new ClientConfigurationFactory(envsForClient); + + // when/then + assertThatExceptionOfType(ClientConfigurationException.class) + .isThrownBy(configurationFactory::create) + .withMessageContaining(ClientConfigurationEnvs.CA_NAME + " is invalid."); + } + + @Test + void create_shouldReturnClientExceptionWhenCANameContainsSpecialCharacters() { + // given + when(envsForClient.getCaName()).thenReturn(CA_NAME_INVALID); + when(envsForClient.getOutputPath()).thenReturn(OUTPUT_PATH_VALID); + when(envsForClient.getRequestTimeOut()).thenReturn(TIME_OUT_VALID); + when(envsForClient.getUrlToCertService()).thenReturn(URL_TO_CERT_SERVICE_VALID); + + // when + ClientConfigurationFactory configurationFactory = new ClientConfigurationFactory(envsForClient); + + // when/then + assertThatExceptionOfType(ClientConfigurationException.class) + .isThrownBy(configurationFactory::create) + .withMessageContaining(ClientConfigurationEnvs.CA_NAME + " is invalid."); + } + + @Test + void create_shouldReturnClientExceptionWhenOutputPathContainsSpecialCharacters() { + // given + when(envsForClient.getCaName()).thenReturn(CA_NAME_VALID); + when(envsForClient.getOutputPath()).thenReturn(OUTPUT_PATH_INVALID); + when(envsForClient.getRequestTimeOut()).thenReturn(TIME_OUT_VALID); + when(envsForClient.getUrlToCertService()).thenReturn(URL_TO_CERT_SERVICE_VALID); + + // when + ClientConfigurationFactory configurationFactory = new ClientConfigurationFactory(envsForClient); + + // when/then + assertThatExceptionOfType(ClientConfigurationException.class) + .isThrownBy(configurationFactory::create) + .withMessageContaining(ClientConfigurationEnvs.OUTPUT_PATH + " is invalid."); + } +} diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactoryTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactoryTest.java new file mode 100644 index 00000000..39d44592 --- /dev/null +++ b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/model/CsrConfigurationFactoryTest.java @@ -0,0 +1,109 @@ +/* + * ============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.client.model; + +import org.junit.jupiter.api.Test; +import org.onap.aaf.certservice.client.common.CsrConfigurationEnvs; +import org.onap.aaf.certservice.client.common.EnvsForCsr; +import org.onap.aaf.certservice.client.exceptions.CsrConfigurationException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class CsrConfigurationFactoryTest { + + final String COMMON_NAME_VALID = "onap.org"; + final String SANS_VALID = "test-name"; + final String COUNTRY_VALID = "US"; + final String LOCATION_VALID = "San-Francisco"; + final String ORGANIZATION_VALID = "Linux-Foundation"; + final String ORGANIZATION_UNIT_VALID = "ONAP"; + final String STATE_VALID = "California"; + final String COMMON_NAME_INVALID = "onap.org*&"; + + private EnvsForCsr envsForCsr = mock(EnvsForCsr.class); + + + @Test + void create_shouldReturnSuccessWhenAllVariablesAreSetAndValid() { + // given + when(envsForCsr.getCommonName()).thenReturn(COMMON_NAME_VALID); + when(envsForCsr.getSubjectAlternativesName()).thenReturn(SANS_VALID); + when(envsForCsr.getCountry()).thenReturn(COUNTRY_VALID); + when(envsForCsr.getLocation()).thenReturn(LOCATION_VALID); + when(envsForCsr.getOrganization()).thenReturn(ORGANIZATION_VALID); + when(envsForCsr.getOrganizationUnit()).thenReturn(ORGANIZATION_UNIT_VALID); + when(envsForCsr.getState()).thenReturn(STATE_VALID); + + // when + CsrConfiguration configuration = new CsrConfigurationFactory(envsForCsr).create(); + + // then + assertThat(configuration.getCommonName()).isEqualTo(COMMON_NAME_VALID); + assertThat(configuration.getSubjectAlternativeNames()).isEqualTo(SANS_VALID); + assertThat(configuration.getCountry()).isEqualTo(COUNTRY_VALID); + assertThat(configuration.getLocation()).isEqualTo(LOCATION_VALID); + assertThat(configuration.getOrganization()).isEqualTo(ORGANIZATION_VALID); + assertThat(configuration.getOrganizationUnit()).isEqualTo(ORGANIZATION_UNIT_VALID); + assertThat(configuration.getState()).isEqualTo(STATE_VALID); + } + + @Test + void create_shouldReturnSuccessWhenNotRequiredVariablesAreNotSet() { + // given + when(envsForCsr.getCommonName()).thenReturn(COMMON_NAME_VALID); + when(envsForCsr.getState()).thenReturn(STATE_VALID); + when(envsForCsr.getCountry()).thenReturn(COUNTRY_VALID); + when(envsForCsr.getOrganization()).thenReturn(ORGANIZATION_VALID); + + // when + CsrConfiguration configuration = new CsrConfigurationFactory(envsForCsr).create(); + + // then + assertThat(configuration.getCommonName()).isEqualTo(COMMON_NAME_VALID); + assertThat(configuration.getCountry()).isEqualTo(COUNTRY_VALID); + assertThat(configuration.getOrganization()).isEqualTo(ORGANIZATION_VALID); + assertThat(configuration.getState()).isEqualTo(STATE_VALID); + } + + + @Test + void create_shouldReturnCsrConfigurationExceptionWhenCommonNameContainsSpecialCharacters() { + // given + when(envsForCsr.getCommonName()).thenReturn(COMMON_NAME_INVALID); + when(envsForCsr.getSubjectAlternativesName()).thenReturn(SANS_VALID); + when(envsForCsr.getCountry()).thenReturn(COUNTRY_VALID); + when(envsForCsr.getLocation()).thenReturn(LOCATION_VALID); + when(envsForCsr.getOrganization()).thenReturn(ORGANIZATION_VALID); + when(envsForCsr.getOrganizationUnit()).thenReturn(ORGANIZATION_UNIT_VALID); + when(envsForCsr.getState()).thenReturn(SANS_VALID); + + // when + CsrConfigurationFactory configurationFactory = new CsrConfigurationFactory(envsForCsr); + + // when/then + assertThatExceptionOfType(CsrConfigurationException.class) + .isThrownBy(configurationFactory::create) + .withMessageContaining(CsrConfigurationEnvs.COMMON_NAME + " is invalid."); + } +} diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..43ca5b67 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +/.tox +/_build/* +/__pycache__/* diff --git a/docs/_static/css/ribbon.css b/docs/_static/css/ribbon.css new file mode 100644 index 00000000..89adc647 --- /dev/null +++ b/docs/_static/css/ribbon.css @@ -0,0 +1,61 @@ +.ribbon { + z-index: 1000; + background-color: #a00; + overflow: hidden; + white-space: nowrap; + position: fixed; + top: 25px; + right: -50px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 10px #888; + -moz-box-shadow: 0 0 10px #888; + box-shadow: 0 0 10px #888; +} + +.ribbon a { + border: 1px solid #faa; + color: #fff; + display: block; + font: bold 81.25% 'Helvetica Neue', Helvetica, Arial, sans-serif; + margin: 1px 0; + padding: 10px 50px; + text-align: center; + text-decoration: none; + text-shadow: 0 0 5px #444; + transition: 0.5s; +} + +.ribbon a:hover { + background: #c11; + color: #fff; +} + +/* override table width restrictions */ +@media screen and (min-width: 767px) { + .wy-table-responsive table td, + .wy-table-responsive table th { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} + +@media screen and (max-width: 767px) { + .wy-table-responsive table td { + white-space: nowrap; + } +} + +/* fix width of the screen */ + +.wy-nav-content { + max-width: none; +} diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico Binary files differnew file mode 100644 index 00000000..cb712ebd --- /dev/null +++ b/docs/_static/favicon.ico diff --git a/docs/_static/logo_onap_2017.png b/docs/_static/logo_onap_2017.png Binary files differnew file mode 100644 index 00000000..5d064f43 --- /dev/null +++ b/docs/_static/logo_onap_2017.png diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..8f40e8b8 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,15 @@ +from docs_conf.conf import * + +branch = 'latest' +master_doc = 'index' + +linkcheck_ignore = [ + 'http://localhost', +] + +intersphinx_mapping = {} + +html_last_updated_fmt = '%d-%b-%y %H:%M' + +def setup(app): + app.add_stylesheet("css/ribbon_onap.css") diff --git a/docs/conf.yaml b/docs/conf.yaml new file mode 100644 index 00000000..ab592813 --- /dev/null +++ b/docs/conf.yaml @@ -0,0 +1,7 @@ +--- +project_cfg: onap +project: onap + +# Change this to ReleaseBranchName to modify the header +default-version: latest +# diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..87b61527 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,8 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright 2020 NOKIA + +AAF Cert Service +------------------------------------------------ +.. toctree:: + :maxdepth: 1 diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt new file mode 100644 index 00000000..b3188ddd --- /dev/null +++ b/docs/requirements-docs.txt @@ -0,0 +1,15 @@ +tox +Sphinx +doc8 +docutils +setuptools +six +sphinx_rtd_theme>=0.4.3 +sphinxcontrib-blockdiag +sphinxcontrib-needs>=0.2.3 +sphinxcontrib-nwdiag +sphinxcontrib-seqdiag +sphinxcontrib-swaggerdoc +sphinxcontrib-plantuml +sphinx_bootstrap_theme +lfdocs-conf diff --git a/docs/tox.ini b/docs/tox.ini new file mode 100644 index 00000000..edac8c35 --- /dev/null +++ b/docs/tox.ini @@ -0,0 +1,22 @@ +[tox] +minversion = 1.6 +envlist = docs, +skipsdist = true + +[testenv:docs] +basepython = python3 +deps = -r{toxinidir}/requirements-docs.txt +commands = + sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html + echo "Generated docs available in {toxinidir}/_build/html" +whitelist_externals = + echo + git + sh + +[testenv:docs-linkcheck] +basepython = python3 +#deps = -r{toxinidir}/requirements-docs.txt +commands = echo "Link Checking not enforced" +#commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck +whitelist_externals = echo @@ -66,6 +66,8 @@ <docker-image.latest>${project.version}</docker-image.latest> <version>${project.version}</version> <docker.http_proxy/> + <immutables.version>2.7.5</immutables.version> + </properties> @@ -289,6 +291,7 @@ <version>${mockito-core.version}</version> <scope>test</scope> </dependency> + <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> |