2 * Copyright (c) 2016 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.netvirt.natservice.internal;
10 import com.google.common.base.Optional;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
13 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
16 import org.opendaylight.genius.mdsalutil.MDSALUtil;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsKey;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.Routermapping;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingKey;
25 import org.opendaylight.yangtools.concepts.ListenerRegistration;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 public class RouterPortsListener extends AbstractDataChangeListener<RouterPorts> implements AutoCloseable{
31 private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
32 private ListenerRegistration<DataChangeListener> listenerRegistration;
33 private final DataBroker dataBroker;
35 public RouterPortsListener (final DataBroker dataBroker) {
36 super(RouterPorts.class);
37 this.dataBroker = dataBroker;
41 LOG.info("{} init", getClass().getSimpleName());
42 listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
43 getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
46 private InstanceIdentifier<RouterPorts> getWildCardPath() {
47 return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
51 public void close() throws Exception {
52 if (listenerRegistration != null) {
53 listenerRegistration.close();
54 listenerRegistration = null;
56 LOG.info("{} close", getClass().getSimpleName());
60 protected void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
61 LOG.trace("Add router ports method - key: " + identifier + ", value=" + routerPorts );
62 Optional<RouterPorts> optRouterPorts = NatUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
63 if(optRouterPorts.isPresent()) {
64 RouterPorts ports = optRouterPorts.get();
65 String routerName = ports.getRouterId();
66 MDSALUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
67 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
68 .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
70 String routerName = routerPorts.getRouterId();
71 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
72 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
73 .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
75 //Check if the router is associated with any BGP VPN and update the association
76 String routerName = routerPorts.getRouterId();
77 Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerName);
79 InstanceIdentifier<Routermapping> routerMappingId = NatUtil.getRouterVpnMappingId(routerName);
80 Optional<Routermapping> optRouterMapping = NatUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, routerMappingId);
81 if(!optRouterMapping.isPresent()){
82 Long vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
83 LOG.debug("Updating router {} to VPN {} association with Id {}", routerName, vpnName, vpnId);
84 Routermapping routerMapping = new RoutermappingBuilder().setKey(new RoutermappingKey(routerName))
85 .setRouterName(routerName).setVpnName(vpnName.getValue()).setVpnId(vpnId).build();
86 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, routerMappingId, routerMapping);
92 protected void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
93 LOG.trace("Remove router ports method - key: " + identifier + ", value=" + routerPorts );
94 //MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
95 //Remove the router to vpn association mapping entry if at all present
96 MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, NatUtil.getRouterVpnMappingId(routerPorts.getRouterId()));
100 protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
101 LOG.trace("Update router ports method - key: " + identifier + ", original=" + original + ", update=" + update );