Change status from inventoried to assigned
[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 findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI = "/findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestId";
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                 findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI;
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 findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestId(String operationalEnvironmentId, String serviceModelVersionId, String requestId) {
231                 try {
232                         HttpEntity<?> entity = getHttpEntity();
233                         OperationalEnvServiceModelStatus modelStatus = restTemplate.exchange(getUri(UriBuilder.fromUri(findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI)
234                                         .queryParam(OPERATIONAL_ENVIRONMENT_ID, operationalEnvironmentId)
235                                         .queryParam(SERVICE_MODEL_VERSION_ID, serviceModelVersionId)
236                                         .queryParam(REQUEST_ID, requestId)                                      
237                                         .build().toString()), HttpMethod.GET, entity, OperationalEnvServiceModelStatus.class).getBody();
238                         if (null != modelStatus) {
239                                 modelStatus.setOperationalEnvId(operationalEnvironmentId);
240                                 modelStatus.setServiceModelVersionId(serviceModelVersionId);
241                                 modelStatus.setRequestId(requestId);                            
242                         }
243                         return modelStatus;
244                 }catch(HttpClientErrorException e){
245                         if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
246                                 return null;
247                         }
248                         throw e;
249                 }
250         }
251
252         public List<OperationalEnvServiceModelStatus> getAllByOperationalEnvIdAndRequestId(String operationalEnvironmentId, String requestId){
253                 return this.getMultipleOperationalEnvServiceModelStatus(getUri(UriBuilder.fromUri(findAllByOperationalEnvIdAndRequestIdURI)
254                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
255                                 .queryParam(REQUEST_ID,requestId)
256                                 .build().toString()));
257         }
258         
259         public OperationalEnvDistributionStatus getDistributionStatusById(String distributionId){
260                 try {
261                         HttpEntity<?> entity = getHttpEntity();
262                         OperationalEnvDistributionStatus distributionStatus = restTemplate.exchange(getUri(operationalEnvDistributionStatusURI + distributionId),
263                                         HttpMethod.GET, entity, OperationalEnvDistributionStatus.class).getBody();
264                         if(null != distributionStatus){
265                                 distributionStatus.setDistributionId(distributionId);
266                         }
267                         return distributionStatus;
268                 }catch(HttpClientErrorException e){
269                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
270                                 return null;
271                         }
272                         throw e;
273                 }
274         }
275
276         private List<OperationalEnvServiceModelStatus> getMultipleOperationalEnvServiceModelStatus(URI uri){
277                 Iterable <OperationalEnvServiceModelStatus> iterable = getClientFactory().create(OperationalEnvServiceModelStatus.class).getAll(uri);
278                 List<OperationalEnvServiceModelStatus> serviceModelStatuses = new ArrayList<>();
279                 Iterator<OperationalEnvServiceModelStatus> statusIterator = iterable.iterator();
280                 statusIterator.forEachRemaining(serviceModelStatuses::add);
281                 return serviceModelStatuses;
282         }
283         
284         public void save(InfraActiveRequests infraActiveRequests) {
285                 HttpHeaders headers = getHttpHeaders();
286                 URI uri = getUri(infraActiveRequestURI);
287                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(infraActiveRequests, headers);
288                 restTemplate.postForLocation(uri, entity);
289         }
290
291         public <T> void save(T object){
292                 HttpHeaders headers = getHttpHeaders();
293                 URI uri = getUri(endpoint+classURLMapper.getURI(object.getClass()));
294                 HttpEntity<T> entity = new HttpEntity<>(object, headers);
295                 restTemplate.postForLocation(uri, entity);
296         }
297         
298         public void updateInfraActiveRequests(InfraActiveRequests request) {
299                 HttpHeaders headers = getHttpHeaders();
300                 URI uri = getUri(infraActiveRequestURI+request.getRequestId());
301                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(request, headers);
302                 restTemplate.put(uri, entity);
303         }
304         
305         protected URI getUri(String uri) {
306                 return URI.create(uri);
307         }
308
309         public void saveRequestProcessingData(RequestProcessingData requestProcessingData) {
310                 HttpHeaders headers = getHttpHeaders();
311                 URI uri = getUri(requestProcessingDataURI);
312                 HttpEntity<RequestProcessingData> entity = new HttpEntity<>(requestProcessingData, headers);
313                 restTemplate.postForLocation(uri, entity);
314         }
315
316         public List<RequestProcessingData> getRequestProcessingDataBySoRequestId(String soRequestId) {
317                 return this.getRequestProcessingData(getUri(UriBuilder.fromUri(endpoint + findBySoRequestIdOrderByGroupingIdDesc)
318                                 .queryParam(SO_REQUEST_ID,soRequestId)
319                                 .build().toString()));
320         }
321
322         private List<RequestProcessingData> getRequestProcessingData(URI uri) {
323                 Iterable<RequestProcessingData> requestProcessingDataIterator = getClientFactory().create(RequestProcessingData.class).getAll(uri);
324                 List<RequestProcessingData> requestProcessingDataList = new ArrayList<>();
325                 Iterator<RequestProcessingData> it = requestProcessingDataIterator.iterator();
326                 it.forEachRemaining(requestProcessingDataList::add);
327                 return requestProcessingDataList;
328         }
329
330         @Component
331         static class ClassURLMapper {
332                 private static final Map <Class,String> classURLMap = new HashMap<>();
333
334                 ClassURLMapper() {
335                         classURLMap.put(ArchivedInfraRequests.class,"/archivedInfraRequests/");
336                         classURLMap.put(InfraActiveRequests.class,"/infraActiveRequests/");
337                         classURLMap.put(OperationalEnvDistributionStatus.class,"/operationalEnvDistributionStatus/");
338                         classURLMap.put(OperationalEnvServiceModelStatus.class,"/operationalEnvServiceModelStatus/");
339                         classURLMap.put(OperationStatus.class,"/operationStatus/");
340                         classURLMap.put(ResourceOperationStatus.class,"/resourceOperationStatus/");
341                         classURLMap.put(SiteStatus.class,"/siteStatus/");
342                         classURLMap.put(WatchdogComponentDistributionStatus.class,"/watchdogComponentDistributionStatus/");
343                         classURLMap.put(WatchdogDistributionStatus.class,"/watchdogDistributionStatus/");
344                         classURLMap.put(WatchdogServiceModVerIdLookup.class,"/watchdogServiceModVerIdLookup/");
345                 }
346
347                   <T> String getURI(Class<T> className) {
348                           Class actualClass = classURLMap.keySet()
349                                           .stream()
350                                           .filter(requestdbClass -> requestdbClass.isAssignableFrom(className))
351                                           .findFirst()
352                                           .get();
353                           return classURLMap.get(actualClass);
354                 }
355         }
356         
357         //USED FOR TEST ONLY
358         public void setPortToEndpoint(String port) {
359                 endpoint = endpoint + port;
360         }
361         
362         //USED FOR TEST ONLY
363         public void removePortFromEndpoint() {
364                 endpoint = endpoint.substring(0, endpoint.lastIndexOf(':') + 1);
365         }
366
367         private HttpHeaders getHttpHeaders() {
368                 HttpHeaders headers = new HttpHeaders();
369                 headers.set(HttpHeaders.AUTHORIZATION, msoAdaptersAuth);
370                 headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
371                 headers.set(HttpHeaders.ACCEPT,  MediaType.APPLICATION_JSON);
372                 return headers;
373         }
374
375         private HttpEntity<?> getHttpEntity() {
376                 HttpHeaders headers = getHttpHeaders();
377                 return new HttpEntity<>(headers);
378         }
379
380 }