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