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.utilities;
 
  23 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
 
  24 import static com.github.tomakehurst.wiremock.client.WireMock.get;
 
  25 import static com.github.tomakehurst.wiremock.client.WireMock.givenThat;
 
  26 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
 
  27 import static org.mockito.Mockito.when;
 
  29 import com.github.tomakehurst.wiremock.WireMockServer;
 
  30 import com.github.tomakehurst.wiremock.client.WireMock;
 
  31 import com.google.gson.Gson;
 
  32 import com.google.gson.GsonBuilder;
 
  33 import com.google.gson.TypeAdapterFactory;
 
  35 import java.util.Arrays;
 
  36 import java.util.Collections;
 
  37 import java.util.HashMap;
 
  38 import java.util.ServiceLoader;
 
  40 import javax.net.ssl.SSLException;
 
  42 import org.junit.jupiter.api.AfterEach;
 
  43 import org.junit.jupiter.api.Assertions;
 
  44 import org.junit.jupiter.api.BeforeAll;
 
  45 import org.junit.jupiter.api.BeforeEach;
 
  46 import org.junit.jupiter.api.Test;
 
  47 import org.junit.jupiter.api.extension.ExtendWith;
 
  48 import org.mockito.Mockito;
 
  49 import org.onap.bbs.event.processor.config.AaiClientConfiguration;
 
  50 import org.onap.bbs.event.processor.config.ApplicationConfiguration;
 
  51 import org.onap.bbs.event.processor.model.ImmutableMetadataEntryAaiObject;
 
  52 import org.onap.bbs.event.processor.model.ImmutableMetadataListAaiObject;
 
  53 import org.onap.bbs.event.processor.model.ImmutablePnfAaiObject;
 
  54 import org.onap.bbs.event.processor.model.ImmutablePropertyAaiObject;
 
  55 import org.onap.bbs.event.processor.model.ImmutableRelationshipDataEntryAaiObject;
 
  56 import org.onap.bbs.event.processor.model.ImmutableRelationshipEntryAaiObject;
 
  57 import org.onap.bbs.event.processor.model.ImmutableRelationshipListAaiObject;
 
  58 import org.onap.bbs.event.processor.model.ImmutableServiceInstanceAaiObject;
 
  59 import org.onap.bbs.event.processor.model.MetadataListAaiObject;
 
  60 import org.onap.bbs.event.processor.model.PnfAaiObject;
 
  61 import org.onap.bbs.event.processor.model.RelationshipListAaiObject;
 
  62 import org.onap.bbs.event.processor.model.ServiceInstanceAaiObject;
 
  63 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
  65 import reactor.test.StepVerifier;
 
  67 @ExtendWith(SpringExtension.class)
 
  68 class AaiReactiveClientTest {
 
  70     private static final int PORT = 9999;
 
  72     private static AaiReactiveClient reactiveClient;
 
  73     private static Gson gson;
 
  74     private static WireMockServer wireMockServer;
 
  77     static void init() throws SSLException {
 
  78         GsonBuilder gsonBuilder = new GsonBuilder();
 
  79         ServiceLoader.load(TypeAdapterFactory.class).forEach(gsonBuilder::registerTypeAdapterFactory);
 
  80         gson = gsonBuilder.create();
 
  82         ApplicationConfiguration configuration = Mockito.mock(ApplicationConfiguration.class);
 
  83         AaiClientConfiguration aaiClientConfiguration = Mockito.mock(AaiClientConfiguration.class);
 
  84         when(configuration.getAaiClientConfiguration()).thenReturn(aaiClientConfiguration);
 
  85         when(aaiClientConfiguration.aaiUserName()).thenReturn("AAI");
 
  86         when(aaiClientConfiguration.aaiUserPassword()).thenReturn("AAI");
 
  87         when(aaiClientConfiguration.aaiHeaders()).thenReturn(new HashMap<>());
 
  88         when(aaiClientConfiguration.enableAaiCertAuth()).thenReturn(false);
 
  90         reactiveClient = new AaiReactiveClient(configuration, gson);
 
  92         wireMockServer = new WireMockServer(PORT);
 
  93         WireMock.configureFor("localhost", PORT);
 
  97     void wireMockSetup() {
 
  98         wireMockServer.start();
 
 102     void wireMockTearDown() {
 
 103         wireMockServer.start();
 
 107     void sendingReactiveRequestForPnf_Succeeds() {
 
 109         String pnfName = "pnf-1";
 
 110         String attachmentPoint = "olt1-1-1";
 
 112         String pnfUrl = String.format("/aai/v14/network/pnfs/pnf/%s?depth=1", pnfName);
 
 114         // Build Relationship Data
 
 115         RelationshipListAaiObject.RelationshipEntryAaiObject firstRelationshipEntry =
 
 116                 ImmutableRelationshipEntryAaiObject.builder()
 
 117                         .relatedTo("service-instance")
 
 118                         .relatedLink("/aai/v14/business/customers/customer/Demonstration/service-subscriptions"
 
 119                                 + "/service-subscription/BBS/service-instances"
 
 120                                 + "/service-instance/84003b26-6b76-4c75-b805-7b14ab4ffaef")
 
 121                         .relationshipLabel("org.onap.relationships.inventory.ComposedOf")
 
 122                         .relationshipData(Arrays.asList(
 
 123                                 ImmutableRelationshipDataEntryAaiObject.builder()
 
 124                                         .relationshipKey("customer.global-customer-id")
 
 125                                         .relationshipValue("Demonstration").build(),
 
 126                                 ImmutableRelationshipDataEntryAaiObject.builder()
 
 127                                         .relationshipKey("service-subscription.service-type")
 
 128                                         .relationshipValue("BBS").build(),
 
 129                                 ImmutableRelationshipDataEntryAaiObject.builder()
 
 130                                         .relationshipKey("service-instance.service-instance-id")
 
 131                                         .relationshipValue("84003b26-6b76-4c75-b805-7b14ab4ffaef").build())
 
 133                         .relatedToProperties(Collections.singletonList(
 
 134                                 ImmutablePropertyAaiObject.builder()
 
 135                                         .propertyKey("service-instance.service-instance-name")
 
 136                                         .propertyValue("bbs-instance").build())
 
 140         RelationshipListAaiObject.RelationshipEntryAaiObject secondRelationshipEntry =
 
 141                 ImmutableRelationshipEntryAaiObject.builder()
 
 142                         .relatedTo("logical-link")
 
 143                         .relatedLink("/network/logical-links/logical-link/" + attachmentPoint)
 
 144                         .relationshipData(Collections.singletonList(ImmutableRelationshipDataEntryAaiObject.builder()
 
 145                                 .relationshipKey("logical-link.link-name")
 
 146                                 .relationshipValue(attachmentPoint).build()))
 
 149         RelationshipListAaiObject relationshipListAaiObject = ImmutableRelationshipListAaiObject.builder()
 
 150                 .relationshipEntries(Arrays.asList(firstRelationshipEntry, secondRelationshipEntry))
 
 153         // Finally construct PNF object data
 
 154         PnfAaiObject pnfAaiObject = ImmutablePnfAaiObject.builder()
 
 156                 .isInMaintenance(true)
 
 157                 .relationshipListAaiObject(relationshipListAaiObject)
 
 160         givenThat(get(urlEqualTo(pnfUrl))
 
 161                 .willReturn(aResponse().withStatus(200)
 
 162                         .withHeader("Content-Type", "application/json")
 
 163                         .withBody(gson.toJson(pnfAaiObject, ImmutablePnfAaiObject.class))));
 
 165         StepVerifier.create(reactiveClient.getPnfObjectDataFor("http://127.0.0.1:" + PORT + pnfUrl))
 
 166                 .expectSubscription()
 
 167                 .consumeNextWith(pnf -> {
 
 168                     Assertions.assertEquals(pnfName, pnf.getPnfName(), "PNF Name in response does not match");
 
 169                     String extractedAttachmentPoint = pnf.getRelationshipListAaiObject().getRelationshipEntries()
 
 171                             .filter(e -> e.getRelatedTo().equals("logical-link"))
 
 172                             .flatMap(e -> e.getRelationshipData().stream())
 
 173                             .filter(d -> d.getRelationshipKey().equals("logical-link.link-name"))
 
 174                             .map(RelationshipListAaiObject.RelationshipDataEntryAaiObject::getRelationshipValue)
 
 175                             .findFirst().orElseThrow(AaiReactiveClientTestException::new);
 
 176                     Assertions.assertEquals(attachmentPoint, extractedAttachmentPoint,
 
 177                             "Attachment point in response does not match");
 
 183     void sendingReactiveRequestForServiceInstance_Succeeds() {
 
 185         String serviceInstanceId = "84003b26-6b76-4c75-b805-7b14ab4ffaef";
 
 186         String orchestrationStatus = "active";
 
 188         String serviceInstanceUrl =
 
 189                 String.format("/aai/v14/nodes/service-instances/service-instance/%s?format=resource_and_url",
 
 192         // Build Relationship Data
 
 193         RelationshipListAaiObject.RelationshipEntryAaiObject relationshipEntry =
 
 194                 ImmutableRelationshipEntryAaiObject.builder()
 
 195                         .relatedTo("service-instance")
 
 196                         .relatedLink("/aai/v14/business/customers/customer/Demonstration/service-subscriptions"
 
 197                                 + "/service-subscription/BBS-CFS/service-instances"
 
 198                                 + "/service-instance/bb374844-44e4-488f-8381-fb5a0e3e6989")
 
 199                         .relationshipLabel("org.onap.relationships.inventory.ComposedOf")
 
 200                         .relationshipData(Collections.singletonList(ImmutableRelationshipDataEntryAaiObject.builder()
 
 201                                 .relationshipKey("service-instance.service-instance-id")
 
 202                                 .relationshipValue("bb374844-44e4-488f-8381-fb5a0e3e6989").build()))
 
 205         RelationshipListAaiObject relationshipListAaiObject = ImmutableRelationshipListAaiObject.builder()
 
 206                 .relationshipEntries(Collections.singletonList(relationshipEntry))
 
 209         MetadataListAaiObject.MetadataEntryAaiObject metadataEntry =
 
 210                 ImmutableMetadataEntryAaiObject.builder()
 
 215         MetadataListAaiObject metadataListAaiObject = ImmutableMetadataListAaiObject.builder()
 
 216                 .metadataEntries(Collections.singletonList(metadataEntry))
 
 219         // Finally construct Service Instance object data
 
 220         ServiceInstanceAaiObject serviceInstanceAaiObject = ImmutableServiceInstanceAaiObject.builder()
 
 221                 .serviceInstanceId(serviceInstanceId)
 
 222                 .orchestrationStatus(orchestrationStatus)
 
 223                 .relationshipListAaiObject(relationshipListAaiObject)
 
 224                 .metadataListAaiObject(metadataListAaiObject)
 
 227         givenThat(get(urlEqualTo(serviceInstanceUrl))
 
 228                 .willReturn(aResponse().withStatus(200)
 
 229                         .withHeader("Content-Type", "application/json")
 
 230                         .withBody(gson.toJson(serviceInstanceAaiObject, ImmutableServiceInstanceAaiObject.class))));
 
 233                 reactiveClient.getServiceInstanceObjectDataFor("http://127.0.0.1:" + PORT + serviceInstanceUrl)
 
 235                 .expectSubscription()
 
 236                 .consumeNextWith(serviceInstance -> {
 
 237                     Assertions.assertEquals(serviceInstanceId, serviceInstance.getServiceInstanceId(),
 
 238                             "Service Instance ID in response does not match");
 
 240                     MetadataListAaiObject extractedMetadataListObject =
 
 241                             serviceInstance.getMetadataListAaiObject().orElseThrow(AaiReactiveClientTestException::new);
 
 243                     MetadataListAaiObject.MetadataEntryAaiObject extractedMetadataEntry =
 
 244                             extractedMetadataListObject.getMetadataEntries()
 
 246                             .filter(m -> m.getMetaname().equals("cvlan"))
 
 247                             .findFirst().orElseThrow(AaiReactiveClientTestException::new);
 
 249                     Assertions.assertEquals("1005", extractedMetadataEntry.getMetavalue(),
 
 250                             "CVLAN in response does not match");
 
 255     private static class AaiReactiveClientTestException extends RuntimeException {}