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