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.onap.bbs.event.processor.config.ApplicationConstants.STREAMS_TYPE;
 
  25 import java.util.HashSet;
 
  29 import org.jetbrains.annotations.NotNull;
 
  30 import org.onap.bbs.event.processor.exceptions.ApplicationEnvironmentException;
 
  31 import org.onap.bbs.event.processor.exceptions.ConfigurationParsingException;
 
  32 import org.onap.bbs.event.processor.model.GeneratedAppConfigObject;
 
  33 import org.onap.bbs.event.processor.utilities.LoggingUtil;
 
  34 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapConsumerConfiguration;
 
  35 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapPublisherConfiguration;
 
  36 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.ImmutableDmaapConsumerConfiguration;
 
  37 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.ImmutableDmaapPublisherConfiguration;
 
  38 import org.springframework.beans.factory.annotation.Autowired;
 
  39 import org.springframework.context.annotation.Configuration;
 
  42 public class ApplicationConfiguration implements ConfigurationChangeObservable {
 
  44     private final AaiClientProperties aaiClientProperties;
 
  45     private final DmaapReRegistrationConsumerProperties dmaapReRegistrationConsumerProperties;
 
  46     private final DmaapCpeAuthenticationConsumerProperties dmaapCpeAuthenticationConsumerProperties;
 
  47     private final DmaapProducerProperties dmaapProducerProperties;
 
  48     private final SecurityProperties securityProperties;
 
  49     private final GenericProperties genericProperties;
 
  51     private DmaapConsumerConfiguration dmaapReRegistrationConsumerConfiguration;
 
  52     private DmaapConsumerConfiguration dmaapCpeAuthenticationConsumerConfiguration;
 
  53     private DmaapPublisherConfiguration dmaapPublisherConfiguration;
 
  54     private AaiClientConfiguration aaiClientConfiguration;
 
  55     private Set<ConfigurationChangeObserver> observers;
 
  57     private int cbsPollingInterval;
 
  60      * Construct BBS event processor application configuration object.
 
  61      * @param aaiClientProperties Properties for AAI client setup
 
  62      * @param dmaapReRegistrationConsumerProperties Properties for DMaaP client setup (PNF re-registration)
 
  63      * @param dmaapCpeAuthenticationConsumerProperties Properties for DMaaP client setup (CPE authentication)
 
  64      * @param dmaapProducerProperties Properties for DMaaP client setup (Close Loop)
 
  65      * @param securityProperties General security properties
 
  66      * @param genericProperties General application properties
 
  69     public ApplicationConfiguration(AaiClientProperties aaiClientProperties,
 
  70                                     DmaapReRegistrationConsumerProperties dmaapReRegistrationConsumerProperties,
 
  71                                     DmaapCpeAuthenticationConsumerProperties dmaapCpeAuthenticationConsumerProperties,
 
  72                                     DmaapProducerProperties dmaapProducerProperties,
 
  73                                     SecurityProperties securityProperties,
 
  74                                     GenericProperties genericProperties) {
 
  75         this.aaiClientProperties = aaiClientProperties;
 
  76         this.dmaapReRegistrationConsumerProperties = dmaapReRegistrationConsumerProperties;
 
  77         this.dmaapCpeAuthenticationConsumerProperties = dmaapCpeAuthenticationConsumerProperties;
 
  78         this.dmaapProducerProperties = dmaapProducerProperties;
 
  79         this.securityProperties = securityProperties;
 
  80         this.genericProperties = genericProperties;
 
  81         observers = new HashSet<>();
 
  82         constructConfigurationObjects();
 
  86     public synchronized void register(ConfigurationChangeObserver observer) {
 
  87         observers.add(observer);
 
  91     public synchronized void unRegister(ConfigurationChangeObserver observer) {
 
  92         observers.remove(observer);
 
  96     public synchronized void notifyObservers() {
 
  97         observers.forEach(ConfigurationChangeObserver::updateConfiguration);
 
 100     public synchronized DmaapConsumerConfiguration getDmaapReRegistrationConsumerConfiguration() {
 
 101         return dmaapReRegistrationConsumerConfiguration;
 
 104     public synchronized DmaapConsumerConfiguration getDmaapCpeAuthenticationConsumerConfiguration() {
 
 105         return dmaapCpeAuthenticationConsumerConfiguration;
 
 108     public synchronized DmaapPublisherConfiguration getDmaapPublisherConfiguration() {
 
 109         return dmaapPublisherConfiguration;
 
 112     public synchronized AaiClientConfiguration getAaiClientConfiguration() {
 
 113         return aaiClientConfiguration;
 
 116     public synchronized int getPipelinesPollingIntervalInSeconds() {
 
 117         return genericProperties.getPipelinesPollingIntervalSec();
 
 120     public synchronized int getPipelinesTimeoutInSeconds() {
 
 121         return genericProperties.getPipelinesTimeoutSec();
 
 124     public synchronized String getPolicyVersion() {
 
 125         return genericProperties.getPolicyVersion();
 
 128     public synchronized String getCloseLoopTargetType() {
 
 129         return genericProperties.getClTargetType();
 
 132     public synchronized String getCloseLoopEventStatus() {
 
 133         return genericProperties.getClEventStatus();
 
 136     public synchronized String getCloseLoopVersion() {
 
 137         return genericProperties.getClVersion();
 
 140     public synchronized String getCloseLoopTarget() {
 
 141         return genericProperties.getClTarget();
 
 144     public String getCloseLoopOriginator() {
 
 145         return genericProperties.getClOriginator();
 
 148     public synchronized int getCbsPollingInterval() {
 
 149         return cbsPollingInterval;
 
 152     public synchronized String getReRegistrationCloseLoopPolicyScope() {
 
 153         return genericProperties.getReRegistration().getPolicyScope();
 
 156     public synchronized String getReRegistrationCloseLoopControlName() {
 
 157         return genericProperties.getReRegistration().getClControlName();
 
 160     public synchronized String getCpeAuthenticationCloseLoopPolicyScope() {
 
 161         return genericProperties.getCpeAuthentication().getPolicyScope();
 
 164     public synchronized String getCpeAuthenticationCloseLoopControlName() {
 
 165         return genericProperties.getCpeAuthentication().getClControlName();
 
 169      * Update current configuration based on the new configuration object fetched from Consul via CBS service of DCAE.
 
 170      * @param newConfiguration updated configuration object
 
 172     public void updateCurrentConfiguration(GeneratedAppConfigObject newConfiguration) {
 
 174         synchronized (this) {
 
 175             cbsPollingInterval = newConfiguration.cbsPollingIntervalSec();
 
 177             GeneratedAppConfigObject.StreamsObject reRegObject =
 
 178                     getStreamsObject(newConfiguration.streamSubscribesMap(), newConfiguration.reRegConfigKey(),
 
 179                             "PNF Re-Registration");
 
 180             TopicUrlInfo topicUrlInfo = parseTopicUrl(reRegObject.dmaapInfo().topicUrl());
 
 181             dmaapReRegistrationConsumerProperties.setDmaapHostName(topicUrlInfo.getHost());
 
 182             dmaapReRegistrationConsumerProperties.setDmaapPortNumber(topicUrlInfo.getPort());
 
 183             dmaapReRegistrationConsumerProperties.setDmaapProtocol(newConfiguration.dmaapProtocol());
 
 184             dmaapReRegistrationConsumerProperties.setDmaapContentType(newConfiguration.dmaapContentType());
 
 185             dmaapReRegistrationConsumerProperties.setDmaapTopicName(topicUrlInfo.getTopicName());
 
 186             dmaapReRegistrationConsumerProperties.setConsumerId(newConfiguration.dmaapConsumerConsumerId());
 
 187             dmaapReRegistrationConsumerProperties.setConsumerGroup(newConfiguration.dmaapConsumerConsumerGroup());
 
 188             dmaapReRegistrationConsumerProperties.setMessageLimit(newConfiguration.dmaapMessageLimit());
 
 189             dmaapReRegistrationConsumerProperties.setTimeoutMs(newConfiguration.dmaapTimeoutMs());
 
 190             constructDmaapReRegistrationConfiguration();
 
 192             GeneratedAppConfigObject.StreamsObject cpeAuthObject =
 
 193                     getStreamsObject(newConfiguration.streamSubscribesMap(), newConfiguration.cpeAuthConfigKey(),
 
 194                             "CPE Authentication");
 
 195             topicUrlInfo = parseTopicUrl(cpeAuthObject.dmaapInfo().topicUrl());
 
 196             dmaapCpeAuthenticationConsumerProperties.setDmaapHostName(topicUrlInfo.getHost());
 
 197             dmaapCpeAuthenticationConsumerProperties.setDmaapPortNumber(topicUrlInfo.getPort());
 
 198             dmaapCpeAuthenticationConsumerProperties.setDmaapProtocol(newConfiguration.dmaapProtocol());
 
 199             dmaapCpeAuthenticationConsumerProperties.setDmaapContentType(newConfiguration.dmaapContentType());
 
 200             dmaapCpeAuthenticationConsumerProperties.setDmaapTopicName(topicUrlInfo.getTopicName());
 
 201             dmaapCpeAuthenticationConsumerProperties.setConsumerId(newConfiguration.dmaapConsumerConsumerId());
 
 202             dmaapCpeAuthenticationConsumerProperties.setConsumerGroup(newConfiguration.dmaapConsumerConsumerGroup());
 
 203             dmaapCpeAuthenticationConsumerProperties.setMessageLimit(newConfiguration.dmaapMessageLimit());
 
 204             dmaapCpeAuthenticationConsumerProperties.setTimeoutMs(newConfiguration.dmaapTimeoutMs());
 
 205             constructDmaapCpeAuthenticationConfiguration();
 
 207             GeneratedAppConfigObject.StreamsObject closeLoopObject =
 
 208                     getStreamsObject(newConfiguration.streamPublishesMap(), newConfiguration.closeLoopConfigKey(),
 
 210             topicUrlInfo = parseTopicUrl(closeLoopObject.dmaapInfo().topicUrl());
 
 211             dmaapProducerProperties.setDmaapHostName(topicUrlInfo.getHost());
 
 212             dmaapProducerProperties.setDmaapPortNumber(topicUrlInfo.getPort());
 
 213             dmaapProducerProperties.setDmaapProtocol(newConfiguration.dmaapProtocol());
 
 214             dmaapProducerProperties.setDmaapContentType(newConfiguration.dmaapContentType());
 
 215             dmaapProducerProperties.setDmaapTopicName(topicUrlInfo.getTopicName());
 
 216             constructDmaapProducerConfiguration();
 
 218             aaiClientProperties.setAaiHost(newConfiguration.aaiHost());
 
 219             aaiClientProperties.setAaiPort(newConfiguration.aaiPort());
 
 220             aaiClientProperties.setAaiProtocol(newConfiguration.aaiProtocol());
 
 221             aaiClientProperties.setAaiUserName(newConfiguration.aaiUsername());
 
 222             aaiClientProperties.setAaiUserPassword(newConfiguration.aaiPassword());
 
 223             aaiClientProperties.setAaiIgnoreSslCertificateErrors(newConfiguration.aaiIgnoreSslCertificateErrors());
 
 224             constructAaiConfiguration();
 
 226             genericProperties.setPipelinesPollingIntervalSec(newConfiguration.pipelinesPollingIntervalSec());
 
 227             genericProperties.setPipelinesTimeoutSec(newConfiguration.pipelinesTimeoutSec());
 
 228             genericProperties.setPolicyVersion(newConfiguration.policyVersion());
 
 229             genericProperties.setClTargetType(newConfiguration.closeLoopTargetType());
 
 230             genericProperties.setClEventStatus(newConfiguration.closeLoopEventStatus());
 
 231             genericProperties.setClVersion(newConfiguration.closeLoopVersion());
 
 232             genericProperties.setClTarget(newConfiguration.closeLoopTarget());
 
 233             genericProperties.setClOriginator(newConfiguration.closeLoopOriginator());
 
 234             genericProperties.getReRegistration().setPolicyScope(newConfiguration.reRegistrationPolicyScope());
 
 235             genericProperties.getReRegistration().setClControlName(newConfiguration.reRegistrationClControlName());
 
 236             genericProperties.getCpeAuthentication().setPolicyScope(newConfiguration.cpeAuthPolicyScope());
 
 237             genericProperties.getCpeAuthentication().setClControlName(newConfiguration.cpeAuthClControlName());
 
 239             LoggingUtil.changeLoggingLevel(newConfiguration.loggingLevel());
 
 246     private GeneratedAppConfigObject.StreamsObject getStreamsObject(
 
 247             Map<String, GeneratedAppConfigObject.StreamsObject> map, String configKey, String messageName) {
 
 248         GeneratedAppConfigObject.StreamsObject streamsObject = map.get(configKey);
 
 249         if (!STREAMS_TYPE.equals(streamsObject.type())) {
 
 250             throw new ApplicationEnvironmentException(String.format("%s requires information about"
 
 251                     + " message-router topic in ONAP", messageName));
 
 253         return streamsObject;
 
 256     private void constructConfigurationObjects() {
 
 257         constructDmaapReRegistrationConfiguration();
 
 258         constructDmaapCpeAuthenticationConfiguration();
 
 259         constructDmaapProducerConfiguration();
 
 260         constructAaiConfiguration();
 
 263     private void constructDmaapReRegistrationConfiguration() {
 
 264         dmaapReRegistrationConsumerConfiguration = new ImmutableDmaapConsumerConfiguration.Builder()
 
 265                 .dmaapHostName(dmaapReRegistrationConsumerProperties.getDmaapHostName())
 
 266                 .dmaapPortNumber(dmaapReRegistrationConsumerProperties.getDmaapPortNumber())
 
 267                 .dmaapProtocol(dmaapReRegistrationConsumerProperties.getDmaapProtocol())
 
 268                 .dmaapTopicName(dmaapReRegistrationConsumerProperties.getDmaapTopicName())
 
 270                         dmaapReRegistrationConsumerProperties.getDmaapUserName() == null ? "" :
 
 271                                 dmaapReRegistrationConsumerProperties.getDmaapUserName())
 
 273                         dmaapReRegistrationConsumerProperties.getDmaapUserPassword() == null ? "" :
 
 274                                 dmaapReRegistrationConsumerProperties.getDmaapUserPassword())
 
 275                 .dmaapContentType(dmaapReRegistrationConsumerProperties.getDmaapContentType())
 
 276                 .consumerId(dmaapReRegistrationConsumerProperties.getConsumerId())
 
 277                 .consumerGroup(dmaapReRegistrationConsumerProperties.getConsumerGroup())
 
 278                 .timeoutMs(dmaapReRegistrationConsumerProperties.getTimeoutMs())
 
 279                 .messageLimit(dmaapReRegistrationConsumerProperties.getMessageLimit())
 
 280                 .enableDmaapCertAuth(securityProperties.isEnableDmaapCertAuth())
 
 281                 .keyStorePath(securityProperties.getKeyStorePath())
 
 282                 .keyStorePasswordPath(securityProperties.getKeyStorePasswordPath())
 
 283                 .trustStorePath(securityProperties.getTrustStorePath())
 
 284                 .trustStorePasswordPath(securityProperties.getTrustStorePasswordPath())
 
 288     private void constructDmaapCpeAuthenticationConfiguration() {
 
 289         dmaapCpeAuthenticationConsumerConfiguration = new ImmutableDmaapConsumerConfiguration.Builder()
 
 290                 .dmaapHostName(dmaapCpeAuthenticationConsumerProperties.getDmaapHostName())
 
 291                 .dmaapPortNumber(dmaapCpeAuthenticationConsumerProperties.getDmaapPortNumber())
 
 292                 .dmaapProtocol(dmaapCpeAuthenticationConsumerProperties.getDmaapProtocol())
 
 293                 .dmaapTopicName(dmaapCpeAuthenticationConsumerProperties.getDmaapTopicName())
 
 295                         dmaapCpeAuthenticationConsumerProperties.getDmaapUserName() == null ? "" :
 
 296                                 dmaapCpeAuthenticationConsumerProperties.getDmaapUserName())
 
 298                         dmaapCpeAuthenticationConsumerProperties.getDmaapUserPassword() == null ? "" :
 
 299                                 dmaapCpeAuthenticationConsumerProperties.getDmaapUserPassword())
 
 300                 .dmaapContentType(dmaapCpeAuthenticationConsumerProperties.getDmaapContentType())
 
 301                 .consumerId(dmaapCpeAuthenticationConsumerProperties.getConsumerId())
 
 302                 .consumerGroup(dmaapCpeAuthenticationConsumerProperties.getConsumerGroup())
 
 303                 .timeoutMs(dmaapCpeAuthenticationConsumerProperties.getTimeoutMs())
 
 304                 .messageLimit(dmaapCpeAuthenticationConsumerProperties.getMessageLimit())
 
 305                 .enableDmaapCertAuth(securityProperties.isEnableDmaapCertAuth())
 
 306                 .keyStorePath(securityProperties.getKeyStorePath())
 
 307                 .keyStorePasswordPath(securityProperties.getKeyStorePasswordPath())
 
 308                 .trustStorePath(securityProperties.getTrustStorePath())
 
 309                 .trustStorePasswordPath(securityProperties.getTrustStorePasswordPath())
 
 313     private void constructDmaapProducerConfiguration() {
 
 314         dmaapPublisherConfiguration = new ImmutableDmaapPublisherConfiguration.Builder()
 
 315                 .dmaapHostName(dmaapProducerProperties.getDmaapHostName())
 
 316                 .dmaapPortNumber(dmaapProducerProperties.getDmaapPortNumber())
 
 317                 .dmaapProtocol(dmaapProducerProperties.getDmaapProtocol())
 
 318                 .dmaapTopicName(dmaapProducerProperties.getDmaapTopicName())
 
 320                         dmaapProducerProperties.getDmaapUserName() == null ? "" :
 
 321                                 dmaapProducerProperties.getDmaapUserName())
 
 323                         dmaapProducerProperties.getDmaapUserPassword() == null ? "" :
 
 324                                 dmaapProducerProperties.getDmaapUserPassword())
 
 325                 .dmaapContentType(dmaapProducerProperties.getDmaapContentType())
 
 326                 .enableDmaapCertAuth(securityProperties.isEnableDmaapCertAuth())
 
 327                 .keyStorePath(securityProperties.getKeyStorePath())
 
 328                 .keyStorePasswordPath(securityProperties.getKeyStorePasswordPath())
 
 329                 .trustStorePath(securityProperties.getTrustStorePath())
 
 330                 .trustStorePasswordPath(securityProperties.getTrustStorePasswordPath())
 
 334     private void constructAaiConfiguration() {
 
 335         aaiClientConfiguration = new ImmutableAaiClientConfiguration.Builder()
 
 336                 .aaiHost(aaiClientProperties.getAaiHost())
 
 337                 .aaiPort(aaiClientProperties.getAaiPort())
 
 338                 .aaiProtocol(aaiClientProperties.getAaiProtocol())
 
 339                 .aaiUserName(aaiClientProperties.getAaiUserName())
 
 340                 .aaiUserPassword(aaiClientProperties.getAaiUserPassword())
 
 341                 .aaiHeaders(aaiClientProperties.getAaiHeaders())
 
 342                 .aaiIgnoreSslCertificateErrors(aaiClientProperties.isAaiIgnoreSslCertificateErrors())
 
 343                 .enableAaiCertAuth(securityProperties.isEnableAaiCertAuth())
 
 344                 .keyStorePath(securityProperties.getKeyStorePath())
 
 345                 .keyStorePasswordPath(securityProperties.getKeyStorePasswordPath())
 
 346                 .trustStorePath(securityProperties.getTrustStorePath())
 
 347                 .trustStorePasswordPath(securityProperties.getTrustStorePasswordPath())
 
 351     private TopicUrlInfo parseTopicUrl(String topicUrl) {
 
 352         String[] urlTokens = topicUrl.split(":");
 
 353         if (urlTokens.length != 3) {
 
 354             throw new ConfigurationParsingException("Wrong topic URL format");
 
 356         TopicUrlInfo topicUrlInfo = new TopicUrlInfo();
 
 357         topicUrlInfo.setHost(urlTokens[1].replace("/", ""));
 
 359         String[] tokensAfterHost = urlTokens[2].split("/events/");
 
 360         if (tokensAfterHost.length != 2) {
 
 361             throw new ConfigurationParsingException("Wrong topic name structure");
 
 363         topicUrlInfo.setPort(Integer.valueOf(tokensAfterHost[0]));
 
 364         topicUrlInfo.setTopicName("/events/" + tokensAfterHost[1]);
 
 369     private static class TopicUrlInfo {
 
 372         private String topicName;
 
 378         void setHost(String host) {
 
 386         void setPort(int port) {
 
 390         String getTopicName() {
 
 394         void setTopicName(String topicName) {
 
 395             this.topicName = topicName;