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 org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
11 import org.opendaylight.genius.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.netvirt.natservice.rev160111.FloatingIpInfo;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.Routermapping;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingKey;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import com.google.common.base.Optional;
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;
39 public RouterPortsListener (final DataBroker db) {
40 super(RouterPorts.class);
46 public void close() throws Exception {
47 if (listenerRegistration != null) {
49 listenerRegistration.close();
50 } catch (final Exception e) {
51 LOG.error("Error when cleaning up DataChangeListener.", e);
53 listenerRegistration = null;
55 LOG.info("Router ports Listener Closed");
58 private void registerListener(final DataBroker db) {
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);
68 private InstanceIdentifier<RouterPorts> getWildCardPath() {
69 return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
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());
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());
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);
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);
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()));
114 protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
115 LOG.trace("Update router ports method - key: " + identifier + ", original=" + original + ", update=" + update );