2 * Copyright (c) 2015 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.vpnservice.nexthopmgr;
9 /**********************************************************************************
11 ** ------------------------------------------------
12 ** DP_ID | VPN | IP Address | GroupId |
13 ** ------------------------------------------------
15 ** Listen to DCNs from vpn-inetrfaces
16 ** if a next-hop is added/removed in vpn-interfaces DS
17 ** call add/removeNextHop(interface.dpn, interface.port, vpn_instance.vpnId, AdjacencyIpAddress);
19 ** if a tunnel-interface is added inn interfaces DS --
20 ** call add/removeNextHop(interface.dpn, interface.port, 00, RemoteIpAddress);
21 *************************************************************************************/
22 import java.util.Collections;
26 import java.util.List;
27 import com.google.common.base.Optional;
28 import com.google.common.collect.FluentIterable;
31 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
33 import org.opendaylight.yangtools.concepts.ListenerRegistration;
34 import org.opendaylight.yangtools.yang.binding.DataObject;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
37 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
38 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
39 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
40 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
45 /*import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.NextHopList;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.next.hop.list.L3NextHops;
47 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1;
49 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
50 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150330.L3nexthop;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150330.l3nexthop.VpnNexthops;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
58 public class NexthopManager extends AbstractDataChangeListener<L3nexthop> implements AutoCloseable{
59 private static final Logger LOG = LoggerFactory.getLogger(L3nexthop.class);
60 private ListenerRegistration<DataChangeListener> listenerRegistration;
61 private final DataBroker broker;
63 public NexthopManager(final DataBroker db) {
64 super(L3nexthop.class);
70 public void close() throws Exception {
71 if (listenerRegistration != null) {
73 listenerRegistration.close();
74 } catch (final Exception e) {
75 LOG.error("Error when cleaning up DataChangeListener.", e);
77 listenerRegistration = null;
79 LOG.info("VPN Interface Manager Closed");
83 private void registerListener(final DataBroker db) {
85 listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
86 getWildCardPath(), NexthopManager.this, DataChangeScope.SUBTREE);
87 } catch (final Exception e) {
88 LOG.error("Nexthop Manager DataChange listener registration fail!", e);
89 throw new IllegalStateException("Nexthop Manager registration Listener failed.", e);
93 public void addNextHop(long dpnId, int port, String vpnRD, String IpAddress)
95 String nhKey = new String("nexthop"+vpnRD+IpAddress);
97 int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey);
99 /* if (getNextHop(groupId) == Null){
100 List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
101 List<ActionInfo> listActionInfo = null;//nextHop.getActions({output to port});
102 BucketInfo bucket = new BucketInfo(listActionInfo);
103 listBucketInfo.add(bucket);
104 //GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpId, groupId, IPAddress, GroupTypes.GroupIndirect, listBucketInfo);
105 //getMdsalApiManager().installGroup(groupEntity, objTransaction???);
108 addNextHopToDS(dpId, vpn, ipAddress, groupId);
114 public void removeNextHop(long dpnId, int port, String vpnRD, String IpAddress)
116 String nhKey = new String("nexthop"+vpnRD+IpAddress);
117 int groupId = 1;//getIdManager().getUniqueId(L3Constants.L3NEXTHOP_GROUPID_POOL, nhKey);
119 /* if (getNextHop(groupId) != Null){
120 List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
121 List<ActionInfo> listActionInfo = null;//nextHop.getActions({output to port});
122 BucketInfo bucket = new BucketInfo(listActionInfo);
123 listBucketInfo.add(bucket);
124 //GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpId, groupId, IPAddress, GroupTypes.GroupIndirect, listBucketInfo);
125 //getMdsalApiManager().removeGroup(groupEntity, objTransaction???);
128 removeNextHopFromDS(dpId, vpn, ipAddress);
134 public long getNextHopPointer(long dpnId, int vpnId, String prefixIp, String nxetHopIp)
136 /* String endpointIp = interfaceManager.getLocalEndpointIp(dpnId);
137 if (nextHopIp.equals(endpointIp)) {
138 return getGidFromDS(dpnId, vpnId, prefixIp);
140 return getGidFromDS(dpnId, 00, nextHopIp);
145 private InstanceIdentifier<L3nexthop> getWildCardPath() {
146 return InstanceIdentifier.create(L3nexthop.class);//.child(l3nexthop.vpnNexthops.class);
149 private void addNextHopToDS(long dpId, int vpnId, String ipAddress, long groupId)
154 private long getGidFromDS(String ipaddress)
161 protected void remove(InstanceIdentifier<L3nexthop> identifier,
163 // TODO Auto-generated method stub
168 protected void update(InstanceIdentifier<L3nexthop> identifier,
169 L3nexthop original, L3nexthop update) {
170 // TODO Auto-generated method stub
175 protected void add(InstanceIdentifier<L3nexthop> identifier, L3nexthop add) {
176 // TODO Auto-generated method stub