2 * Copyright (c) 2017, 2018 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.genius.interfacemanager.servicebindings.flowbased.listeners;
10 import com.google.common.util.concurrent.ListenableFuture;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.Callable;
16 import javax.annotation.Nonnull;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.genius.datastoreutils.listeners.AbstractSyncDataTreeChangeListener;
23 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.state.factory.FlowBasedServicesStateAddable;
24 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.state.factory.FlowBasedServicesStateRendererFactoryResolver;
25 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.utilities.FlowBasedServicesUtils;
26 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeBase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
35 public class FlowBasedServicesNodeStateListener extends AbstractSyncDataTreeChangeListener<Node> {
37 private static final Logger LOG = LoggerFactory.getLogger(FlowBasedServicesNodeStateListener.class);
39 private final JobCoordinator jobCoordinator;
40 private final FlowBasedServicesStateRendererFactoryResolver flowBasedServicesStateRendererFactoryResolver;
43 public FlowBasedServicesNodeStateListener(final DataBroker dataBroker, final JobCoordinator jobCoordinator,
44 final FlowBasedServicesStateRendererFactoryResolver
45 flowBasedServicesStateRendererFactoryResolver) {
46 super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class));
47 this.jobCoordinator = jobCoordinator;
48 this.flowBasedServicesStateRendererFactoryResolver = flowBasedServicesStateRendererFactoryResolver;
52 public void remove(@Nonnull final Node node) {
57 public void update(@Nonnull final Node originalNode, @Nonnull final Node updatedNode) {
62 public void add(@Nonnull final Node node) {
63 final BigInteger dpId = getDpnID(node);
67 bindServicesOnTunnelType(dpId);
70 private void bindServicesOnTunnelType(final BigInteger dpId) {
71 LOG.debug("Received node add event for {}", dpId);
72 for (final Class<?extends ServiceModeBase> serviceMode : FlowBasedServicesUtils.SERVICE_MODE_MAP.values()) {
73 for (final String interfaceName : FlowBasedServicesUtils.INTERFACE_TYPE_BASED_SERVICE_BINDING_KEYWORDS) {
74 final FlowBasedServicesStateAddable flowBasedServicesStateAddable =
75 flowBasedServicesStateRendererFactoryResolver
76 .getFlowBasedServicesStateRendererFactory(serviceMode).getFlowBasedServicesStateAddRenderer();
77 jobCoordinator.enqueueJob(interfaceName,
78 new RendererStateInterfaceBindWorker(flowBasedServicesStateAddable, dpId,
84 private static class RendererStateInterfaceBindWorker implements Callable<List<ListenableFuture<Void>>> {
85 private final String iface;
86 final BigInteger dpnId;
87 final FlowBasedServicesStateAddable flowBasedServicesStateAddable;
89 RendererStateInterfaceBindWorker(final FlowBasedServicesStateAddable flowBasedServicesStateAddable,
90 final BigInteger dpnId,
92 this.flowBasedServicesStateAddable = flowBasedServicesStateAddable;
98 public List<ListenableFuture<Void>> call() {
99 final List<ListenableFuture<Void>> futures = new ArrayList<>();
100 flowBasedServicesStateAddable.bindServicesOnInterfaceType(futures, dpnId, iface);
105 private BigInteger getDpnID(final Node id) {
106 final String[] node = id.getId().getValue().split(":");
107 if (node.length < 2) {
108 LOG.warn("Unexpected nodeId {}", id.getId().getValue());
111 return new BigInteger(node[1]);