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 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;
32 public class RouterPortsListener
33 extends AsyncDataTreeChangeListenerBase<RouterPorts, RouterPortsListener> {
35 private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
36 private final DataBroker dataBroker;
39 public RouterPortsListener(final DataBroker dataBroker) {
40 super(RouterPorts.class, RouterPortsListener.class);
41 this.dataBroker = dataBroker;
47 LOG.info("{} init", getClass().getSimpleName());
48 registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
52 protected InstanceIdentifier<RouterPorts> getWildCardPath() {
53 return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
57 protected RouterPortsListener getDataTreeChangeListener() {
58 return RouterPortsListener.this;
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());
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());
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);
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));
111 protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
112 LOG.trace("Update : key: {}, original:{}, update:{}",update.getKey(), original, update);