2 * Copyright 2020 Fujitsu Limited.
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
7 * http://www.apache.org/licenses/LICENSE-2.0
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
15 package org.onap.holmes.common.aai;
17 import com.google.gson.JsonArray;
18 import com.google.gson.JsonObject;
19 import com.google.gson.JsonParser;
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;
31 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getInfo;
32 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getPath;
34 import java.io.IOException;
35 import java.util.HashMap;
38 import javax.ws.rs.core.MultivaluedHashMap;
39 import javax.ws.rs.core.MultivaluedMap;
41 import org.jvnet.hk2.annotations.Service;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
46 public class AaiQueryMdons {
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;
54 public static AaiQueryMdons newInstance() {
55 return new AaiQueryMdons();
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");
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());
75 private String getResponse(String url) throws CorrelationException {
77 CloseableHttpClient httpClient = null;
78 HttpGet httpGet = new HttpGet(url);
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);
86 httpGet.releaseConnection();
87 if (httpClient != null) {
90 } catch (IOException e) {
91 log.warn("Failed to close http client!");
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");
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();
125 String access = getAccessServiceForDomain(domain);
126 String[] accessSplit = access.split("__");
127 accessServiceMap.put(accessSplit[0], accessSplit[1]);
135 return accessServiceMap;
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);
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;
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");
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();
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());
189 public void updateLogicLinkStatus(String linkName, String status) throws CorrelationException {
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());
198 private HttpResponse put(String url, String content) throws CorrelationException {
199 CloseableHttpClient httpClient = null;
200 HttpPut httpPut = new HttpPut(url);
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);
207 closeHttpClient(httpClient);
211 private void closeHttpClient(CloseableHttpClient httpClient) {
212 if (httpClient != null) {
215 } catch (IOException e) {
216 log.warn("Failed to close http client!");