Refine the RPC implementation registration
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / impl / TapiProvider.java
1 /*
2  * Copyright © 2018 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.tapi.impl;
9
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.List;
13 import org.opendaylight.mdsal.binding.api.DataBroker;
14 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
15 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
16 import org.opendaylight.mdsal.binding.api.NotificationService;
17 import org.opendaylight.mdsal.binding.api.RpcProviderService;
18 import org.opendaylight.mdsal.binding.api.RpcService;
19 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
20 import org.opendaylight.transportpce.common.InstanceIdentifiers;
21 import org.opendaylight.transportpce.common.NetworkUtils;
22 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
23 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
24 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
25 import org.opendaylight.transportpce.tapi.impl.rpc.CreateConnectivityServiceImpl;
26 import org.opendaylight.transportpce.tapi.impl.rpc.DeleteConnectivityServiceImpl;
27 import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectionDetailsImpl;
28 import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceDetailsImpl;
29 import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceListImpl;
30 import org.opendaylight.transportpce.tapi.impl.rpc.GetLinkDetailsImpl;
31 import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeDetailsImpl;
32 import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeEdgePointDetailsImpl;
33 import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointDetailsImpl;
34 import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointListImpl;
35 import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyDetailsImpl;
36 import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyListImpl;
37 import org.opendaylight.transportpce.tapi.listeners.TapiNetworkModelNotificationHandler;
38 import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
39 import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
40 import org.opendaylight.transportpce.tapi.listeners.TapiServiceNotificationHandler;
41 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
42 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
43 import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
44 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
45 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
46 import org.opendaylight.transportpce.tapi.utils.TapiContext;
47 import org.opendaylight.transportpce.tapi.utils.TapiInitialORMapping;
48 import org.opendaylight.transportpce.tapi.utils.TapiLink;
49 import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
50 import org.opendaylight.transportpce.tapi.utils.TapiListener;
51 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
52 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.ServiceInterfacePoints;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
60 import org.opendaylight.yangtools.concepts.Registration;
61 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
62 import org.osgi.service.component.annotations.Activate;
63 import org.osgi.service.component.annotations.Component;
64 import org.osgi.service.component.annotations.Deactivate;
65 import org.osgi.service.component.annotations.Reference;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 /**
70  * Class to register TAPI interface Service and Notification.
71  *
72  * @author Gilles Thouenon (gilles.thouenon@orange.com) on behalf of Orange
73  *
74  */
75 @Component
76 public class TapiProvider {
77
78     private static final Logger LOG = LoggerFactory.getLogger(TapiProvider.class);
79
80     private static final InstanceIdentifier<Nodes> MAPPING_II = InstanceIdentifier.create(Network.class)
81         .child(org.opendaylight.yang.gen.v1.http
82             .org.opendaylight.transportpce.portmapping.rev231221.network.Nodes.class);
83     private static final InstanceIdentifier<Link> LINK_II = InstanceIdentifier.create(Networks.class).child(
84         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network.class,
85             new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
86         .child(Link.class);
87     private final DataBroker dataBroker;
88     private final NetworkTransactionService networkTransactionService;
89     private final ServiceDataStoreOperations serviceDataStoreOperations;
90     private List<Registration> listeners;
91     private Registration rpcRegistration;
92     private Registration pcelistenerRegistration;
93     private Registration rendererlistenerRegistration;
94     private Registration servicehandlerlistenerRegistration;
95     private Registration tapinetworkmodellistenerRegistration;
96
97     @Activate
98     public TapiProvider(@Reference DataBroker dataBroker,
99             @Reference RpcProviderService rpcProviderService,
100             @Reference RpcService rpcService,
101             @Reference NotificationService notificationService,
102             @Reference NotificationPublishService notificationPublishService,
103             @Reference NetworkTransactionService networkTransactionService,
104             @Reference ServiceDataStoreOperations serviceDataStoreOperations,
105             @Reference TapiNetworkModelNotificationHandler tapiNetworkModelNotificationHandler,
106             @Reference TapiNetworkModelService tapiNetworkModelServiceImpl) {
107         this.dataBroker = dataBroker;
108         this.networkTransactionService = networkTransactionService;
109         this.serviceDataStoreOperations = serviceDataStoreOperations;
110         LOG.info("TapiProvider Session Initiated");
111         TapiContext tapiContext = new TapiContext(this.networkTransactionService);
112         LOG.info("Empty TAPI context created: {}", tapiContext.getTapiContext());
113         TapiLink tapiLink = new TapiLinkImpl(this.networkTransactionService);
114         TopologyUtils topologyUtils = new TopologyUtils(this.networkTransactionService, this.dataBroker, tapiLink);
115         ConnectivityUtils connectivityUtils = new ConnectivityUtils(this.serviceDataStoreOperations, new HashMap<>(),
116                 tapiContext, this.networkTransactionService);
117         TapiInitialORMapping tapiInitialORMapping = new TapiInitialORMapping(topologyUtils, connectivityUtils,
118                 tapiContext, this.serviceDataStoreOperations);
119         tapiInitialORMapping.performTopoInitialMapping();
120         tapiInitialORMapping.performServInitialMapping();
121         TapiPceNotificationHandler pceListenerImpl = new TapiPceNotificationHandler(dataBroker, connectivityUtils);
122         TapiRendererNotificationHandler rendererListenerImpl = new TapiRendererNotificationHandler(dataBroker,
123                 notificationPublishService);
124
125         rpcRegistration = rpcProviderService.registerRpcImplementations(
126                 new CreateConnectivityServiceImpl(rpcService, tapiContext, connectivityUtils, pceListenerImpl,
127                         rendererListenerImpl),
128                 new GetConnectivityServiceDetailsImpl(tapiContext),
129                 new GetConnectionDetailsImpl(tapiContext),
130                 new DeleteConnectivityServiceImpl(rpcService, tapiContext, networkTransactionService),
131                 new GetConnectivityServiceListImpl(tapiContext),
132                 new GetNodeDetailsImpl(tapiContext),
133                 new GetTopologyDetailsImpl(tapiContext, topologyUtils, tapiLink, networkTransactionService),
134                 new GetNodeEdgePointDetailsImpl(tapiContext),
135                 new GetLinkDetailsImpl(tapiContext),
136                 new GetTopologyListImpl(tapiContext),
137                 new GetServiceInterfacePointDetailsImpl(tapiContext),
138                 new GetServiceInterfacePointListImpl(tapiContext));
139
140         this.listeners = new ArrayList<>();
141         TapiNetconfTopologyListener topologyListener = new TapiNetconfTopologyListener(tapiNetworkModelServiceImpl);
142         TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransactionService);
143         TapiPortMappingListener tapiPortMappingListener = new TapiPortMappingListener(tapiNetworkModelServiceImpl);
144         listeners.add(dataBroker.registerTreeChangeListener(
145                 DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, LINK_II), orLinkListener));
146         listeners.add(dataBroker.registerTreeChangeListener(
147                 DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifiers.NETCONF_TOPOLOGY_II
148                     .child(Node.class)),
149                 topologyListener));
150         listeners.add(dataBroker.registerTreeChangeListener(
151                 DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, MAPPING_II), tapiPortMappingListener));
152         TapiListener tapiListener = new TapiListener();
153         listeners.add(dataBroker.registerTreeChangeListener(
154                 DataTreeIdentifier.of(
155                         LogicalDatastoreType.CONFIGURATION,
156                         InstanceIdentifier.create(ServiceInterfacePoints.class)),
157                 tapiListener));
158         // Notification Listener
159         pcelistenerRegistration = notificationService.registerCompositeListener(pceListenerImpl.getCompositeListener());
160         rendererlistenerRegistration = notificationService
161             .registerCompositeListener(rendererListenerImpl.getCompositeListener());
162         TapiServiceNotificationHandler serviceHandlerListenerImpl = new TapiServiceNotificationHandler(dataBroker);
163         servicehandlerlistenerRegistration = notificationService
164             .registerCompositeListener(serviceHandlerListenerImpl.getCompositeListener());
165         tapinetworkmodellistenerRegistration = notificationService
166             .registerCompositeListener(tapiNetworkModelNotificationHandler.getCompositeListener());
167     }
168
169     /**
170      * Method called when the blueprint container is destroyed.
171      */
172     @Deactivate
173     public void close() {
174         listeners.forEach(lis -> lis.close());
175         listeners.clear();
176         pcelistenerRegistration.close();
177         rendererlistenerRegistration.close();
178         servicehandlerlistenerRegistration.close();
179         tapinetworkmodellistenerRegistration.close();
180         rpcRegistration.close();
181         LOG.info("TapiProvider Session Closed");
182     }
183
184     public Registration getRegisteredRpcs() {
185         return rpcRegistration;
186     }
187
188 }