AAI data query changes for the MDONS CLosed
[holmes/common.git] / holmes-actions / src / main / java / org / onap / holmes / common / aai / AaiQueryMdons.java
1 /**
2  * Copyright 2020 Fujitsu Limited.
3  * <p>
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  * <p>
7  * http://www.apache.org/licenses/LICENSE-2.0
8  * <p>
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14
15 package org.onap.holmes.common.aai;
16
17 import com.google.gson.JsonArray;
18 import com.google.gson.JsonObject;
19 import com.google.gson.JsonParser;
20
21 import org.apache.http.HttpResponse;
22 import org.apache.http.client.methods.HttpGet;
23 import org.apache.http.client.methods.HttpPut;
24 import org.apache.http.entity.StringEntity;
25 import org.apache.http.impl.client.CloseableHttpClient;
26 import org.onap.holmes.common.aai.config.AaiConfig;
27 import org.onap.holmes.common.config.MicroServiceConfig;
28 import org.onap.holmes.common.exception.CorrelationException;
29 import org.onap.holmes.common.utils.HttpsUtils;
30
31 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getInfo;
32 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getPath;
33
34 import java.io.IOException;
35 import java.util.HashMap;
36 import java.util.Map;
37
38 import javax.ws.rs.core.MultivaluedHashMap;
39 import javax.ws.rs.core.MultivaluedMap;
40
41 import org.jvnet.hk2.annotations.Service;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45 @Service
46 public class AaiQueryMdons {
47
48     private final Logger log = LoggerFactory.getLogger(AaiQueryMdons.class);
49     private static final String RELATIONSHIP_VALUE = "relationship-value";
50     private static final String RELATIONSHIP_LIST = "relationship-list";
51     private static final String RELATIONSHIP_DATA = "relationship-data";
52     private MultivaluedMap<String, Object> headers;
53
54     public static AaiQueryMdons newInstance() {
55         return new AaiQueryMdons();
56     }
57
58     private AaiQueryMdons() {
59         headers = new MultivaluedHashMap<>();
60         headers.add("X-TransactionId", AaiConfig.X_TRANSACTION_ID);
61         headers.add("X-FromAppId", AaiConfig.X_FROMAPP_ID);
62         headers.add("Authorization", AaiConfig.getAuthenticationCredentials());
63         headers.add("Accept", "application/json");
64         headers.add("Content-Type", "application/json");
65     }
66
67     private String getCompletePath(String urlTemplate, Map<String, String> pathParams) {
68         String url = urlTemplate;
69         for (Map.Entry<String, String> entry : pathParams.entrySet()) {
70             url = url.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue());
71         }
72         return url;
73     }
74     
75     private String getResponse(String url) throws CorrelationException {
76         String response;
77         CloseableHttpClient httpClient = null;
78         HttpGet httpGet = new HttpGet(url);
79         try {
80             httpClient = HttpsUtils.getHttpsClient(HttpsUtils.DEFUALT_TIMEOUT);
81             HttpResponse httpResponse = HttpsUtils.get(httpGet, getHeaders(), httpClient);
82             response = HttpsUtils.extractResponseEntity(httpResponse);
83         } catch (Exception e) {
84             throw new CorrelationException("Failed to get data from aai", e);
85         } finally {
86             httpGet.releaseConnection();
87             if (httpClient != null) {
88                 try {
89                     httpClient.close();
90                 } catch (IOException e) {
91                     log.warn("Failed to close http client!");
92                 }
93             }
94         }
95         return response;
96     }
97
98     private Map<String, String> getHeaders() {
99         Map<String, String> headers = new HashMap<>();
100         headers.put("X-TransactionId", AaiConfig.X_TRANSACTION_ID);
101         headers.put("X-FromAppId", AaiConfig.X_FROMAPP_ID);
102         headers.put("Authorization", AaiConfig.getAuthenticationCredentials());
103         headers.put("Accept", "application/json");
104         return headers;
105     }
106
107     public Map<String, String> processPnf(String pnfId) throws CorrelationException {
108         Map<String, String> accessServiceMap = new HashMap<>();
109         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_VALUE, "pnfName", pnfId);
110         String pnf = getResponse(url);
111         JsonObject jObject = JsonParser.parseString(pnf).getAsJsonObject();
112         JsonObject pInterfaces = AaiJsonParserUtil.extractJsonObject(jObject, "p-interfaces");
113         JsonArray pInterface = AaiJsonParserUtil.extractJsonArray(pInterfaces, "p-interface");
114         for (int i = 0; i < pInterface.size(); i++) {
115             JsonObject relationshiplist =
116                     AaiJsonParserUtil.extractJsonObject(pInterface.get(i).getAsJsonObject(), RELATIONSHIP_LIST);
117             JsonArray relationship = AaiJsonParserUtil.extractJsonArray(relationshiplist, "relationship");
118             if (relationship != null) {
119                 for (int j = 0; j < relationship.size(); j++) {
120                     JsonObject object = relationship.get(j).getAsJsonObject();
121                     if (object.get("related-to").getAsString().equals("service-instance")) {
122                         String domain = object.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject()
123                                 .get(RELATIONSHIP_VALUE).getAsString();
124
125                         String access = getAccessServiceForDomain(domain);
126                         String[] accessSplit = access.split("__");
127                         accessServiceMap.put(accessSplit[0], accessSplit[1]);
128
129                     }
130
131                 }
132
133             }
134         }
135         return accessServiceMap;
136     }
137
138     private String getServiceInstanceAai(String serviceInstanceId) throws CorrelationException {
139         Map<String, String> paramMap = new HashMap<>();
140         paramMap.put("global-customer-id", "Orange");
141         paramMap.put("service-type", "MDONS_OTN");
142         paramMap.put("instance-id", serviceInstanceId);
143         String url = MicroServiceConfig.getAaiAddr() + getCompletePath(AaiConfig.AaiConsts.AAI_SERVICE, paramMap);
144         return getResponse(url);
145     }
146
147     private String getAccessServiceForDomain(String serviceInstanceId) throws CorrelationException {
148         String domainInstance = getServiceInstanceAai(serviceInstanceId);
149         JsonObject matchedObject = getInfo(domainInstance, "service-instance");
150         String accessInstanceId = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject()
151                 .get(RELATIONSHIP_VALUE).getAsString();
152         String accessName = matchedObject.get("related-to-property").getAsJsonArray().get(0).getAsJsonObject()
153                 .get("property-value").getAsString();
154         return accessInstanceId + "__" + accessName;
155     }
156
157     public void updateLinksForAccessService(Map<String, String> accessInstanceList) throws CorrelationException {
158         for (String access : accessInstanceList.keySet()) {
159             String response = getServiceInstanceAai(access);
160             JsonObject matchedObject = getInfo(response, "logical-link");
161             if (matchedObject != null) {
162                 String linkName = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(0).getAsJsonObject()
163                         .get(RELATIONSHIP_VALUE).getAsString();
164                 updateLogicLinkStatus(linkName, "down");
165             }
166
167         }
168
169     }
170
171     public String getPnfNameFromPnfId(String pnfId) throws CorrelationException {
172         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_ID, "pnfId", pnfId);
173         String pnf = getResponse(url);
174         JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject();
175         JsonArray pnfList = AaiJsonParserUtil.extractJsonArray(jsonObject, "pnf");
176         return pnfList.get(0).getAsJsonObject().get("pnf-name").getAsString();
177
178     }
179
180     public void updatePnfOperationalStatus(String pnfName, String status) throws CorrelationException {
181         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF, "pnfName", pnfName);
182         String pnf = getResponse(url);
183         JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject();
184         jsonObject.addProperty("operational-status", status);
185         put(url, jsonObject.toString());
186
187     }
188
189     public void updateLogicLinkStatus(String linkName, String status) throws CorrelationException {
190         String url =
191                 MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_LINK_UPDATE, "linkName", linkName);
192         String response = getResponse(url);
193         JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
194         jsonObject.addProperty("operational-status", status);
195         put(url, jsonObject.toString());
196     }
197
198     private HttpResponse put(String url, String content) throws CorrelationException {
199         CloseableHttpClient httpClient = null;
200         HttpPut httpPut = new HttpPut(url);
201         try {
202             httpClient = HttpsUtils.getConditionalHttpsClient(HttpsUtils.DEFUALT_TIMEOUT);
203             return HttpsUtils.put(httpPut, getHeaders(), new HashMap<>(), new StringEntity(content), httpClient);
204         } catch (Exception e) {
205             throw new CorrelationException("Failed to put data in AAI", e);
206         } finally {
207             closeHttpClient(httpClient);
208         }
209     }
210
211     private void closeHttpClient(CloseableHttpClient httpClient) {
212         if (httpClient != null) {
213             try {
214                 httpClient.close();
215             } catch (IOException e) {
216                 log.warn("Failed to close http client!");
217             }
218         }
219     }
220
221 }