6ab92853d1342e7372985ec450fdcb9a7ac660d4
[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.onap.so.logging.jaxrs.filter.SpringClientFilter;
37 import org.springframework.beans.factory.annotation.Autowired;
38 import org.springframework.beans.factory.annotation.Value;
39 import org.springframework.context.annotation.Bean;
40 import org.springframework.context.annotation.Primary;
41 import org.springframework.core.ParameterizedTypeReference;
42 import org.springframework.http.HttpEntity;
43 import org.springframework.http.HttpHeaders;
44 import org.springframework.http.HttpMethod;
45 import org.springframework.http.HttpRequest;
46 import org.springframework.http.client.BufferingClientHttpRequestFactory;
47 import org.springframework.http.client.ClientHttpRequestExecution;
48 import org.springframework.http.client.ClientHttpRequestFactory;
49 import org.springframework.http.client.ClientHttpRequestInterceptor;
50 import org.springframework.http.client.ClientHttpResponse;
51 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
52 import org.springframework.stereotype.Component;
53 import org.springframework.web.client.HttpClientErrorException;
54 import org.springframework.web.client.RestTemplate;
55 import uk.co.blackpepper.bowman.Client;
56 import uk.co.blackpepper.bowman.ClientFactory;
57 import uk.co.blackpepper.bowman.Configuration;
58 import uk.co.blackpepper.bowman.RestTemplateConfigurer;
59
60 import javax.annotation.PostConstruct;
61 import javax.ws.rs.core.UriBuilder;
62 import java.io.IOException;
63 import java.net.URI;
64 import java.util.ArrayList;
65 import java.util.HashMap;
66 import java.util.Iterator;
67 import java.util.List;
68 import java.util.Map;
69
70 @Component("RequestsDbClient")
71 @Primary
72 public class RequestsDbClient {
73
74         private static final String SERVICE_ID = "SERVICE_ID";
75         private static final String OPERATION_ID = "OPERATION_ID";
76         private static final String SO_REQUEST_ID = "SO_REQUEST_ID";
77         private static final String GROUPING_ID = "GROUPING_ID";
78         private static final String REQUEST_ID = "REQUEST_ID";
79         private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENVIRONMENT_ID";
80         private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
81         private static final String NAME = "NAME";
82         private static final String VALUE = "VALUE";
83         private static final String TAG = "TAG";
84         
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
120         @Autowired
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         }
139         
140         public ClientFactory getClientFactory(){
141                 URI baseUri = UriBuilder.fromUri(endpoint).build();             
142                 ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory());
143
144                 return Configuration.builder().setBaseUri(baseUri).setClientHttpRequestFactory(factory).setRestTemplateConfigurer(restTemplate -> {
145                         restTemplate.getInterceptors().add((new SpringClientFilter()));
146
147                         restTemplate.getInterceptors().add((request, body, execution) -> {
148
149                                 request.getHeaders().add(HttpHeaders.AUTHORIZATION, msoAdaptersAuth);
150                                 return execution.execute(request, body);
151                         });
152                 }).build().buildClientFactory();
153         }
154
155         
156         public List<InfraActiveRequests> getCloudOrchestrationFiltersFromInfraActive(Map<String, String> orchestrationMap){
157                 URI uri = getUri(cloudOrchestrationFiltersFromInfraActive);
158                 HttpHeaders headers = new HttpHeaders();
159                 headers.set("Authorization", msoAdaptersAuth);
160                 HttpEntity<Map> entity = new HttpEntity<>(orchestrationMap, headers);
161                 try{
162                         return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
163                 }catch(HttpClientErrorException e){
164                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
165                                 return null;
166                         }
167                         throw e;
168                 }
169         }
170
171     public InfraActiveRequests getInfraActiveRequestbyRequestId(String requestId) {
172         try {
173                 HttpHeaders headers = new HttpHeaders();
174                 headers.set("Authorization", msoAdaptersAuth);
175                 HttpEntity<?> entity = new HttpEntity<>(headers);
176             InfraActiveRequests infraActiveRequests = restTemplate.exchange(getUri(endpoint + "/infraActiveRequests/" + requestId), HttpMethod.GET, entity, InfraActiveRequests.class).getBody();
177             if (infraActiveRequests != null) {
178                 infraActiveRequests.setRequestId(requestId);
179             }
180             return infraActiveRequests;
181         } catch (HttpClientErrorException e) {
182             if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
183                 return null;
184             }
185             throw e;
186         }
187     }
188
189         public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive(Map<String, List<String>> orchestrationMap) {
190                 HttpHeaders headers = new HttpHeaders();
191                 headers.set("Authorization", msoAdaptersAuth);
192                 URI uri = getUri(getOrchestrationFilterURI);
193                 HttpEntity<Map<String, List<String>>> entity = new HttpEntity<>(orchestrationMap, headers);
194                 return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
195         }
196
197         public InfraActiveRequests checkVnfIdStatus(String operationalEnvironmentId) {
198         HttpHeaders headers = new HttpHeaders();
199                 headers.set("Authorization", msoAdaptersAuth);
200                 HttpEntity<?> entity = new HttpEntity<>(headers);
201                 URI uri = getUri(checkVnfIdStatus + operationalEnvironmentId);
202                 return restTemplate.exchange(uri, HttpMethod.GET, entity, InfraActiveRequests.class).getBody();
203         }
204         
205         public InfraActiveRequests checkInstanceNameDuplicate(HashMap<String, String> instanceIdMap, String instanceName, String requestScope) {
206                 HttpHeaders headers = new HttpHeaders();
207                 headers.set("Authorization", msoAdaptersAuth);
208                 URI uri = getUri(checkInstanceNameDuplicate);
209                 HttpEntity<InstanceNameDuplicateCheckRequest> entity = new HttpEntity<>(new InstanceNameDuplicateCheckRequest(instanceIdMap, instanceName, requestScope), headers);
210                 try{
211                         return restTemplate.exchange(uri, HttpMethod.POST, entity, InfraActiveRequests.class).getBody();
212                 }catch(HttpClientErrorException e){
213                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
214                                 return null;
215                         }
216                         throw e;
217                 }
218
219         }
220
221         public OperationStatus getOneByServiceIdAndOperationId(String serviceId, String operationId) {
222                 try {
223                 HttpHeaders headers = new HttpHeaders();
224                         headers.set("Authorization", msoAdaptersAuth);
225                         HttpEntity<?> entity = new HttpEntity<>(headers);
226                         OperationStatus operationStatus = restTemplate.exchange(UriBuilder.fromUri(getUri(findOneByServiceIdAndOperationIdURI))
227                                         .queryParam(SERVICE_ID, serviceId)
228                                         .queryParam(OPERATION_ID, operationId)
229                                         .build(), HttpMethod.GET, entity, OperationStatus.class).getBody();
230                         if (operationStatus != null) {
231                                 operationStatus.setServiceId(serviceId);
232                                 operationStatus.setOperationId(operationId);
233                         }
234
235                         return operationStatus;
236                 } catch (HttpClientErrorException e) {
237                         if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
238                                 return null;
239                         }
240                         throw e;
241                 }
242         }
243         
244         public OperationalEnvServiceModelStatus findOneByOperationalEnvIdAndServiceModelVersionId(String operationalEnvironmentId, String serviceModelVersionId) {
245                 return this.getSingleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findOneByOperationalEnvIdAndServiceModelVersionIdURI)
246                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
247                                 .queryParam(SERVICE_MODEL_VERSION_ID,serviceModelVersionId)
248                                 .build());
249         }
250
251         public List<OperationalEnvServiceModelStatus> getAllByOperationalEnvIdAndRequestId(String operationalEnvironmentId, String requestId){
252                 return this.getMultipleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findAllByOperationalEnvIdAndRequestIdURI)
253                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
254                                 .queryParam(REQUEST_ID,requestId)
255                                 .build());
256         }
257         
258         public OperationalEnvDistributionStatus getDistributionStatusById(String distributionId){
259                 return this.getSingleOperationalEnvDistributionStatus(UriBuilder.fromUri(operationalEnvDistributionStatusURI+distributionId).build());
260         }
261         
262         private OperationalEnvServiceModelStatus getSingleOperationalEnvServiceModelStatus(URI uri){
263                 return getClientFactory().create(OperationalEnvServiceModelStatus.class).get(uri);
264         }
265
266         private List<OperationalEnvServiceModelStatus> getMultipleOperationalEnvServiceModelStatus(URI uri){
267                 Iterable <OperationalEnvServiceModelStatus> iterable = getClientFactory().create(OperationalEnvServiceModelStatus.class).getAll(uri);
268                 List<OperationalEnvServiceModelStatus> serviceModelStatuses = new ArrayList<>();
269                 Iterator<OperationalEnvServiceModelStatus> statusIterator = iterable.iterator();
270                 statusIterator.forEachRemaining(serviceModelStatuses::add);
271                 return serviceModelStatuses;
272         }
273
274         public void save(InfraActiveRequests infraActiveRequests) {
275                 HttpHeaders headers = new HttpHeaders();
276                 headers.set("Authorization", msoAdaptersAuth);
277                 URI uri = getUri(infraActiveRequestURI);
278                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(infraActiveRequests, headers);
279                 restTemplate.postForLocation(uri, entity);
280         }
281
282         public <T> void save(T object){
283                 HttpHeaders headers = new HttpHeaders();
284                 headers.set("Authorization", msoAdaptersAuth);
285                 URI uri = getUri(endpoint+classURLMapper.getURI(object.getClass()));
286                 HttpEntity<T> entity = new HttpEntity<>(object, headers);
287                 restTemplate.postForLocation(uri, entity);
288         }
289         
290         private OperationalEnvDistributionStatus getSingleOperationalEnvDistributionStatus(URI uri){
291                 return getClientFactory().create(OperationalEnvDistributionStatus.class).get(uri);
292         }
293
294         public void updateInfraActiveRequests(InfraActiveRequests request) {                            
295                 HttpHeaders headers = new HttpHeaders();
296                 headers.set("Authorization", msoAdaptersAuth);
297                 headers.set(HttpHeaders.CONTENT_TYPE,"application/json");
298                 headers.set(HttpHeaders.ACCEPT,  "application/json");
299                 URI uri = getUri(infraActiveRequestURI+request.getRequestId());
300                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(request, headers);
301                 restTemplate.put(uri, entity);
302         }
303         
304         protected URI getUri(String uri) {
305                 return URI.create(uri);
306         }
307
308         public void saveRequestProcessingData(RequestProcessingData requestProcessingData) {
309                 HttpHeaders headers = new HttpHeaders();
310                 headers.set("Authorization", msoAdaptersAuth);
311                 URI uri = getUri(endpoint + requestProcessingDataURI);
312                 HttpEntity<RequestProcessingData> entity = new HttpEntity<>(requestProcessingData, headers);
313                 restTemplate.postForLocation(uri, entity);
314         }
315         
316         public RequestProcessingData getRequestProcessingDataBySoRequestIdAndGroupingIdAndNameAndTag(String soRequestId,
317                         String groupingId, String name, String tag) {
318                 return this.getSingleRequestProcessingData(UriBuilder.fromUri(endpoint + findOneBySoRequestIdAndGroupingIdAndNameAndTagURI)
319                                 .queryParam(SO_REQUEST_ID,soRequestId)
320                                 .queryParam(GROUPING_ID,groupingId)
321                                 .queryParam(NAME,name)
322                                 .queryParam(TAG,tag)
323                                 .build());
324         }
325         public List<RequestProcessingData> getRequestProcessingDataBySoRequestId(String soRequestId) {
326                 return this.getRequestProcessingData(UriBuilder.fromUri(endpoint + findBySoRequestIdOrderByGroupingIdDesc)
327                                 .queryParam(SO_REQUEST_ID,soRequestId)
328                                 .build());
329         }
330         
331         public RequestProcessingData getSingleRequestProcessingData(URI uri){
332                 return getClientFactory().create(RequestProcessingData.class).get(uri);
333         }
334         
335         private List<RequestProcessingData> getRequestProcessingData(URI uri) {
336                 Iterable<RequestProcessingData> requestProcessingDataIterator = getClientFactory().create(RequestProcessingData.class).getAll(uri);
337                 List<RequestProcessingData> requestProcessingDataList = new ArrayList<>();
338                 Iterator<RequestProcessingData> it = requestProcessingDataIterator.iterator();
339                 it.forEachRemaining(requestProcessingDataList::add);
340                 return requestProcessingDataList;
341         }
342         
343         public List<RequestProcessingData> getAllRequestProcessingData() {
344                 
345                 return (List<RequestProcessingData>) this.getAllRequestProcessingData(UriBuilder.fromUri(endpoint + "/requestProcessingData").build());
346         }
347         
348         private Iterable<RequestProcessingData> getAllRequestProcessingData(URI uri) {          
349                 return getClientFactory().create(RequestProcessingData.class).getAll(uri);
350         }
351
352         @Component
353         static class ClassURLMapper {
354                 private static final Map <Class,String> classURLMap = new HashMap<>();
355
356                 ClassURLMapper() {
357                         classURLMap.put(ArchivedInfraRequests.class,"/archivedInfraRequests/");
358                         classURLMap.put(InfraActiveRequests.class,"/infraActiveRequests/");
359                         classURLMap.put(OperationalEnvDistributionStatus.class,"/operationalEnvDistributionStatus/");
360                         classURLMap.put(OperationalEnvServiceModelStatus.class,"/operationalEnvServiceModelStatus/");
361                         classURLMap.put(OperationStatus.class,"/operationStatus/");
362                         classURLMap.put(ResourceOperationStatus.class,"/resourceOperationStatus/");
363                         classURLMap.put(SiteStatus.class,"/siteStatus/");
364                         classURLMap.put(WatchdogComponentDistributionStatus.class,"/watchdogComponentDistributionStatus/");
365                         classURLMap.put(WatchdogDistributionStatus.class,"/watchdogDistributionStatus/");
366                         classURLMap.put(WatchdogServiceModVerIdLookup.class,"/watchdogServiceModVerIdLookup/");
367                 }
368
369                   <T> String getURI(Class<T> className) {
370                           Class actualClass = classURLMap.keySet()
371                                           .stream()
372                                           .filter(requestdbClass -> requestdbClass.isAssignableFrom(className))
373                                           .findFirst()
374                                           .get();
375                           return classURLMap.get(actualClass);
376                 }
377         }
378         
379         //USED FOR TEST ONLY
380         public void setPortToEndpoint(String port) {
381                 endpoint = endpoint + port;
382         }
383         
384         //USED FOR TEST ONLY
385         public void removePortFromEndpoint() {
386                 endpoint = endpoint.substring(0, endpoint.lastIndexOf(':') + 1);
387         }
388 }