142bf73ec0d9a7753733fc77948deafce46b0a5c
[vid.git] / vid-app-common / src / main / java / org / onap / vid / services / AaiServiceImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2018 - 2019 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
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
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=========================================================
20  */
21
22 package org.onap.vid.services;
23
24 import com.fasterxml.jackson.databind.JsonNode;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import io.joshworks.restclient.http.HttpResponse;
27 import org.apache.http.HttpStatus;
28 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
29 import org.onap.vid.aai.*;
30 import org.onap.vid.aai.model.*;
31 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.AaiGetRelatedInstanceGroupsByVnfId;
32 import org.onap.vid.aai.model.AaiGetOperationalEnvironments.OperationalEnvironmentList;
33 import org.onap.vid.aai.model.AaiGetPnfs.Pnf;
34 import org.onap.vid.aai.model.AaiGetServicesRequestModel.GetServicesAAIRespone;
35 import org.onap.vid.aai.model.Properties;
36 import org.onap.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
37 import org.onap.vid.asdc.beans.Service;
38 import org.onap.vid.exceptions.GenericUncheckedException;
39 import org.onap.vid.model.ServiceInstanceSearchResult;
40 import org.onap.vid.model.SubscriberList;
41 import org.onap.vid.model.aaiTree.AAITreeNode;
42 import org.onap.vid.model.aaiTree.RelatedVnf;
43 import org.onap.vid.roles.RoleValidator;
44 import org.onap.vid.utils.Intersection;
45 import org.onap.vid.utils.Tree;
46 import org.springframework.beans.factory.annotation.Autowired;
47
48 import javax.ws.rs.core.Response;
49 import java.io.UnsupportedEncodingException;
50 import java.net.URLEncoder;
51 import java.util.*;
52 import java.util.stream.Collectors;
53
54 /**
55  * Created by Oren on 7/4/17.
56  */
57 public class AaiServiceImpl implements AaiService {
58     private static final String SERVICE_INSTANCE_ID = "service-instance.service-instance-id";
59     private static final String SERVICE_TYPE = "service-subscription.service-type";
60     private static final String CUSTOMER_ID = "customer.global-customer-id";
61     private static final String SERVICE_INSTANCE_NAME = "service-instance.service-instance-name";
62     private static final String TENANT_NODE_TYPE = "tenant";
63     private static final String CLOUD_REGION_NODE_TYPE = "cloud-region";
64     private int indexOfSubscriberName = 6;
65
66     private AaiClientInterface aaiClient;
67     private AaiOverTLSClientInterface aaiOverTLSClient;
68     private AaiResponseTranslator aaiResponseTranslator;
69     private AAITreeNodeBuilder aaiTreeNode;
70     private AAIServiceTree aaiServiceTree;
71
72     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AaiServiceImpl.class);
73
74     @Autowired
75     public AaiServiceImpl(
76         AaiClientInterface aaiClient,
77         AaiOverTLSClientInterface aaiOverTLSClient,
78         AaiResponseTranslator aaiResponseTranslator,
79         AAITreeNodeBuilder aaiTreeNode,
80         AAIServiceTree aaiServiceTree)
81     {
82         this.aaiClient = aaiClient;
83         this.aaiOverTLSClient = aaiOverTLSClient;
84         this.aaiResponseTranslator = aaiResponseTranslator;
85         this.aaiTreeNode = aaiTreeNode;
86         this.aaiServiceTree = aaiServiceTree;
87     }
88
89     private List<Service> convertModelToService(Model model) {
90         List<Service> services = new ArrayList<>();
91         String category = "";
92
93         if(validateModel(model)){
94             if(model.getModelType() != null) {
95                 category = model.getModelType();
96             }
97
98             for (ModelVer modelVer: model.getModelVers().getModelVer()) {
99                 Service service = new Service(
100                         modelVer.getModelVersionId(),
101                         model.getModelInvariantId(),
102                         category, modelVer.getModelVersion(), modelVer.getModelName(),
103                         modelVer.getDistributionStatus(),
104                         null, null, null, null
105                 );
106
107                 services.add(service);
108             }
109         } else {
110             return Collections.emptyList();
111         }
112
113         return services;
114     }
115
116     private boolean validateModel(Model model){
117         if (model == null) {
118             return false;
119         } else {
120             return model.getModelVers() != null && model.getModelVers().getModelVer() != null && model.getModelVers().getModelVer().get(0).getModelVersionId() != null;
121         }
122     }
123
124     private List<ServiceInstanceSearchResult> getServicesByOwningEntityId(List<String> owningEntities, RoleValidator roleValidator) {
125         AaiResponse<OwningEntityResponse> owningEntityResponse = aaiClient.getServicesByOwningEntityId(owningEntities);
126         List<ServiceInstanceSearchResult> serviceInstanceSearchResultList = new ArrayList<>();
127         if (owningEntityResponse.getT() != null) {
128             for (OwningEntity owningEntity : owningEntityResponse.getT().getOwningEntity()) {
129                 if (owningEntity.getRelationshipList() != null) {
130                     serviceInstanceSearchResultList = convertRelationshipToSearchResult(owningEntity, serviceInstanceSearchResultList, roleValidator);
131                 }
132             }
133         }
134         return serviceInstanceSearchResultList;
135     }
136
137     private List<ServiceInstanceSearchResult> getServicesByProjectNames(List<String> projectNames, RoleValidator roleValidator) {
138         AaiResponse<ProjectResponse> projectByIdResponse = aaiClient.getServicesByProjectNames(projectNames);
139         List<ServiceInstanceSearchResult> serviceInstanceSearchResultList = new ArrayList<>();
140         if (projectByIdResponse.getT() != null) {
141             for (Project project : projectByIdResponse.getT().getProject()) {
142                 if (project.getRelationshipList() != null) {
143                     serviceInstanceSearchResultList = convertRelationshipToSearchResult(project, serviceInstanceSearchResultList, roleValidator);
144                 }
145             }
146         }
147         return serviceInstanceSearchResultList;
148     }
149
150     private List<ServiceInstanceSearchResult> convertRelationshipToSearchResult(AaiRelationResponse owningEntityResponse, List<ServiceInstanceSearchResult> serviceInstanceSearchResultList, RoleValidator roleValidator) {
151         if (owningEntityResponse.getRelationshipList().getRelationship() != null) {
152             List<Relationship> relationshipList = owningEntityResponse.getRelationshipList().getRelationship();
153             for (Relationship relationship : relationshipList) {
154                 ServiceInstanceSearchResult serviceInstanceSearchResult = new ServiceInstanceSearchResult();
155                 extractRelationshipData(relationship, serviceInstanceSearchResult, roleValidator);
156                 extractRelatedToProperty(relationship, serviceInstanceSearchResult);
157                 serviceInstanceSearchResultList.add(serviceInstanceSearchResult);
158             }
159         }
160         return serviceInstanceSearchResultList;
161     }
162
163     private void extractRelationshipData(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult, RoleValidator roleValidator) {
164         List<RelationshipData> relationshipDataList = relationship.getRelationDataList();
165         if (relationshipDataList != null) {
166             setSubscriberName(relationship, serviceInstanceSearchResult);
167             for (RelationshipData relationshipData : relationshipDataList) {
168                 String key = relationshipData.getRelationshipKey();
169                 if (key.equals(SERVICE_INSTANCE_ID)) {
170                     serviceInstanceSearchResult.setServiceInstanceId(relationshipData.getRelationshipValue());
171                 } else if (key.equals(SERVICE_TYPE)) {
172                     serviceInstanceSearchResult.setServiceType(relationshipData.getRelationshipValue());
173                 } else if (key.equals(CUSTOMER_ID)) {
174                     serviceInstanceSearchResult.setGlobalCustomerId(relationshipData.getRelationshipValue());
175                 }
176             }
177
178             boolean isPermitted = roleValidator.isServicePermitted(serviceInstanceSearchResult.getSubscriberName(), serviceInstanceSearchResult.getServiceType());
179             serviceInstanceSearchResult.setIsPermitted(isPermitted);
180         }
181     }
182
183     private void setSubscriberName(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult) {
184         String relatedLink = relationship.getRelatedLink();
185         String[] subsciber = relatedLink.split("/");
186         serviceInstanceSearchResult.setSubscriberName(subsciber[indexOfSubscriberName]);
187     }
188
189     private void extractRelatedToProperty(Relationship relationship, ServiceInstanceSearchResult serviceInstanceSearchResult) {
190         List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToPropertyList();
191         if (relatedToPropertyList != null) {
192             for (RelatedToProperty relatedToProperty : relatedToPropertyList) {
193                 if (relatedToProperty.getPropertyKey().equals(SERVICE_INSTANCE_NAME)) {
194                     serviceInstanceSearchResult.setServiceInstanceName(relatedToProperty.getPropertyValue());
195                 }
196             }
197         }
198     }
199
200     @Override
201     public SubscriberFilteredResults getFullSubscriberList(RoleValidator roleValidator) {
202         HttpResponse<SubscriberList> allSubscribers = aaiOverTLSClient.getAllSubscribers();
203         return new SubscriberFilteredResults(
204             roleValidator,
205             allSubscribers.getBody(),
206             allSubscribers.getStatusText(),
207             allSubscribers.getStatus()
208         );
209     }
210
211     @Override
212     public AaiResponse<OperationalEnvironmentList> getOperationalEnvironments(String operationalEnvironmentType, String operationalEnvironmentStatus) {
213         return aaiClient.getOperationalEnvironments(operationalEnvironmentType, operationalEnvironmentStatus);
214     }
215
216     @Override
217     public HttpResponse<SubscriberList> getFullSubscriberList() {
218         return aaiOverTLSClient.getAllSubscribers();
219     }
220
221     @Override
222     public AaiResponse getSubscriberData(String subscriberId, RoleValidator roleValidator) {
223         AaiResponse<Services> subscriberResponse = aaiClient.getSubscriberData(subscriberId);
224         String subscriberGlobalId = subscriberResponse.getT().globalCustomerId;
225         for (ServiceSubscription serviceSubscription : subscriberResponse.getT().serviceSubscriptions.serviceSubscription) {
226             String serviceType = serviceSubscription.serviceType;
227             serviceSubscription.isPermitted = roleValidator.isServicePermitted(subscriberGlobalId, serviceType);
228         }
229         return subscriberResponse;
230
231     }
232
233     @Override
234     public AaiResponse getServiceInstanceSearchResults(String subscriberId, String instanceIdentifier, RoleValidator roleValidator, List<String> owningEntities, List<String> projects) {
235         List<List<ServiceInstanceSearchResult>> resultList = new ArrayList<>();
236         ServiceInstancesSearchResults serviceInstancesSearchResults = new ServiceInstancesSearchResults();
237
238         if (subscriberId != null || instanceIdentifier != null) {
239             resultList.add(getServicesBySubscriber(subscriberId, instanceIdentifier, roleValidator));
240         }
241         if (owningEntities != null) {
242             resultList.add(getServicesByOwningEntityId(owningEntities, roleValidator));
243         }
244         if (projects != null) {
245             resultList.add(getServicesByProjectNames(projects, roleValidator));
246         }
247         if (!resultList.isEmpty()) {
248             serviceInstancesSearchResults.serviceInstances = Intersection.of(resultList);
249         }
250
251         return new AaiResponse<>(serviceInstancesSearchResults, null, HttpStatus.SC_OK);
252     }
253
254
255     private List<ServiceInstanceSearchResult> getServicesBySubscriber(String subscriberId, String instanceIdentifier, RoleValidator roleValidator) {
256         AaiResponse<Services> subscriberResponse = aaiClient.getSubscriberData(subscriberId);
257         String subscriberGlobalId = subscriberResponse.getT().globalCustomerId;
258         String subscriberName = subscriberResponse.getT().subscriberName;
259         ServiceSubscriptions serviceSubscriptions = subscriberResponse.getT().serviceSubscriptions;
260
261         return getSearchResultsForSubscriptions(serviceSubscriptions, subscriberId, instanceIdentifier, roleValidator, subscriberGlobalId, subscriberName);
262
263     }
264
265
266     private ArrayList<ServiceInstanceSearchResult> getSearchResultsForSubscriptions(ServiceSubscriptions serviceSubscriptions, String subscriberId, String instanceIdentifier, RoleValidator roleValidator, String subscriberGlobalId, String subscriberName) {
267         ArrayList<ServiceInstanceSearchResult> results = new ArrayList<>();
268
269         if (serviceSubscriptions != null) {
270             for (ServiceSubscription serviceSubscription : serviceSubscriptions.serviceSubscription) {
271                 String serviceType = serviceSubscription.serviceType;
272                 serviceSubscription.isPermitted = roleValidator.isServicePermitted(subscriberGlobalId, serviceType);
273                 ArrayList<ServiceInstanceSearchResult> resultsForSubscription = getSearchResultsForSingleSubscription(serviceSubscription, subscriberId, instanceIdentifier, subscriberName, serviceType);
274                 results.addAll(resultsForSubscription);
275             }
276         }
277
278         return results;
279     }
280
281     private ArrayList<ServiceInstanceSearchResult> getSearchResultsForSingleSubscription(ServiceSubscription serviceSubscription, String subscriberId, String instanceIdentifier, String subscriberName, String serviceType) {
282         ArrayList<ServiceInstanceSearchResult> results = new ArrayList<>();
283
284         if (serviceSubscription.serviceInstances != null) {
285             for (ServiceInstance serviceInstance : serviceSubscription.serviceInstances.serviceInstance) {
286                 ServiceInstanceSearchResult serviceInstanceSearchResult =
287                         new ServiceInstanceSearchResult(serviceInstance.serviceInstanceId, subscriberId, serviceType, serviceInstance.serviceInstanceName,
288                                 subscriberName, serviceInstance.modelInvariantId, serviceInstance.modelVersionId, serviceSubscription.isPermitted);
289
290                 if ((instanceIdentifier == null) || (serviceInstanceMatchesIdentifier(instanceIdentifier, serviceInstance))){
291                     results.add(serviceInstanceSearchResult);
292                 }
293             }
294         }
295
296         return results;
297     }
298
299     private boolean serviceInstanceMatchesIdentifier(String instanceIdentifier, ServiceInstance serviceInstance) {
300         return instanceIdentifier.equals(serviceInstance.serviceInstanceId) || instanceIdentifier.equals(serviceInstance.serviceInstanceName);
301     }
302
303     @Override
304     public Response getVersionByInvariantId(List<String> modelInvariantId) {
305         try {
306             return aaiClient.getVersionByInvariantId(modelInvariantId);
307         } catch (Exception e) {
308             LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to getVersionByInvariantId from A&AI", e);
309         }
310         return null;
311     }
312
313     @Override
314     public AaiResponse<Pnf> getSpecificPnf(String pnfId) {
315         return aaiClient.getSpecificPnf(pnfId);
316     }
317
318     @Override
319     public AaiResponse getPNFData(String globalCustomerId, String serviceType, String modelVersionId, String modelInvariantId, String cloudRegion, String equipVendor, String equipModel) {
320         return aaiClient.getPNFData(globalCustomerId, serviceType, modelVersionId, modelInvariantId, cloudRegion, equipVendor, equipModel);
321     }
322
323     @Override
324     public AaiResponse getServices(RoleValidator roleValidator) {
325         AaiResponse<GetServicesAAIRespone> subscriberResponse = aaiClient.getServices();
326         if (subscriberResponse.getT() != null) {
327             for (org.onap.vid.aai.model.AaiGetServicesRequestModel.Service service : subscriberResponse.getT().service) {
328                 service.isPermitted = true;
329             }
330         }
331         return subscriberResponse;
332     }
333
334     @Override
335     public AaiResponse<GetTenantsResponse[]> getTenants(String globalCustomerId, String serviceType, RoleValidator roleValidator) {
336         AaiResponse<GetTenantsResponse[]> aaiGetTenantsResponse = aaiClient.getTenants(globalCustomerId, serviceType);
337         GetTenantsResponse[] tenants = aaiGetTenantsResponse.getT();
338         if (tenants != null) {
339             for (GetTenantsResponse tenant : tenants) {
340                 tenant.isPermitted = roleValidator.isTenantPermitted(globalCustomerId, serviceType, tenant.tenantName);
341             }
342         }
343         return aaiGetTenantsResponse;
344     }
345
346     @Override
347     public AaiResponse getVNFData(String globalSubscriberId, String serviceType, String serviceInstanceId) {
348         return aaiClient.getVNFData(globalSubscriberId, serviceType, serviceInstanceId);
349     }
350
351     @Override
352     public AaiResponse<AaiGetVnfResponse> getVNFData(String globalSubscriberId, String serviceType) {
353         AaiResponse response = aaiClient.getVNFData(globalSubscriberId, serviceType);
354         return filterChangeManagementVNFCandidatesResponse(response);
355     }
356
357     private AaiResponse<AaiGetVnfResponse> filterChangeManagementVNFCandidatesResponse(AaiResponse<AaiGetVnfResponse> response) {
358
359
360         if (response != null && response.getT() != null) {
361             response.getT().results =
362                     response.getT().results.stream()
363                             .filter(result -> (
364                                     result.nodeType.equalsIgnoreCase("generic-vnf") ||
365                                             result.nodeType.equalsIgnoreCase("service-instance")))
366                             .collect(Collectors.toList());
367
368             return response;
369         }
370
371         return new AaiResponse();
372     }
373
374     @Override
375     public AaiResponse getAaiZones() {
376         return aaiClient.getAllAicZones();
377     }
378
379     @Override
380     public AaiResponse getAicZoneForPnf(String globalCustomerId, String serviceType, String serviceId) {
381         String aicZone = "";
382
383         AaiResponse<ServiceRelationships> serviceInstanceResp = aaiClient.getServiceInstance(globalCustomerId, serviceType, serviceId);
384         if (serviceInstanceResp.getT() != null) {
385             List<String> aicZoneList = getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "zone", "zone.zone-id");
386             if (!aicZoneList.isEmpty()) {
387                 aicZone = aicZoneList.get(0);
388             } else {
389                 LOGGER.warn("aic zone not found for service instance " + serviceId);
390             }
391         } else {
392             if (serviceInstanceResp.getErrorMessage() != null) {
393                 LOGGER.error("get service instance {} return error {}", serviceId, serviceInstanceResp.getErrorMessage());
394                 return new AaiResponse(aicZone , serviceInstanceResp.getErrorMessage() ,serviceInstanceResp.getHttpCode());
395             } else {
396                 LOGGER.warn("get service instance {} return empty body", serviceId);
397                 return new AaiResponse(aicZone , "get service instance " + serviceId + " return empty body" ,serviceInstanceResp.getHttpCode());
398             }
399         }
400
401         return new AaiResponse(aicZone , null ,HttpStatus.SC_OK);
402     }
403
404     @Override
405     public AaiResponse getNodeTemplateInstances(String globalCustomerId, String serviceType, String modelVersionId, String modelInvariantId, String cloudRegion) {
406         return aaiClient.getNodeTemplateInstances(globalCustomerId, serviceType, modelVersionId, modelInvariantId, cloudRegion);
407     }
408
409     @Override
410     public AaiResponse getNetworkCollectionDetails(String serviceInstanceId){
411         return aaiClient.getNetworkCollectionDetails(serviceInstanceId);
412     }
413
414     @Override
415     public AaiResponse<AaiGetInstanceGroupsByCloudRegion> getInstanceGroupsByCloudRegion(String cloudOwner, String cloudRegionId, String networkFunction){
416         return aaiClient.getInstanceGroupsByCloudRegion(cloudOwner, cloudRegionId, networkFunction);
417     }
418
419     @Override
420     public Collection<Service> getServicesByDistributionStatus() {
421         AaiResponse<GetServiceModelsByDistributionStatusResponse> serviceModelsByDistributionStatusResponse = aaiClient.getServiceModelsByDistributionStatus();
422         Collection<Service> services = new ArrayList<>();
423         if (serviceModelsByDistributionStatusResponse.getT() != null) {
424             List<Result> results = serviceModelsByDistributionStatusResponse.getT().getResults();
425             for (Result result : results) {
426                 if(result.getModel() != null) {
427                     List<Service> service = convertModelToService(result.getModel());
428                     services.addAll(service);
429                 }
430             }
431         }
432         return services;
433     }
434
435     @Override
436     public List<String> getServiceInstanceAssociatedPnfs(String globalCustomerId, String serviceType, String serviceInstanceId) {
437         List<String> pnfs = new ArrayList<>();
438
439         AaiResponse<ServiceRelationships> serviceInstanceResp = aaiClient.getServiceInstance(globalCustomerId, serviceType, serviceInstanceId);
440         if (serviceInstanceResp.getT() != null) {
441
442             addPnfsToListViaLogicalLinks(pnfs, serviceInstanceResp);
443             addPnfsToListViaDirectRelations(pnfs, serviceInstanceResp);
444
445             if (pnfs.isEmpty()) {
446                 LOGGER.warn("no pnf direct relation found for service id:" + serviceInstanceId+
447                         " name: "+serviceInstanceResp.getT().getServiceInstanceName());
448             }
449         } else {
450             if (serviceInstanceResp.getErrorMessage() != null) {
451                 LOGGER.error("get service instance {} return error {}", serviceInstanceId, serviceInstanceResp.getErrorMessage());
452             } else {
453                 LOGGER.warn("get service instance {} return empty body", serviceInstanceId);
454             }
455         }
456
457         return pnfs.stream().distinct().collect(Collectors.toList());
458     }
459
460     @Override
461     public AaiResponseTranslator.PortMirroringConfigData getPortMirroringConfigData(String configurationId) {
462         AaiResponse<JsonNode> aaiResponse = aaiClient.getCloudRegionAndSourceByPortMirroringConfigurationId(configurationId);
463         return aaiResponseTranslator.extractPortMirroringConfigData(aaiResponse);
464     }
465
466     @Override
467     public AaiResponse getInstanceGroupsByVnfInstanceId(String vnfInstanceId){
468         AaiResponse<AaiGetRelatedInstanceGroupsByVnfId> aaiResponse = aaiClient.getInstanceGroupsByVnfInstanceId(vnfInstanceId);
469         if(aaiResponse.getHttpCode() == HttpStatus.SC_OK){
470             return new AaiResponse(convertGetInstanceGroupsResponseToSimpleResponse(aaiResponse.getT()), aaiResponse.getErrorMessage(), aaiResponse.getHttpCode());
471         }
472         return aaiClient.getInstanceGroupsByVnfInstanceId(vnfInstanceId);
473     }
474
475     @Override
476     public GetTenantsResponse getHomingDataByVfModule(String vnfInstanceId, String vfModuleId) {
477         return aaiClient.getHomingDataByVfModule(vnfInstanceId,vfModuleId);
478     }
479
480     @Override
481     public List<RelatedVnf> searchGroupMembers(String globalCustomerId, String serviceType, String invariantId, String groupType, String groupRole) {
482         String getURL = "business/customers/customer/" +
483                     globalCustomerId + "/service-subscriptions/service-subscription/" +
484                     serviceType + "/service-instances?model-invariant-id=" + invariantId;
485
486         Tree<AAIServiceTree.AaiRelationship> pathsToSearch = new Tree<>(new AAIServiceTree.AaiRelationship(AAITreeNodeBuilder.SERVICE_INSTANCE));
487         pathsToSearch.addPath(AAITreeNodeBuilder.toAaiRelationshipList(AAITreeNodeBuilder.GENERIC_VNF, AAITreeNodeBuilder.INSTANCE_GROUP));
488
489         //get all vnfs related to service-instances from the model-invariant-id
490         List<AAITreeNode> aaiTree = aaiServiceTree.buildAAITree(getURL, pathsToSearch);
491
492         //filter by instance-group-role & instance-group-type properties (from getAdditionalProperties)
493         //only vnfs has related instance-group with the same groupType & groupRole - are filtered out.
494         List<AAITreeNode> filteredVnfs = filterByInstanceGroupRoleAndType(aaiTree, groupRole, groupType);
495
496         //convert vnfs to expected result
497         return filteredVnfs.stream()
498                 .map(RelatedVnf::from)
499                 .map(this::enrichRelatedVnfWithCloudRegionAndTenant)
500                 .collect(Collectors.toList());
501     }
502
503     private List<AAITreeNode> filterByInstanceGroupRoleAndType(List<AAITreeNode> aaiTree, String groupRole, String groupType) {
504
505         return aaiTree.stream()
506                 .map(AAITreeNode::getChildren)
507                 .flatMap(Collection::stream)
508                 .filter(vnf -> isInstanceGroupsNotMatchRoleAndType(vnf.getChildren(), groupRole, groupType))
509                 .collect(Collectors.toList());
510     }
511
512     public boolean isInstanceGroupsNotMatchRoleAndType(List<AAITreeNode> instanceGroups, String groupRole, String groupType) {
513         return instanceGroups.stream()
514                 .map(AAITreeNode::getAdditionalProperties)
515                 .allMatch(props ->
516                         (!(groupRole.equals(props.get("instance-group-role")) &&
517                                 groupType.equals(props.get("instance-group-type"))))
518                 );
519     }
520
521     public RelatedVnf enrichRelatedVnfWithCloudRegionAndTenant(RelatedVnf vnf) {
522         Map<String, Properties> cloudRegionAndTenant = aaiClient.getCloudRegionAndTenantByVnfId(vnf.getInstanceId());
523
524         if (cloudRegionAndTenant.containsKey(TENANT_NODE_TYPE)) {
525             vnf.setTenantId(cloudRegionAndTenant.get(TENANT_NODE_TYPE).getTenantId());
526             vnf.setTenantName(cloudRegionAndTenant.get(TENANT_NODE_TYPE).getTenantName());
527         }
528
529         if (cloudRegionAndTenant.containsKey(CLOUD_REGION_NODE_TYPE)) {
530             vnf.setLcpCloudRegionId(cloudRegionAndTenant.get(CLOUD_REGION_NODE_TYPE).getCloudRegionId());
531         }
532
533         return vnf;
534     }
535     private List<InstanceGroupInfo> convertGetInstanceGroupsResponseToSimpleResponse(AaiGetRelatedInstanceGroupsByVnfId response) {
536         List<InstanceGroupInfo> instanceGroupInfoList = new ArrayList<>();
537         for(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Relationship relationship: response.getRelationshipList().getRelationship()){
538             getInstanceGroupInfoFromRelationship(relationship, instanceGroupInfoList);
539         }
540         return instanceGroupInfoList;
541     }
542
543     private void getInstanceGroupInfoFromRelationship(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Relationship relationship, List<InstanceGroupInfo> instanceGroupInfoList) {
544         if(relationship.getRelatedTo().equals("instance-group")){
545             for(org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.RelatedToProperty relatedToProperty: relationship.getRelatedToPropertyList()){
546                 if(relatedToProperty.getPropertyKey().equals("instance-group.instance-group-name")){
547                     instanceGroupInfoList.add(new InstanceGroupInfo(relatedToProperty.getPropertyValue()));
548                 }
549             }
550         }
551     }
552
553     @Override
554     public  List<PortDetailsTranslator.PortDetails> getPortMirroringSourcePorts(String configurationId){
555         return aaiClient.getPortMirroringSourcePorts(configurationId);
556     }
557
558     private void addPnfsToListViaDirectRelations(List<String> pnfs, AaiResponse<ServiceRelationships> serviceInstanceResp) {
559         pnfs.addAll(getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "pnf", "pnf.pnf-name"));
560     }
561
562     private void addPnfsToListViaLogicalLinks(List<String> pnfs, AaiResponse<ServiceRelationships> serviceInstanceResp) {
563         List<String> logicalLinks = getRelationshipDataByType(serviceInstanceResp.getT().getRelationshipList(), "logical-link", "logical-link.link-name");
564         for (String logicalLink : logicalLinks) {
565             String link;
566             try {
567                 link = URLEncoder.encode(logicalLink, "UTF-8");
568             } catch (UnsupportedEncodingException e) {
569                 LOGGER.error("Failed to encode logical link: " + logicalLink, e);
570                 continue;
571             }
572
573             AaiResponse<LogicalLinkResponse> logicalLinkResp = aaiClient.getLogicalLink(link);
574             if (logicalLinkResp.getT() != null) {
575                 //lag-interface is the key for pnf - approved by Bracha
576                 List<String> linkPnfs = getRelationshipDataByType(logicalLinkResp.getT().getRelationshipList(), "lag-interface", "pnf.pnf-name");
577                 if (!linkPnfs.isEmpty()) {
578                     pnfs.addAll(linkPnfs);
579                 } else {
580                     LOGGER.warn("no pnf found for logical link " + logicalLink);
581                 }
582             } else {
583                 if (logicalLinkResp.getErrorMessage() != null) {
584                     LOGGER.error("get logical link " + logicalLink + " return error", logicalLinkResp.getErrorMessage());
585                 } else {
586                     LOGGER.warn("get logical link " + logicalLink + " return empty body");
587                 }
588             }
589         }
590     }
591
592     private List<String> getRelationshipDataByType(RelationshipList relationshipList, String relationshipType, String relationshipDataKey) {
593         List<String> relationshipValues = new ArrayList<>();
594         for (Relationship relationship : relationshipList.getRelationship()) {
595             if (relationship.getRelatedTo().equals(relationshipType)) {
596                 relationshipValues.addAll( relationship.getRelationDataList().stream()
597                         .filter(rel -> rel.getRelationshipKey().equals(relationshipDataKey))
598                         .map(RelationshipData::getRelationshipValue)
599                         .collect(Collectors.toList())
600                 );
601             }
602         }
603
604
605         return relationshipValues;
606     }
607
608     public String getAAIServiceTree(String globalCustomerId, String serviceType, String serviceInstanceId) {
609         ObjectMapper om = new ObjectMapper();
610         String result;
611         try {
612             org.onap.vid.model.aaiTree.ServiceInstance tree = aaiServiceTree.getServiceInstanceTopology(globalCustomerId, serviceType, serviceInstanceId);
613             result = om.writeValueAsString(tree);
614         } catch (Exception e) {
615             throw new GenericUncheckedException(e);
616         }
617         return result;
618     }
619 }