Merge "path correction for the cokpit community"
[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.io.IOException;
24 import java.net.URI;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Map;
30
31 import javax.annotation.PostConstruct;
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.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.beans.factory.annotation.Value;
49 import org.springframework.context.annotation.Bean;
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.HttpRequest;
56 import org.springframework.http.client.ClientHttpRequestExecution;
57 import org.springframework.http.client.ClientHttpRequestInterceptor;
58 import org.springframework.http.client.ClientHttpResponse;
59 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
60 import org.springframework.stereotype.Component;
61 import org.springframework.web.client.HttpClientErrorException;
62 import org.springframework.web.client.RestTemplate;
63
64 import uk.co.blackpepper.bowman.Client;
65 import uk.co.blackpepper.bowman.ClientFactory;
66 import uk.co.blackpepper.bowman.Configuration;
67 import uk.co.blackpepper.bowman.RestTemplateConfigurer;
68
69 @Component("RequestsDbClient")
70 @Primary
71 public class RequestsDbClient {
72
73         private static final String SERVICE_ID = "SERVICE_ID";
74         private static final String OPERATION_ID = "OPERATION_ID";
75         private static final String SO_REQUEST_ID = "SO_REQUEST_ID";
76         private static final String GROUPING_ID = "GROUPING_ID";
77         private static final String REQUEST_ID = "REQUEST_ID";
78         private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENVIRONMENT_ID";
79         private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
80         private static final String NAME = "NAME";
81         private static final String VALUE = "VALUE";
82         private static final String TAG = "TAG";
83         
84         private Client<InfraActiveRequests> infraActiveRequestClient;
85         private Client<OperationStatus> operationStatusClient;
86         private Client<RequestProcessingData> requestProcessingDataClient;
87         private final Client<OperationalEnvDistributionStatus> distributionStatusClient;
88         private final Client<OperationalEnvServiceModelStatus> serviceModelStatusClient;
89
90         @Value("${mso.adapters.requestDb.endpoint}")
91         protected String endpoint;
92
93         @Value("${mso.adapters.requestDb.auth}")
94         private String msoAdaptersAuth;
95
96         private String getOrchestrationFilterURI = "/infraActiveRequests/getOrchestrationFiltersFromInfraActive/";
97         private static final String OPERATION_STATUS_SEARCH = "/operationStatus/search";
98         private static final String OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH = "/operationalEnvServiceModelStatus/search";
99
100
101         private String checkVnfIdStatus = "/infraActiveRequests/checkVnfIdStatus/";
102
103         private String infraActiveRequestURI = "/infraActiveRequests/";
104
105         private String checkInstanceNameDuplicate = "/infraActiveRequests/checkInstanceNameDuplicate";
106         
107         private String operationalEnvDistributionStatusURI = "/operationalEnvDistributionStatus/";
108         
109         private String findOneByServiceIdAndOperationIdURI = "/findOneByServiceIdAndOperationId";
110         
111         private String findOneByOperationalEnvIdAndServiceModelVersionIdURI = "/findOneByOperationalEnvIdAndServiceModelVersionId";
112         
113         private String findAllByOperationalEnvIdAndRequestIdURI = "/findAllByOperationalEnvIdAndRequestId";
114
115         private String cloudOrchestrationFiltersFromInfraActive = "/infraActiveRequests/getCloudOrchestrationFiltersFromInfraActive";
116         
117         private String requestProcessingDataURI = "/requestProcessingData";
118         
119         private String findOneBySoRequestIdAndGroupingIdAndNameAndTagURI = "/requestProcessingData/search/findOneBySoRequestIdAndGroupingIdAndNameAndTag/";
120
121         private String findBySoRequestIdOrderByGroupingIdDesc = "/requestProcessingData/search/findBySoRequestIdOrderByGroupingIdDesc/";
122
123         protected HttpHeaders headers;
124
125         protected ClientFactory clientFactory;
126         
127         @Autowired
128         protected RestTemplate restTemplate;
129         
130         @Autowired
131         ClassURLMapper classURLMapper;
132
133         @PostConstruct
134         public void init() {
135                 getOrchestrationFilterURI = endpoint + getOrchestrationFilterURI;
136                 infraActiveRequestURI = endpoint + infraActiveRequestURI;
137                 checkVnfIdStatus = endpoint + checkVnfIdStatus;
138                 checkInstanceNameDuplicate = endpoint + checkInstanceNameDuplicate;
139                 cloudOrchestrationFiltersFromInfraActive = endpoint + cloudOrchestrationFiltersFromInfraActive;
140                 findOneByServiceIdAndOperationIdURI = endpoint + OPERATION_STATUS_SEARCH + findOneByServiceIdAndOperationIdURI;
141                 requestProcessingDataURI = endpoint + requestProcessingDataURI;
142                 operationalEnvDistributionStatusURI = endpoint + operationalEnvDistributionStatusURI;
143                 findOneByOperationalEnvIdAndServiceModelVersionIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findOneByOperationalEnvIdAndServiceModelVersionIdURI;
144                 findAllByOperationalEnvIdAndRequestIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findAllByOperationalEnvIdAndRequestIdURI;
145                 headers = new HttpHeaders();
146                 headers.set("Authorization", msoAdaptersAuth);
147         }
148
149         public RequestsDbClient() {
150                 ClientFactory clientFactory = Configuration.builder().setRestTemplateConfigurer(new RestTemplateConfigurer() {
151
152                         public void configure(RestTemplate restTemplate) {
153
154                                 restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
155
156                                         public ClientHttpResponse intercept(HttpRequest request, byte[] body,
157                                                         ClientHttpRequestExecution execution) throws IOException {
158
159                                                 request.getHeaders().add("Authorization", msoAdaptersAuth);
160                                                 return execution.execute(request, body);
161                                         }
162                                 });
163                         }
164                 }).build().buildClientFactory();
165                 infraActiveRequestClient = clientFactory.create(InfraActiveRequests.class);
166                 operationStatusClient = clientFactory.create(OperationStatus.class);
167                 requestProcessingDataClient = clientFactory.create(RequestProcessingData.class);
168                 distributionStatusClient = clientFactory.create(OperationalEnvDistributionStatus.class);
169                 serviceModelStatusClient = clientFactory.create(OperationalEnvServiceModelStatus.class);
170         }
171         
172         public List<InfraActiveRequests> getCloudOrchestrationFiltersFromInfraActive(Map<String, String> orchestrationMap){
173                 URI uri = getUri(cloudOrchestrationFiltersFromInfraActive);
174                 HttpEntity<Map> entity = new HttpEntity<>(orchestrationMap, headers);
175                 try{
176                         return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
177                 }catch(HttpClientErrorException e){
178                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
179                                 return null;
180                         }
181                         throw e;
182                 }
183         }
184         public InfraActiveRequests getInfraActiveRequestbyRequestId(String requestId) {
185                 return this.getSingleInfraActiveRequests(this.getUri(endpoint + "/infraActiveRequests/" + requestId));
186         }
187
188         public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive(Map<String, List<String>> orchestrationMap) {
189                 URI uri = getUri(getOrchestrationFilterURI);
190                 HttpEntity<Map<String, List<String>>> entity = new HttpEntity<>(orchestrationMap, headers);
191                 return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
192         }
193
194         public InfraActiveRequests checkVnfIdStatus(String operationalEnvironmentId) {
195                 URI uri = getUri(checkVnfIdStatus + operationalEnvironmentId);
196                 return restTemplate.exchange(uri, HttpMethod.GET, HttpEntity.EMPTY, InfraActiveRequests.class).getBody();
197         }
198         public InfraActiveRequests checkInstanceNameDuplicate(HashMap<String, String> instanceIdMap, String instanceName, String requestScope) {
199                 URI uri = getUri(checkInstanceNameDuplicate);
200                 HttpEntity<InstanceNameDuplicateCheckRequest> entity = new HttpEntity<>(new InstanceNameDuplicateCheckRequest(instanceIdMap, instanceName, requestScope), headers);
201                 try{
202                         return restTemplate.exchange(uri, HttpMethod.POST, entity, InfraActiveRequests.class).getBody();
203                 }catch(HttpClientErrorException e){
204                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
205                                 return null;
206                         }
207                         throw e;
208                 }
209
210         }
211         
212         public  OperationStatus getOneByServiceIdAndOperationId(String serviceId, String operationId){
213                 return this.getSingleOperationStatus(UriBuilder.fromUri(findOneByServiceIdAndOperationIdURI)
214                                 .queryParam(SERVICE_ID,serviceId)
215                                 .queryParam(OPERATION_ID,operationId)
216                                 .build());
217         }
218         
219         public OperationalEnvServiceModelStatus findOneByOperationalEnvIdAndServiceModelVersionId(String operationalEnvironmentId, String serviceModelVersionId) {
220                 return this.getSingleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findOneByOperationalEnvIdAndServiceModelVersionIdURI)
221                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
222                                 .queryParam(SERVICE_MODEL_VERSION_ID,serviceModelVersionId)
223                                 .build());
224         }
225
226         public List<OperationalEnvServiceModelStatus> getAllByOperationalEnvIdAndRequestId(String operationalEnvironmentId, String requestId){
227                 return this.getMultipleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findAllByOperationalEnvIdAndRequestIdURI)
228                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
229                                 .queryParam(REQUEST_ID,requestId)
230                                 .build());
231         }
232         
233         public OperationalEnvDistributionStatus getDistributionStatusById(String distributionId){
234                 return this.getSingleOperationalEnvDistributionStatus(UriBuilder.fromUri(operationalEnvDistributionStatusURI+distributionId).build());
235         }
236         
237         private OperationalEnvServiceModelStatus getSingleOperationalEnvServiceModelStatus(URI uri){
238                 return serviceModelStatusClient.get(uri);
239         }
240
241         private List<OperationalEnvServiceModelStatus> getMultipleOperationalEnvServiceModelStatus(URI uri){
242                 Iterable <OperationalEnvServiceModelStatus> iterable = serviceModelStatusClient.getAll(uri);
243                 List<OperationalEnvServiceModelStatus> serviceModelStatuses = new ArrayList<>();
244                 Iterator<OperationalEnvServiceModelStatus> statusIterator = iterable.iterator();
245                 statusIterator.forEachRemaining(serviceModelStatuses::add);
246                 return serviceModelStatuses;
247         }
248
249         public void save(InfraActiveRequests infraActiveRequests) {
250                 URI uri = getUri(infraActiveRequestURI);
251                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(infraActiveRequests, headers);
252                 restTemplate.postForLocation(uri, entity);
253         }
254
255         public <T> void save(T object){
256                 URI uri = getUri(endpoint+classURLMapper.getURI(object.getClass()));
257                 HttpEntity<T> entity = new HttpEntity<>(object, headers);
258                 restTemplate.postForLocation(uri, entity);
259         }
260         
261         private OperationalEnvDistributionStatus getSingleOperationalEnvDistributionStatus(URI uri){
262                 return distributionStatusClient.get(uri);
263         }
264         
265         protected InfraActiveRequests getSingleInfraActiveRequests(URI uri) {
266                 return infraActiveRequestClient.get(uri);
267         }
268
269         public void updateInfraActiveRequests(InfraActiveRequests request) {            
270                 infraActiveRequestClient.put(request);
271         }
272         
273         protected URI getUri(String uri) {
274                 return URI.create(uri);
275         }
276         
277         
278         
279         public OperationStatus getSingleOperationStatus(URI uri){
280                 return operationStatusClient.get(uri);
281         }
282
283         public void saveRequestProcessingData(RequestProcessingData requestProcessingData) {
284                 URI uri = getUri(endpoint + requestProcessingDataURI);
285                 HttpEntity<RequestProcessingData> entity = new HttpEntity<>(requestProcessingData, headers);
286                 restTemplate.postForLocation(uri, entity);
287         }
288         
289         public RequestProcessingData getRequestProcessingDataBySoRequestIdAndGroupingIdAndNameAndTag(String soRequestId,
290                         String groupingId, String name, String tag) {
291                 return this.getSingleRequestProcessingData(UriBuilder.fromUri(endpoint + findOneBySoRequestIdAndGroupingIdAndNameAndTagURI)
292                                 .queryParam(SO_REQUEST_ID,soRequestId)
293                                 .queryParam(GROUPING_ID,groupingId)
294                                 .queryParam(NAME,name)
295                                 .queryParam(TAG,tag)
296                                 .build());
297         }
298         public List<RequestProcessingData> getRequestProcessingDataBySoRequestId(String soRequestId) {
299                 return this.getRequestProcessingData(UriBuilder.fromUri(endpoint + findBySoRequestIdOrderByGroupingIdDesc)
300                                 .queryParam(SO_REQUEST_ID,soRequestId)
301                                 .build());
302         }
303         
304         public RequestProcessingData getSingleRequestProcessingData(URI uri){
305                 return requestProcessingDataClient.get(uri);
306         }
307         
308         private List<RequestProcessingData> getRequestProcessingData(URI uri) {
309                 Iterable<RequestProcessingData> requestProcessingDataIterator = requestProcessingDataClient.getAll(uri);
310                 List<RequestProcessingData> requestProcessingDataList = new ArrayList<>();
311                 Iterator<RequestProcessingData> it = requestProcessingDataIterator.iterator();
312                 it.forEachRemaining(requestProcessingDataList::add);
313                 return requestProcessingDataList;
314         }
315         
316         public List<RequestProcessingData> getAllRequestProcessingData() {
317                 
318                 return (List<RequestProcessingData>) this.getAllRequestProcessingData(UriBuilder.fromUri(endpoint + "/requestProcessingData").build());
319         }
320         
321         private Iterable<RequestProcessingData> getAllRequestProcessingData(URI uri) {
322                 return requestProcessingDataClient.getAll(uri);
323         }
324
325         @Bean
326         public RestTemplate restTemplate() {
327                 return new RestTemplate( new HttpComponentsClientHttpRequestFactory());
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 }