OAM NF Adopter SNMP Manager
[oam/nf-oam-adopter.git] / ves-nf-oam-adopter / ves-nf-oam-adopter-snmp-manager / src / main / java / org / o / ran / oam / nf / oam / adopter / snmp / manager / mapper / CommonEventHeaderHandler.java
diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/mapper/CommonEventHeaderHandler.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/mapper/CommonEventHeaderHandler.java
new file mode 100644 (file)
index 0000000..c2d052c
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  O-RAN-SC
+ *  ================================================================================
+ *  Copyright © 2021 AT&T Intellectual Property. All rights reserved.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.o.ran.oam.nf.oam.adopter.snmp.manager.mapper;
+
+import java.util.Optional;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.o.ran.oam.nf.oam.adopter.api.CommonEventHeader;
+import org.o.ran.oam.nf.oam.adopter.snmp.manager.pojos.TrapsMappingConfiguration;
+import org.o.ran.oam.nf.oam.adopter.snmp.manager.pojos.VesMappingConfiguration;
+import org.snmp4j.PDU;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.UdpAddress;
+import org.snmp4j.smi.Variable;
+
+/**
+ * Follows
+ * https://docs.onap.org/projects/onap-vnfrqts-requirements/en/latest/Chapter8/ves7_1spec.html#datatype-commoneventheader
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+final class CommonEventHeaderHandler {
+    static CommonEventHeader toCommonEventHeader(final UdpAddress peerAddress,
+            final VesMappingConfiguration vesMappingConfig, final TrapsMappingConfiguration mappingConfiguration,
+            final PDU pdu, final String timeZone) {
+        final CommonEventHeader header = new CommonEventHeader();
+        setMandatoryFields(header, peerAddress, vesMappingConfig, mappingConfiguration, pdu);
+        setOptionalFields(header, vesMappingConfig, mappingConfiguration, pdu, timeZone);
+        return header;
+    }
+
+    private static void setOptionalFields(final CommonEventHeader header,
+            final VesMappingConfiguration vesMappingConfig, final TrapsMappingConfiguration mappingConfiguration,
+            final PDU pdu, final String timeZone) {
+        header.setNfVendorName(vesMappingConfig.getNfVendorName());
+        final String oidEntityId = mappingConfiguration.getOidReportingEntityID();
+        if (oidEntityId != null) {
+            final Variable uuid = pdu.getVariable(new OID(oidEntityId));
+            header.setReportingEntityId(uuid == null ? null : uuid.toString());
+        }
+        header.setNfNamingCode(null); //NOP
+        header.setNfcNamingCode(null); //NOP
+        if (timeZone != null) {
+            header.setTimeZoneOffset(timeZone);
+        }
+    }
+
+    private static void setMandatoryFields(final CommonEventHeader header, final UdpAddress peerAddress,
+            final VesMappingConfiguration vesMappingConfig, final TrapsMappingConfiguration mappingConfiguration,
+            final PDU pdu) {
+        header.setDomain(CommonEventHeader.Domain.FAULT);
+
+        final Optional<OID> eventIdOid = Optional.ofNullable(mappingConfiguration.getOidEventId()).map(OID::new);
+        final Optional<Variable> eventIdValue = eventIdOid.map(pdu::getVariable);
+        final String eventId = eventIdValue.map(Variable::toString).orElse(pdu.getRequestID().toString());
+        header.setEventId(eventId);
+        header.setEventName(
+                CommonEventHeader.Domain.FAULT.name() + "_" + vesMappingConfig.getReportingEntityName() + "_"
+                        + mappingConfiguration.getName());
+
+        final String oidStartEpoch = mappingConfiguration.getEventStartEpochMicrosec();
+        if (oidStartEpoch != null) {
+            final Variable uuid = pdu.getVariable(new OID(oidStartEpoch));
+            header.setStartEpochMicrosec(uuid == null ? null : Long.valueOf(uuid.toString()));
+        } else {
+            header.setStartEpochMicrosec(System.currentTimeMillis());
+        }
+
+        final String oidLastEpoch = mappingConfiguration.getEventLastEpochMicrosec();
+        if (oidLastEpoch != null) {
+            final Variable uuid = pdu.getVariable(new OID(oidLastEpoch));
+            header.setLastEpochMicrosec(uuid == null ? null : Long.valueOf(uuid.toString()));
+        } else {
+            header.setLastEpochMicrosec(System.currentTimeMillis());
+        }
+        header.setPriority(CommonEventHeader.Priority.HIGH);
+        header.setReportingEntityName(vesMappingConfig.getReportingEntityName());
+        header.setReportingEntityId(vesMappingConfig.getReportingEntityId());
+        header.setSequence(extractEventSequence(mappingConfiguration, pdu));
+        final String oidSourceName = mappingConfiguration.getOidSourceName();
+        if (oidSourceName != null) {
+            final Variable sourceName = pdu.getVariable(new OID(oidSourceName));
+            header.setSourceName(sourceName.toString());
+        } else {
+            header.setSourceName(peerAddress.getInetAddress().getHostAddress());
+        }
+        header.setVersion(CommonEventHeader.Version._4_0);
+        header.setVesEventListenerVersion(Optional.ofNullable(vesMappingConfig.getVesEventListenerVersion())
+                                                  .map(CommonEventHeader.VesEventListenerVersion::fromValue)
+                                                  .orElse(CommonEventHeader.VesEventListenerVersion._7_1));
+    }
+
+    private static long extractEventSequence(final TrapsMappingConfiguration mappingConfiguration, final PDU pdu) {
+        final Optional<String> optEventSequenceOid = Optional.ofNullable(mappingConfiguration.getOidEventSequence());
+        if (optEventSequenceOid.isPresent()) {
+            final String eventSequenceOid = optEventSequenceOid.get();
+            if (!eventSequenceOid.contains(".")) {
+                return Long.parseLong(eventSequenceOid);
+            }
+            final Optional<Variable> optValue = Optional.ofNullable(pdu.getVariable(new OID(eventSequenceOid)));
+            if (optValue.isPresent()) {
+                return optValue.get().toLong();
+            }
+        }
+        return 0L;
+    }
+}