72508df8ffe262e5a695bf23f9a11b484adb2651
[netvirt.git] / natservice / impl / src / main / java / org / opendaylight / netvirt / 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.netvirt.natservice.internal;
9
10 import com.google.common.base.Optional;
11 import javax.annotation.PostConstruct;
12 import javax.inject.Inject;
13 import javax.inject.Singleton;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
17 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
18 import org.opendaylight.genius.mdsalutil.MDSALUtil;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.Routermapping;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingKey;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 @Singleton
32 public class RouterPortsListener
33     extends AsyncDataTreeChangeListenerBase<RouterPorts, RouterPortsListener> {
34
35     private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
36     private final DataBroker dataBroker;
37
38     @Inject
39     public RouterPortsListener(final DataBroker dataBroker) {
40         super(RouterPorts.class, RouterPortsListener.class);
41         this.dataBroker = dataBroker;
42     }
43
44     @Override
45     @PostConstruct
46     public void init() {
47         LOG.info("{} init", getClass().getSimpleName());
48         registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
49     }
50
51     @Override
52     protected InstanceIdentifier<RouterPorts> getWildCardPath() {
53         return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
54     }
55
56     @Override
57     protected RouterPortsListener getDataTreeChangeListener() {
58         return RouterPortsListener.this;
59     }
60
61     @Override
62     protected void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
63         LOG.trace("add : key:{}  value:{}",routerPorts.getKey(), routerPorts);
64         Optional<RouterPorts> optRouterPorts =
65                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
66                         LogicalDatastoreType.OPERATIONAL, identifier);
67         if (optRouterPorts.isPresent()) {
68             RouterPorts ports = optRouterPorts.get();
69             String routerName = ports.getRouterId();
70             MDSALUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
71                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
72                     .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
73         } else {
74             String routerName = routerPorts.getRouterId();
75             MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
76                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
77                     .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
78         }
79         //Check if the router is associated with any BGP VPN and update the association
80         String routerName = routerPorts.getRouterId();
81         Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerName);
82         if (vpnName != null) {
83             InstanceIdentifier<Routermapping> routerMappingId = NatUtil.getRouterVpnMappingId(routerName);
84             Optional<Routermapping> optRouterMapping =
85                     SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
86                             LogicalDatastoreType.OPERATIONAL, routerMappingId);
87             if (!optRouterMapping.isPresent()) {
88                 Long vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
89                 LOG.debug("add : Updating router {} to VPN {} association with Id {}", routerName, vpnName, vpnId);
90                 Routermapping routerMapping = new RoutermappingBuilder().setKey(new RoutermappingKey(routerName))
91                     .setRouterName(routerName).setVpnName(vpnName.getValue()).setVpnId(vpnId).build();
92                 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, routerMappingId, routerMapping);
93             }
94         }
95     }
96
97     @Override
98     protected void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
99         LOG.trace("remove : key:{}  value:{}",routerPorts.getKey(), routerPorts);
100         //MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
101         //Remove the router to vpn association mapping entry if at all present
102         String routerName = routerPorts.getRouterId();
103         Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerName);
104         if (vpnName != null) {
105             MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL,
106                 NatUtil.getRouterVpnMappingId(routerName));
107         }
108     }
109
110     @Override
111     protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
112         LOG.trace("Update : key: {}, original:{}, update:{}",update.getKey(), original, update);
113     }
114 }