Migrate users of mdsalutil-api/Abstract listener base classes to tools/listeners
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / servicebindings / flowbased / listeners / FlowBasedServicesNodeStateListener.java
1 /*
2  * Copyright (c) 2017, 2018 Ericsson India Global Services Pvt Ltd. 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.genius.interfacemanager.servicebindings.flowbased.listeners;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.concurrent.Callable;
15 import javax.annotation.Nonnull;
16 import javax.inject.Inject;
17 import javax.inject.Singleton;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.state.factory.FlowBasedServicesStateAddable;
21 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.state.factory.FlowBasedServicesStateRendererFactoryResolver;
22 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.utilities.FlowBasedServicesUtils;
23 import org.opendaylight.genius.tools.mdsal.listener.AbstractSyncDataTreeChangeListener;
24 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeBase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 @Singleton
33 public class FlowBasedServicesNodeStateListener extends AbstractSyncDataTreeChangeListener<Node> {
34
35     private static final Logger LOG = LoggerFactory.getLogger(FlowBasedServicesNodeStateListener.class);
36
37     private final JobCoordinator jobCoordinator;
38     private final FlowBasedServicesStateRendererFactoryResolver flowBasedServicesStateRendererFactoryResolver;
39
40     @Inject
41     public FlowBasedServicesNodeStateListener(final DataBroker dataBroker, final JobCoordinator jobCoordinator,
42                                               final FlowBasedServicesStateRendererFactoryResolver
43                                                       flowBasedServicesStateRendererFactoryResolver) {
44         super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class));
45         this.jobCoordinator = jobCoordinator;
46         this.flowBasedServicesStateRendererFactoryResolver = flowBasedServicesStateRendererFactoryResolver;
47     }
48
49     @Override
50     public void remove(@Nonnull InstanceIdentifier<Node> instanceIdentifier, @Nonnull Node node) {
51         // Do nothing
52     }
53
54     @Override
55     public void update(@Nonnull InstanceIdentifier<Node> instanceIdentifier, @Nonnull Node originalNode,
56                        @Nonnull final Node updatedNode) {
57         // Nothing to do
58     }
59
60     @Override
61     public void add(@Nonnull InstanceIdentifier<Node> instanceIdentifier, @Nonnull Node node) {
62         final BigInteger dpId = getDpnID(node);
63         if (dpId == null) {
64             return;
65         }
66         bindServicesOnTunnelType(dpId);
67     }
68
69     private void bindServicesOnTunnelType(final BigInteger dpId) {
70         LOG.debug("Received node add event for {}", dpId);
71         for (final Class<?extends ServiceModeBase> serviceMode : FlowBasedServicesUtils.SERVICE_MODE_MAP.values()) {
72             for (final String interfaceName : FlowBasedServicesUtils.INTERFACE_TYPE_BASED_SERVICE_BINDING_KEYWORDS) {
73                 final FlowBasedServicesStateAddable flowBasedServicesStateAddable =
74                     flowBasedServicesStateRendererFactoryResolver
75                         .getFlowBasedServicesStateRendererFactory(serviceMode).getFlowBasedServicesStateAddRenderer();
76                 jobCoordinator.enqueueJob(interfaceName,
77                                           new RendererStateInterfaceBindWorker(flowBasedServicesStateAddable, dpId,
78                                                                                interfaceName));
79             }
80         }
81     }
82
83     private static class RendererStateInterfaceBindWorker implements Callable<List<ListenableFuture<Void>>> {
84         private final String iface;
85         final BigInteger dpnId;
86         final FlowBasedServicesStateAddable flowBasedServicesStateAddable;
87
88         RendererStateInterfaceBindWorker(final FlowBasedServicesStateAddable flowBasedServicesStateAddable,
89                                          final BigInteger dpnId,
90                                          final String iface) {
91             this.flowBasedServicesStateAddable = flowBasedServicesStateAddable;
92             this.dpnId = dpnId;
93             this.iface = iface;
94         }
95
96         @Override
97         public List<ListenableFuture<Void>> call() {
98             final List<ListenableFuture<Void>> futures = new ArrayList<>();
99             flowBasedServicesStateAddable.bindServicesOnInterfaceType(futures, dpnId, iface);
100             return futures;
101         }
102     }
103
104     private BigInteger getDpnID(final Node id) {
105         final String[] node =  id.getId().getValue().split(":");
106         if (node.length < 2) {
107             LOG.warn("Unexpected nodeId {}", id.getId().getValue());
108             return null;
109         }
110         return new BigInteger(node[1]);
111     }
112 }