Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / aai / AaiResponseTranslator.java
1 package org.onap.vid.aai;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4 import org.apache.commons.lang3.StringUtils;
5 import org.springframework.stereotype.Component;
6
7 import java.util.Optional;
8
9 @Component
10 public class AaiResponseTranslator {
11
12     public PortMirroringConfigData extractPortMirroringConfigData(AaiResponse<JsonNode> aaiResponse) {
13         return extractErrorResponseIfHttpError(aaiResponse).orElseGet(() -> extractPortMirroringConfigData(aaiResponse.getT()));
14     }
15
16     public PortMirroringConfigData extractPortMirroringConfigData(JsonNode cloudRegionAndSourceFromConfigurationResponse) {
17         final JsonNode payload = cloudRegionAndSourceFromConfigurationResponse;
18         if (payload == null) {
19             return new PortMirroringConfigDataError("Response payload is null", null);
20         }
21
22         final JsonNode results = payload.path("results");
23         if (results.isMissingNode()) {
24             return new PortMirroringConfigDataError("Root node 'results' is missing", payload.toString());
25         }
26
27         for (JsonNode resultNode : results) {
28             final JsonNode nodeType = resultNode.path("node-type");
29             if (nodeType.isTextual() && "cloud-region".equals(nodeType.textValue())) {
30                 return getPortMirroringConfigData(payload, resultNode);
31             }
32         }
33         return new PortMirroringConfigDataError("Root node 'results' has no node where 'node-TYPE' is 'cloud-region'", payload.toString());
34     }
35
36     private PortMirroringConfigData getPortMirroringConfigData(JsonNode payload, JsonNode resultNode) {
37         final JsonNode properties = resultNode.path("properties");
38         if (properties.isMissingNode()) {
39                     final String message = "The node-type 'cloud-region' does not contain a 'properties' node";
40             return new PortMirroringConfigDataError(message, payload.toString());
41         }
42
43         final JsonNode cloudRegionIdNode = properties.path("cloud-region-id");
44         if (cloudRegionIdNode.isMissingNode()) {
45                     return new PortMirroringConfigDataError("The node-type 'cloud-region' does not contain the property 'cloud-region-id'", payload.toString());
46         }
47         if (!cloudRegionIdNode.isTextual()) {
48                     return new PortMirroringConfigDataError("The node-type 'cloud-region' contains a non-textual value for the property 'cloud-region-id'", payload.toString());
49         }
50
51         final String cloudRegionId = cloudRegionIdNode.asText();
52         if (StringUtils.isBlank(cloudRegionId)) {
53                     return new PortMirroringConfigDataError("Node 'properties.cloud-region-id' of node-type 'cloud-region' is blank", payload.toString());
54         }
55
56         return new PortMirroringConfigDataOk(cloudRegionId);
57     }
58
59     private Optional<PortMirroringConfigData> extractErrorResponseIfHttpError(AaiResponse aaiResponse) {
60         if (aaiResponse.getHttpCode() != org.springframework.http.HttpStatus.OK.value()) {
61             final String errorMessage = aaiResponse.getErrorMessage();
62             return Optional.of(new PortMirroringConfigDataError(
63                     "Got " + aaiResponse.getHttpCode() + " from aai",
64                     errorMessage != null ? errorMessage : null)
65             );
66         } else {
67             return Optional.empty();
68         }
69     }
70
71     public abstract static class PortMirroringConfigData {
72     }
73
74     public static class PortMirroringConfigDataOk extends PortMirroringConfigData {
75         private final String cloudRegionId;
76
77         public PortMirroringConfigDataOk(String cloudRegionId) {
78             this.cloudRegionId = cloudRegionId;
79         }
80
81         public String getCloudRegionId() {
82             return cloudRegionId;
83         }
84     }
85
86     public static class PortMirroringConfigDataError extends PortMirroringConfigData {
87         private final String errorDescription;
88         private final String rawAaiResponse;
89
90         public PortMirroringConfigDataError(String errorDescription, String rawAaiResponse) {
91             this.errorDescription = errorDescription;
92             this.rawAaiResponse = rawAaiResponse;
93         }
94
95         public String getErrorDescription() {
96             return errorDescription;
97         }
98
99         public String getRawAaiResponse() {
100             return rawAaiResponse;
101         }
102     }
103 }