e58f86117d7b966a81105602730d4415254c48d3
[vpnservice.git] / natservice / natservice-impl / src / main / java / org / opendaylight / vpnservice / natservice / internal / RouterPortsListener.java
1 /*
2  * Copyright (c) 2016 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.vpnservice.natservice.internal;
9
10 import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
11 import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
14 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.yangtools.concepts.ListenerRegistration;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.FloatingIpInfo;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.floating.ip.info.RouterPorts;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.floating.ip.info.RouterPortsBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.floating.ip.info.RouterPortsKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.floating.ip.info.router.ports.PortsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.floating.ip.info.router.ports.PortsKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.router.to.vpn.mapping.Routermapping;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.router.to.vpn.mapping.RoutermappingBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.natservice.rev160111.router.to.vpn.mapping.RoutermappingKey;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import com.google.common.base.Optional;
32
33 public class RouterPortsListener extends AbstractDataChangeListener<RouterPorts> implements AutoCloseable{
34     private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
35     private ListenerRegistration<DataChangeListener> listenerRegistration;
36     private final DataBroker broker;
37
38
39     public RouterPortsListener (final DataBroker db) {
40         super(RouterPorts.class);
41         broker = db;
42         registerListener(db);
43     }
44
45     @Override
46     public void close() throws Exception {
47         if (listenerRegistration != null) {
48             try {
49                 listenerRegistration.close();
50             } catch (final Exception e) {
51                 LOG.error("Error when cleaning up DataChangeListener.", e);
52             }
53             listenerRegistration = null;
54         }
55         LOG.info("Router ports Listener Closed");
56     }
57
58     private void registerListener(final DataBroker db) {
59         try {
60             listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
61                     getWildCardPath(), RouterPortsListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
62         } catch (final Exception e) {
63             LOG.error("RouterPorts DataChange listener registration fail!", e);
64             throw new IllegalStateException("RouterPorts Listener registration Listener failed.", e);
65         }
66     }
67
68     private InstanceIdentifier<RouterPorts> getWildCardPath() {
69         return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
70     }
71
72
73     @Override
74     protected void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
75         LOG.trace("Add router ports method - key: " + identifier + ", value=" + routerPorts );
76         Optional<RouterPorts> optRouterPorts = NatUtil.read(broker, LogicalDatastoreType.OPERATIONAL, identifier);
77         if(optRouterPorts.isPresent()) {
78             RouterPorts ports = optRouterPorts.get();
79             String routerName = ports.getRouterId();
80             MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, 
81                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
82                     .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
83         } else {
84             String routerName = routerPorts.getRouterId();
85             MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, identifier, 
86                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
87                         .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
88         }
89         //Check if the router is associated with any BGP VPN and update the association
90         String routerName = routerPorts.getRouterId();
91         Uuid vpnName = NatUtil.getVpnForRouter(broker, routerName);
92         if(vpnName != null) {
93             InstanceIdentifier<Routermapping> routerMappingId = NatUtil.getRouterVpnMappingId(routerName);
94             Optional<Routermapping> optRouterMapping = NatUtil.read(broker, LogicalDatastoreType.OPERATIONAL, routerMappingId);
95             if(!optRouterMapping.isPresent()){
96                 Long vpnId = NatUtil.getVpnId(broker, vpnName.getValue());
97                 LOG.debug("Updating router {} to VPN {} association with Id {}", routerName, vpnName, vpnId);
98                 Routermapping routerMapping = new RoutermappingBuilder().setKey(new RoutermappingKey(routerName))
99                                                  .setRouterName(routerName).setVpnName(vpnName.getValue()).setVpnId(vpnId).build();
100                 MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, routerMappingId, routerMapping);
101             }
102         }
103     }
104
105     @Override
106     protected void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
107         LOG.trace("Remove router ports method - key: " + identifier + ", value=" + routerPorts );
108         //MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, identifier);
109         //Remove the router to vpn association mapping entry if at all present
110         MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, NatUtil.getRouterVpnMappingId(routerPorts.getRouterId()));
111     }
112
113     @Override
114     protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
115         LOG.trace("Update router ports method - key: " + identifier + ", original=" + original + ", update=" + update );
116     }
117 }