Fix for invalid vpnid in default snat flow 25/73725/5
authorVishal Thapar <vthapar@redhat.com>
Wed, 4 Jul 2018 06:18:09 +0000 (11:48 +0530)
committerSam Hague <shague@redhat.com>
Wed, 4 Jul 2018 23:36:31 +0000 (23:36 +0000)
JIRA: NETVIRT-1358
Change-Id: I3af41be559316c203e49fcfa9bd7fda809fdf59c
Signed-off-by: Vishal Thapar <vthapar@redhat.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java

index 22b9d3419d9263d7bb2ccaa4b8c75700823edf4f..6ebc81eb90b9db04d909c19bc571cb57f267f6f0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Red Hat, Inc. and others. All rights reserved.
+ * Copyright (c) 2017, 2018 Red Hat, Inc. and others. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -10,13 +10,16 @@ package org.opendaylight.netvirt.natservice.ha;
 
 import java.math.BigInteger;
 
+import java.time.Duration;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.netvirt.natservice.internal.NatConstants;
 import org.opendaylight.netvirt.natservice.internal.NatUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
@@ -37,14 +40,17 @@ public class SnatCentralizedSwitchChangeListener
     private final DataBroker dataBroker;
     private final SnatServiceManager snatServiceManger;
     private final NatDataUtil natDataUtil;
+    private final DataTreeEventCallbackRegistrar eventCallbacks;
 
     @Inject
     public SnatCentralizedSwitchChangeListener(final DataBroker dataBroker,
-            final SnatServiceManager snatServiceManger, NatDataUtil natDataUtil) {
+            final SnatServiceManager snatServiceManger, NatDataUtil natDataUtil,
+            final DataTreeEventCallbackRegistrar dataTreeEventCallbackRegistrar) {
         super(RouterToNaptSwitch.class, SnatCentralizedSwitchChangeListener.class);
         this.dataBroker = dataBroker;
         this.snatServiceManger = snatServiceManger;
         this.natDataUtil = natDataUtil;
+        this.eventCallbacks = dataTreeEventCallbackRegistrar;
     }
 
     @Override
@@ -94,10 +100,29 @@ public class SnatCentralizedSwitchChangeListener
     protected void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Adding {}", routerToNaptSwitch);
         BigInteger primarySwitchId = routerToNaptSwitch.getPrimarySwitchId();
-        Routers router = NatUtil.getRoutersFromConfigDS(dataBroker, routerToNaptSwitch.getRouterName());
+        String routerName = routerToNaptSwitch.getRouterName();
+        Routers router = NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
+        long vpnId = NatUtil.getVpnId(dataBroker, routerName);
+        if (vpnId == NatConstants.INVALID_ID) {
+            LOG.warn("VpnId not unavailable for router {} yet", routerName);
+            eventCallbacks.onAddOrUpdate(LogicalDatastoreType.CONFIGURATION,
+                NatUtil.getVpnInstanceToVpnIdIdentifier(routerName), (unused, newVpnId) -> {
+                    handleAdd(routerName, router, primarySwitchId);
+                    return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
+                }, Duration.ofSeconds(5), iid -> {
+                    LOG.error("VpnId not found for router {}", routerName);
+                });
+            return;
+        }
+        handleAdd(routerName, router, primarySwitchId);
+    }
+
+    private void handleAdd(String routerName, Routers router, BigInteger primarySwitchId) {
         if (router != null) {
             natDataUtil.addtoRouterMap(router);
             snatServiceManger.notify(router, primarySwitchId, null, SnatServiceManager.Action.SNAT_ALL_SWITCH_ENBL);
+        } else {
+            LOG.error("Router {} not found for primarySwitch {}", routerName, primarySwitchId);
         }
     }
 
index ab8ecfbfb636fdb93745b6747d25d1c0454592bb..f142b79f729ec090d8fe6acc50d144531dbbc197 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright © 2016, 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -325,7 +325,7 @@ public final class NatUtil {
             .child(InternalToExternalPortMap.class, new InternalToExternalPortMapKey(internalIp)).build();
     }
 
-    static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
+    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
         .instance.to.vpn.id.VpnInstance> getVpnInstanceToVpnIdIdentifier(String vpnName) {
         return InstanceIdentifier.builder(VpnInstanceToVpnId.class)
             .child(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn