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