Bug fixes for optical use case.

Change-Id: I62bff2ec639957043890bf06b8ba0d9abe0b6b04
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
index 65499f4..8dcbeff 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
@@ -279,6 +279,11 @@
 
         // Search path with available cross connect points
         for (Path path : paths) {
+            // Path service calculates from node to node, we're only interested in port to port
+            if (!path.src().equals(ingress) || !path.dst().equals(egress)) {
+                continue;
+            }
+
             OpticalConnectivityId id = setupPath(path, bandwidth, latency);
             if (id != null) {
                 log.info("Assigned OpticalConnectivityId: {}", id);
@@ -455,7 +460,7 @@
                         .src(src)
                         .dst(dst)
                         .signalType(srcOCPort.signalType())
-                        .bidirectional(true)
+                        .bidirectional(false)
                         .build();
                 intents.add(circuitIntent);
             } else if (srcPort instanceof OchPort && dstPort instanceof OchPort) {
@@ -471,7 +476,7 @@
                         .src(src)
                         .dst(dst)
                         .signalType(srcOchPort.signalType())
-                        .bidirectional(true)
+                        .bidirectional(false)
                         .build();
                 intents.add(opticalIntent);
             } else {
@@ -668,16 +673,14 @@
                 if (hasEnoughBandwidth(l.src()) && hasEnoughBandwidth(l.dst())) {
                     return 1.0;
                 } else {
-                    log.trace("Not enought bandwidth on {}", l);
+                    log.trace("Not enough bandwidth on {}", l);
                     return -1.0;
                 }
             } else {
-                // TODO needs to differentiate optical and packet?
-                if (l.type() == Link.Type.OPTICAL) {
-                    // Transport links
-                    return 1.0;
+                // Use everything except our own indirect links
+                if (l.type() == Link.Type.INDIRECT) {
+                    return -1.0;
                 } else {
-                    // Packet links
                     return 1.0;
                 }
             }
@@ -844,7 +847,8 @@
                                    BasicLinkConfig.class);
                 lnkCfg.isAllowed(true);
                 lnkCfg.isDurable(true);
-                lnkCfg.type(Link.Type.DIRECT);
+                lnkCfg.type(Link.Type.INDIRECT);
+                lnkCfg.isBidirectional(false);
                 lnkCfg.apply();
             } catch (Exception ex) {
                 log.error("Applying BasicLinkConfig failed", ex);
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
index 8b17246..614ab90 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
@@ -123,7 +123,7 @@
 
         for (Link link : intent.path().links()) {
             TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
-            if (!isTransparent(link.src().deviceId())) {
+            if (!isTransparent(current.deviceId())) {
                 treatmentBuilder.add(Instructions.modL0Lambda(intent.lambda()));
             }
             treatmentBuilder.setOutput(link.src().port());
@@ -136,6 +136,7 @@
                     .fromApp(appId)
                     .makePermanent()
                     .build();
+            selectorBuilder = DefaultTrafficSelector.builder();
 
             if (!isNoFlowRule(current.deviceId())) {
                 rules.add(rule);
@@ -143,7 +144,7 @@
 
             current = link.dst();
             selectorBuilder.matchInPort(link.dst().port());
-            if (!isTransparent(link.dst().deviceId())) {
+            if (!isTransparent(current.deviceId())) {
                 selectorBuilder.add(Criteria.matchLambda(intent.lambda()));
                 selectorBuilder.add(Criteria.matchOchSignalType(intent.signalType()));
             }
@@ -184,7 +185,7 @@
 
         for (Link link : Lists.reverse(intent.path().links())) {
             TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
-            if (isTransparent(link.dst().deviceId())) {
+            if (!isTransparent(current.deviceId())) {
                 treatmentBuilder.add(Instructions.modL0Lambda(intent.lambda()));
             }
             treatmentBuilder.setOutput(link.dst().port());
@@ -197,6 +198,7 @@
                     .fromApp(appId)
                     .makePermanent()
                     .build();
+            selectorBuilder = DefaultTrafficSelector.builder();
 
             if (!isNoFlowRule(current.deviceId())) {
                 rules.add(rule);
@@ -204,7 +206,7 @@
 
             current = link.src();
             selectorBuilder.matchInPort(link.src().port());
-            if (isTransparent(link.src().deviceId())) {
+            if (!isTransparent(current.deviceId())) {
                 selectorBuilder.add(Criteria.matchLambda(intent.lambda()));
                 selectorBuilder.add(Criteria.matchOchSignalType(intent.signalType()));
             }
diff --git a/drivers/lumentum/src/main/resources/lumentum-drivers.xml b/drivers/lumentum/src/main/resources/lumentum-drivers.xml
index 230cc34..d8ec9cd 100644
--- a/drivers/lumentum/src/main/resources/lumentum-drivers.xml
+++ b/drivers/lumentum/src/main/resources/lumentum-drivers.xml
@@ -32,6 +32,9 @@
                    impl="org.onosproject.drivers.lumentum.LumentumWaveReadyDiscovery"/>
         <behaviour api="org.onosproject.net.optical.OpticalDevice"
                    impl="org.onosproject.net.optical.DefaultOpticalDevice"/>
+        <behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
+                   impl="org.onosproject.driver.optical.config.ConfigFlowRuleProgrammable"/>
+
     </driver>
 </drivers>