2  * ============LICENSE_START=======================================================
 
   3  * BBS-RELOCATION-CPE-AUTHENTICATION-HANDLER
 
   4  * ================================================================================
 
   5  * Copyright (C) 2019 NOKIA Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.bbs.event.processor.config;
 
  23 import static org.junit.jupiter.api.Assertions.assertAll;
 
  24 import static org.junit.jupiter.api.Assertions.assertEquals;
 
  25 import static org.junit.jupiter.api.Assertions.assertFalse;
 
  26 import static org.junit.jupiter.api.Assertions.assertTrue;
 
  28 import java.util.Collections;
 
  29 import java.util.HashMap;
 
  32 import org.junit.FixMethodOrder;
 
  33 import org.junit.jupiter.api.DisplayName;
 
  34 import org.junit.jupiter.api.Test;
 
  35 import org.junit.runners.MethodSorters;
 
  36 import org.onap.bbs.event.processor.model.GeneratedAppConfigObject;
 
  37 import org.onap.bbs.event.processor.model.ImmutableDmaapInfo;
 
  38 import org.onap.bbs.event.processor.model.ImmutableGeneratedAppConfigObject;
 
  39 import org.onap.bbs.event.processor.model.ImmutableStreamsObject;
 
  40 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapConsumerConfiguration;
 
  41 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapPublisherConfiguration;
 
  42 import org.springframework.beans.factory.annotation.Autowired;
 
  43 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 
  44 import org.springframework.boot.test.context.SpringBootTest;
 
  45 import org.springframework.test.context.TestPropertySource;
 
  47 @SpringBootTest(classes = {
 
  48         AaiClientProperties.class,
 
  49         DmaapReRegistrationConsumerProperties.class,
 
  50         DmaapCpeAuthenticationConsumerProperties.class,
 
  51         DmaapProducerProperties.class,
 
  52         SecurityProperties.class,
 
  53         GenericProperties.class})
 
  54 @EnableConfigurationProperties
 
  55 @TestPropertySource(properties = {
 
  56         "configs.aai.client.aaiHost=test localhost",
 
  57         "configs.aai.client.aaiPort=1234",
 
  58         "configs.aai.client.aaiProtocol=https",
 
  59         "configs.aai.client.aaiUserName=AAI",
 
  60         "configs.aai.client.aaiUserPassword=AAI",
 
  61         "configs.aai.client.aaiIgnoreSslCertificateErrors=true",
 
  62         "configs.aai.client.aaiHeaders.X-FromAppId=bbs",
 
  63         "configs.aai.client.aaiHeaders.X-TransactionId=9999",
 
  64         "configs.aai.client.aaiHeaders.Accept=application/json",
 
  65         "configs.aai.client.aaiHeaders.Real-Time=true",
 
  66         "configs.aai.client.aaiHeaders.Content-Type=application/merge-patch+json",
 
  67         "configs.dmaap.consumer.re-registration.dmaapHostName=test localhost",
 
  68         "configs.dmaap.consumer.re-registration.dmaapPortNumber=1234",
 
  69         "configs.dmaap.consumer.re-registration.dmaapTopicName=/events/unauthenticated.PNF_REREGISTRATION",
 
  70         "configs.dmaap.consumer.re-registration.dmaapProtocol=http",
 
  71         "configs.dmaap.consumer.re-registration.dmaapContentType=application/json",
 
  72         "configs.dmaap.consumer.re-registration.consumerId=c12",
 
  73         "configs.dmaap.consumer.re-registration.consumerGroup=OpenDcae-c12",
 
  74         "configs.dmaap.consumer.re-registration.timeoutMs=-1",
 
  75         "configs.dmaap.consumer.re-registration.messageLimit=1",
 
  76         "configs.dmaap.consumer.cpe-authentication.dmaapHostName=test localhost",
 
  77         "configs.dmaap.consumer.cpe-authentication.dmaapPortNumber=1234",
 
  78         "configs.dmaap.consumer.cpe-authentication.dmaapTopicName=/events/unauthenticated.CPE_AUTHENTICATION",
 
  79         "configs.dmaap.consumer.cpe-authentication.dmaapProtocol=http",
 
  80         "configs.dmaap.consumer.cpe-authentication.dmaapContentType=application/json",
 
  81         "configs.dmaap.consumer.cpe-authentication.consumerId=c12",
 
  82         "configs.dmaap.consumer.cpe-authentication.consumerGroup=OpenDcae-c12",
 
  83         "configs.dmaap.consumer.cpe-authentication.timeoutMs=-1",
 
  84         "configs.dmaap.consumer.cpe-authentication.messageLimit=1",
 
  85         "configs.dmaap.producer.dmaapHostName=test localhost",
 
  86         "configs.dmaap.producer.dmaapPortNumber=1234",
 
  87         "configs.dmaap.producer.dmaapTopicName=/events/unauthenticated.DCAE_CL_OUTPUT",
 
  88         "configs.dmaap.producer.dmaapProtocol=http",
 
  89         "configs.dmaap.producer.dmaapContentType=application/json",
 
  90         "configs.security.trustStorePath=test trust store path",
 
  91         "configs.security.trustStorePasswordPath=test trust store password path",
 
  92         "configs.security.keyStorePath=test key store path",
 
  93         "configs.security.keyStorePasswordPath=test key store password path",
 
  94         "configs.security.enableDmaapCertAuth=true",
 
  95         "configs.security.enableAaiCertAuth=true",
 
  96         "configs.application.pipelinesPollingIntervalSec=30",
 
  97         "configs.application.pipelinesTimeoutSec=15",
 
  98         "configs.application.re-registration.policyScope=reRegPolicyScope",
 
  99         "configs.application.re-registration.clControlName=reRegControlName",
 
 100         "configs.application.cpe-authentication.policyScope=cpeAuthPolicyScope",
 
 101         "configs.application.cpe-authentication.clControlName=cpeAuthControlName"})
 
 102 @DisplayName("Application Configuration Unit-Tests")
 
 103 // Ordering tests because we need a first configuration population from @TestPropertySource
 
 104 // and then update of the config parameters based on a new Consul-retrieved Configuration object
 
 105 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 
 106 class ApplicationConfigurationTest {
 
 108     private ApplicationConfiguration configuration;
 
 111     public ApplicationConfigurationTest(AaiClientProperties aaiClientProperties,
 
 112                                         DmaapReRegistrationConsumerProperties dmaapReRegistrationConsumerProperties,
 
 113                                         DmaapCpeAuthenticationConsumerProperties
 
 114                                                     dmaapCpeAuthenticationConsumerProperties,
 
 115                                         DmaapProducerProperties dmaapProducerProperties,
 
 116                                         SecurityProperties securityProperties,
 
 117                                         GenericProperties genericProperties) {
 
 118         this.configuration = new ApplicationConfiguration(aaiClientProperties,
 
 119                 dmaapReRegistrationConsumerProperties,
 
 120                 dmaapCpeAuthenticationConsumerProperties,
 
 121                 dmaapProducerProperties,
 
 127     void testA_configurationObjectSuccessfullyPopulated() {
 
 129         AaiClientConfiguration aaiClientConfiguration = configuration.getAaiClientConfiguration();
 
 130         assertAll("AAI Client Configuration Properties",
 
 131             () -> assertEquals("test localhost", aaiClientConfiguration.aaiHost()),
 
 132             () -> assertEquals(Integer.valueOf(1234), aaiClientConfiguration.aaiPort()),
 
 133             () -> assertEquals("https", aaiClientConfiguration.aaiProtocol()),
 
 134             () -> assertEquals("AAI", aaiClientConfiguration.aaiUserName()),
 
 135             () -> assertEquals("AAI", aaiClientConfiguration.aaiUserPassword()),
 
 136             () -> assertTrue(aaiClientConfiguration.aaiIgnoreSslCertificateErrors()),
 
 137             () -> assertEquals("bbs", aaiClientConfiguration.aaiHeaders().get("X-FromAppId")),
 
 138             () -> assertEquals("9999", aaiClientConfiguration.aaiHeaders().get("X-TransactionId")),
 
 139             () -> assertEquals("application/json", aaiClientConfiguration.aaiHeaders().get("Accept")),
 
 140             () -> assertEquals("true", aaiClientConfiguration.aaiHeaders().get("Real-Time")),
 
 141             () -> assertEquals("application/merge-patch+json",
 
 142                         aaiClientConfiguration.aaiHeaders().get("Content-Type"))
 
 145         DmaapConsumerConfiguration dmaapConsumerReRegistrationConfig =
 
 146                 configuration.getDmaapReRegistrationConsumerConfiguration();
 
 147         assertAll("DMaaP Consumer Re-Registration Configuration Properties",
 
 148             () -> assertEquals("test localhost", dmaapConsumerReRegistrationConfig.dmaapHostName()),
 
 149             () -> assertEquals(Integer.valueOf(1234), dmaapConsumerReRegistrationConfig.dmaapPortNumber()),
 
 150             () -> assertEquals("/events/unauthenticated.PNF_REREGISTRATION",
 
 151                     dmaapConsumerReRegistrationConfig.dmaapTopicName()),
 
 152             () -> assertEquals("http", dmaapConsumerReRegistrationConfig.dmaapProtocol()),
 
 153             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserName()),
 
 154             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserPassword()),
 
 155             () -> assertEquals("application/json", dmaapConsumerReRegistrationConfig.dmaapContentType()),
 
 156             () -> assertEquals("c12", dmaapConsumerReRegistrationConfig.consumerId()),
 
 157             () -> assertEquals("OpenDcae-c12", dmaapConsumerReRegistrationConfig.consumerGroup()),
 
 158             () -> assertEquals(Integer.valueOf(-1), dmaapConsumerReRegistrationConfig.timeoutMs()),
 
 159             () -> assertEquals(Integer.valueOf(1), dmaapConsumerReRegistrationConfig.messageLimit())
 
 162         DmaapConsumerConfiguration dmaapConsumerCpeAuthenticationConfig =
 
 163                 configuration.getDmaapCpeAuthenticationConsumerConfiguration();
 
 164         assertAll("DMaaP Consumer CPE Authentication Configuration Properties",
 
 165             () -> assertEquals("test localhost", dmaapConsumerCpeAuthenticationConfig.dmaapHostName()),
 
 166             () -> assertEquals(Integer.valueOf(1234), dmaapConsumerCpeAuthenticationConfig.dmaapPortNumber()),
 
 167             () -> assertEquals("/events/unauthenticated.CPE_AUTHENTICATION",
 
 168                     dmaapConsumerCpeAuthenticationConfig.dmaapTopicName()),
 
 169             () -> assertEquals("http", dmaapConsumerCpeAuthenticationConfig.dmaapProtocol()),
 
 170             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserName()),
 
 171             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserPassword()),
 
 172             () -> assertEquals("application/json", dmaapConsumerCpeAuthenticationConfig.dmaapContentType()),
 
 173             () -> assertEquals("c12", dmaapConsumerCpeAuthenticationConfig.consumerId()),
 
 174             () -> assertEquals("OpenDcae-c12", dmaapConsumerCpeAuthenticationConfig.consumerGroup()),
 
 175             () -> assertEquals(Integer.valueOf(-1), dmaapConsumerCpeAuthenticationConfig.timeoutMs()),
 
 176             () -> assertEquals(Integer.valueOf(1), dmaapConsumerCpeAuthenticationConfig.messageLimit())
 
 179         DmaapPublisherConfiguration dmaapPublisherConfiguration = configuration.getDmaapPublisherConfiguration();
 
 180         assertAll("DMaaP Publisher Configuration Properties",
 
 181             () -> assertEquals("test localhost", dmaapPublisherConfiguration.dmaapHostName()),
 
 182             () -> assertEquals(Integer.valueOf(1234), dmaapPublisherConfiguration.dmaapPortNumber()),
 
 183             () -> assertEquals("/events/unauthenticated.DCAE_CL_OUTPUT",
 
 184                     dmaapPublisherConfiguration.dmaapTopicName()),
 
 185             () -> assertEquals("http", dmaapPublisherConfiguration.dmaapProtocol()),
 
 186             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserName()),
 
 187             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserPassword()),
 
 188             () -> assertEquals("application/json", dmaapPublisherConfiguration.dmaapContentType())
 
 191         assertAll("Generic Application Properties",
 
 192             () -> assertEquals(30, configuration.getPipelinesPollingIntervalInSeconds()),
 
 193             () -> assertEquals(15, configuration.getPipelinesTimeoutInSeconds()),
 
 194             () -> assertEquals("reRegPolicyScope", configuration.getReRegistrationCloseLoopPolicyScope()),
 
 195             () -> assertEquals("cpeAuthPolicyScope", configuration.getCpeAuthenticationCloseLoopPolicyScope()),
 
 196             () -> assertEquals("reRegControlName", configuration.getReRegistrationCloseLoopControlName()),
 
 197             () -> assertEquals("cpeAuthControlName", configuration.getCpeAuthenticationCloseLoopControlName())
 
 202     void testB_passingNewConfiguration_UpdateSucceeds() {
 
 203         Map<String, GeneratedAppConfigObject.StreamsObject> subscribes = new HashMap<>();
 
 205         GeneratedAppConfigObject.DmaapInfo dmaapInfo1 = ImmutableDmaapInfo.builder()
 
 206                 .clientId("1500462518108")
 
 207                 .clientRole("com.dcae.member")
 
 209                 .topicUrl("https://we-are-message-router1.us:3901/events/unauthenticated.PNF_UPDATE")
 
 211         GeneratedAppConfigObject.StreamsObject streamsObject1 = ImmutableStreamsObject.builder()
 
 212                 .type("message_router")
 
 213                 .aafUsername("some-user")
 
 214                 .aafPassword("some-password")
 
 215                 .dmaapInfo(dmaapInfo1)
 
 217         GeneratedAppConfigObject.DmaapInfo dmaapInfo2 = ImmutableDmaapInfo.builder()
 
 218                 .clientId("1500462518108")
 
 219                 .clientRole("com.dcae.member")
 
 221                 .topicUrl("https://we-are-message-router2.us:3902/events/unauthenticated.CPE_AUTHENTICATION")
 
 223         GeneratedAppConfigObject.StreamsObject streamsObject2 = ImmutableStreamsObject.builder()
 
 224                 .type("message_router")
 
 225                 .aafUsername("some-user")
 
 226                 .aafPassword("some-password")
 
 227                 .dmaapInfo(dmaapInfo2)
 
 230         subscribes.put("config_key_1", streamsObject1);
 
 231         subscribes.put("config_key_2", streamsObject2);
 
 233         // Create Publishes Objects
 
 234         GeneratedAppConfigObject.DmaapInfo dmaapInfo3 = ImmutableDmaapInfo.builder()
 
 235                 .clientId("1500462518108")
 
 236                 .clientRole("com.dcae.member")
 
 238                 .topicUrl("https://we-are-message-router3.us:3903/events/unauthenticated.DCAE_CL_OUTPUT")
 
 240         GeneratedAppConfigObject.StreamsObject streamsObject3 = ImmutableStreamsObject.builder()
 
 241                 .type("message_router")
 
 242                 .aafUsername("some-user")
 
 243                 .aafPassword("some-password")
 
 244                 .dmaapInfo(dmaapInfo3)
 
 247         // Final config object
 
 248         GeneratedAppConfigObject updatedConfiguration = ImmutableGeneratedAppConfigObject.builder()
 
 249                 .dmaapProtocol("https")
 
 250                 .dmaapContentType("application/json")
 
 251                 .dmaapConsumerConsumerId("c13")
 
 252                 .dmaapConsumerConsumerGroup("OpenDcae-c13")
 
 253                 .dmaapMessageLimit(10)
 
 255                 .aaiHost("aai.onap.svc.cluster.local")
 
 258                 .aaiUsername("AAI-update")
 
 259                 .aaiPassword("AAI-update")
 
 260                 .aaiIgnoreSslCertificateErrors(false)
 
 261                 .pipelinesPollingIntervalSec(20)
 
 262                 .pipelinesTimeoutSec(20)
 
 263                 .cbsPollingIntervalSec(180)
 
 264                 .reRegistrationPolicyScope("policyScope-update")
 
 265                 .reRegistrationClControlName("controlName-update")
 
 266                 .cpeAuthPolicyScope("policyScope-update")
 
 267                 .cpeAuthClControlName("controlName-update")
 
 268                 .reRegConfigKey("config_key_1")
 
 269                 .cpeAuthConfigKey("config_key_2")
 
 270                 .closeLoopConfigKey("config_key_3")
 
 271                 .streamSubscribesMap(subscribes)
 
 272                 .streamPublishesMap(Collections.singletonMap("config_key_3", streamsObject3))
 
 275         // Update the configuration
 
 276         configuration.updateCurrentConfiguration(updatedConfiguration);
 
 278         AaiClientConfiguration aaiClientConfiguration = configuration.getAaiClientConfiguration();
 
 279         assertAll("AAI Client Configuration Properties",
 
 280             () -> assertEquals("aai.onap.svc.cluster.local", aaiClientConfiguration.aaiHost()),
 
 281             () -> assertEquals(Integer.valueOf(8443), aaiClientConfiguration.aaiPort()),
 
 282             () -> assertEquals("http", aaiClientConfiguration.aaiProtocol()),
 
 283             () -> assertEquals("AAI-update", aaiClientConfiguration.aaiUserName()),
 
 284             () -> assertEquals("AAI-update", aaiClientConfiguration.aaiUserPassword()),
 
 285             () -> assertFalse(aaiClientConfiguration.aaiIgnoreSslCertificateErrors()),
 
 286             () -> assertEquals("bbs", aaiClientConfiguration.aaiHeaders().get("X-FromAppId")),
 
 287             () -> assertEquals("9999", aaiClientConfiguration.aaiHeaders().get("X-TransactionId")),
 
 288             () -> assertEquals("application/json", aaiClientConfiguration.aaiHeaders().get("Accept")),
 
 289             () -> assertEquals("true", aaiClientConfiguration.aaiHeaders().get("Real-Time")),
 
 290             () -> assertEquals("application/merge-patch+json",
 
 291                         aaiClientConfiguration.aaiHeaders().get("Content-Type"))
 
 294         DmaapConsumerConfiguration dmaapConsumerReRegistrationConfig =
 
 295                 configuration.getDmaapReRegistrationConsumerConfiguration();
 
 296         assertAll("DMaaP Consumer Re-Registration Configuration Properties",
 
 297             () -> assertEquals("we-are-message-router1.us", dmaapConsumerReRegistrationConfig.dmaapHostName()),
 
 298             () -> assertEquals(Integer.valueOf(3901), dmaapConsumerReRegistrationConfig.dmaapPortNumber()),
 
 299             () -> assertEquals("/events/unauthenticated.PNF_UPDATE",
 
 300                     dmaapConsumerReRegistrationConfig.dmaapTopicName()),
 
 301             () -> assertEquals("https", dmaapConsumerReRegistrationConfig.dmaapProtocol()),
 
 302             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserName()),
 
 303             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserPassword()),
 
 304             () -> assertEquals("application/json", dmaapConsumerReRegistrationConfig.dmaapContentType()),
 
 305             () -> assertEquals("c13", dmaapConsumerReRegistrationConfig.consumerId()),
 
 306             () -> assertEquals("OpenDcae-c13", dmaapConsumerReRegistrationConfig.consumerGroup()),
 
 307             () -> assertEquals(Integer.valueOf(5), dmaapConsumerReRegistrationConfig.timeoutMs()),
 
 308             () -> assertEquals(Integer.valueOf(10), dmaapConsumerReRegistrationConfig.messageLimit())
 
 311         DmaapConsumerConfiguration dmaapConsumerCpeAuthenticationConfig =
 
 312                 configuration.getDmaapCpeAuthenticationConsumerConfiguration();
 
 313         assertAll("DMaaP Consumer CPE Authentication Configuration Properties",
 
 314             () -> assertEquals("we-are-message-router2.us", dmaapConsumerCpeAuthenticationConfig.dmaapHostName()),
 
 315             () -> assertEquals(Integer.valueOf(3902), dmaapConsumerCpeAuthenticationConfig.dmaapPortNumber()),
 
 316             () -> assertEquals("/events/unauthenticated.CPE_AUTHENTICATION",
 
 317                     dmaapConsumerCpeAuthenticationConfig.dmaapTopicName()),
 
 318             () -> assertEquals("https", dmaapConsumerCpeAuthenticationConfig.dmaapProtocol()),
 
 319             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserName()),
 
 320             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserPassword()),
 
 321             () -> assertEquals("application/json", dmaapConsumerCpeAuthenticationConfig.dmaapContentType()),
 
 322             () -> assertEquals("c13", dmaapConsumerCpeAuthenticationConfig.consumerId()),
 
 323             () -> assertEquals("OpenDcae-c13", dmaapConsumerCpeAuthenticationConfig.consumerGroup()),
 
 324             () -> assertEquals(Integer.valueOf(5), dmaapConsumerCpeAuthenticationConfig.timeoutMs()),
 
 325             () -> assertEquals(Integer.valueOf(10), dmaapConsumerCpeAuthenticationConfig.messageLimit())
 
 328         DmaapPublisherConfiguration dmaapPublisherConfiguration = configuration.getDmaapPublisherConfiguration();
 
 329         assertAll("DMaaP Publisher Configuration Properties",
 
 330             () -> assertEquals("we-are-message-router3.us", dmaapPublisherConfiguration.dmaapHostName()),
 
 331             () -> assertEquals(Integer.valueOf(3903), dmaapPublisherConfiguration.dmaapPortNumber()),
 
 332             () -> assertEquals("/events/unauthenticated.DCAE_CL_OUTPUT",
 
 333                     dmaapPublisherConfiguration.dmaapTopicName()),
 
 334             () -> assertEquals("https", dmaapPublisherConfiguration.dmaapProtocol()),
 
 335             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserName()),
 
 336             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserPassword()),
 
 337             () -> assertEquals("application/json", dmaapPublisherConfiguration.dmaapContentType())
 
 340         assertAll("Generic Application Properties",
 
 341             () -> assertEquals(20, configuration.getPipelinesPollingIntervalInSeconds()),
 
 342             () -> assertEquals(20, configuration.getPipelinesTimeoutInSeconds()),
 
 343             () -> assertEquals(180, configuration.getCbsPollingInterval()),
 
 344             () -> assertEquals("policyScope-update", configuration.getReRegistrationCloseLoopPolicyScope()),
 
 345             () -> assertEquals("policyScope-update", configuration.getCpeAuthenticationCloseLoopPolicyScope()),
 
 346             () -> assertEquals("controlName-update", configuration.getReRegistrationCloseLoopControlName()),
 
 347             () -> assertEquals("controlName-update", configuration.getCpeAuthenticationCloseLoopControlName())