From cec9b3deab76cc7f69ef03fc7fb538f386581f4b Mon Sep 17 00:00:00 2001 From: kurczews Date: Mon, 25 Mar 2019 09:36:25 +0100 Subject: Support for BBS logical link Issue-ID: DCAEGEN2-1362 Change-Id: I9dbe7c941d9b48e0cac16be9d3410855c51ef4b0 Signed-off-by: kurczews --- .../prh/exceptions/AaiFailureException.java | 28 ++++ .../services/prh/tasks/BbsActionsTask.java | 145 +++++++++++++++++++++ .../services/prh/tasks/ScheduledTasks.java | 19 ++- 3 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/exceptions/AaiFailureException.java create mode 100644 prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTask.java (limited to 'prh-app-server/src/main/java/org') diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/exceptions/AaiFailureException.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/exceptions/AaiFailureException.java new file mode 100644 index 00000000..6741bb2d --- /dev/null +++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/exceptions/AaiFailureException.java @@ -0,0 +1,28 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA Intellectual Property. 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.dcaegen2.services.prh.exceptions; + +public class AaiFailureException extends PrhTaskException { + + public AaiFailureException(String message) { + super(message); + } +} diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTask.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTask.java new file mode 100644 index 00000000..755d1282 --- /dev/null +++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTask.java @@ -0,0 +1,145 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA Intellectual Property. 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.dcaegen2.services.prh.tasks; + +import static org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpMethod.PUT; + +import com.google.gson.JsonObject; +import io.netty.buffer.ByteBuf; +import io.vavr.collection.HashMap; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; +import org.onap.dcaegen2.services.prh.configuration.Config; +import org.onap.dcaegen2.services.prh.exceptions.AaiFailureException; +import org.onap.dcaegen2.services.prh.model.ConsumerDmaapModel; +import org.onap.dcaegen2.services.prh.model.bbs.ImmutableLogicalLink; +import org.onap.dcaegen2.services.prh.model.bbs.ImmutableRelationship; +import org.onap.dcaegen2.services.prh.model.bbs.ImmutableRelationshipWrapper; +import org.onap.dcaegen2.services.prh.model.bbs.RelationshipWrapper; +import org.onap.dcaegen2.services.prh.model.utils.GsonSerializer; +import org.onap.dcaegen2.services.prh.model.utils.HttpUtils; +import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpResponse; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.ImmutableHttpRequest; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.RequestBody; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.RxHttpClient; +import org.onap.dcaegen2.services.sdk.rest.services.uri.URI.URIBuilder; +import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +@Component +public class BbsActionsTask { + + private static final Logger LOGGER = LoggerFactory.getLogger(BbsActionsTask.class); + private static final String ATTACHMENT_POINT = "attachmentPoint"; + private static final String LOGICAL_LINK_URI = "/network/logical-links/logical-link/"; + private static final String PNF_URI = "/network/pnfs/pnf/"; + + private final AaiClientConfiguration aaiConfig; + private final RxHttpClient httpClient; + + @Autowired + BbsActionsTask(Config config) { + this(config, RxHttpClient.create()); + } + + BbsActionsTask(Config config, RxHttpClient httpClient) { + this.aaiConfig = config.getAaiClientConfiguration(); + this.httpClient = httpClient; + } + + public Mono execute(ConsumerDmaapModel consumerDmaapModel) { + JsonObject additionalFields = consumerDmaapModel.getAdditionalFields(); + if (additionalFields == null || !additionalFields.has(ATTACHMENT_POINT)) { + return Mono.just(consumerDmaapModel); + } + String linkName = additionalFields.get(ATTACHMENT_POINT).getAsString(); + if (linkName.isEmpty()) { + LOGGER.warn("Attachment point is empty! Ignore related actions."); + return Mono.just(consumerDmaapModel); + } + String pnfName = consumerDmaapModel.getCorrelationId(); + return createLogicalLinkInAai(linkName, pnfName).flatMap(handleResponse(consumerDmaapModel)); + } + + private Function> handleResponse(ConsumerDmaapModel consumerDmaapModel) { + return response -> HttpUtils.isSuccessfulResponseCode(response.statusCode()) + ? Mono.just(consumerDmaapModel) + : Mono.error(new AaiFailureException( + "Incorrect response when performing BBS-related actions: " + response.statusCode())); + } + + private Mono createLogicalLinkInAai(String linkName, String pnfName) { + ImmutableHttpRequest request = buildLogicalLinkRequest(linkName, pnfName); + + return httpClient.call(request); + } + + private ImmutableHttpRequest buildLogicalLinkRequest(String linkName, String pnfName) { + String uri = buildLogicalLinkUri(linkName); + ImmutableLogicalLink logicalLink = buildModel(linkName, pnfName); + Publisher jsonPayload = RequestBody.fromString(GsonSerializer.createJsonBody(logicalLink)); + + return ImmutableHttpRequest + .builder() + .method(PUT) + .url(uri) + .body(jsonPayload) + .customHeaders(HashMap.ofAll(aaiConfig.aaiHeaders())) + .build(); + } + + private ImmutableLogicalLink buildModel(String linkName, String pnfName) { + List relationships = buildRelationLink(pnfName); + + return ImmutableLogicalLink + .builder() + .linkName(linkName) + .linkType(ATTACHMENT_POINT) + .relationshipList(relationships) + .build(); + } + + private List buildRelationLink(String pnfName) { + return Arrays.asList(ImmutableRelationshipWrapper + .builder() + .relationship(ImmutableRelationship + .builder() + .relatedLink(PNF_URI + pnfName) + .build()) + .build()); + } + + private String buildLogicalLinkUri(String linkName) { + return new URIBuilder() + .scheme(aaiConfig.aaiProtocol()) + .host(aaiConfig.aaiHost()) + .port(aaiConfig.aaiPort()) + .path(aaiConfig.aaiBasePath() + LOGICAL_LINK_URI + linkName) + .build() + .toString(); + } +} \ No newline at end of file diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/ScheduledTasks.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/ScheduledTasks.java index 6ae8a3c7..16a6f8c5 100644 --- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/ScheduledTasks.java +++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/ScheduledTasks.java @@ -54,6 +54,7 @@ public class ScheduledTasks { private final DmaapConsumerTask dmaapConsumerTask; private final DmaapPublisherTask dmaapProducerTask; private final AaiProducerTask aaiProducerTask; + private final BbsActionsTask bbsActionsTask; private Map mdcContextMap; /** @@ -64,11 +65,16 @@ public class ScheduledTasks { * @param aaiPublisherTask - second task */ @Autowired - public ScheduledTasks(DmaapConsumerTask dmaapConsumerTask, DmaapPublisherTask dmaapPublisherTask, - AaiProducerTask aaiPublisherTask, Map mdcContextMap) { + public ScheduledTasks( + DmaapConsumerTask dmaapConsumerTask, + DmaapPublisherTask dmaapPublisherTask, + AaiProducerTask aaiPublisherTask, + BbsActionsTask bbsActionsTask, + Map mdcContextMap) { this.dmaapConsumerTask = dmaapConsumerTask; this.dmaapProducerTask = dmaapPublisherTask; this.aaiProducerTask = aaiPublisherTask; + this.bbsActionsTask = bbsActionsTask; this.mdcContextMap = mdcContextMap; } @@ -88,6 +94,9 @@ public class ScheduledTasks { .doOnError(exception -> logger.warn("AAIProducerTask exception has been registered: ", exception)) .onErrorResume(resumePrhPredicate(), exception -> Mono.empty()) + .flatMap(this::processAdditionalFields) + .doOnError(exception -> + logger.warn("BBSActionsTask exception has been registered: ", exception)) .flatMap(this::publishToDmaapConfiguration) .doOnError(exception -> logger.warn("DMaaPProducerTask exception has been registered: ", exception)) @@ -102,7 +111,6 @@ public class ScheduledTasks { } } - private void onComplete() { logger.info("PRH tasks have been completed"); } @@ -121,7 +129,6 @@ public class ScheduledTasks { } } - private Flux consumeFromDMaaPMessage() { return Flux.defer(() -> { MdcVariables.setMdcContextMap(mdcContextMap); @@ -148,6 +155,10 @@ public class ScheduledTasks { } } + private Mono processAdditionalFields(ConsumerDmaapModel consumerDmaapModel) { + return bbsActionsTask.execute(consumerDmaapModel); + } + private Mono publishToDmaapConfiguration(ConsumerDmaapModel monoAaiModel) { try { return dmaapProducerTask.execute(monoAaiModel); -- cgit 1.2.3-korg