Switched from Dropwizard to Springboot
[holmes/common.git] / holmes-actions / src / main / java / org / onap / holmes / common / aai / AaiQueryMdons.java
1 /**
2  * Copyright 2020 - 2021 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 import org.onap.holmes.common.aai.config.AaiConfig;
21 import org.onap.holmes.common.config.MicroServiceConfig;
22 import org.onap.holmes.common.exception.CorrelationException;
23 import org.onap.holmes.common.utils.JerseyClient;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26 import org.springframework.stereotype.Service;
27
28 import javax.ws.rs.client.Entity;
29 import javax.ws.rs.core.MultivaluedHashMap;
30 import javax.ws.rs.core.MultivaluedMap;
31 import java.util.HashMap;
32 import java.util.Map;
33
34 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getInfo;
35 import static org.onap.holmes.common.aai.AaiJsonParserUtil.getPath;
36
37 @Service
38 public class AaiQueryMdons {
39
40     private final Logger log = LoggerFactory.getLogger(AaiQueryMdons.class);
41     private static final String RELATIONSHIP_VALUE = "relationship-value";
42     private static final String RELATIONSHIP_LIST = "relationship-list";
43     private static final String RELATIONSHIP_DATA = "relationship-data";
44     private MultivaluedMap<String, Object> headers;
45
46     public static AaiQueryMdons newInstance() {
47         return new AaiQueryMdons();
48     }
49
50     private AaiQueryMdons() {
51         headers = new MultivaluedHashMap<>();
52         headers.add("X-TransactionId", AaiConfig.X_TRANSACTION_ID);
53         headers.add("X-FromAppId", AaiConfig.X_FROMAPP_ID);
54         headers.add("Authorization", AaiConfig.getAuthenticationCredentials());
55         headers.add("Accept", "application/json");
56         headers.add("Content-Type", "application/json");
57     }
58
59     private String getCompletePath(String urlTemplate, Map<String, String> pathParams) {
60         String url = urlTemplate;
61         for (Map.Entry<String, String> entry : pathParams.entrySet()) {
62             url = url.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue());
63         }
64         return url;
65     }
66
67     private String getResponse(String url) throws CorrelationException {
68         try {
69             return JerseyClient.newInstance().headers(getHeaders()).get(url);
70         } catch (Exception e) {
71             throw new CorrelationException("Failed to get data from aai", e);
72         }
73     }
74
75     private Map<String, Object> getHeaders() {
76         Map<String, Object> headers = new HashMap<>();
77         headers.put("X-TransactionId", AaiConfig.X_TRANSACTION_ID);
78         headers.put("X-FromAppId", AaiConfig.X_FROMAPP_ID);
79         headers.put("Authorization", AaiConfig.getAuthenticationCredentials());
80         headers.put("Accept", "application/json");
81         return headers;
82     }
83
84     public Map<String, String> processPnf(String pnfId) throws CorrelationException {
85         Map<String, String> accessServiceMap = new HashMap<>();
86         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_VALUE, "pnfName", pnfId);
87         String pnf = getResponse(url);
88         JsonObject jObject = JsonParser.parseString(pnf).getAsJsonObject();
89         JsonObject pInterfaces = AaiJsonParserUtil.extractJsonObject(jObject, "p-interfaces");
90         JsonArray pInterface = AaiJsonParserUtil.extractJsonArray(pInterfaces, "p-interface");
91         for (int i = 0; i < pInterface.size(); i++) {
92             JsonObject relationshiplist =
93                     AaiJsonParserUtil.extractJsonObject(pInterface.get(i).getAsJsonObject(), RELATIONSHIP_LIST);
94             JsonArray relationship = AaiJsonParserUtil.extractJsonArray(relationshiplist, "relationship");
95             if (relationship != null) {
96                 for (int j = 0; j < relationship.size(); j++) {
97                     JsonObject object = relationship.get(j).getAsJsonObject();
98                     if (object.get("related-to").getAsString().equals("service-instance")) {
99                         String domain = object.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject()
100                                 .get(RELATIONSHIP_VALUE).getAsString();
101
102                         String access = getAccessServiceForDomain(domain);
103                         String[] accessSplit = access.split("__");
104                         accessServiceMap.put(accessSplit[0], accessSplit[1]);
105
106                     }
107
108                 }
109
110             }
111         }
112         return accessServiceMap;
113     }
114
115     private String getServiceInstanceAai(String serviceInstanceId) throws CorrelationException {
116         Map<String, String> paramMap = new HashMap<>();
117         paramMap.put("global-customer-id", "Orange");
118         paramMap.put("service-type", "MDONS_OTN");
119         paramMap.put("instance-id", serviceInstanceId);
120         String url = MicroServiceConfig.getAaiAddr() + getCompletePath(AaiConfig.AaiConsts.AAI_SERVICE, paramMap);
121         return getResponse(url);
122     }
123
124     private String getAccessServiceForDomain(String serviceInstanceId) throws CorrelationException {
125         String domainInstance = getServiceInstanceAai(serviceInstanceId);
126         JsonObject matchedObject = getInfo(domainInstance, "service-instance");
127         String accessInstanceId = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(2).getAsJsonObject()
128                 .get(RELATIONSHIP_VALUE).getAsString();
129         String accessName = matchedObject.get("related-to-property").getAsJsonArray().get(0).getAsJsonObject()
130                 .get("property-value").getAsString();
131         return accessInstanceId + "__" + accessName;
132     }
133
134     public void updateLinksForAccessService(Map<String, String> accessInstanceList) throws CorrelationException {
135         for (String access : accessInstanceList.keySet()) {
136             String response = getServiceInstanceAai(access);
137             JsonObject matchedObject = getInfo(response, "logical-link");
138             if (matchedObject != null) {
139                 String linkName = matchedObject.get(RELATIONSHIP_DATA).getAsJsonArray().get(0).getAsJsonObject()
140                         .get(RELATIONSHIP_VALUE).getAsString();
141                 updateLogicLinkStatus(linkName, "down");
142             }
143
144         }
145
146     }
147
148     public String getPnfNameFromPnfId(String pnfId) throws CorrelationException {
149         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF_ID, "pnfId", pnfId);
150         String pnf = getResponse(url);
151         JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject();
152         JsonArray pnfList = AaiJsonParserUtil.extractJsonArray(jsonObject, "pnf");
153         return pnfList.get(0).getAsJsonObject().get("pnf-name").getAsString();
154
155     }
156
157     public void updatePnfOperationalStatus(String pnfName, String status) throws CorrelationException {
158         String url = MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_PNF, "pnfName", pnfName);
159         String pnf = getResponse(url);
160         JsonObject jsonObject = JsonParser.parseString(pnf).getAsJsonObject();
161         jsonObject.addProperty("operational-status", status);
162         put(url, jsonObject.toString());
163
164     }
165
166     public void updateLogicLinkStatus(String linkName, String status) throws CorrelationException {
167         String url =
168                 MicroServiceConfig.getAaiAddr() + getPath(AaiConfig.AaiConsts.AAI_LINK_UPDATE, "linkName", linkName);
169         String response = getResponse(url);
170         JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
171         jsonObject.addProperty("operational-status", status);
172         put(url, jsonObject.toString());
173     }
174
175     private void put(String url, String content) throws CorrelationException {
176         try {
177             JerseyClient.newInstance().headers(getHeaders()).put(url, Entity.json(content));
178         } catch (Exception e) {
179             throw new CorrelationException("Failed to put data in AAI", e);
180         }
181     }
182 }