/** * Copyright 2020 - 2021 Fujitsu Limited. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.onap.holmes.common.aai; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.onap.holmes.common.aai.config.AaiConfig; import org.onap.holmes.common.config.MicroServiceConfig; import org.onap.holmes.common.exception.CorrelationException; import org.onap.holmes.common.utils.JerseyClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import java.util.HashMap; import java.util.Map; import static org.onap.holmes.common.aai.AaiJsonParserUtil.getInfo; import static org.onap.holmes.common.aai.AaiJsonParserUtil.getPath; @Service public class AaiQueryMdons { private final Logger log = LoggerFactory.getLogger(AaiQueryMdons.class); private static final String RELATIONSHIP_VALUE = "relationship-value"; private static final String RELATIONSHIP_LIST = "relationship-list"; private static final String RELATIONSHIP_DATA = "relationship-data"; private MultivaluedMap headers; public static AaiQueryMdons newInstance() { return new AaiQueryMdons(); } private AaiQueryMdons() { headers = new MultivaluedHashMap<>(); headers.add("X-TransactionId", AaiConfig.X_TRANSACTION_ID); headers.add("X-FromAppId", AaiConfig.X_FROMAPP_ID); headers.add("Authorization", AaiConfig.getAuthenticationCredentials()); headers.add("Accept", "application/json"); headers.add("Content-Type", "application/json"); } private String getCompletePath(String urlTemplate, Map pathParams) { String url = urlTemplate; for (Map.Entry entry : pathParams.entrySet()) { url = url.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue()); } return url; } private String getResponse(String url) throws CorrelationException { try { return JerseyClient.newInstance().headers(getHeaders()).get(url); } catch (Exception e) { throw new CorrelationException("Failed to get data from aai", e); } } private Map getHeaders() { Map headers = new HashMap<>(); headers.put("X-TransactionId", AaiConfig.X_TRANSACTION_ID); headers.put("X-FromAppId", AaiConfig.X_FROMAPP_ID); headers.put("Authorization", AaiConfig.getAuthenticationCredentials()); headers.put("Accept", "application/json"); return headers; } public Map processPnf(String pnfId) throws CorrelationException { Map accessServiceMap = new HashMap<>(); String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_VALUE, "pnfName", pnfId); String pnf = getResponse(url); JsonObject jObject = JsonParser.parseString(pnf).getAsJsonObject(); JsonObject pInterfaces = AaiJsonParserUtil.extractJsonObject(jObject, "p-interfaces"); JsonArray pInterface = AaiJsonParserUtil.extractJsonArray(pInterfaces, "p-interface"); for (int i = 0; i < pInterface.size(); i++) { JsonObject relationshiplist = AaiJsonParserUtil.extractJsonObject(pInterface.get(i).getAsJsonObject(), RELATIONSHIP_LIST); JsonArray relationship = AaiJsonParserUtil.extractJsonArray(relationshiplist, "relationship"); if (relationship != null) { for (int j = 0; j < relationship.size(); j++) { JsonObject object = relationship.get(j).getAsJsonObject(); if (object.get("related-to").getAsString().equals("service-instance")) { String domain = object.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject() .get(RELATIONSHIP_VALUE).getAsString(); String access = getAccessServiceForDomain(domain); String[] accessSplit = access.split("__"); accessServiceMap.put(accessSplit[0], accessSplit[1]); } } } } return accessServiceMap; } private String getServiceInstanceAai(String serviceInstanceId) throws CorrelationException { Map paramMap = new HashMap<>(); paramMap.put("global-customer-id", "Orange"); paramMap.put("service-type", "MDONS_OTN"); paramMap.put("instance-id", serviceInstanceId); String url = MicroServiceConfig.getAaiAddr() + getCompletePath(AaiConfig.AaiConsts.AAI_SERVICE, paramMap); return getResponse(url); } private String getAccessServiceForDomain(String serviceInstanceId) throws CorrelationException { String domainInstance = getServiceInstanceAai(serviceInstanceId); JsonObject matchedObject = getInfo(domainInstance, "service-instance"); String accessInstanceId = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject() .get(RELATIONSHIP_VALUE).getAsString(); String accessName = matchedObject.get("related-to-property").getAsJsonArray().get(0).getAsJsonObject() .get("property-value").getAsString(); return accessInstanceId + "__" + accessName; } public void updateLinksForAccessService(Map accessInstanceList) throws CorrelationException { for (String access : accessInstanceList.keySet()) { String response = getServiceInstanceAai(access); JsonObject matchedObject = getInfo(response, "logical-link"); if (matchedObject != null) { String linkName = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(0).getAsJsonObject() .get(RELATIONSHIP_VALUE).getAsString(); updateLogicLinkStatus(linkName, "down"); } } } public String getPnfNameFromPnfId(String pnfId) throws CorrelationException { String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_ID, "pnfId", pnfId); String pnf = getResponse(url); JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject(); JsonArray pnfList = AaiJsonParserUtil.extractJsonArray(jsonObject, "pnf"); return pnfList.get(0).getAsJsonObject().get("pnf-name").getAsString(); } public void updatePnfOperationalStatus(String pnfName, String status) throws CorrelationException { String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF, "pnfName", pnfName); String pnf = getResponse(url); JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject(); jsonObject.addProperty("operational-status", status); put(url, jsonObject.toString()); } public void updateLogicLinkStatus(String linkName, String status) throws CorrelationException { String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_LINK_UPDATE, "linkName", linkName); String response = getResponse(url); JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject(); jsonObject.addProperty("operational-status", status); put(url, jsonObject.toString()); } private void put(String url, String content) throws CorrelationException { try { JerseyClient.newInstance().headers(getHeaders()).put(url, Entity.json(content)); } catch (Exception e) { throw new CorrelationException("Failed to put data in AAI", e); } } }