Adding rest service for so monitoring
[so.git] / mso-api-handlers / mso-requests-db / src / main / java / org / onap / so / requestsdb / 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.requestsdb.client;
22
23 import org.apache.http.HttpStatus;
24 import org.onap.so.db.request.beans.InfraActiveRequests;
25 import org.onap.so.db.request.beans.OperationalEnvDistributionStatus;
26 import org.onap.so.db.request.beans.OperationStatus;
27 import org.onap.so.db.request.beans.OperationalEnvServiceModelStatus;
28 import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup;
29 import org.onap.so.db.request.beans.ArchivedInfraRequests;
30 import org.onap.so.db.request.beans.ResourceOperationStatus;
31 import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
32 import org.onap.so.db.request.beans.WatchdogDistributionStatus;
33 import org.onap.so.db.request.beans.SiteStatus;
34 import org.onap.so.db.request.data.controller.InstanceNameDuplicateCheckRequest;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.beans.factory.annotation.Value;
37 import org.springframework.context.annotation.Bean;
38 import org.springframework.core.ParameterizedTypeReference;
39 import org.springframework.http.HttpEntity;
40 import org.springframework.http.HttpHeaders;
41 import org.springframework.http.HttpMethod;
42 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
43 import org.springframework.stereotype.Component;
44 import org.springframework.web.client.HttpClientErrorException;
45 import org.springframework.web.client.RestTemplate;
46 import uk.co.blackpepper.bowman.Client;
47 import uk.co.blackpepper.bowman.ClientFactory;
48 import uk.co.blackpepper.bowman.Configuration;
49
50 import javax.annotation.PostConstruct;
51 import javax.ws.rs.core.UriBuilder;
52 import java.net.URI;
53 import java.util.List;
54 import java.util.Map;
55 import java.util.ArrayList;
56 import java.util.HashMap;
57 import java.util.Iterator;
58
59 @Component
60 public class RequestsDbClient {
61
62         private static final String SERVICE_ID = "SERVICE_ID";
63         private static final String OPERATION_ID = "OPERATION_ID";
64         private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENVIRONMENT_ID";
65         private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
66         private static final String REQUEST_ID = "REQUEST_ID";
67
68         private final Client<InfraActiveRequests> infraActiveRequestClient;
69         private final Client<OperationStatus> operationStatusClient;
70         private final Client<OperationalEnvDistributionStatus> distributionStatusClient;
71         private final Client<OperationalEnvServiceModelStatus> serviceModelStatusClient;
72
73         @Value("${mso.adapters.requestDb.endpoint}")
74         private String endpoint;
75
76         @Value("${mso.adapters.requestDb.auth}")
77         private String msoAdaptersAuth;
78
79         private String getOrchestrationFilterURI = "/infraActiveRequests/getOrchestrationFiltersFromInfraActive/";
80         private static final String OPERATION_STATUS_SEARCH = "/operationStatus/search";
81         private static final String OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH = "/operationalEnvServiceModelStatus/search";
82
83         private String checkVnfIdStatus = "/infraActiveRequests/checkVnfIdStatus/";
84
85         private String infraActiveRequestURI = "/infraActiveRequests/";
86
87         private String checkInstanceNameDuplicate = "/infraActiveRequests/checkInstanceNameDuplicate";
88         
89         private String findOneByServiceIdAndOperationIdURI = "/findOneByServiceIdAndOperationId";
90         
91         private  String operationalEnvDistributionStatusURI = "/operationalEnvDistributionStatus/";
92
93         private String cloudOrchestrationFiltersFromInfraActive = "/infraActiveRequests/getCloudOrchestrationFiltersFromInfraActive";
94
95         private String findOneByOperationalEnvIdAndServiceModelVersionIdURI = "/findOneByOperationalEnvIdAndServiceModelVersionId";
96         
97         private String findAllByOperationalEnvIdAndRequestIdURI = "/findAllByOperationalEnvIdAndRequestId";
98
99         private HttpHeaders headers;
100
101         @Autowired
102         private RestTemplate restTemplate;
103         @Autowired
104         ClassURLMapper classURLMapper;
105         
106
107         @PostConstruct
108         public void init() {
109                 getOrchestrationFilterURI = endpoint + getOrchestrationFilterURI;
110                 infraActiveRequestURI = endpoint + infraActiveRequestURI;
111                 checkVnfIdStatus = endpoint + checkVnfIdStatus;
112                 checkInstanceNameDuplicate = endpoint + checkInstanceNameDuplicate;
113                 cloudOrchestrationFiltersFromInfraActive = endpoint + cloudOrchestrationFiltersFromInfraActive;
114                 findOneByServiceIdAndOperationIdURI = endpoint + OPERATION_STATUS_SEARCH + findOneByServiceIdAndOperationIdURI;
115                 operationalEnvDistributionStatusURI = endpoint + operationalEnvDistributionStatusURI;
116                 findOneByOperationalEnvIdAndServiceModelVersionIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findOneByOperationalEnvIdAndServiceModelVersionIdURI;
117                 findAllByOperationalEnvIdAndRequestIdURI = endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findAllByOperationalEnvIdAndRequestIdURI;
118                 headers = new HttpHeaders();
119                 headers.set("Authorization", msoAdaptersAuth);
120         }
121
122         public RequestsDbClient() {
123                 ClientFactory clientFactory = Configuration.builder().setRestTemplateConfigurer(restTemplate -> restTemplate.getInterceptors().add((request, body, execution) -> {
124                         request.getHeaders().add("Authorization", msoAdaptersAuth);
125                         return execution.execute(request, body);
126                 })).build().buildClientFactory();
127                 infraActiveRequestClient = clientFactory.create(InfraActiveRequests.class);
128                 operationStatusClient = clientFactory.create(OperationStatus.class);
129                 distributionStatusClient = clientFactory.create(OperationalEnvDistributionStatus.class);
130                 serviceModelStatusClient = clientFactory.create(OperationalEnvServiceModelStatus.class);
131         }
132         public List<InfraActiveRequests> getCloudOrchestrationFiltersFromInfraActive(Map<String, String> orchestrationMap){
133                 URI uri = getUri(cloudOrchestrationFiltersFromInfraActive);
134                 HttpEntity<Map> entity = new HttpEntity<>(orchestrationMap, headers);
135                 try{
136                         return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
137                 }catch(HttpClientErrorException e){
138                         if(HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()){
139                                 return null;
140                         }
141                         throw e;
142                 }
143         }
144         public InfraActiveRequests getInfraActiveRequestbyRequestId(String requestId) {
145                 return this.getSingleInfraActiveRequests(this.getUri(endpoint + "/infraActiveRequests/" + requestId));
146         }
147
148         public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive(Map<String, List<String>> orchestrationMap) {
149                 URI uri = getUri(getOrchestrationFilterURI);
150                 HttpEntity<Map<String, List<String>>> entity = new HttpEntity<>(orchestrationMap, headers);
151                 return restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference<List<InfraActiveRequests>>() {}).getBody();
152         }
153
154         public InfraActiveRequests checkVnfIdStatus(String operationalEnvironmentId) {
155                 URI uri = getUri(checkVnfIdStatus + operationalEnvironmentId);
156                 return restTemplate.exchange(uri, HttpMethod.GET, HttpEntity.EMPTY, InfraActiveRequests.class).getBody();
157         }
158         public InfraActiveRequests checkInstanceNameDuplicate(HashMap<String, String> instanceIdMap, String instanceName, String requestScope) {
159                 URI uri = getUri(checkInstanceNameDuplicate);
160                 HttpEntity<InstanceNameDuplicateCheckRequest> entity = new HttpEntity<>(new InstanceNameDuplicateCheckRequest(instanceIdMap, instanceName, requestScope), headers);
161                 try{
162                         return restTemplate.exchange(uri, HttpMethod.POST, entity, InfraActiveRequests.class).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         
172         public  OperationStatus getOneByServiceIdAndOperationId(String serviceId, String operationId){
173                 return this.getSingleOperationStatus(UriBuilder.fromUri(findOneByServiceIdAndOperationIdURI)
174                                 .queryParam(SERVICE_ID,serviceId)
175                                 .queryParam(OPERATION_ID,operationId)
176                                 .build());
177         }
178
179         public OperationalEnvServiceModelStatus findOneByOperationalEnvIdAndServiceModelVersionId(String operationalEnvironmentId, String serviceModelVersionId) {
180                 return this.getSingleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findOneByOperationalEnvIdAndServiceModelVersionIdURI)
181                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
182                                 .queryParam(SERVICE_MODEL_VERSION_ID,serviceModelVersionId)
183                                 .build());
184         }
185
186         public List<OperationalEnvServiceModelStatus> getAllByOperationalEnvIdAndRequestId(String operationalEnvironmentId, String requestId){
187                 return this.getMultipleOperationalEnvServiceModelStatus(UriBuilder.fromUri(findAllByOperationalEnvIdAndRequestIdURI)
188                                 .queryParam(OPERATIONAL_ENVIRONMENT_ID,operationalEnvironmentId)
189                                 .queryParam(REQUEST_ID,requestId)
190                                 .build());
191         }
192         
193         public OperationalEnvDistributionStatus getDistributionStatusById(String distributionId){
194                 return this.getSingleOperationalEnvDistributionStatus(UriBuilder.fromUri(operationalEnvDistributionStatusURI+distributionId).build());
195         }
196         
197         private OperationalEnvServiceModelStatus getSingleOperationalEnvServiceModelStatus(URI uri){
198                 return serviceModelStatusClient.get(uri);
199         }
200
201         private List<OperationalEnvServiceModelStatus> getMultipleOperationalEnvServiceModelStatus(URI uri){
202                 Iterable <OperationalEnvServiceModelStatus> iterable = serviceModelStatusClient.getAll(uri);
203                 List<OperationalEnvServiceModelStatus> serviceModelStatuses = new ArrayList<>();
204                 Iterator<OperationalEnvServiceModelStatus> statusIterator = iterable.iterator();
205                 statusIterator.forEachRemaining(serviceModelStatuses::add);
206                 return serviceModelStatuses;
207         }
208
209         public void save(InfraActiveRequests infraActiveRequests) {
210                 URI uri = getUri(infraActiveRequestURI);
211                 HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(infraActiveRequests, headers);
212                 restTemplate.postForLocation(uri, entity);
213         }
214         
215         public <T> void save(T object){
216                 URI uri = getUri(endpoint+classURLMapper.getURI(object.getClass()));
217                 HttpEntity<T> entity = new HttpEntity<>(object, headers);
218                 restTemplate.postForLocation(uri, entity);
219         }
220         
221         private OperationalEnvDistributionStatus getSingleOperationalEnvDistributionStatus(URI uri){
222                 return distributionStatusClient.get(uri);
223         }
224
225         private InfraActiveRequests getSingleInfraActiveRequests(URI uri) {
226                 return infraActiveRequestClient.get(uri);
227         }
228
229         public void updateInfraActiveRequests(InfraActiveRequests request) {            
230                 infraActiveRequestClient.put(request);
231         }
232         
233         private OperationStatus getSingleOperationStatus(URI uri){
234                 return operationStatusClient.get(uri);
235         }
236
237         private URI getUri(String uri) {
238                 return URI.create(uri);
239         }
240
241         @Bean
242         public RestTemplate restTemplate() {
243                 return new RestTemplate( new HttpComponentsClientHttpRequestFactory());
244         }
245
246         @Component
247         static class ClassURLMapper {
248                 private static final Map <Class,String> classURLMap = new HashMap<>();
249
250                 ClassURLMapper() {
251                         classURLMap.put(ArchivedInfraRequests.class,"/archivedInfraRequests/");
252                         classURLMap.put(InfraActiveRequests.class,"/infraActiveRequests/");
253                         classURLMap.put(OperationalEnvDistributionStatus.class,"/operationalEnvDistributionStatus/");
254                         classURLMap.put(OperationalEnvServiceModelStatus.class,"/operationalEnvServiceModelStatus/");
255                         classURLMap.put(OperationStatus.class,"/operationStatus/");
256                         classURLMap.put(ResourceOperationStatus.class,"/resourceOperationStatus/");
257                         classURLMap.put(SiteStatus.class,"/siteStatus/");
258                         classURLMap.put(WatchdogComponentDistributionStatus.class,"/watchdogComponentDistributionStatus/");
259                         classURLMap.put(WatchdogDistributionStatus.class,"/watchdogDistributionStatus/");
260                         classURLMap.put(WatchdogServiceModVerIdLookup.class,"/watchdogServiceModVerIdLookup/");
261                 }
262
263                   <T> String getURI(Class<T> className) {
264                           Class actualClass = classURLMap.keySet()
265                                           .stream()
266                                           .filter(requestdbClass -> requestdbClass.isAssignableFrom(className))
267                                           .findFirst()
268                                           .get();
269                           return classURLMap.get(actualClass);
270                 }
271         }
272 }