Replaced all tabs with spaces in java and pom.xml
[so.git] / common / src / main / java / org / onap / so / client / cds / CDSProcessingClient.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 Bell Canada.
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.onap.so.client.cds;
22
23 import io.grpc.ManagedChannel;
24 import io.grpc.internal.DnsNameResolverProvider;
25 import io.grpc.internal.PickFirstLoadBalancerProvider;
26 import io.grpc.netty.NettyChannelBuilder;
27 import java.util.concurrent.CountDownLatch;
28 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
29 import org.onap.so.client.PreconditionFailedException;
30 import org.onap.so.client.RestPropertiesLoader;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * <p>
36  * The CDS processing client is using gRPC for communication between SO and CDS. That communication is configured to use
37  * a streaming approach, meaning that client can send an event to which server can reply will multiple sub-responses,
38  * until full completion of the processing.
39  * </p>
40  * <p>
41  * In order for the caller to manage the callback, it is the responsibility of the caller to implement and provide a
42  * {@link CDSProcessingListener} so received messages can be handled appropriately.
43  * </p>
44  *
45  * Here is an example of implementation of such listener:
46  * 
47  * <pre>
48  * new CDSProcessingListener {
49  *
50  *     &#64;Override
51  *     public void onMessage(ExecutionServiceOutput message) {
52  *         log.info("Received notification from CDS: {}", message);
53  *     }
54  *
55  *     &#64;Override
56  *     public void onError(Throwable t) {
57  *         Status status = Status.fromThrowable(t);
58  *         log.error("Failed processing blueprint {}", status, t);
59  *     }
60  * }
61  * </pre>
62  */
63 public class CDSProcessingClient implements AutoCloseable {
64
65     private static final Logger log = LoggerFactory.getLogger(CDSProcessingClient.class);
66
67     private ManagedChannel channel;
68     private CDSProcessingHandler handler;
69
70     public CDSProcessingClient(final CDSProcessingListener listener) {
71         CDSProperties props = RestPropertiesLoader.getInstance().getNewImpl(CDSProperties.class);
72         if (props == null) {
73             throw new PreconditionFailedException(
74                     "No RestProperty.CDSProperties implementation found on classpath, can't create client.");
75         }
76         this.channel = NettyChannelBuilder.forAddress(props.getHost(), props.getPort())
77                 .nameResolverFactory(new DnsNameResolverProvider())
78                 .loadBalancerFactory(new PickFirstLoadBalancerProvider())
79                 .intercept(new BasicAuthClientInterceptor(props)).usePlaintext().build();
80         this.handler = new CDSProcessingHandler(listener);
81         log.info("CDSProcessingClient started");
82     }
83
84     CDSProcessingClient(final ManagedChannel channel, final CDSProcessingHandler handler) {
85         this.channel = channel;
86         this.handler = handler;
87     }
88
89     /**
90      * Sends a request to the CDS backend micro-service.
91      *
92      * The caller will be returned a CountDownLatch that can be used to define how long the processing can wait. The
93      * CountDownLatch is initiated with just 1 count. When the client receives an #onCompleted callback, the counter
94      * will decrement.
95      *
96      * It is the user responsibility to close the client.
97      *
98      * @param input request to send
99      * @return CountDownLatch instance that can be use to #await for completeness of processing
100      */
101     public CountDownLatch sendRequest(ExecutionServiceInput input) {
102         return handler.process(input, channel);
103     }
104
105     @Override
106     public void close() {
107         if (channel != null) {
108             channel.shutdown();
109         }
110         log.info("CDSProcessingClient stopped");
111     }
112 }