f8980457a4dbdcd961c1237ed2987b8efcbc398b
[vid.git] / vid-app-common / src / main / java / org / onap / vid / aai / model / PortDetailsTranslator.java
1 package org.onap.vid.aai.model;
2
3
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;
8
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;
15
16 public class PortDetailsTranslator {
17
18     @Inject
19     FeatureManager featureManager;
20
21     public static class PortDetailsOk extends PortDetails {
22
23         private final String interfaceId;
24         private final String interfaceName;
25         private final boolean isPortMirrored;
26
27         public PortDetailsOk(String interfaceId, String interfaceName, boolean isPortMirrored) {
28             this.interfaceId = interfaceId;
29             this.interfaceName = interfaceName;
30             this.isPortMirrored = isPortMirrored;
31         }
32
33         public String getInterfaceId() {
34             return interfaceId;
35         }
36
37         public String getInterfaceName() {
38             return interfaceName;
39         }
40
41         public boolean getIsPortMirrored() {
42             return isPortMirrored;
43         }
44     }
45
46     public abstract static class PortDetails {
47     }
48
49     public static class PortDetailsError extends PortDetails {
50         private final String errorDescription;
51         private final String rawAaiResponse;
52
53         public PortDetailsError(String errorDescription, String rawAaiResponse){
54            this.errorDescription = errorDescription;
55            this.rawAaiResponse = rawAaiResponse;
56         }
57
58         public String getErrorDescription() {
59             return errorDescription;
60         }
61
62         public String getRawAaiResponse() {
63             return rawAaiResponse;
64         }
65     }
66
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);
72
73         if(errorDescriptions.isEmpty()){
74             return new PortDetailsOk(properties.getInterfaceId(), properties.getInterfaceName(), properties.getIsPortMirrored());
75         } else {
76             return new PortDetailsError(String.join(" ", errorDescriptions), rawPayload);
77         }
78     }
79
80     private static void describeIfNullOrEmpty(String name, Object value, List<String> errorDescriptions) {
81         if (value == null) {
82             errorDescriptions.add("Value of '" + name + "' is missing.");
83         } else if (value.toString().isEmpty()) {
84             errorDescriptions.add("Value of '" + name + "' is empty.");
85         }
86     }
87
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)
94             ));
95         } else {
96             return Optional.empty();
97         }
98     }
99
100     public List<PortDetails> extractPortDetailsInternal(AaiGetPortMirroringSourcePorts aaiGetPortsResponse, String rawPayload){
101         List<SimpleResult> filteredResult = getFilteredPortList(aaiGetPortsResponse.getResults());
102
103         return filteredResult.stream()
104                 .map(SimpleResult::getProperties)
105                 .map(p -> extractPortDetailsFromProperties(p, rawPayload))
106                 .collect(Collectors.toList());
107     }
108
109     public List<SimpleResult> getFilteredPortList(List<SimpleResult> results) {
110         String LINTERFACE = "l-interface";
111
112         final Predicate<SimpleResult> ifIsPort = (SimpleResult r) -> LINTERFACE.equals(r.getNodeType());
113         Predicate<SimpleResult> ifIsSource = getIsSourcePredicate();
114
115         return results.stream()
116                 .filter(ifIsPort)
117                 .filter(ifIsSource)
118                 .collect(Collectors.toList());
119     }
120
121     private Predicate<SimpleResult> getIsSourcePredicate() {
122         boolean FLAG_ADVANCED_PORTS_FILTER = featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER);
123
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()));
128         } else {
129             return (SimpleResult r) -> true;
130         }
131     }
132
133     public List<PortDetails> extractPortDetails(AaiResponse<AaiGetPortMirroringSourcePorts> aaiGetPortsResponse, String rawPayload){
134         return extractErrorResponseIfHttpError(aaiGetPortsResponse, rawPayload).orElseGet(() -> extractPortDetailsInternal(aaiGetPortsResponse.getT(), rawPayload));
135
136     }
137
138 }