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