Improve test coverage for requestdbclient
[so.git] / mso-api-handlers / mso-requests-db / src / main / java / org / onap / so / db / request / client / RequestsDbClient.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T 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
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.db.request.client;
22
23 import org.apache.http.HttpStatus;
24 import org.onap.so.db.request.beans.ArchivedInfraRequests;
25 import org.onap.so.db.request.beans.InfraActiveRequests;
26 import org.onap.so.db.request.beans.OperationStatus;
27 import org.onap.so.db.request.beans.OperationalEnvDistributionStatus;
28 import org.onap.so.db.request.beans.OperationalEnvServiceModelStatus;
29 import org.onap.so.db.request.beans.RequestProcessingData;
30 import org.onap.so.db.request.beans.ResourceOperationStatus;
31 import org.onap.so.db.request.beans.SiteStatus;
32 import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
33 import org.onap.so.db.request.beans.WatchdogDistributionStatus;
34 import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup;
35 import org.onap.so.db.request.data.controller.InstanceNameDuplicateCheckRequest;
36 import org.springframework.beans.factory.annotation.Autowired;
37 import org.springframework.beans.factory.annotation.Value;
38 import org.springframework.context.annotation.Primary;
39 import org.springframework.core.ParameterizedTypeReference;
40 import org.springframework.http.HttpEntity;
41 import org.springframework.http.HttpHeaders;
42 import org.springframework.http.HttpMethod;
43 import org.springframework.http.HttpRequest;
44 import org.springframework.http.client.ClientHttpRequestExecution;
45 import org.springframework.http.client.ClientHttpRequestInterceptor;
46 import org.springframework.http.client.ClientHttpResponse;
47 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
48 import org.springframework.stereotype.Component;
49 import org.springframework.web.client.HttpClientErrorException;
50 import org.springframework.web.client.RestTemplate;
51 import uk.co.blackpepper.bowman.Client;
52 import uk.co.blackpepper.bowman.ClientFactory;
53 import uk.co.blackpepper.bowman.Configuration;
54 import uk.co.blackpepper.bowman.RestTemplateConfigurer;
55
56 import javax.annotation.PostConstruct;
57 import javax.ws.rs.core.UriBuilder;
58 import java.io.IOException;
59 import java.net.URI;
60 import java.util.ArrayList;
61 import java.util.HashMap;
62 import java.util.Iterator;
63 import java.util.List;
64 import java.util.Map;
65
66 @Component("RequestsDbClient")
67 @Primary
68 public class RequestsDbClient {
69
70         private static final String SERVICE_ID = "SERVICE_ID";
71         private static final String OPERATION_ID = "OPERATION_ID";
72         private static final String SO_REQUEST_ID = "SO_REQUEST_ID";
73         private static final String GROUPING_ID = "GROUPING_ID";
74         private static final String REQUEST_ID = "REQUEST_ID";
75         private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENVIRONMENT_ID";
76         private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
77         private static final String NAME = "NAME";
78         private static final String VALUE = "VALUE";
79         private static final String TAG = "TAG";
80         
81         private Client<InfraActiveRequests> infraActiveRequestClient;
82         private Client<RequestProcessingData> requestProcessingDataClient;
83         private final Client<OperationalEnvDistributionStatus> distributionStatusClient;
84         private final Client<OperationalEnvServiceModelStatus> serviceModelStatusClient;
85
86         @Value("${mso.adapters.requestDb.endpoint}")
87         protected String endpoint;
88
89         @Value("${mso.adapters.requestDb.auth}")
90         private String msoAdaptersAuth;
91
92         private String getOrchestrationFilterURI = "/infraActiveRequests/getOrchestrationFiltersFromInfraActive/";
93         private static final String OPERATION_STATUS_SEARCH = "/operationStatus/search";
94         private static final String OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH = "/operationalEnvServiceModelStatus/search";
95
96
97         private String checkVnfIdStatus = "/infraActiveRequests/checkVnfIdStatus/";
98
99         private String infraActiveRequestURI = "/infraActiveRequests/";
100
101         private String checkInstanceNameDuplicate = "/infraActiveRequests/checkInstanceNameDuplicate";
102         
103         private String operationalEnvDistributionStatusURI = "/operationalEnvDistributionStatus/";
104         
105         private String findOneByServiceIdAndOperationIdURI = "/findOneByServiceIdAndOperationId";
106         
107         private String findOneByOperationalEnvIdAndServiceModelVersionIdURI = "/findOneByOperationalEnvIdAndServiceModelVersionId";
108         
109         private String findAllByOperationalEnvIdAndRequestIdURI = "/findAllByOperationalEnvIdAndRequestId";
110
111         private String cloudOrchestrationFiltersFromInfraActive = "/infraActiveRequests/getCloudOrchestrationFiltersFromInfraActive";
112         
113         private String requestProcessingDataURI = "/requestProcessingData";
114         
115         private String findOneBySoRequestIdAndGroupingIdAndNameAndTagURI = "/requestProcessingData/search/findOneBySoRequestIdAndGroupingIdAndNameAndTag/";
116
117         private String findBySoRequestIdOrderByGroupingIdDesc = "/requestProcessingData/search/findBySoRequestIdOrderByGroupingIdDesc/";
118
119         protected HttpHeaders headers;
120
121         protected RestTemplate restTemplate;
122         
123         @Autowired
124         ClassURLMapper classURLMapper;
125
126         @PostConstruct
127         public void init() {
128                 getOrchestrationFilterURI = endpoint + getOrchestrationFilterURI;
129                 infraActiveRequestURI = endpoint + infraActiveRequestURI;
130                 checkVnfIdStatus = endpoint + checkVnfIdStatus;
131                 checkInstanceNameDuplicate = endpoint + checkInstanceNameDuplicate;
132                 cloudOrchestrationFiltersFromInfraActive = endpoint + cloudOrchestrationFiltersFromInfraActive;
133                 findOneByServiceIdAndOperationIdURI = endpoint + OPERATION_STATUS_SEARCH + findOneByServiceIdAndOperationIdURI;
134                 requestProcessingDataURI = endpoint + requestProcessingDataURI;
135                 operationalEnvDistributionStatusURI = endpoint + operationalEnvDistributionStatusURI;
136                 findOneByOperationalEnvIdAndServiceModelVersionIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findOneByOperationalEnvIdAndServiceModelVersionIdURI;
137                 findAllByOperationalEnvIdAndRequestIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findAllByOperationalEnvIdAndRequestIdURI;
138                 headers = new HttpHeaders();
139                 headers.set("Authorization", msoAdaptersAuth);
140                 restTemplate = restTemplate();
141         }
142
143         public RequestsDbClient() {
144                 ClientFactory clientFactory = Configuration.builder().setRestTemplateConfigurer(new RestTemplateConfigurer() {
145
146                         public void configure(RestTemplate restTemplate) {
147
148                                 restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
149
150                                         public ClientHttpResponse intercept(HttpRequest request, byte[] body,
151                                                         ClientHttpRequestExecution execution) throws IOException {
152
153                                                 request.getHeaders().add("Authorization", msoAdaptersAuth);
154                                                 return execution.execute(request, body);
155                                         }
156                                 });
157                         }
158                 }).build().buildClientFactory();
159                 infraActiveRequestClient = clientFactory.create(InfraActiveRequests.class);
160                 requestProcessingDataClient = clientFactory.create(RequestProcessingData.class);
161                 distributionStatusClient = clientFactory.create(OperationalEnvDistributionStatus.class);
162                 serviceModelStatusClient = clientFactory.create(OperationalEnvServiceModelStatus.class);
163         }
164         
165         public List<InfraActiveRequests> getCloudOrchestrationFiltersFromInfraActive(Map<String, String> orchestrationMap){
166                 URI uri = getUri(cloudOrchestrationFiltersFromInfraActive);
167                 HttpEntity<Map> entity = new HttpEntity<>(orchestrationMap, headers);
168                 try{
169                         return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
170                 }catch(HttpClientErrorException e){
171                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
172                                 return null;
173                         }
174                         throw e;
175                 }
176         }
177
178     public InfraActiveRequests getInfraActiveRequestbyRequestId(String requestId) {
179         try {
180             InfraActiveRequests infraActiveRequests = restTemplate.exchange(getUri(endpoint + "/infraActiveRequests/" + requestId), HttpMethod.GET, HttpEntity.EMPTY, InfraActiveRequests.class).getBody();
181             if (infraActiveRequests != null) {
182                 infraActiveRequests.setRequestId(requestId);
183             }
184             return infraActiveRequests;
185         } catch (HttpClientErrorException e) {
186             if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
187                 return null;
188             }
189             throw e;
190         }
191     }
192
193         public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive(Map<String, List<String>> orchestrationMap) {
194                 URI uri = getUri(getOrchestrationFilterURI);
195                 HttpEntity<Map<String, List<String>>> entity = new HttpEntity<>(orchestrationMap, headers);
196                 return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
197         }
198
199         public InfraActiveRequests checkVnfIdStatus(String operationalEnvironmentId) {
200                 URI uri = getUri(checkVnfIdStatus + operationalEnvironmentId);
201                 return restTemplate.exchange(uri, HttpMethod.GET, HttpEntity.EMPTY, InfraActiveRequests.class).getBody();
202         }
203         public InfraActiveRequests checkInstanceNameDuplicate(HashMap<String, String> instanceIdMap, String instanceName, String requestScope) {
204                 URI uri = getUri(checkInstanceNameDuplicate);
205                 HttpEntity<InstanceNameDuplicateCheckRequest> entity = new HttpEntity<>(new InstanceNameDuplicateCheckRequest(instanceIdMap, instanceName, requestScope), headers);
206                 try{
207                         return restTemplate.exchange(uri, HttpMethod.POST, entity, InfraActiveRequests.class).getBody();
208                 }catch(HttpClientErrorException e){
209                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
210                                 return null;
211                         }
212                         throw e;
213                 }
214
215         }
216
217         public OperationStatus getOneByServiceIdAndOperationId(String serviceId, String operationId) {
218                 try {
219                         OperationStatus operationStatus = restTemplate.exchange(UriBuilder.fromUri(getUri(findOneByServiceIdAndOperationIdURI))
220                                         .queryParam(SERVICE_ID, serviceId)
221                                         .queryParam(OPERATION_ID, operationId)
222                                         .build(), HttpMethod.GET, HttpEntity.EMPTY, OperationStatus.class).getBody();
223                         if (operationStatus != null) {
224                                 operationStatus.setServiceId(serviceId);
225                                 operationStatus.setOperationId(operationId);
226                         }
227
228                         return operationStatus;
229                 } catch (HttpClientErrorException e) {
230                         if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
231                                 return null;
232                         }
233                         throw e;
234                 }
235         }
236         
237         public OperationalEnvServiceModelStatus findOneByOperationalEnvIdAndServiceModelVersionId(String operationalEnvironmentId, String serviceModelVersionId) {
238                 return this.getSingleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findOneByOperationalEnvIdAndServiceModelVersionIdURI)
239                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
240                                 .queryParam(SERVICE_MODEL_VERSION_ID,serviceModelVersionId)
241                                 .build());
242         }
243
244         public List<OperationalEnvServiceModelStatus> getAllByOperationalEnvIdAndRequestId(String operationalEnvironmentId, String requestId){
245                 return this.getMultipleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findAllByOperationalEnvIdAndRequestIdURI)
246                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
247                                 .queryParam(REQUEST_ID,requestId)
248                                 .build());
249         }
250         
251         public OperationalEnvDistributionStatus getDistributionStatusById(String distributionId){
252                 return this.getSingleOperationalEnvDistributionStatus(UriBuilder.fromUri(operationalEnvDistributionStatusURI+distributionId).build());
253         }
254         
255         private OperationalEnvServiceModelStatus getSingleOperationalEnvServiceModelStatus(URI uri){
256                 return serviceModelStatusClient.get(uri);
257         }
258
259         private List<OperationalEnvServiceModelStatus> getMultipleOperationalEnvServiceModelStatus(URI uri){
260                 Iterable <OperationalEnvServiceModelStatus> iterable = serviceModelStatusClient.getAll(uri);
261                 List<OperationalEnvServiceModelStatus> serviceModelStatuses = new ArrayList<>();
262                 Iterator<OperationalEnvServiceModelStatus> statusIterator = iterable.iterator();
263                 statusIterator.forEachRemaining(serviceModelStatuses::add);
264                 return serviceModelStatuses;
265         }
266
267         public void save(InfraActiveRequests infraActiveRequests) {
268                 URI uri = getUri(infraActiveRequestURI);
269                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(infraActiveRequests, headers);
270                 restTemplate.postForLocation(uri, entity);
271         }
272
273         public <T> void save(T object){
274                 URI uri = getUri(endpoint+classURLMapper.getURI(object.getClass()));
275                 HttpEntity<T> entity = new HttpEntity<>(object, headers);
276                 restTemplate.postForLocation(uri, entity);
277         }
278         
279         private OperationalEnvDistributionStatus getSingleOperationalEnvDistributionStatus(URI uri){
280                 return distributionStatusClient.get(uri);
281         }
282
283         public void updateInfraActiveRequests(InfraActiveRequests request) {            
284                 infraActiveRequestClient.put(request);
285         }
286         
287         protected URI getUri(String uri) {
288                 return URI.create(uri);
289         }
290
291         public void saveRequestProcessingData(RequestProcessingData requestProcessingData) {
292                 URI uri = getUri(endpoint + requestProcessingDataURI);
293                 HttpEntity<RequestProcessingData> entity = new HttpEntity<>(requestProcessingData, headers);
294                 restTemplate.postForLocation(uri, entity);
295         }
296         
297         public RequestProcessingData getRequestProcessingDataBySoRequestIdAndGroupingIdAndNameAndTag(String soRequestId,
298                         String groupingId, String name, String tag) {
299                 return this.getSingleRequestProcessingData(UriBuilder.fromUri(endpoint + findOneBySoRequestIdAndGroupingIdAndNameAndTagURI)
300                                 .queryParam(SO_REQUEST_ID,soRequestId)
301                                 .queryParam(GROUPING_ID,groupingId)
302                                 .queryParam(NAME,name)
303                                 .queryParam(TAG,tag)
304                                 .build());
305         }
306         public List<RequestProcessingData> getRequestProcessingDataBySoRequestId(String soRequestId) {
307                 return this.getRequestProcessingData(UriBuilder.fromUri(endpoint + findBySoRequestIdOrderByGroupingIdDesc)
308                                 .queryParam(SO_REQUEST_ID,soRequestId)
309                                 .build());
310         }
311         
312         public RequestProcessingData getSingleRequestProcessingData(URI uri){
313                 return requestProcessingDataClient.get(uri);
314         }
315         
316         private List<RequestProcessingData> getRequestProcessingData(URI uri) {
317                 Iterable<RequestProcessingData> requestProcessingDataIterator = requestProcessingDataClient.getAll(uri);
318                 List<RequestProcessingData> requestProcessingDataList = new ArrayList<>();
319                 Iterator<RequestProcessingData> it = requestProcessingDataIterator.iterator();
320                 it.forEachRemaining(requestProcessingDataList::add);
321                 return requestProcessingDataList;
322         }
323         
324         public List<RequestProcessingData> getAllRequestProcessingData() {
325                 
326                 return (List<RequestProcessingData>) this.getAllRequestProcessingData(UriBuilder.fromUri(endpoint + "/requestProcessingData").build());
327         }
328         
329         private Iterable<RequestProcessingData> getAllRequestProcessingData(URI uri) {
330                 return requestProcessingDataClient.getAll(uri);
331         }
332
333         public RestTemplate restTemplate() {
334                 return new RestTemplate( new HttpComponentsClientHttpRequestFactory());
335         }
336
337         @Component
338         static class ClassURLMapper {
339                 private static final Map <Class,String> classURLMap = new HashMap<>();
340
341                 ClassURLMapper() {
342                         classURLMap.put(ArchivedInfraRequests.class,"/archivedInfraRequests/");
343                         classURLMap.put(InfraActiveRequests.class,"/infraActiveRequests/");
344                         classURLMap.put(OperationalEnvDistributionStatus.class,"/operationalEnvDistributionStatus/");
345                         classURLMap.put(OperationalEnvServiceModelStatus.class,"/operationalEnvServiceModelStatus/");
346                         classURLMap.put(OperationStatus.class,"/operationStatus/");
347                         classURLMap.put(ResourceOperationStatus.class,"/resourceOperationStatus/");
348                         classURLMap.put(SiteStatus.class,"/siteStatus/");
349                         classURLMap.put(WatchdogComponentDistributionStatus.class,"/watchdogComponentDistributionStatus/");
350                         classURLMap.put(WatchdogDistributionStatus.class,"/watchdogDistributionStatus/");
351                         classURLMap.put(WatchdogServiceModVerIdLookup.class,"/watchdogServiceModVerIdLookup/");
352                 }
353
354                   <T> String getURI(Class<T> className) {
355                           Class actualClass = classURLMap.keySet()
356                                           .stream()
357                                           .filter(requestdbClass -> requestdbClass.isAssignableFrom(className))
358                                           .findFirst()
359                                           .get();
360                           return classURLMap.get(actualClass);
361                 }
362         }
363         
364         //USED FOR TEST ONLY
365         public void setPortToEndpoint(String port) {
366                 endpoint = endpoint + port;
367         }
368         
369         //USED FOR TEST ONLY
370         public void removePortFromEndpoint() {
371                 endpoint = endpoint.substring(0, endpoint.lastIndexOf(':') + 1);
372         }
373 }