T3 Fixes:
        - Incomplete multicast Path computation
        - NPE in case of null port for a device

Change-Id: Id3865ac3ac447b487ab59aff17d5554c5b8ae245
(cherry picked from commit 95da6491db769b90120eb2638c76cca2ac418289)
diff --git a/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java b/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
index ed02d03..cf40de9 100644
--- a/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
+++ b/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
@@ -198,20 +198,22 @@
 
 
         try {
+            ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
             //if the location deviceId is the same, the two hosts are under same subnet and vlan on the interface
             // we are under same leaf so it's L2 Unicast.
             if (areBridged(source, destination)) {
                 selectorBuilder.matchEthDst(destination.mac());
-                ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
                 source.locations().forEach(hostLocation -> {
                     selectorBuilder.matchInPort(hostLocation.port());
                     StaticPacketTrace trace = trace(selectorBuilder.build(), hostLocation);
                     trace.addEndpointHosts(Pair.of(source, destination));
                     traces.add(trace);
                 });
-                return traces.build();
+                //The destination host is not dual homed, if it is the other path might be done through routing.
+                if (destination.locations().size() == 1) {
+                    return traces.build();
+                }
             }
-
             //handle the IPs for src and dst in case of L3
             if (etherType.equals(EtherType.IPV4) || etherType.equals(EtherType.IPV6)) {
 
@@ -242,7 +244,6 @@
                         " router MAC from segment routing config can't perform L3 tracing.");
                 failTrace.setSuccess(false);
             }
-            ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
             source.locations().forEach(hostLocation -> {
                 selectorBuilder.matchInPort(hostLocation.port());
                 StaticPacketTrace trace = trace(selectorBuilder.build(), hostLocation);
@@ -508,11 +509,10 @@
                         " which is enabled and is edge port");
                 trace.setSuccess(true);
                 computePath(completePath, trace, outputPath.getOutput());
-                completePath.clear();
                 if (!hasOtherOutput(in.deviceId(), trace, outputPath.getOutput())) {
                     return trace;
                 }
-            } else if (deviceService.getPort(cp).isEnabled()) {
+            } else if (deviceService.getPort(cp) != null && deviceService.getPort(cp).isEnabled()) {
                 EthTypeCriterion ethTypeCriterion = (EthTypeCriterion) trace.getInitialPacket()
                         .getCriterion(Criterion.Type.ETH_TYPE);
                 //We treat as correct output only if it's not LLDP or BDDP
@@ -556,11 +556,17 @@
                 }
 
             } else {
-                //No links means that the packet gets dropped.
-                log.warn("No links out of {}", cp);
                 computePath(completePath, trace, cp);
-                trace.addResultMessage("No links depart from " + cp + ". Packet is dropped");
                 trace.setSuccess(false);
+                if (deviceService.getPort(cp) == null) {
+                    //Port is not existant on device.
+                    log.warn("Port {} is not available on device.", cp);
+                    trace.addResultMessage("Port " + cp + "is not available on device. Packet is dropped");
+                } else {
+                    //No links means that the packet gets dropped.
+                    log.warn("No links out of {}", cp);
+                    trace.addResultMessage("No links depart from " + cp + ". Packet is dropped");
+                }
             }
         }
         return trace;