1 package org.onap.vid.aai.model;
4 import com.google.common.collect.ImmutableList;
5 import org.onap.vid.aai.AaiResponse;
6 import org.onap.vid.properties.Features;
7 import org.togglz.core.manager.FeatureManager;
9 import javax.inject.Inject;
10 import java.util.LinkedList;
11 import java.util.List;
12 import java.util.Optional;
13 import java.util.function.Predicate;
14 import java.util.stream.Collectors;
16 public class PortDetailsTranslator {
19 FeatureManager featureManager;
21 public static class PortDetailsOk extends PortDetails {
23 private final String interfaceId;
24 private final String interfaceName;
25 private final boolean isPortMirrored;
27 public PortDetailsOk(String interfaceId, String interfaceName, boolean isPortMirrored) {
28 this.interfaceId = interfaceId;
29 this.interfaceName = interfaceName;
30 this.isPortMirrored = isPortMirrored;
33 public String getInterfaceId() {
37 public String getInterfaceName() {
41 public boolean getIsPortMirrored() {
42 return isPortMirrored;
46 public abstract static class PortDetails {
49 public static class PortDetailsError extends PortDetails {
50 private final String errorDescription;
51 private final String rawAaiResponse;
53 public PortDetailsError(String errorDescription, String rawAaiResponse){
54 this.errorDescription = errorDescription;
55 this.rawAaiResponse = rawAaiResponse;
58 public String getErrorDescription() {
59 return errorDescription;
62 public String getRawAaiResponse() {
63 return rawAaiResponse;
67 public static PortDetails extractPortDetailsFromProperties(Properties properties, String rawPayload){
68 List<String> errorDescriptions = new LinkedList<>();
69 describeIfNullOrEmpty("interface-id", properties.getInterfaceId(), errorDescriptions);
70 describeIfNullOrEmpty("interface-name", properties.getInterfaceName(), errorDescriptions);
71 describeIfNullOrEmpty("is-port-mirrored", properties.getIsPortMirrored(), errorDescriptions);
73 if(errorDescriptions.isEmpty()){
74 return new PortDetailsOk(properties.getInterfaceId(), properties.getInterfaceName(), properties.getIsPortMirrored());
76 return new PortDetailsError(String.join(" ", errorDescriptions), rawPayload);
80 private static void describeIfNullOrEmpty(String name, Object value, List<String> errorDescriptions) {
82 errorDescriptions.add("Value of '" + name + "' is missing.");
83 } else if (value.toString().isEmpty()) {
84 errorDescriptions.add("Value of '" + name + "' is empty.");
88 private static Optional<List<PortDetails>> extractErrorResponseIfHttpError(AaiResponse aaiResponse, String rawPayload) {
89 if (aaiResponse.getHttpCode() != org.springframework.http.HttpStatus.OK.value()) {
90 final String errorMessage = aaiResponse.getErrorMessage();
91 return Optional.of(ImmutableList.of(new PortDetailsError(
92 "Got " + aaiResponse.getHttpCode() + " from aai",
93 errorMessage != null ? errorMessage.toString() : rawPayload)
96 return Optional.empty();
100 public List<PortDetails> extractPortDetailsInternal(AaiGetPortMirroringSourcePorts aaiGetPortsResponse, String rawPayload){
101 List<SimpleResult> filteredResult = getFilteredPortList(aaiGetPortsResponse.getResults());
103 return filteredResult.stream()
104 .map(SimpleResult::getProperties)
105 .map(p -> extractPortDetailsFromProperties(p, rawPayload))
106 .collect(Collectors.toList());
109 public List<SimpleResult> getFilteredPortList(List<SimpleResult> results) {
110 String LINTERFACE = "l-interface";
112 final Predicate<SimpleResult> ifIsPort = (SimpleResult r) -> LINTERFACE.equals(r.getNodeType());
113 Predicate<SimpleResult> ifIsSource = getIsSourcePredicate();
115 return results.stream()
118 .collect(Collectors.toList());
121 private Predicate<SimpleResult> getIsSourcePredicate() {
122 boolean FLAG_ADVANCED_PORTS_FILTER = featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER);
124 if (FLAG_ADVANCED_PORTS_FILTER) {
125 String PORT_LABEL = "org.onap.relationships.inventory.Source";
126 return (SimpleResult r) -> r.getRelatedTo().stream()
127 .anyMatch(relatedTo -> PORT_LABEL.equalsIgnoreCase(relatedTo.getRelationshipLabel()));
129 return (SimpleResult r) -> true;
133 public List<PortDetails> extractPortDetails(AaiResponse<AaiGetPortMirroringSourcePorts> aaiGetPortsResponse, String rawPayload){
134 return extractErrorResponseIfHttpError(aaiGetPortsResponse, rawPayload).orElseGet(() -> extractPortDetailsInternal(aaiGetPortsResponse.getT(), rawPayload));