summaryrefslogtreecommitdiffstats
path: root/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java
diff options
context:
space:
mode:
Diffstat (limited to 'components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java')
-rw-r--r--components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java432
1 files changed, 432 insertions, 0 deletions
diff --git a/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java b/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java
new file mode 100644
index 00000000..b68373d1
--- /dev/null
+++ b/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/aai/AaiService.java
@@ -0,0 +1,432 @@
+/*******************************************************************************
+ * ============LICENSE_START=======================================================
+ * slice-analysis-ms
+ * ================================================================================
+ * Copyright (C) 2021-2022 Wipro Limited.
+ * Copyright (C) 2022 Huawei Canada Limited.
+ * Copyright (C) 2022 Huawei Technologies Co., Ltd.
+ * ==============================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ *******************************************************************************/
+
+package org.onap.slice.analysis.ms.aai;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import java.util.Set;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.slice.analysis.ms.models.Configuration;
+import org.onap.slice.analysis.ms.models.aai.ServiceInstance;
+import org.onap.slice.analysis.ms.restclients.AaiRestClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * Service for AAI interfaces
+ *
+ */
+@Service
+public class AaiService implements AaiInterface {
+
+ private static Logger log = LoggerFactory.getLogger(Configuration.class);
+
+ @Autowired
+ AaiRestClient restclient;
+
+ private static ObjectMapper objectMapper = new ObjectMapper();
+ private static String globalSubscriberId;
+ private static String subscriptionServiceType;
+ private static String aaiBaseUrl = Configuration.getInstance().getAaiUrl();
+
+ /**
+ * Fetches the details of a service
+ *
+ * @param snssai SNSSAI ID
+ * @return responseMap contains service details
+ */
+ public Map<String, String> fetchServiceDetails(String snssai) {
+ Map<String, String> responseMap = fetchSubscriberAndSubscriptionServiceType();
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType + "/service-instances";
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ String serviceRole = "AN-NF";
+ try {
+ String serviceInstance =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject serviceInstanceJson = new JSONObject(serviceInstance);
+ JSONArray serviceInstanceList = serviceInstanceJson.getJSONArray("service-instance");
+ for (int i = 0; i < serviceInstanceList.length(); i++) {
+ JSONObject serviceObj = serviceInstanceList.getJSONObject(i);
+ if (serviceObj.has("environment-context") && serviceObj.getString("environment-context").equalsIgnoreCase(snssai)
+ && serviceObj.has("workload-context") && serviceObj.getString("workload-context").contains("AN")
+ && serviceObj.has("service-role")
+ && serviceObj.getString("service-role").contains("slice-profile")) {
+ responseMap.put("sliceProfileId", serviceObj.getString("service-instance-id"));
+ }
+ }
+
+ String serviceRoleReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType
+ + "/service-instances/?service-role=nssi&depth=2";
+ log.info("serviceRoleReqUrl {}", serviceRoleReqUrl);
+ String serviceInstanceForServiceRole =
+ restclient.sendGetRequest(serviceRoleReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject serviceInstanceForServiceRoleJson = new JSONObject(serviceInstanceForServiceRole);
+ JSONArray serviceInstanceListForServiceRole =
+ serviceInstanceForServiceRoleJson.getJSONArray("service-instance");
+ for (int i = 0; i < serviceInstanceListForServiceRole.length(); i++) {
+ JSONObject serviceObj = serviceInstanceListForServiceRole.getJSONObject(i);
+ if (serviceObj.has("workload-context") && serviceObj.getString("workload-context").trim().equalsIgnoreCase(serviceRole)) {
+ responseMap.put("ranNFNSSIId", serviceObj.getString("service-instance-id"));
+ }
+ }
+ } catch (Exception e) {
+ log.info("Exception while fetching serviceDetails: " + e);
+ }
+ responseMap.put("sNSSAI", snssai);
+ log.info("subscriber details: " + responseMap);
+ return responseMap;
+ }
+
+ /**
+ * fetch all valid cll instances
+ * @return
+ */
+ public Set<String> fetchAllCllInstances() {
+ globalSubscriberId = "IBNCustomer";
+ subscriptionServiceType = "IBN";
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType + "/service-instances";
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ Set<String> cllInstances = new HashSet<>();
+ try {
+ String serviceInstance =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ log.debug("The service instance response msg are :{}", serviceInstance);
+ JSONObject serviceInstanceJson = new JSONObject(serviceInstance);
+ JSONArray serviceInstanceArray = serviceInstanceJson.getJSONArray("service-instance");
+ for (int i = 0; i < serviceInstanceArray.length(); i++) {
+ JSONObject serviceObj = serviceInstanceArray.getJSONObject(i);
+ String serviceId = serviceObj.getString("service-instance-id");
+ log.debug("Jsonobject {}", serviceObj);
+ if(serviceId.startsWith("cll")){
+ cllInstances.add(serviceId);
+ log.debug("Add {} to latest service id list", serviceId);
+ }
+ }
+ return cllInstances;
+ } catch (Exception e) {
+ log.error("Exception while fetching serviceDetails: " + e);
+ }
+ return new HashSet<>();
+ }
+
+ /**
+ * Fetches the current configuration of a Slice from AAI
+ *
+ * @param snssai SNSSAI ID
+ * @return responseMap contains slice configuration
+ */
+ public Map<String, Integer> fetchCurrentConfigurationOfSlice(String snssai) {
+ log.info("AAI fetch config Slice: " + aaiBaseUrl);
+ String serviceInstaneId = null;
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType + "/service-instances";
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ Map<String, Integer> responseMap = new HashMap<String, Integer>();
+ try {
+ String serviceInstance =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject serviceInstanceJson = new JSONObject(serviceInstance);
+
+ JSONArray serviceInstanceList = serviceInstanceJson.getJSONArray("service-instance");
+ for (int i = 0; i < serviceInstanceList.length(); i++) {
+ JSONObject serviceObj = serviceInstanceList.getJSONObject(i);
+ if (serviceObj.has("environment-context") && serviceObj.getString("environment-context").equalsIgnoreCase(snssai)
+ && serviceObj.has("workload-context") && serviceObj.getString("workload-context").contains("AN")
+ && serviceObj.has("service-role")
+ && serviceObj.getString("service-role").contains("slice-profile-instance")) {
+ serviceInstaneId = serviceObj.getString("service-instance-id");
+ }
+ }
+
+ String sliceProfileReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType
+ + "/service-instances/service-instance/" + serviceInstaneId + "/slice-profiles";
+ log.info("sliceProfileReqUrl {}", sliceProfileReqUrl);
+ String sliceProfile = restclient
+ .sendGetRequest(sliceProfileReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject sliceProfileJson = new JSONObject(sliceProfile);
+ JSONArray sliceProfileList = sliceProfileJson.getJSONArray("slice-profile");
+ for (int i = 0; i < sliceProfileList.length(); i++) {
+ JSONObject sliceProfileObj = sliceProfileList.getJSONObject(i);
+ responseMap.put("dLThptPerSlice", sliceProfileObj.getInt("exp-data-rate-UL"));
+ responseMap.put("uLThptPerSlice", sliceProfileObj.getInt("exp-data-rate-DL"));
+ break;
+ }
+ log.info("Slice configuration: " + responseMap);
+ } catch (Exception e) {
+ log.info("AAI Slice: " + e);
+ }
+ return responseMap;
+ }
+
+ /**
+ * Fetches the details of a subscriber and subscription Service
+ *
+ * @return responseMap contains details of subscriber and subscription service
+ */
+ public Map<String, String> fetchSubscriberAndSubscriptionServiceType() {
+
+ Map<String, String> responseMap = new HashMap<String, String>();
+
+ log.info("Get GlobalSubscriberId");
+ String subscriberReqUrl = aaiBaseUrl + "/business/customers";
+ log.info("subscriberReqUrl {}", subscriberReqUrl);
+ try {
+ String subscriberReq =
+ restclient.sendGetRequest(subscriberReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject subscriberReqJson = new JSONObject(subscriberReq);
+ JSONArray subscriberReqJsonList = subscriberReqJson.getJSONArray("customer");
+ for (int i = 0; i < subscriberReqJsonList.length(); i++) {
+ JSONObject subscriberReqObj = subscriberReqJsonList.getJSONObject(i);
+ globalSubscriberId = subscriberReqObj.getString("global-customer-id");
+ responseMap.put("globalSubscriberId", globalSubscriberId);
+ break;
+ }
+
+ log.info("Get subscriptionServiceType");
+ String subscriptionServiceReqUrl =
+ aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId + "/service-subscriptions";
+ log.info("subscriptionServiceReqUrl: {}", subscriptionServiceReqUrl);
+ String subscriptionService = restclient
+ .sendGetRequest(subscriptionServiceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ JSONObject subscriptionServiceJson = new JSONObject(subscriptionService);
+ JSONArray subscriptionServiceListJson = subscriptionServiceJson.getJSONArray("service-subscription");
+ for (int i = 0; i < subscriptionServiceListJson.length(); i++) {
+ JSONObject subscriptionServiceObj = subscriptionServiceListJson.getJSONObject(i);
+ subscriptionServiceType = subscriptionServiceObj.getString("service-type");
+ responseMap.put("subscriptionServiceType", subscriptionServiceType);
+ break;
+ }
+ } catch (Exception e) {
+ log.info("Exception while fetching subscriber and subscription: " + e);
+ }
+
+ log.info("responseMap: " + responseMap);
+ return responseMap;
+
+ }
+
+ /**
+ * Fetches the SNSSIs of a serviceInstanceId
+ *
+ * @param sliceInstanceId service instance ID
+ * @return snssaiList contains list of SNSSAIs
+ */
+ public List<String> getSnssaiList(String sliceInstanceId) {
+ fetchSubscriberAndSubscriptionServiceType();
+ List<String> allotedResource = new ArrayList<>();
+ List<String> sliceProfileList = new ArrayList<>();
+ List<String> snssaiList = new ArrayList<>();
+
+ log.info("fetch slice instance details");
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType
+ + "/service-instances/service-instance/" + sliceInstanceId;
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ try {
+ String serviceInstanceString =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ ServiceInstance serviceInstance = objectMapper.readValue(serviceInstanceString, ServiceInstance.class);
+ if (serviceInstance.getServiceRole().equalsIgnoreCase("nsi")) {
+ serviceInstance.getRelationshipList().getRelationship().forEach(relationship -> {
+ if (Objects.nonNull(relationship.getRelatedTo()) && relationship.getRelatedTo().equalsIgnoreCase("allotted-resource")) {
+ relationship.getRelationshipData().forEach(data -> {
+ if (data.get("relationship-key").equalsIgnoreCase("service-instance.service-instance-id")) {
+ allotedResource.add(data.get("relationship-value"));
+ }
+
+ });
+ }
+ });
+
+ return fetchSnssaiOfSliceProfile(fetchSliceProfilesOfAllotedResourceData(allotedResource));
+
+ }
+ if (serviceInstance.getServiceRole().equalsIgnoreCase("nssi")) {
+ serviceInstance.getRelationshipList().getRelationship().forEach(relationship -> {
+ if (Objects.nonNull(relationship.getRelatedToProperty())) {
+ relationship.getRelatedToProperty().forEach(property -> {
+ if (property.get("property-value").contains("sliceprofile")) {
+ relationship.getRelationshipData().forEach(data -> {
+ if (data.get("relationship-key")
+ .equalsIgnoreCase("service-instance.service-instance-id")) {
+ sliceProfileList.add(data.get("relationship-value"));
+ }
+
+ });
+
+ }
+
+ });
+ }
+ });
+ return fetchSnssaiOfSliceProfile(sliceProfileList);
+ }
+
+ } catch (Exception e) {
+ log.info("Exception while fetching snssaiList: " + e);
+ }
+
+ return snssaiList;
+
+ }
+
+ /**
+ * Fetches the sliceProfileList of a AllotedResource
+ *
+ * @param allotedResourceList contains list of allotedResource IDs
+ * @return sliceProfilesList contains list of SliceProfiles
+ */
+ public List<String> fetchSliceProfilesOfAllotedResourceData(List<String> allotedResourceList) {
+
+ List<String> sliceProfileList = new ArrayList<>();
+
+ log.info("fetch Alloted Resource Data");
+
+ allotedResourceList.forEach(serviceInstanceId -> {
+ try {
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType
+ + "/service-instances/service-instance/" + serviceInstanceId;
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ String serviceInstanceString =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ ServiceInstance serviceInstance = objectMapper.readValue(serviceInstanceString, ServiceInstance.class);
+
+ serviceInstance.getRelationshipList().getRelationship().forEach(relationship -> {
+ relationship.getRelatedToProperty().forEach(property -> {
+ if (property.get("property-value").contains("sliceprofile")) {
+ relationship.getRelationshipData().forEach(data -> {
+ if (data.get("relationship-key")
+ .equalsIgnoreCase("service-instance.service-instance-id")) {
+ sliceProfileList.add(data.get("relationship-value"));
+ }
+
+ });
+
+ }
+
+ });
+
+ });
+ } catch (Exception e) {
+ log.info("Exception while fetching AllotedResourceData: " + e);
+ }
+
+ });
+
+ log.info("sliceProfileList: " + sliceProfileList);
+
+ return sliceProfileList;
+
+ }
+
+ /**
+ * Fetches the snssaiList of a SliceProfile
+ *
+ * @param sliceProfileList contains list of sliceProfile IDs
+ * @return snssaiList contains list of SNSSAIs
+ */
+ public List<String> fetchSnssaiOfSliceProfile(List<String> sliceProfileList) {
+ List<String> snssaiList = new ArrayList<>();
+
+ log.info("fetch SliceProfile");
+ sliceProfileList.forEach(serviceInstanceId -> {
+ String serviceReqUrl = aaiBaseUrl + "/business/customers/customer/" + globalSubscriberId
+ + "/service-subscriptions/service-subscription/" + subscriptionServiceType + "/service-instances/"
+ + "service-instance/" + serviceInstanceId;
+ log.info("serviceReqUrl {}", serviceReqUrl);
+ try {
+ String serviceInstanceString =
+ restclient.sendGetRequest(serviceReqUrl, new ParameterizedTypeReference<String>() {}).getBody();
+ ServiceInstance serviceInstance = objectMapper.readValue(serviceInstanceString, ServiceInstance.class);
+
+ if (serviceInstance.getServiceRole().equalsIgnoreCase("slice-profile")) {
+ if (!snssaiList.contains(serviceInstance.getEnvironmentContext())) {
+ snssaiList.add(serviceInstance.getEnvironmentContext());
+ }
+ }
+
+ } catch (Exception e) {
+ log.info("Exception while fetching sliceProfile data: " + e);
+ }
+
+ });
+ log.info("snssaiList: " + snssaiList);
+
+ return snssaiList;
+
+ }
+
+ /**
+ * Get network bandwidth attribute of an ethernet service. These data is inside a network policy whose
+ * etwork-policy-fqdn equals to provided service-instance-id
+ * @param serviceId target service instance id
+ * @return Map contains maxBandwidth value of given service-instance
+ */
+ public Map<String, Integer> fetchMaxBandwidthOfService(String serviceId){
+ log.info("Fetching max-bandwidth from AAI network-policy");
+ String networkPolicyUrl = aaiBaseUrl + "/network/network-policies" + "?network-policy-fqdn="
+ + serviceId;
+ Map<String, Integer> result = new HashMap<>();
+ try {
+ ResponseEntity<String> resp = restclient.sendGetRequest(networkPolicyUrl, new ParameterizedTypeReference<String>() {
+ });
+ log.debug("AaiService received {} : {}", resp.getStatusCodeValue(), resp.getBody());
+ if (resp.getStatusCodeValue() == 200){
+ String networkPolicy = resp.getBody();
+ JSONObject networkPolicyJson = new JSONObject(networkPolicy);
+ JSONArray networkPolicyList = networkPolicyJson.optJSONArray("network-policy");
+ if (networkPolicyList != null && networkPolicyList.length() > 0){
+ JSONObject networkPolicyOjb = networkPolicyList.getJSONObject(0);
+ result.put("maxBandwidth", networkPolicyOjb.getInt("max-bandwidth"));
+ log.info("Successfully retrieved max bandwidth for service {}: {}",
+ serviceId, result.get("maxBandwidth"));
+ return result;
+ }
+ }
+ log.warn("Failed to retrieve max bandwidth for service {}, no such network-policy or no valid max-bandwidth " +
+ "associated", serviceId);
+ } catch (Exception e){
+ log.warn("Error encountered when fetching maxbandwidth: " + e);
+ }
+ return new HashMap<String, Integer>();
+ }
+}