[ONOS] cherry pick from onos1.6 to master all defects merges

Change-Id: I0ff6595a55b1104cf59a270ac2b10a7f831f6555
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index e50e820..9997659 100644
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -63,8 +63,6 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
 import org.onosproject.incubator.net.resource.label.LabelResourceId;
-import org.onosproject.mastership.MastershipEvent;
-import org.onosproject.mastership.MastershipListener;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.ConnectPoint;
@@ -79,6 +77,8 @@
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceProvider;
 import org.onosproject.net.device.DeviceProviderRegistry;
 import org.onosproject.net.device.DeviceProviderService;
@@ -140,7 +140,7 @@
     private DeviceProviderService deviceProviderService;
     private LinkProviderService linkProviderService;
 
-    private InternalMastershipListener masterListener = new InternalMastershipListener();
+    private DeviceListener deviceListener = new InternalDeviceListener();
     private InternalBgpProvider listener = new InternalBgpProvider();
     private static final String UNKNOWN = "unknown";
     public static final long IDENTIFIER_SET = 0x100000000L;
@@ -169,7 +169,7 @@
         deviceProviderService = deviceProviderRegistry.register(this);
         linkProviderService = linkProviderRegistry.register(this);
         controller.addListener(listener);
-        mastershipService.addListener(masterListener);
+        deviceService.addListener(deviceListener);
         controller.addLinkListener(listener);
     }
 
@@ -182,25 +182,28 @@
         linkProviderService = null;
         controller.removeListener(listener);
         controller.removeLinkListener(listener);
-        mastershipService.removeListener(masterListener);
+        deviceService.removeListener(deviceListener);
     }
 
-    private class InternalMastershipListener implements MastershipListener {
+    private class InternalDeviceListener implements DeviceListener {
         @Override
-        public void event(MastershipEvent event) {
-            if (event.type() == MastershipEvent.Type.MASTER_CHANGED) {
-                if (mastershipService.getMasterFor(event.subject()) != null) {
-                    //Only for L3 device create label pool for that device
-                    Device device = deviceService.getDevice(event.subject());
-                    if (device == null) {
-                        log.debug("Device {} doesn't exist", event.subject());
-                        return;
+        public void event(DeviceEvent event) {
+            Device device = event.subject();
+
+            switch (event.type()) {
+                case DEVICE_ADDED:
+                    if (!mastershipService.isLocalMaster(device.id())) {
+                        break;
                     }
-                    //Reserve device label pool for L3 devices
+
+                    // Reserve device label pool for L3 devices
                     if (device.annotations().value(LSRID) != null) {
-                        createDevicePool(event.subject());
+                        createDevicePool(device.id());
                     }
-                }
+                    break;
+
+                default:
+                    break;
             }
         }
     }
@@ -460,6 +463,10 @@
             }
 
             linkProviderService.linkVanished(linkDes);
+
+            linkDes = new DefaultLinkDescription(linkDes.dst(), linkDes.src(), Link.Type.DIRECT,
+                    false, linkDes.annotations());
+            linkProviderService.linkVanished(linkDes);
         }
     }