Rewrote optical connectivity intent compiler

Change-Id: I5acece3c14bed8a23f7bbe0c5a9bc0932a2a0881
diff --git a/core/api/src/main/java/org/onosproject/net/Device.java b/core/api/src/main/java/org/onosproject/net/Device.java
index ddfa6af..e36d762 100644
--- a/core/api/src/main/java/org/onosproject/net/Device.java
+++ b/core/api/src/main/java/org/onosproject/net/Device.java
@@ -26,7 +26,7 @@
      * Coarse classification of the type of the infrastructure device.
      */
     public enum Type {
-        SWITCH, ROUTER, ROADM, OTN, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, OTHER
+        SWITCH, ROUTER, ROADM, OTN, ROADM_OTN, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, OTHER
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/OchPort.java b/core/api/src/main/java/org/onosproject/net/OchPort.java
index 8a7836b..eb956f2 100644
--- a/core/api/src/main/java/org/onosproject/net/OchPort.java
+++ b/core/api/src/main/java/org/onosproject/net/OchPort.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.net;
 
-import org.onlab.util.Frequency;
-
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
@@ -29,9 +27,6 @@
  */
 public class OchPort extends DefaultPort {
 
-    public static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1);
-    public static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5);
-
     private final OduSignalType signalType;
     private final boolean isTunable;
     private final OchSignal lambda;
@@ -43,7 +38,7 @@
      * @param number      port number
      * @param isEnabled   port enabled state
      * @param signalType  ODU signal type
-     * @param isTunable   maximum frequency in MHz
+     * @param isTunable   tunable wavelength capability
      * @param lambda      OCh signal
      * @param annotations optional key/value annotations
      */
diff --git a/core/api/src/main/java/org/onosproject/net/OchSignal.java b/core/api/src/main/java/org/onosproject/net/OchSignal.java
index e629b5e..356950c 100644
--- a/core/api/src/main/java/org/onosproject/net/OchSignal.java
+++ b/core/api/src/main/java/org/onosproject/net/OchSignal.java
@@ -30,11 +30,10 @@
  * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)".
  * </p>
  */
-// TODO: consider which is better, OchSignal or OpticalChannelSignal
 public class OchSignal implements Lambda {
 
-    private static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1);
-    private static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5);
+    public static final Frequency CENTER_FREQUENCY = Frequency.ofTHz(193.1);
+    public static final Frequency FLEX_GRID_SLOT = Frequency.ofGHz(12.5);
 
     private final GridType gridType;
     private final ChannelSpacing channelSpacing;
@@ -57,10 +56,9 @@
               int spacingMultiplier, int slotGranularity) {
         this.gridType = checkNotNull(gridType);
         this.channelSpacing = checkNotNull(channelSpacing);
-        // TODO: check the precondition for spacingMultiplier. Is negative value permitted?
+        // Negative values are permitted for spacingMultiplier
         this.spacingMultiplier = spacingMultiplier;
-
-        checkArgument(slotGranularity > 0, "slotGranularity must be more than 0, but %s", slotGranularity);
+        checkArgument(slotGranularity > 0, "slotGranularity must be larger than 0, received %s", slotGranularity);
         this.slotGranularity = slotGranularity;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java
index 7f3d7f0..c3a7f41 100644
--- a/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java
@@ -40,7 +40,7 @@
      * @param isEnabled   port enabled state
      * @param signalType  ODU signal type
      * @param isTunable   tunable wavelength capability
-     * @param lambda      Och signal
+     * @param lambda      OCh signal
      * @param annotations optional key/value annotations map
      */
     public OchPortDescription(PortNumber number, boolean isEnabled, OduSignalType signalType,
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
index 6b48b00..c2b84ab 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
@@ -24,8 +24,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * An optical layer intent for connectivity from one transponder port to another
- * transponder port. No traffic selector or traffic treatment are needed.
+ * An optical layer intent for connectivity between two OCh ports.
+ * No traffic selector or traffic treatment are needed.
  */
 public final class OpticalConnectivityIntent extends Intent {
     private final ConnectPoint src;
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
index 0013c0d..5e1eacc 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
@@ -15,11 +15,9 @@
  */
 package org.onosproject.net.intent;
 
-import java.util.Collection;
-
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Link;
+import org.onosproject.net.OchSignal;
 import org.onosproject.net.Path;
 
 import com.google.common.base.MoreObjects;
@@ -32,27 +30,27 @@
     private final ConnectPoint src;
     private final ConnectPoint dst;
     private final Path path;
-
+    private final OchSignal lambda;
 
     private OpticalPathIntent(ApplicationId appId,
                               Key key,
                               ConnectPoint src,
                               ConnectPoint dst,
                               Path path,
+                              OchSignal lambda,
                               int priority) {
-        super(appId,
-                key,
-                ImmutableSet.copyOf(path.links()),
-                priority);
+        super(appId, key, ImmutableSet.copyOf(path.links()), priority);
         this.src = checkNotNull(src);
         this.dst = checkNotNull(dst);
         this.path = checkNotNull(path);
+        this.lambda = checkNotNull(lambda);
     }
 
     protected OpticalPathIntent() {
         this.src = null;
         this.dst = null;
         this.path = null;
+        this.lambda = null;
     }
 
     /**
@@ -72,6 +70,7 @@
         private ConnectPoint src;
         private ConnectPoint dst;
         private Path path;
+        private OchSignal lambda;
         Key key;
 
         @Override
@@ -123,6 +122,17 @@
         }
 
         /**
+         * Sets the optical channel (lambda) for the intent that will be built.
+         *
+         * @param lambda the optical channel
+         * @return this builder
+         */
+        public Builder lambda(OchSignal lambda) {
+            this.lambda = lambda;
+            return this;
+        }
+
+        /**
          * Builds an optical path intent from the accumulated parameters.
          *
          * @return optical path intent
@@ -135,6 +145,7 @@
                     src,
                     dst,
                     path,
+                    lambda,
                     priority
             );
         }
@@ -153,6 +164,10 @@
         return path;
     }
 
+    public OchSignal lambda() {
+        return lambda;
+    }
+
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
@@ -163,11 +178,7 @@
                 .add("ingressPort", src)
                 .add("egressPort", dst)
                 .add("path", path)
+                .add("lambda", lambda)
                 .toString();
     }
-
-
-    public Collection<Link> requiredLinks() {
-        return path.links();
-    }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceService.java b/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceService.java
new file mode 100644
index 0000000..10e5911
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceService.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.resource;
+
+import org.onosproject.net.Port;
+import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.IntentId;
+
+import java.util.Set;
+
+/**
+ * Service for providing device resources.
+ */
+public interface DeviceResourceService {
+    /**
+     * Request a set of ports needed to satisfy the intent.
+     *
+     * @param intent the intent
+     * @return set of ports
+     */
+    Set<Port> requestPorts(Intent intent);
+
+    /**
+     * Release ports associated with given intent ID.
+     *
+     * @param intentId intent ID
+     */
+    void releasePorts(IntentId intentId);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceStore.java b/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceStore.java
new file mode 100644
index 0000000..5df661c
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/resource/DeviceResourceStore.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.resource;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.intent.IntentId;
+
+import java.util.Set;
+
+public interface DeviceResourceStore {
+    Set<Port> getFreePorts(DeviceId deviceId);
+
+    void allocatePorts(Set<Port> port, IntentId intent);
+
+    void releasePorts(IntentId intent);
+}