T-API notification JUnit test 32/100432/24
authorJavier Errea <javier.errea_moreno@nokia.com>
Wed, 6 Apr 2022 13:32:30 +0000 (15:32 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Tue, 6 Dec 2022 13:50:28 +0000 (13:50 +0000)
JIRA: TRNSPRTPCE-649
Signed-off-by: errea <errea@eurecom.fr>
Change-Id: Icc1bd2a4815e3d6df6ab8c22bcba2466d3b1ee49

nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImpl.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/utils/NbiNotificationsUtils.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/consumer/SubscriberTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsImplTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImplTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/producer/PublisherTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java [new file with mode: 0644]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java [new file with mode: 0644]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/utils/NotificationServiceDataUtils.java
nbinotifications/src/test/resources/expected_tapi_event.json [new file with mode: 0755]
nbinotifications/src/test/resources/tapi_event.json [new file with mode: 0644]

index 797fca71966b61d8a654fd07b591a7127982022c..7450fa6711503272d3be8ca59efadbdea5f848d7 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.transportpce.nbinotifications.listener;
 
-import java.util.HashMap;
 import java.util.Map;
 import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
+import org.opendaylight.transportpce.nbinotifications.utils.NbiNotificationsUtils;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NbiNotificationsListener;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmServiceBuilder;
@@ -20,20 +20,6 @@ import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapi
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishTapiNotificationService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfo;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfoBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfoKey;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AlarmInfoBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributes;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributesBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributesKey;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectName;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectNameBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectNameKey;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TcaInfoBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,64 +84,8 @@ public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
             return;
         }
         Publisher<NotificationTapiService> publisher = tapiPublisherMap.get(topic);
-        publisher.sendEvent(new NotificationTapiServiceBuilder(transformTapiNotification(notification))
-                .build(), topic);
-    }
-
-    private NotificationTapiService transformTapiNotification(PublishTapiNotificationService notification) {
-        Map<AdditionalInfoKey, AdditionalInfo> addInfoMap = new HashMap<>();
-        if (notification.getAdditionalInfo() != null) {
-            for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AdditionalInfo
-                addInfo:notification.getAdditionalInfo().values()) {
-                AdditionalInfo transAddInfo = new AdditionalInfoBuilder(addInfo).build();
-                addInfoMap.put(transAddInfo.key(), transAddInfo);
-            }
-        }
-        Map<ChangedAttributesKey, ChangedAttributes> changedAttMap = new HashMap<>();
-        if (notification.getChangedAttributes() != null) {
-            for (org.opendaylight.yang.gen.v1
-                .urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributes
-                    changedAtt:notification.getChangedAttributes().values()) {
-                ChangedAttributes transChangedAtt = new ChangedAttributesBuilder(changedAtt).build();
-                changedAttMap.put(transChangedAtt.key(), transChangedAtt);
-            }
-        }
-        Map<NameKey, Name> nameMap = new HashMap<>();
-        if (notification.getName() != null) {
-            for (Name name:notification.getName().values()) {
-                Name transName = new NameBuilder(name).build();
-                nameMap.put(transName.key(), transName);
-            }
-        }
-        Map<TargetObjectNameKey, TargetObjectName> targetObjNameMap = new HashMap<>();
-        if (notification.getTargetObjectName() != null) {
-            for (org.opendaylight.yang.gen.v1
-                .urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectName
-                    targetObjectName:notification.getTargetObjectName().values()) {
-                TargetObjectName transTargetObjName = new TargetObjectNameBuilder(targetObjectName).build();
-                targetObjNameMap.put(transTargetObjName.key(), transTargetObjName);
-            }
-        }
-        LOG.info("Notification uuid = {}", notification.getUuid());
-        return new NotificationTapiServiceBuilder()
-            .setAlarmInfo(notification.getAlarmInfo() == null ? null
-                : new AlarmInfoBuilder(notification.getAlarmInfo()).build())
-            .setAdditionalText(notification.getAdditionalText())
-            .setAdditionalInfo(addInfoMap)
-            .setNotificationType(notification.getNotificationType())
-            .setChangedAttributes(changedAttMap)
-            .setEventTimeStamp(notification.getEventTimeStamp())
-            .setLayerProtocolName(notification.getLayerProtocolName())
-            .setName(nameMap)
-            .setSequenceNumber(notification.getSequenceNumber())
-            .setSourceIndicator(notification.getSourceIndicator())
-            .setTargetObjectIdentifier(notification.getTargetObjectIdentifier())
-            .setTargetObjectName(targetObjNameMap)
-            .setTargetObjectType(notification.getTargetObjectType())
-            .setTcaInfo(notification.getTcaInfo() == null ? null
-                : new TcaInfoBuilder(notification.getTcaInfo()).build())
-            .setUuid(notification.getUuid())
-            .build();
+        publisher.sendEvent(new NotificationTapiServiceBuilder(
+                NbiNotificationsUtils.transformTapiNotification(notification)).build(), topic);
     }
 
     public void setPublishersServiceMap(Map<String, Publisher<NotificationProcessService>> publishersServiceMap) {
@@ -169,4 +99,8 @@ public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
     public void setTapiPublishersMap(Map<String, Publisher<NotificationTapiService>> tapiPublishersMap) {
         this.tapiPublisherMap = tapiPublishersMap;
     }
+
+    public Publisher<NotificationTapiService> getTapiPublisherFromTopic(String topic) {
+        return this.tapiPublisherMap.get(topic);
+    }
 }
index af097c35b86d1ec0b222a59126c97f77ad95338b..02007bab88ce025ea46f5967657e1c678b743077 100644 (file)
@@ -9,7 +9,26 @@ package org.opendaylight.transportpce.nbinotifications.utils;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfo;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfoBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfoKey;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AlarmInfoBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectName;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TargetObjectNameKey;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.TcaInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,4 +53,60 @@ public final class NbiNotificationsUtils {
         }
         return props;
     }
+
+    public static NotificationTapiService transformTapiNotification(PublishTapiNotificationService notification) {
+        Map<AdditionalInfoKey, AdditionalInfo> addInfoMap = new HashMap<>();
+        if (notification.getAdditionalInfo() != null) {
+            for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AdditionalInfo
+                    addInfo:notification.getAdditionalInfo().values()) {
+                AdditionalInfo transAddInfo = new AdditionalInfoBuilder(addInfo).build();
+                addInfoMap.put(transAddInfo.key(), transAddInfo);
+            }
+        }
+        Map<ChangedAttributesKey, ChangedAttributes> changedAttMap = new HashMap<>();
+        if (notification.getChangedAttributes() != null) {
+            for (org.opendaylight.yang.gen.v1
+                    .urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributes
+                    changedAtt:notification.getChangedAttributes().values()) {
+                ChangedAttributes transChangedAtt = new ChangedAttributesBuilder(changedAtt).build();
+                changedAttMap.put(transChangedAtt.key(), transChangedAtt);
+            }
+        }
+        Map<NameKey, Name> nameMap = new HashMap<>();
+        if (notification.getName() != null) {
+            for (Name name:notification.getName().values()) {
+                Name transName = new NameBuilder(name).build();
+                nameMap.put(transName.key(), transName);
+            }
+        }
+        Map<TargetObjectNameKey, TargetObjectName> targetObjNameMap = new HashMap<>();
+        if (notification.getTargetObjectName() != null) {
+            for (org.opendaylight.yang.gen.v1
+                    .urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectName
+                    targetObjectName:notification.getTargetObjectName().values()) {
+                TargetObjectName transTargetObjName = new TargetObjectNameBuilder(targetObjectName).build();
+                targetObjNameMap.put(transTargetObjName.key(), transTargetObjName);
+            }
+        }
+        LOG.info("Notification uuid = {}", notification.getUuid());
+        return new NotificationTapiServiceBuilder()
+                .setAlarmInfo(notification.getAlarmInfo() == null ? null
+                        : new AlarmInfoBuilder(notification.getAlarmInfo()).build())
+                .setAdditionalText(notification.getAdditionalText())
+                .setAdditionalInfo(addInfoMap)
+                .setNotificationType(notification.getNotificationType())
+                .setChangedAttributes(changedAttMap)
+                .setEventTimeStamp(notification.getEventTimeStamp())
+                .setLayerProtocolName(notification.getLayerProtocolName())
+                .setName(nameMap)
+                .setSequenceNumber(notification.getSequenceNumber())
+                .setSourceIndicator(notification.getSourceIndicator())
+                .setTargetObjectIdentifier(notification.getTargetObjectIdentifier())
+                .setTargetObjectName(targetObjNameMap)
+                .setTargetObjectType(notification.getTargetObjectType())
+                .setTcaInfo(notification.getTcaInfo() == null ? null
+                        : new TcaInfoBuilder(notification.getTcaInfo()).build())
+                .setUuid(notification.getUuid())
+                .build();
+    }
 }
index c32142f23b57e047cca5707190ddbb77b0927351..326c4ecdd9522dbdbf4edeec7c405a08b40954a6 100644 (file)
@@ -24,23 +24,29 @@ import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceD
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.get.notifications.alarm.service.output.NotificationsAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.Notification;
 
 public class SubscriberTest extends AbstractTest {
     private static final String TOPIC = "topic";
     private static final int PARTITION = 0;
     private MockConsumer<String, NotificationsProcessService> mockConsumer;
     private MockConsumer<String, NotificationsAlarmService> mockConsumerAlarm;
+    private MockConsumer<String, Notification> mockConsumerTapi;
     private Subscriber<NotificationProcessService, NotificationsProcessService> subscriberService;
     private Subscriber<NotificationAlarmService, NotificationsAlarmService> subscriberAlarmService;
+    private Subscriber<NotificationTapiService, Notification> subscriberTapiService;
 
     @Before
     public void setUp() {
         mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
         mockConsumerAlarm = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
+        mockConsumerTapi = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
         subscriberService = new Subscriber<>(mockConsumer);
         subscriberAlarmService = new Subscriber<>(mockConsumerAlarm);
+        subscriberTapiService = new Subscriber<>(mockConsumerTapi);
     }
 
     @Test
@@ -82,4 +88,24 @@ public class SubscriberTest extends AbstractTest {
         assertEquals("There should be 1 record", 1, result.size());
         assertTrue("Consumer should be closed", mockConsumerAlarm.closed());
     }
+
+    @Test
+    public void subscribeTapiAlarmShouldBeSuccessful() {
+        // from https://www.baeldung.com/kafka-mockconsumer
+        ConsumerRecord<String, Notification> record = new ConsumerRecord<>(
+            TOPIC, PARTITION, 0L, "key", NotificationServiceDataUtils.buildReceivedTapiAlarmEvent());
+        mockConsumerTapi.schedulePollTask(() -> {
+            mockConsumerTapi.rebalance(Collections.singletonList(new TopicPartition(TOPIC, PARTITION)));
+            mockConsumerTapi.addRecord(record);
+        });
+
+        Map<TopicPartition, Long> startOffsets = new HashMap<>();
+        TopicPartition tp = new TopicPartition(TOPIC, PARTITION);
+        startOffsets.put(tp, 0L);
+        mockConsumerTapi.updateBeginningOffsets(startOffsets);
+        List<Notification> result = subscriberTapiService.subscribe(TOPIC,
+            NotificationTapiService.QNAME);
+        assertEquals("There should be 1 record", 1, result.size());
+        assertTrue("Consumer should be closed", mockConsumerTapi.closed());
+    }
 }
index 018c2d62257796d9afdf3bc7d09ec4c8717b1730..bc025c5d0f6959976a5280a5749d52eecb828742 100644 (file)
@@ -7,17 +7,18 @@
  */
 package org.opendaylight.transportpce.nbinotifications.impl;
 
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.Mock;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.common.network.RequestProcessor;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
 import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
@@ -28,17 +29,20 @@ import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.GetNotifications
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationProcessService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.CreateNotificationSubscriptionServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.CreateNotificationSubscriptionServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.GetNotificationListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.GetNotificationListOutput;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class NbiNotificationsImplTest extends AbstractTest {
     private NbiNotificationsImpl nbiNotificationsImpl;
     public static NetworkTransactionService networkTransactionService;
-
-    @Mock
     private TopicManager topicManager;
 
     @Before
-    public void setUp() {
+    public void setUp() throws ExecutionException, InterruptedException {
+        topicManager = TopicManager.getInstance();
         networkTransactionService = new NetworkTransactionImpl(
             new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
         JsonStringConverter<NotificationProcessService> converter = new JsonStringConverter<>(
@@ -47,6 +51,8 @@ public class NbiNotificationsImplTest extends AbstractTest {
                 getDataStoreContextUtil().getBindingDOMCodecServices());
         JsonStringConverter<NotificationTapiService> converterTapi = new JsonStringConverter<>(
             getDataStoreContextUtil().getBindingDOMCodecServices());
+        topicManager.setTapiConverter(converterTapi);
+        NotificationServiceDataUtils.createTapiContext(networkTransactionService);
 
         nbiNotificationsImpl = new NbiNotificationsImpl(converter, converterAlarm, converterTapi,
             "localhost:8080", networkTransactionService, topicManager);
@@ -81,4 +87,28 @@ public class NbiNotificationsImplTest extends AbstractTest {
                 nbiNotificationsImpl.getNotificationsAlarmService(builder.build());
         assertNull("Should be null", result.get().getResult().getNotificationsAlarmService());
     }
+
+    @Test
+    public void createTapiNotificationSubscriptionServiceTest() throws InterruptedException, ExecutionException {
+        CreateNotificationSubscriptionServiceInputBuilder builder
+            = NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder();
+        ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> result =
+            nbiNotificationsImpl.createNotificationSubscriptionService(builder.build());
+        assertNotNull("Should receive UUID for subscription service",
+            result.get().getResult().getSubscriptionService().getUuid().toString());
+    }
+
+    @Test
+    public void getTapiNotificationsServiceTest() throws InterruptedException, ExecutionException {
+        CreateNotificationSubscriptionServiceInputBuilder builder
+            = NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder();
+        ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> result =
+            nbiNotificationsImpl.createNotificationSubscriptionService(builder.build());
+        GetNotificationListInputBuilder builder1 = new GetNotificationListInputBuilder()
+            .setTimePeriod("Time Period")
+            .setSubscriptionIdOrName(result.get().getResult().getSubscriptionService().getUuid().getValue());
+        ListenableFuture<RpcResult<GetNotificationListOutput>> result1 =
+            nbiNotificationsImpl.getNotificationList(builder1.build());
+        assertNull("Should be null", result1.get().getResult().getNotification());
+    }
 }
index 1743723e6883853be8d9a3563d6fad0199953e23..ced79a2cc9668a296c350c7a895c5d0827e7633b 100644 (file)
@@ -7,43 +7,53 @@
  */
 package org.opendaylight.transportpce.nbinotifications.listener;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationAlarmServiceBuilder;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishTapiNotificationServiceBuilder;
 
 public class NbiNotificationsListenerImplTest extends AbstractTest {
     @Mock
     private Publisher<NotificationProcessService> publisherService;
     @Mock
     private Publisher<NotificationAlarmService> publisherAlarm;
+    @Mock
+    private Publisher<NotificationTapiService> publisherTapiService;
 
     @Before
-    public void setUp() {
+    public void setUp() throws ExecutionException, InterruptedException {
         MockitoAnnotations.openMocks(this);
     }
 
     @Test
     public void onPublishNotificationServiceTest() {
         NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm), new HashMap<>());
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
         PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
                 .setPublisherName("test")
                 .setCommonId("commonId")
@@ -59,7 +69,7 @@ public class NbiNotificationsListenerImplTest extends AbstractTest {
     @Test
     public void onPublishNotificationServiceWrongPublisherTest() {
         NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm), new HashMap<>());
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
         PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
                 .setPublisherName("wrongPublisher")
                 .setCommonId("commonId")
@@ -75,7 +85,7 @@ public class NbiNotificationsListenerImplTest extends AbstractTest {
     @Test
     public void onPublishNotificationAlarmServiceTest() {
         NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm), new HashMap<>());
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
         PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
                 .setPublisherName("test")
                 .setConnectionType(ConnectionType.Service)
@@ -90,7 +100,7 @@ public class NbiNotificationsListenerImplTest extends AbstractTest {
     @Test
     public void onPublishNotificationAlarmServiceWrongPublisherTest() {
         NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm), new HashMap<>());
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
         PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
                 .setPublisherName("wrongPublisher")
                 .setConnectionType(ConnectionType.Service)
@@ -101,4 +111,37 @@ public class NbiNotificationsListenerImplTest extends AbstractTest {
         listener.onPublishNotificationAlarmService(notification);
         verify(publisherAlarm, times(0)).sendEvent(any(), anyString());
     }
+
+    @Test
+    public void onPublishTapiNotificationServiceTest() throws ExecutionException, InterruptedException {
+        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+
+        PublishTapiNotificationService notification
+            = new PublishTapiNotificationServiceBuilder(NotificationServiceDataUtils.buildReceivedTapiAlarmEvent())
+                .setTopic("test")
+                .build();
+        listener.onPublishTapiNotificationService(notification);
+        verify(publisherTapiService, times(1)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    public void onPublishTapiNotificationServiceTestWrongPublisherTest() {
+        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
+            Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishTapiNotificationService notification
+            = new PublishTapiNotificationServiceBuilder(NotificationServiceDataUtils.buildReceivedTapiAlarmEvent())
+                .setTopic(UUID.randomUUID().toString())
+                .build();
+        listener.onPublishTapiNotificationService(notification);
+        verify(publisherTapiService, times(0)).sendEvent(any(), eq(notification.getTopic()));
+    }
+
+    @Test
+    public void getTapiPublisherFromTopicTest() {
+        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        assertNull(listener.getTapiPublisherFromTopic("toto"));
+        assertEquals(publisherTapiService, listener.getTapiPublisherFromTopic("test"));
+    }
 }
index 1d988fc0ce2700b4bd6ca9d43fc7cb168879f181..0e07aff231382b9e25252ff41d30eae7b5ffa9b5 100644 (file)
@@ -9,46 +9,86 @@ package org.opendaylight.transportpce.nbinotifications.producer;
 
 import static org.junit.Assert.assertEquals;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import org.apache.kafka.clients.producer.MockProducer;
 import org.apache.kafka.common.serialization.StringSerializer;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.common.network.RequestProcessor;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsImpl;
 import org.opendaylight.transportpce.nbinotifications.serialization.ConfigConstants;
 import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceSerializer;
 import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceSerializer;
+import org.opendaylight.transportpce.nbinotifications.serialization.TapiNotificationSerializer;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationAlarmService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.CreateNotificationSubscriptionServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.CreateNotificationSubscriptionServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.create.notification.subscription.service.input.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.create.notification.subscription.service.input.SubscriptionFilterBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 
 public class PublisherTest extends AbstractTest {
     private JsonStringConverter<NotificationProcessService> converterService;
     private JsonStringConverter<NotificationAlarmService> converterAlarm;
+    private JsonStringConverter<NotificationTapiService> converterTapiService;
     private Publisher<NotificationProcessService> publisherService;
     private Publisher<NotificationAlarmService> publisherAlarm;
+    private Publisher<NotificationTapiService> publisherTapiService;
     private MockProducer<String, NotificationProcessService> mockProducer;
     private MockProducer<String, NotificationAlarmService> mockAlarmProducer;
+    private MockProducer<String, NotificationTapiService> mockTapiProducer;
+    private NbiNotificationsImpl nbiNotificationsImpl;
+    private TopicManager topicManager;
+
+    public static NetworkTransactionService networkTransactionService;
 
     @Before
-    public void setUp() {
+    public void setUp() throws ExecutionException, InterruptedException {
+        topicManager = TopicManager.getInstance();
         converterService = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         converterAlarm = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        converterTapiService = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         NotificationServiceSerializer serializerService = new NotificationServiceSerializer();
         NotificationAlarmServiceSerializer serializerAlarm = new NotificationAlarmServiceSerializer();
+        TapiNotificationSerializer serializerTapi = new TapiNotificationSerializer();
         Map<String, Object> properties = Map.of(ConfigConstants.CONVERTER, converterService);
         Map<String, Object> propertiesAlarm = Map.of(ConfigConstants.CONVERTER, converterAlarm);
+        Map<String, Object> propertiesTapi = Map.of(ConfigConstants.CONVERTER, converterTapiService);
         serializerService.configure(properties, false);
         serializerAlarm.configure(propertiesAlarm, false);
+        serializerTapi.configure(propertiesTapi, false);
         mockProducer = new MockProducer<>(true, new StringSerializer(), serializerService);
         mockAlarmProducer = new MockProducer<>(true, new StringSerializer(), serializerAlarm);
+        mockTapiProducer = new MockProducer<>(true, new StringSerializer(), serializerTapi);
         publisherService = new Publisher<>("test", mockProducer);
         publisherAlarm = new Publisher<>("test", mockAlarmProducer);
+        publisherTapiService = new Publisher<>("test", mockTapiProducer);
+        MockitoAnnotations.openMocks(this);
+        networkTransactionService = new NetworkTransactionImpl(
+            new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
+        topicManager.setTapiConverter(converterTapiService);
+        NotificationServiceDataUtils.createTapiContext(networkTransactionService);
+        nbiNotificationsImpl = new NbiNotificationsImpl(converterService, converterAlarm, converterTapiService,
+            "localhost:8080", networkTransactionService, topicManager);
     }
 
     @Test
@@ -73,4 +113,23 @@ public class PublisherTest extends AbstractTest {
         assertEquals("We should have one message", 1, mockAlarmProducer.history().size());
         assertEquals("Key should be test", "test", mockAlarmProducer.history().get(0).key());
     }
+
+    @Test
+    public void sendTapiEventShouldBeSuccessful() throws IOException {
+        CreateNotificationSubscriptionServiceInputBuilder builder
+            = NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder();
+        SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder(builder.getSubscriptionFilter())
+            .setRequestedObjectIdentifier(new HashSet<>(List.of(new Uuid("76d8f07b-ead5-4132-8eb8-cf3fdef7e079"))))
+            .build();
+        builder.setSubscriptionFilter(subscriptionFilter);
+        ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> result =
+            nbiNotificationsImpl.createNotificationSubscriptionService(builder.build());
+        String json = Files.readString(Paths.get("src/test/resources/tapi_event.json"));
+        NotificationTapiService notificationTapiService = converterTapiService
+            .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationTapiService.QNAME),
+                json, JSONCodecFactorySupplier.RFC7951);
+        publisherTapiService.sendEvent(notificationTapiService, "");
+        assertEquals("We should have one message", 1, mockTapiProducer.history().size());
+        assertEquals("Key should be test", "test", mockTapiProducer.history().get(0).key());
+    }
 }
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java
new file mode 100644 (file)
index 0000000..e50231e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.junit.Test;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.Notification;
+
+public class NotificationTapiServiceDeserializerTest extends AbstractTest {
+
+    @Test
+    public void deserializeTest() throws IOException {
+        JsonStringConverter<NotificationTapiService> converter = new JsonStringConverter<>(
+                getDataStoreContextUtil().getBindingDOMCodecServices());
+        TapiNotificationDeserializer deserializer = new TapiNotificationDeserializer();
+        Map<String, Object> configs = Map.of(ConfigConstants.CONVERTER, converter);
+        deserializer.configure(configs, false);
+        Notification readEvent = deserializer.deserialize("76d8f07b-ead5-4132-8eb8-cf3fdef7e079",
+                Files.readAllBytes(Paths.get("src/test/resources/tapi_event.json")));
+        deserializer.close();
+        assertEquals("Service uuid should be 76d8f07b-ead5-4132-8eb8-cf3fdef7e079",
+            "76d8f07b-ead5-4132-8eb8-cf3fdef7e079", readEvent.getTargetObjectIdentifier().getValue());
+    }
+}
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java
new file mode 100644 (file)
index 0000000..233b1a9
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.junit.Test;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+
+public class NotificationTapiServiceSerializerTest extends AbstractTest {
+
+    @Test
+    public void serializeTest() throws IOException {
+        JsonStringConverter<NotificationTapiService> converter =
+                new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        String json = Files.readString(Paths.get("src/test/resources/tapi_event.json"));
+        NotificationTapiService notificationService = converter
+                .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationTapiService.QNAME),
+                        json, JSONCodecFactorySupplier.RFC7951);
+        TapiNotificationSerializer serializer = new TapiNotificationSerializer();
+        Map<String, Object> configs = Map.of(ConfigConstants.CONVERTER, converter);
+        serializer.configure(configs, false);
+        byte[] data = serializer.serialize("test", notificationService);
+        serializer.close();
+        assertNotNull("Serialized data should not be null", data);
+        String expectedJson = Files.readString(Paths.get("src/test/resources/expected_tapi_event.json"));
+        // Minify the json string
+        expectedJson = new ObjectMapper().readValue(expectedJson, JsonNode.class).toString();
+        assertEquals("The event should be equals", expectedJson, new String(data, StandardCharsets.UTF_8));
+    }
+}
index ea8c5496a548b8c22b0fdff46b7795578bb71b04..195ef39fac788f952e7be3fbc77fbab548d72938 100644 (file)
@@ -7,7 +7,18 @@
  */
 package org.opendaylight.transportpce.nbinotifications.utils;
 
+import java.nio.charset.Charset;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
@@ -28,11 +39,42 @@ import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.get.notification
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.get.notifications.process.service.output.NotificationsProcessServiceBuilder;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceAEndBuilder;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.CreateNotificationSubscriptionServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.GetNotificationListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.NotificationType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.ObjectType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.SubscriptionState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.context.NotificationContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.create.notification.subscription.service.input.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.create.notification.subscription.service.input.SubscriptionFilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.NotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.NwTopologyServiceBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
 public final class NotificationServiceDataUtils {
 
+    public static final String TAPI_CONTEXT = "T-API context";
+
     private NotificationServiceDataUtils() {
     }
 
@@ -71,6 +113,38 @@ public final class NotificationServiceDataUtils {
                 .build();
     }
 
+    public static Notification buildReceivedTapiAlarmEvent() {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+        Uuid targetObjectId = new Uuid(UUID.randomUUID().toString());
+        TargetObjectName objectName = new TargetObjectNameBuilder()
+            .setValue(targetObjectId.getValue())
+            .setValueName("Connectivity Service Name")
+            .build();
+        ChangedAttributes adminStateChange = new ChangedAttributesBuilder()
+            .setValueName("administrativeState")
+            .setOldValue(AdministrativeState.LOCKED.getName())
+            .setNewValue(AdministrativeState.UNLOCKED.getName())
+            .build();
+        ChangedAttributes operStateChange = new ChangedAttributesBuilder()
+            .setValueName("operationalState")
+            .setOldValue(OperationalState.DISABLED.getName())
+            .setNewValue(OperationalState.ENABLED.getName())
+            .build();
+        return new NotificationBuilder()
+            .setNotificationType(NotificationType.ATTRIBUTEVALUECHANGE)
+            .setLayerProtocolName(LayerProtocolName.ETH)
+            .setTargetObjectType(ObjectType.CONNECTIVITYSERVICE)
+            .setEventTimeStamp(datetime)
+            .setUuid(new Uuid(UUID.randomUUID().toString()))
+            .setTargetObjectIdentifier(targetObjectId)
+            .setTargetObjectName(Map.of(objectName.key(), objectName))
+            .setChangedAttributes(Map.of(adminStateChange.key(), adminStateChange,
+                operStateChange.key(), operStateChange))
+            .build();
+    }
+
     public static ServiceAEndBuilder getServiceAEndBuild() {
         return new ServiceAEndBuilder()
                 .setClli("clli")
@@ -91,6 +165,25 @@ public final class NotificationServiceDataUtils {
                 .setRxDirection(getRxDirection());
     }
 
+    public static CreateNotificationSubscriptionServiceInputBuilder buildNotificationSubscriptionServiceInputBuilder() {
+        Name name = new NameBuilder()
+            .setValue("test subscription")
+            .setValueName("Subscription name")
+            .build();
+        SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder()
+            .setRequestedObjectTypes(new HashSet<>(List.of(ObjectType.CONNECTIVITYSERVICE)))
+            .setRequestedNotificationTypes(new HashSet<>(List.of(NotificationType.ALARMEVENT)))
+            .setRequestedLayerProtocols(new HashSet<>(List.of(LayerProtocolName.ETH)))
+            .setRequestedObjectIdentifier(new HashSet<>(List.of(new Uuid(UUID.randomUUID().toString()))))
+            .setIncludeContent(true)
+            .setLocalId("localId")
+            .setName(Map.of(name.key(), name))
+            .build();
+        return new CreateNotificationSubscriptionServiceInputBuilder()
+            .setSubscriptionFilter(subscriptionFilter)
+            .setSubscriptionState(SubscriptionState.ACTIVE);
+    }
+
     private static Map<TxDirectionKey, TxDirection> getTxDirection() {
         return Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
@@ -132,4 +225,71 @@ public final class NotificationServiceDataUtils {
                 .setIndex(Uint8.ZERO)
                 .build());
     }
+
+    public static void createTapiContext(
+            NetworkTransactionService networkTransactionService) throws ExecutionException, InterruptedException {
+        // Augmenting tapi context to include topology and connectivity contexts
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name contextName
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder()
+            .setValue(TAPI_CONTEXT).setValueName("TAPI Context Name").build();
+
+        Context1 connectivityContext =
+            new Context1Builder()
+                .setConnectivityContext(
+                    new ConnectivityContextBuilder()
+                        .setConnection(new HashMap<>())
+                        .setConnectivityService(new HashMap<>())
+                        .build())
+                .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name nwTopoServiceName =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder()
+                .setValue("Network Topo Service")
+                .setValueName("Network Topo Service Name")
+                .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1 topologyContext
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1Builder()
+            .setTopologyContext(new TopologyContextBuilder()
+                .setNwTopologyService(new NwTopologyServiceBuilder()
+                    .setTopology(new HashMap<>())
+                    .setUuid(
+                        new Uuid(
+                            UUID.nameUUIDFromBytes("Network Topo Service".getBytes(Charset.forName("UTF-8")))
+                                .toString()))
+                    .setName(Map.of(nwTopoServiceName.key(), nwTopoServiceName))
+                    .build())
+                .setTopology(new HashMap<>())
+                .build())
+            .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.Context1 notificationContext
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.Context1Builder()
+            .setNotificationContext(new NotificationContextBuilder()
+                .setNotification(new HashMap<>())
+                .setNotifSubscription(new HashMap<>())
+                .build())
+            .build();
+
+        ContextBuilder contextBuilder = new ContextBuilder()
+            .setName(Map.of(contextName.key(), contextName))
+            .setUuid(
+                new Uuid(UUID.nameUUIDFromBytes(TAPI_CONTEXT.getBytes(Charset.forName("UTF-8"))).toString()))
+            .setServiceInterfacePoint(new HashMap<>())
+            .addAugmentation(connectivityContext)
+            .addAugmentation(topologyContext)
+            .addAugmentation(notificationContext);
+
+        // todo: add notification context
+        InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
+        // put in datastore
+        networkTransactionService.put(LogicalDatastoreType.OPERATIONAL, contextIID, contextBuilder.build());
+        networkTransactionService.commit().get();
+    }
+
+    public static GetNotificationListInputBuilder buildGetNotificationListInputBuilder(String subscriptionUuid) {
+        return new GetNotificationListInputBuilder()
+                .setSubscriptionIdOrName(subscriptionUuid)
+                .setTimePeriod("some string");
+    }
 }
diff --git a/nbinotifications/src/test/resources/expected_tapi_event.json b/nbinotifications/src/test/resources/expected_tapi_event.json
new file mode 100755 (executable)
index 0000000..068a5ed
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "nbi-notifications:notification-tapi-service": {
+    "layer-protocol-name": "ETH",
+    "notification-type": "ATTRIBUTE_VALUE_CHANGE",
+    "changed-attributes": [
+      {
+        "value-name": "administrativeState",
+        "old-value": "LOCKED",
+        "new-value": "UNLOCKED"
+      },
+      {
+        "value-name": "operationalState",
+        "old-value": "DISABLED",
+        "new-value": "ENABLED"
+      }
+    ],
+    "target-object-name": [
+      {
+        "value-name": "Connectivity Service Name",
+        "value": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+      }
+    ],
+    "uuid": "6ae49721-7f96-4924-b23b-31e5bee4946b",
+    "target-object-type": "CONNECTIVITY_SERVICE",
+    "event-time-stamp": "2022-04-06T09:06:01+00:00",
+    "target-object-identifier": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+  }
+}
\ No newline at end of file
diff --git a/nbinotifications/src/test/resources/tapi_event.json b/nbinotifications/src/test/resources/tapi_event.json
new file mode 100644 (file)
index 0000000..068a5ed
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "nbi-notifications:notification-tapi-service": {
+    "layer-protocol-name": "ETH",
+    "notification-type": "ATTRIBUTE_VALUE_CHANGE",
+    "changed-attributes": [
+      {
+        "value-name": "administrativeState",
+        "old-value": "LOCKED",
+        "new-value": "UNLOCKED"
+      },
+      {
+        "value-name": "operationalState",
+        "old-value": "DISABLED",
+        "new-value": "ENABLED"
+      }
+    ],
+    "target-object-name": [
+      {
+        "value-name": "Connectivity Service Name",
+        "value": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+      }
+    ],
+    "uuid": "6ae49721-7f96-4924-b23b-31e5bee4946b",
+    "target-object-type": "CONNECTIVITY_SERVICE",
+    "event-time-stamp": "2022-04-06T09:06:01+00:00",
+    "target-object-identifier": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+  }
+}
\ No newline at end of file