Remove default flow rules for ROADMs. Fix LinkResource NPE. Single instance provisions optical path.

Change-Id: Iacbd41403ecd0c0df240d09026253c4b761a1d6a
diff --git a/apps/optical/src/main/java/org/onosproject/optical/OpticalPathProvisioner.java b/apps/optical/src/main/java/org/onosproject/optical/OpticalPathProvisioner.java
index 13796f9..d79d191 100644
--- a/apps/optical/src/main/java/org/onosproject/optical/OpticalPathProvisioner.java
+++ b/apps/optical/src/main/java/org/onosproject/optical/OpticalPathProvisioner.java
@@ -20,8 +20,11 @@
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.Link;
@@ -74,6 +77,12 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected HostService hostService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterService clusterService;
+
     private ApplicationId appId;
 
     // TODO use a shared map for distributed operation
@@ -89,11 +98,10 @@
 
     @Activate
     protected void activate() {
-        // TODO elect a leader and have one instance do the provisioning
         intentService.addListener(pathProvisioner);
         appId = coreService.registerApplication("org.onosproject.optical");
         initTport();
-        log.info("Starting optical path provisoning...");
+        log.info("Starting optical path provisioning...");
     }
 
     protected void initTport() {
@@ -178,17 +186,27 @@
             // Low speed LLDP may cause multiple calls which are not expected
 
             if (!IntentState.FAILED.equals(intentService.getIntentState(intent.key()))) {
-                   return;
+                return;
             }
 
+            NodeId localNode = clusterService.getLocalNode().id();
+
             List<Intent> intents = Lists.newArrayList();
             if (intent instanceof HostToHostIntent) {
                 HostToHostIntent hostToHostIntent = (HostToHostIntent) intent;
+
                 Host one = hostService.getHost(hostToHostIntent.one());
                 Host two = hostService.getHost(hostToHostIntent.two());
                 if (one == null || two == null) {
                     return; //FIXME
                 }
+
+                // Ignore if we're not the master for the intent's origin device
+                NodeId sourceMaster = mastershipService.getMasterFor(one.location().deviceId());
+                if (!localNode.equals(sourceMaster)) {
+                    return;
+                }
+
                 // provision both directions
                 intents.addAll(getOpticalPath(one.location(), two.location()));
                 // note: bi-directional intent is set up
@@ -196,6 +214,13 @@
                 //intents.addAll(getOpticalPath(two.location(), one.location()));
             } else if (intent instanceof PointToPointIntent) {
                 PointToPointIntent p2pIntent = (PointToPointIntent) intent;
+
+                // Ignore if we're not the master for the intent's origin device
+                NodeId sourceMaster = mastershipService.getMasterFor(p2pIntent.ingressPoint().deviceId());
+                if (!localNode.equals(sourceMaster)) {
+                    return;
+                }
+
                 intents.addAll(getOpticalPath(p2pIntent.ingressPoint(), p2pIntent.egressPoint()));
             } else {
                 log.info("Unsupported intent type: {}", intent.getClass());
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 18989bb..8908601 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -220,6 +220,11 @@
      * @param request the packet request
      */
     private void pushRule(Device device, PacketRequest request) {
+        // Everything is pre-provisioned on ROADMs
+        if (device.type().equals(Device.Type.ROADM)) {
+            return;
+        }
+
         TrafficTreatment treatment = DefaultTrafficTreatment.builder()
                                                             .punt()
                                                             .build();
diff --git a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java b/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java
index fadb152..61c36d0 100644
--- a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java
@@ -15,17 +15,6 @@
  */
 package org.onosproject.net.resource.impl;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -57,6 +46,17 @@
 import org.onosproject.net.resource.ResourceType;
 import org.slf4j.Logger;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides basic implementation of link resources allocation.
  */
@@ -197,7 +197,10 @@
         Map<Link, Set<ResourceAllocation>> allocations = new HashMap<>();
         for (Link link : req.links()) {
             allocations.put(link, new HashSet<ResourceAllocation>(allocs));
-            allocations.get(link).addAll(allocsPerLink.get(link));
+            Set<ResourceAllocation> linkAllocs = allocsPerLink.get(link);
+            if (linkAllocs != null) {
+                allocations.get(link).addAll(linkAllocs);
+            }
         }
         LinkResourceAllocations result =
                 new DefaultLinkResourceAllocations(req, allocations);
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
index a855d5a..c1b8aa1 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
@@ -90,7 +90,7 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PacketService packetSevice;
+    protected PacketService packetService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MastershipService masterService;
@@ -143,7 +143,7 @@
 
         providerService = providerRegistry.register(this);
         deviceService.addListener(listener);
-        packetSevice.addProcessor(listener, 0);
+        packetService.addProcessor(listener, 0);
         masterService.addListener(roleListener);
 
         LinkDiscovery ld;
@@ -152,7 +152,7 @@
                 log.debug("LinkDiscovery from {} disabled by configuration", device.id());
                 continue;
             }
-            ld = new LinkDiscovery(device, packetSevice, masterService,
+            ld = new LinkDiscovery(device, packetService, masterService,
                               providerService, useBDDP);
             discoverers.put(device.id(), ld);
             for (Port p : deviceService.getPorts(device.id())) {
@@ -186,7 +186,7 @@
         }
         providerRegistry.unregister(this);
         deviceService.removeListener(listener);
-        packetSevice.removeProcessor(listener);
+        packetService.removeProcessor(listener);
         masterService.removeListener(roleListener);
         providerService = null;
 
@@ -237,14 +237,14 @@
     private void requestPackets() {
         TrafficSelector.Builder lldpSelector = DefaultTrafficSelector.builder();
         lldpSelector.matchEthType(Ethernet.TYPE_LLDP);
-        packetSevice.requestPackets(lldpSelector.build(),
-                                    PacketPriority.CONTROL, appId);
+        packetService.requestPackets(lldpSelector.build(),
+                PacketPriority.CONTROL, appId);
 
         if (useBDDP) {
             TrafficSelector.Builder bddpSelector = DefaultTrafficSelector.builder();
             bddpSelector.matchEthType(Ethernet.TYPE_BSN);
-            packetSevice.requestPackets(bddpSelector.build(),
-                                        PacketPriority.CONTROL, appId);
+            packetService.requestPackets(bddpSelector.build(),
+                    PacketPriority.CONTROL, appId);
         }
     }
 
@@ -273,7 +273,7 @@
                     log.debug("Device mastership changed ({}) {}",
                             event.type(), deviceId);
                     discoverers.put(deviceId, new LinkDiscovery(device,
-                            packetSevice, masterService, providerService,
+                            packetService, masterService, providerService,
                             useBDDP));
                 }
             }
@@ -307,8 +307,7 @@
                             log.debug("Device added ({}) {}", event.type(),
                                       deviceId);
                             discoverers.put(deviceId, new LinkDiscovery(device,
-                                                                        packetSevice, masterService, providerService,
-                                                                        useBDDP));
+                                    packetService, masterService, providerService, useBDDP));
                         } else {
                             if (ld.isStopped()) {
                                 log.debug("Device restarted ({}) {}", event.type(),
@@ -412,7 +411,7 @@
                     DeviceId did = dev.id();
                     synchronized (discoverers) {
                         if (!discoverers.containsKey(did)) {
-                            ld = new LinkDiscovery(dev, packetSevice,
+                            ld = new LinkDiscovery(dev, packetService,
                                     masterService, providerService, useBDDP);
                             discoverers.put(did, ld);
                             for (Port p : deviceService.getPorts(did)) {
diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
index f7be862..a601b23 100644
--- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
+++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
@@ -112,7 +112,7 @@
         provider.coreService = coreService;
 
         provider.deviceService = deviceService;
-        provider.packetSevice = packetService;
+        provider.packetService = packetService;
         provider.providerRegistry = linkService;
         provider.masterService = masterService;
 
@@ -204,7 +204,7 @@
         provider.coreService = null;
         provider.providerRegistry = null;
         provider.deviceService = null;
-        provider.packetSevice = null;
+        provider.packetService = null;
     }
 
     private DeviceEvent deviceEvent(DeviceEvent.Type type, DeviceId did) {