2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2018 Nokia. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.vid.services;
24 import io.joshworks.restclient.http.HttpResponse;
25 import org.apache.http.HttpStatus;
26 import org.codehaus.jackson.JsonNode;
27 import org.onap.vid.aai.*;
28 import org.onap.vid.aai.ServiceInstance;
29 import org.onap.vid.aai.ServiceSubscription;
30 import org.onap.vid.aai.Services;
31 import org.onap.vid.aai.model.AaiGetAicZone.AicZones;
32 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.AaiGetNetworkCollectionDetails;
33 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.AaiGetRelatedInstanceGroupsByVnfId;
34 import org.onap.vid.aai.model.AaiGetOperationalEnvironments.OperationalEnvironmentList;
35 import org.onap.vid.aai.model.AaiGetPnfs.Pnf;
36 import org.onap.vid.aai.model.AaiGetServicesRequestModel.GetServicesAAIRespone;
37 import org.onap.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
38 import org.onap.vid.aai.model.*;
39 import org.onap.vid.asdc.beans.Service;
40 import org.onap.vid.model.ServiceInstanceSearchResult;
41 import org.onap.vid.model.SubscriberList;
42 import org.onap.vid.roles.RoleValidator;
43 import org.onap.vid.utils.Intersection;
44 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
45 import org.springframework.beans.factory.annotation.Autowired;
47 import javax.ws.rs.core.Response;
48 import java.io.UnsupportedEncodingException;
49 import java.net.URLEncoder;
50 import java.util.ArrayList;
51 import java.util.Collection;
52 import java.util.Collections;
53 import java.util.List;
54 import java.util.stream.Collectors;
55 import org.springframework.beans.factory.annotation.Qualifier;
58 * Created by Oren on 7/4/17.
60 public class AaiServiceImpl implements AaiService {
61 private static final String SERVICE_INSTANCE_ID = "service-instance.service-instance-id";
62 private static final String SERVICE_TYPE = "service-subscription.service-type";
63 private static final String CUSTOMER_ID = "customer.global-customer-id";
64 private static final String SERVICE_INSTANCE_NAME = "service-instance.service-instance-name";
65 private int indexOfSubscriberName = 6;
68 private AaiClientInterface aaiClient;
71 @Qualifier("aaiClientForCodehausMapping")
72 private AaiOverTLSClientInterface aaiOverTLSClient;
75 private AaiResponseTranslator aaiResponseTranslator;
77 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AaiServiceImpl.class);
79 private List<Service> convertModelToService(Model model) {
80 List<Service> services = new ArrayList<>();
83 if(validateModel(model)){
84 if(model.getModelType() != null) {
85 category = model.getModelType();
88 for (ModelVer modelVer: model.getModelVers().getModelVer()) {
89 Service service = new Service(
90 modelVer.getModelVersionId(),
91 model.getModelInvariantId(),
92 category, modelVer.getModelVersion(), modelVer.getModelName(),
93 modelVer.getDistributionStatus(),
94 null, null, null, null
97 services.add(service);
100 return Collections.emptyList();
106 private boolean validateModel(Model model){
110 return model.getModelVers() != null && model.getModelVers().getModelVer() != null && model.getModelVers().getModelVer().get(0).getModelVersionId() != null;
114 private List<ServiceInstanceSearchResult> getServicesByOwningEntityId(List<String> owningEntities, RoleValidator roleValidator) {
115 AaiResponse<OwningEntityResponse> owningEntityResponse = aaiClient.getServicesByOwningEntityId(owningEntities);
116 List<ServiceInstanceSearchResult> serviceInstanceSearchResultList = new ArrayList<>();
117 if (owningEntityResponse.getT() != null) {
118 for (OwningEntity owningEntity : owningEntityResponse.getT().getOwningEntity()) {
119 if (owningEntity.getRelationshipList() != null) {
120 serviceInstanceSearchResultList = convertRelationshipToSearchResult(owningEntity, serviceInstanceSearchResultList, roleValidator);
124 return serviceInstanceSearchResultList;
127 private List<ServiceInstanceSearchResult> getServicesByProjectNames(List<String> projectNames, RoleValidator roleValidator) {
128 AaiResponse<ProjectResponse> projectByIdResponse = aaiClient.getServicesByProjectNames(projectNames);
129 List<ServiceInstanceSearchResult> serviceInstanceSearchResultList = new ArrayList<>();
130 if (projectByIdResponse.getT() != null) {
131 for (Project project : projectByIdResponse.getT().getProject()) {
132 if (project.getRelationshipList() != null) {
133 serviceInstanceSearchResultList = convertRelationshipToSearchResult(project, serviceInstanceSearchResultList, roleValidator);
137 return serviceInstanceSearchResultList;
140 private List<ServiceInstanceSearchResult> convertRelationshipToSearchResult(AaiRelationResponse owningEntityResponse, List<ServiceInstanceSearchResult> serviceInstanceSearchResultList, RoleValidator roleValidator) {
141 if (owningEntityResponse.getRelationshipList().getRelationship() != null) {
142 List<Relationship> relationshipList = owningEntityResponse.getRelationshipList().getRelationship();
143 for (Relationship relationship : relationshipList) {
144 ServiceInstanceSearchResult serviceInstanceSearchResult = new ServiceInstanceSearchResult();
145 extractRelationshipData(relationship, serviceInstanceSearchResult, roleValidator);
146 extractRelatedToProperty(relationship, serviceInstanceSearchResult);
147 serviceInstanceSearchResultList.add(serviceInstanceSearchResult);
150 return serviceInstanceSearchResultList;
153 private void extractRelationshipData(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult, RoleValidator roleValidator) {
154 List<RelationshipData> relationshipDataList = relationship.getRelationDataList();
155 if (relationshipDataList != null) {
156 setSubscriberName(relationship, serviceInstanceSearchResult);
157 for (RelationshipData relationshipData : relationshipDataList) {
158 String key = relationshipData.getRelationshipKey();
159 if (key.equals(SERVICE_INSTANCE_ID)) {
160 serviceInstanceSearchResult.setServiceInstanceId(relationshipData.getRelationshipValue());
161 } else if (key.equals(SERVICE_TYPE)) {
162 serviceInstanceSearchResult.setServiceType(relationshipData.getRelationshipValue());
163 } else if (key.equals(CUSTOMER_ID)) {
164 serviceInstanceSearchResult.setGlobalCustomerId(relationshipData.getRelationshipValue());
168 boolean isPermitted = roleValidator.isServicePermitted(serviceInstanceSearchResult.getSubscriberName(), serviceInstanceSearchResult.getServiceType());
169 serviceInstanceSearchResult.setIsPermitted(isPermitted);
173 private void setSubscriberName(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult) {
174 String relatedLink = relationship.getRelatedLink();
175 String[] subsciber = relatedLink.split("/");
176 serviceInstanceSearchResult.setSubscriberName(subsciber[indexOfSubscriberName]);
179 private void extractRelatedToProperty(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult) {
180 List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToPropertyList();
181 if (relatedToPropertyList != null) {
182 for (RelatedToProperty relatedToProperty : relatedToPropertyList) {
183 if (relatedToProperty.getPropertyKey().equals(SERVICE_INSTANCE_NAME)) {
184 serviceInstanceSearchResult.setServiceInstanceName(relatedToProperty.getPropertyValue());
191 public SubscriberFilteredResults getFullSubscriberList(RoleValidator roleValidator) {
192 HttpResponse<SubscriberList> allSubscribers = aaiOverTLSClient.getAllSubscribers();
193 return new SubscriberFilteredResults(
195 allSubscribers.getBody(),
196 allSubscribers.getStatusText(),
197 allSubscribers.getStatus()
202 public AaiResponse<OperationalEnvironmentList> getOperationalEnvironments(String operationalEnvironmentType, String operationalEnvironmentStatus) {
203 return aaiClient.getOperationalEnvironments(operationalEnvironmentType, operationalEnvironmentStatus);
207 public HttpResponse<SubscriberList> getFullSubscriberList() {
208 return aaiOverTLSClient.getAllSubscribers();
212 public AaiResponse getSubscriberData(String subscriberId, RoleValidator roleValidator) {
213 AaiResponse<Services> subscriberResponse = aaiClient.getSubscriberData(subscriberId);
214 String subscriberGlobalId = subscriberResponse.getT().globalCustomerId;
215 for (ServiceSubscription serviceSubscription : subscriberResponse.getT().serviceSubscriptions.serviceSubscription) {
216 String serviceType = serviceSubscription.serviceType;
217 serviceSubscription.isPermitted = roleValidator.isServicePermitted(subscriberGlobalId, serviceType);
219 return subscriberResponse;
224 public AaiResponse getServiceInstanceSearchResults(String subscriberId, String instanceIdentifier, RoleValidator roleValidator, List<String> owningEntities, List<String> projects) {
225 List<List<ServiceInstanceSearchResult>> resultList = new ArrayList<>();
226 ServiceInstancesSearchResults serviceInstancesSearchResults = new ServiceInstancesSearchResults();
228 if (subscriberId != null || instanceIdentifier != null) {
229 resultList.add(getServicesBySubscriber(subscriberId, instanceIdentifier, roleValidator));
231 if (owningEntities != null) {
232 resultList.add(getServicesByOwningEntityId(owningEntities, roleValidator));
234 if (projects != null) {
235 resultList.add(getServicesByProjectNames(projects, roleValidator));
237 if (!resultList.isEmpty()) {
238 Intersection<ServiceInstanceSearchResult> intersection = new Intersection<>();
239 serviceInstancesSearchResults.serviceInstances = intersection.intersectMultipileArray(resultList);
242 return new AaiResponse<>(serviceInstancesSearchResults, null, HttpStatus.SC_OK);
246 private List<ServiceInstanceSearchResult> getServicesBySubscriber(String subscriberId, String instanceIdentifier, RoleValidator roleValidator) {
247 AaiResponse<Services> subscriberResponse = aaiClient.getSubscriberData(subscriberId);
248 String subscriberGlobalId = subscriberResponse.getT().globalCustomerId;
249 String subscriberName = subscriberResponse.getT().subscriberName;
250 ServiceSubscriptions serviceSubscriptions = subscriberResponse.getT().serviceSubscriptions;
252 return getSearchResultsForSubscriptions(serviceSubscriptions, subscriberId, instanceIdentifier, roleValidator, subscriberGlobalId, subscriberName);
257 private ArrayList<ServiceInstanceSearchResult> getSearchResultsForSubscriptions(ServiceSubscriptions serviceSubscriptions, String subscriberId, String instanceIdentifier, RoleValidator roleValidator, String subscriberGlobalId, String subscriberName) {
258 ArrayList<ServiceInstanceSearchResult> results = new ArrayList<>();
260 if (serviceSubscriptions != null) {
261 for (ServiceSubscription serviceSubscription : serviceSubscriptions.serviceSubscription) {
262 String serviceType = serviceSubscription.serviceType;
263 serviceSubscription.isPermitted = roleValidator.isServicePermitted(subscriberGlobalId, serviceType);
264 ArrayList<ServiceInstanceSearchResult> resultsForSubscription = getSearchResultsForSingleSubscription(serviceSubscription, subscriberId, instanceIdentifier, subscriberName, serviceType);
265 results.addAll(resultsForSubscription);
272 private ArrayList<ServiceInstanceSearchResult> getSearchResultsForSingleSubscription(ServiceSubscription serviceSubscription, String subscriberId, String instanceIdentifier, String subscriberName, String serviceType) {
273 ArrayList<ServiceInstanceSearchResult> results = new ArrayList<>();
275 if (serviceSubscription.serviceInstances != null) {
276 for (ServiceInstance serviceInstance : serviceSubscription.serviceInstances.serviceInstance) {
277 ServiceInstanceSearchResult serviceInstanceSearchResult =
278 new ServiceInstanceSearchResult(serviceInstance.serviceInstanceId, subscriberId, serviceType, serviceInstance.serviceInstanceName,
279 subscriberName, serviceInstance.modelInvariantId, serviceInstance.modelVersionId, serviceSubscription.isPermitted);
281 if (instanceIdentifier == null) {
282 results.add(serviceInstanceSearchResult);
283 } else if (serviceInstanceMatchesIdentifier(instanceIdentifier, serviceInstance)) {
284 results.add(serviceInstanceSearchResult);
292 private boolean serviceInstanceMatchesIdentifier(String instanceIdentifier, ServiceInstance serviceInstance) {
293 return instanceIdentifier.equals(serviceInstance.serviceInstanceId) || instanceIdentifier.equals(serviceInstance.serviceInstanceName);
297 public Response getVersionByInvariantId(List<String> modelInvariantId) {
299 return aaiClient.getVersionByInvariantId(modelInvariantId);
300 } catch (Exception e) {
301 LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to getVersionByInvariantId from A&AI", e);
307 public AaiResponse<Pnf> getSpecificPnf(String pnfId) {
308 return aaiClient.getSpecificPnf(pnfId);
312 public AaiResponse getPNFData(String globalCustomerId, String serviceType, String modelVersionId, String modelInvariantId, String cloudRegion, String equipVendor, String equipModel) {
313 return aaiClient.getPNFData(globalCustomerId, serviceType, modelVersionId, modelInvariantId, cloudRegion, equipVendor, equipModel);
319 public AaiResponse getServices(RoleValidator roleValidator) {
320 AaiResponse<GetServicesAAIRespone> subscriberResponse = aaiClient.getServices();
321 if (subscriberResponse.getT() != null) {
322 for (org.onap.vid.aai.model.AaiGetServicesRequestModel.Service service : subscriberResponse.getT().service) {
323 service.isPermitted = true;
326 return subscriberResponse;
330 public AaiResponse<GetTenantsResponse[]> getTenants(String globalCustomerId, String serviceType, RoleValidator roleValidator) {
331 AaiResponse<GetTenantsResponse[]> aaiGetTenantsResponse = aaiClient.getTenants(globalCustomerId, serviceType);
332 GetTenantsResponse[] tenants = aaiGetTenantsResponse.getT();
333 if (tenants != null) {
334 for (int i = 0; i < tenants.length; i++) {
335 tenants[i].isPermitted = roleValidator.isTenantPermitted(globalCustomerId, serviceType, tenants[i].tenantName);
338 return aaiGetTenantsResponse;
344 public AaiResponse getVNFData(String globalSubscriberId, String serviceType, String serviceInstanceId) {
345 return aaiClient.getVNFData(globalSubscriberId, serviceType, serviceInstanceId);
349 public Response getVNFData(String globalSubscriberId, String serviceType) {
350 return aaiClient.getVNFData(globalSubscriberId, serviceType);
354 public AaiResponse getAaiZones() {
355 return (AaiResponse<AicZones>) aaiClient.getAllAicZones();
359 public AaiResponse getAicZoneForPnf(String globalCustomerId, String serviceType, String serviceId) {
362 AaiResponse<ServiceRelationships> serviceInstanceResp = aaiClient.getServiceInstance(globalCustomerId, serviceType, serviceId);
363 if (serviceInstanceResp.getT() != null) {
364 List<String> aicZoneList = getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "zone", "zone.zone-id");
365 if (!aicZoneList.isEmpty()) {
366 aicZone = aicZoneList.get(0);
368 LOGGER.warn("aic zone not found for service instance " + serviceId);
371 if (serviceInstanceResp.getErrorMessage() != null) {
372 LOGGER.error("get service instance {} return error {}", serviceId, serviceInstanceResp.getErrorMessage());
373 return new AaiResponse(aicZone , serviceInstanceResp.getErrorMessage() ,serviceInstanceResp.getHttpCode());
375 LOGGER.warn("get service instance {} return empty body", serviceId);
376 return new AaiResponse(aicZone , "get service instance " + serviceId + " return empty body" ,serviceInstanceResp.getHttpCode());
380 return new AaiResponse(aicZone , null ,HttpStatus.SC_OK);
384 public AaiResponse getNodeTemplateInstances(String globalCustomerId, String serviceType, String modelVersionId, String modelInvariantId, String cloudRegion) {
385 return aaiClient.getNodeTemplateInstances(globalCustomerId, serviceType, modelVersionId, modelInvariantId, cloudRegion);
389 public AaiResponse getNetworkCollectionDetails(String serviceInstanceId){
390 AaiResponse<AaiGetNetworkCollectionDetails> getNetworkCollectionDetailsAaiResponse = aaiClient.getNetworkCollectionDetails(serviceInstanceId);
391 return getNetworkCollectionDetailsAaiResponse;
395 public AaiResponse<AaiGetInstanceGroupsByCloudRegion> getInstanceGroupsByCloudRegion(String cloudOwner, String cloudRegionId, String networkFunction){
396 AaiResponse<AaiGetInstanceGroupsByCloudRegion> getInstanceGroupsByCloudRegionResponse = aaiClient.getInstanceGroupsByCloudRegion(cloudOwner, cloudRegionId, networkFunction);
397 return getInstanceGroupsByCloudRegionResponse;
401 public Collection<Service> getServicesByDistributionStatus() {
402 AaiResponse<GetServiceModelsByDistributionStatusResponse> serviceModelsByDistributionStatusResponse = aaiClient.getServiceModelsByDistributionStatus();
403 Collection<Service> services = new ArrayList<>();
404 if (serviceModelsByDistributionStatusResponse.getT() != null) {
405 List<Result> results = serviceModelsByDistributionStatusResponse.getT().getResults();
406 for (Result result : results) {
407 if(result.getModel() != null) {
408 List<Service> service = convertModelToService(result.getModel());
409 services.addAll(service);
417 public List<String> getServiceInstanceAssociatedPnfs(String globalCustomerId, String serviceType, String serviceInstanceId) {
418 List<String> pnfs = new ArrayList<>();
420 AaiResponse<ServiceRelationships> serviceInstanceResp = aaiClient.getServiceInstance(globalCustomerId, serviceType, serviceInstanceId);
421 if (serviceInstanceResp.getT() != null) {
423 addPnfsToListViaLogicalLinks(pnfs, serviceInstanceResp);
424 addPnfsToListViaDirectRelations(pnfs, serviceInstanceResp);
426 if (pnfs.isEmpty()) {
427 LOGGER.warn("no pnf direct relation found for service id:" + serviceInstanceId+
428 " name: "+serviceInstanceResp.getT().getServiceInstanceName());
431 if (serviceInstanceResp.getErrorMessage() != null) {
432 LOGGER.error("get service instance {} return error {}", serviceInstanceId, serviceInstanceResp.getErrorMessage());
434 LOGGER.warn("get service instance {} return empty body", serviceInstanceId);
438 return pnfs.stream().distinct().collect(Collectors.toList());
442 public AaiResponseTranslator.PortMirroringConfigData getPortMirroringConfigData(String configurationId) {
443 AaiResponse<JsonNode> aaiResponse = aaiClient.getCloudRegionAndSourceByPortMirroringConfigurationId(configurationId);
444 return aaiResponseTranslator.extractPortMirroringConfigData(aaiResponse);
448 public AaiResponse getInstanceGroupsByVnfInstanceId(String vnfInstanceId){
449 AaiResponse<AaiGetRelatedInstanceGroupsByVnfId> aaiResponse = aaiClient.getInstanceGroupsByVnfInstanceId(vnfInstanceId);
450 if(aaiResponse.getHttpCode() == HttpStatus.SC_OK){
451 return new AaiResponse(convertGetInstanceGroupsResponseToSimpleResponse(aaiResponse.getT()), aaiResponse.getErrorMessage(), aaiResponse.getHttpCode());
453 return aaiClient.getInstanceGroupsByVnfInstanceId(vnfInstanceId);
456 private List<InstanceGroupInfo> convertGetInstanceGroupsResponseToSimpleResponse(AaiGetRelatedInstanceGroupsByVnfId response) {
457 List<InstanceGroupInfo> instanceGroupInfoList = new ArrayList<>();
458 for(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Relationship relationship: response.getRelationshipList().getRelationship()){
459 getInstanceGroupInfoFromRelationship(relationship, instanceGroupInfoList);
461 return instanceGroupInfoList;
464 private void getInstanceGroupInfoFromRelationship(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Relationship relationship, List<InstanceGroupInfo> instanceGroupInfoList) {
465 if(relationship.getRelatedTo().equals("instance-group")){
466 for(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.RelatedToProperty relatedToProperty: relationship.getRelatedToPropertyList()){
467 if(relatedToProperty.getPropertyKey().equals("instance-group.instance-group-name")){
468 instanceGroupInfoList.add(new InstanceGroupInfo(relatedToProperty.getPropertyValue()));
475 public List<PortDetailsTranslator.PortDetails> getPortMirroringSourcePorts(String configurationId){
476 return aaiClient.getPortMirroringSourcePorts(configurationId);
479 private void addPnfsToListViaDirectRelations(List<String> pnfs, AaiResponse<ServiceRelationships> serviceInstanceResp) {
480 pnfs.addAll(getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "pnf", "pnf.pnf-name"));
483 private void addPnfsToListViaLogicalLinks(List<String> pnfs, AaiResponse<ServiceRelationships> serviceInstanceResp) {
484 List<String> logicalLinks = getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "logical-link", "logical-link.link-name");
485 for (String logicalLink : logicalLinks) {
488 link = URLEncoder.encode(logicalLink, "UTF-8");
489 } catch (UnsupportedEncodingException e) {
490 LOGGER.error("Failed to encode logical link: " + logicalLink, e);
494 AaiResponse<LogicalLinkResponse> logicalLinkResp = aaiClient.getLogicalLink(link);
495 if (logicalLinkResp.getT() != null) {
496 //lag-interface is the key for pnf - approved by Bracha
497 List<String> linkPnfs = getRelationshipDataByType(logicalLinkResp.getT().getRelationshipList(), "lag-interface", "pnf.pnf-name");
498 if (!linkPnfs.isEmpty()) {
499 pnfs.addAll(linkPnfs);
501 LOGGER.warn("no pnf found for logical link " + logicalLink);
504 if (logicalLinkResp.getErrorMessage() != null) {
505 LOGGER.error("get logical link " + logicalLink + " return error", logicalLinkResp.getErrorMessage());
507 LOGGER.warn("get logical link " + logicalLink + " return empty body");
513 private List<String> getRelationshipDataByType(RelationshipList relationshipList, String relationshipType, String relationshipDataKey) {
514 List<String> relationshipValues = new ArrayList<>();
515 for (Relationship relationship : relationshipList.getRelationship()) {
516 if (relationship.getRelatedTo().equals(relationshipType)) {
517 relationshipValues.addAll( relationship.getRelationDataList().stream()
518 .filter(rel -> rel.getRelationshipKey().equals(relationshipDataKey))
519 .map(RelationshipData::getRelationshipValue)
520 .collect(Collectors.toList())
526 return relationshipValues;