b6b79f7ee6eb640aef526416cb1f20f5289392e9
[transportpce.git] / nbinotifications / src / main / java / org / opendaylight / transportpce / nbinotifications / impl / rpc / CreateNotificationSubscriptionServiceImpl.java
1 /*
2  * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.transportpce.nbinotifications.impl.rpc;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.HashMap;
12 import java.util.Map;
13 import java.util.UUID;
14 import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
15 import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
16 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
17 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionService;
18 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceInput;
19 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceOutput;
20 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceOutputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
22 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContextBuilder;
23 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.output.SubscriptionService;
24 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.output.SubscriptionServiceBuilder;
25 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscription;
26 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionKey;
28 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.Notification;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotificationKey;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilter;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilterBuilder;
32 import org.opendaylight.yangtools.yang.common.ErrorType;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
34 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39 public class CreateNotificationSubscriptionServiceImpl implements CreateNotificationSubscriptionService {
40     private static final Logger LOG = LoggerFactory.getLogger(CreateNotificationSubscriptionServiceImpl.class);
41
42     private NbiNotificationsProvider nbiNotifications;
43     private final TopicManager topicManager;
44
45     public CreateNotificationSubscriptionServiceImpl(NbiNotificationsProvider nbiNotifications,
46             TopicManager topicManager) {
47         this.nbiNotifications = nbiNotifications;
48         this.topicManager = topicManager;
49     }
50
51     @Override
52     public ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> invoke(
53             CreateNotificationSubscriptionServiceInput input) {
54         for (Uuid uuid : input.getSubscriptionFilter().getRequestedObjectIdentifier()) {
55             LOG.info("Adding T-API topic: {} to Kafka server", uuid.getValue());
56             this.topicManager.addTapiTopic(uuid.getValue());
57         }
58         Uuid notifSubscriptionUuid = new Uuid(UUID.randomUUID().toString());
59         SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder()
60             .setName(input.getSubscriptionFilter().getName())
61             .setLocalId(input.getSubscriptionFilter().getLocalId())
62             .setIncludeContent(input.getSubscriptionFilter().getIncludeContent())
63             .setRequestedNotificationTypes(input.getSubscriptionFilter().getRequestedNotificationTypes())
64             .setRequestedLayerProtocols(input.getSubscriptionFilter().getRequestedLayerProtocols())
65             .setRequestedObjectIdentifier(input.getSubscriptionFilter().getRequestedObjectIdentifier())
66             .setRequestedObjectTypes(input.getSubscriptionFilter().getRequestedObjectTypes())
67             .build();
68         SubscriptionService subscriptionService = new SubscriptionServiceBuilder()
69             .setUuid(notifSubscriptionUuid)
70             .setSubscriptionFilter(new HashMap<>(Map.of(subscriptionFilter.key(), subscriptionFilter)))
71             .setSubscriptionState(input.getSubscriptionState())
72             .build();
73         Map<NotifSubscriptionKey, NotifSubscription> notifSubscriptions = new HashMap<>(Map.of(
74             new NotifSubscriptionKey(notifSubscriptionUuid),
75             new NotifSubscriptionBuilder()
76                 .setSubscriptionState(subscriptionService.getSubscriptionState())
77                 .setSubscriptionFilter(subscriptionService.getSubscriptionFilter())
78                 .setUuid(notifSubscriptionUuid)
79 //            Following 2 items are no more in notification-context with T-API 2.4
80 //              .setSupportedNotificationTypes(notificationTypes)
81 //              .setSupportedObjectTypes(objectTypes)
82                 .setName(subscriptionService.getName())
83                 .build()));
84         Map<NotificationKey, Notification> notifications;
85         NotificationContext notificationContext = nbiNotifications.getNotificationContext();
86         if (notificationContext == null) {
87             notifications = new HashMap<>();
88         } else {
89             notifications = notificationContext.getNotification();
90             var subsc = notificationContext.getNotifSubscription();
91             if (subsc != null) {
92                 notifSubscriptions.putAll(subsc);
93             }
94         }
95         if (nbiNotifications.updateNotificationContext(
96                 new NotificationContextBuilder()
97                     .setNotification(notifications)
98                     .setNotifSubscription(notifSubscriptions)
99                     .build())) {
100             return RpcResultBuilder
101                 .success(
102                     new CreateNotificationSubscriptionServiceOutputBuilder()
103                         .setSubscriptionService(subscriptionService)
104                         .build())
105                 .buildFuture();
106         }
107         LOG.error("Failed to update Notification context");
108         return RpcResultBuilder.<CreateNotificationSubscriptionServiceOutput>failed()
109             .withError(ErrorType.RPC, "Failed to update notification context")
110             .buildFuture();
111     }
112 }