Add channel parameter to optical connectivity intent (ONOS-6670)

Change-Id: I3d61e28b82f845db025d21cc65e9240b6ee2b6cc
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
index 939493b..d26cfef 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
@@ -18,13 +18,17 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.onlab.util.Spectrum;
 import org.onosproject.cli.app.AllApplicationNamesCompleter;
 import org.onosproject.cli.net.ConnectPointCompleter;
 import org.onosproject.cli.net.ConnectivityIntentCommand;
+import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.CltSignalType;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.GridType;
+import org.onosproject.net.OchSignal;
 import org.onosproject.net.OduSignalType;
 import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceService;
@@ -72,6 +76,12 @@
             required = false, multiValued = false)
     private boolean bidirectional = false;
 
+    @Option(name = "-c", aliases = "--channel",
+            description = "Optical channel in GHz to use for the intent (e.g., 193.1). " +
+            "Uses 50 GHz spaced DWDM channel plan by default.",
+            required = false, multiValued = false)
+    private Double channel;
+
 
     private ConnectPoint createConnectPoint(String devicePortString) {
         String[] splitted = devicePortString.split("/");
@@ -93,6 +103,16 @@
         return null;
     }
 
+    private OchSignal createOchSignal(Double channel) {
+        if (channel == null) {
+            return null;
+        }
+
+        ChannelSpacing spacing = ChannelSpacing.CHL_50GHZ;
+        int multiplier = (int) (Math.round(channel - Spectrum.CENTER_FREQUENCY.asHz() / spacing.frequency().asHz()));
+        return new OchSignal(GridType.DWDM, spacing, multiplier, 4);
+    }
+
     @Override
     protected void execute() {
         IntentService service = get(IntentService.class);
@@ -155,6 +175,7 @@
                     .dst(egress)
                     .signalType(signalType)
                     .bidirectional(bidirectional)
+                    .ochSignal(createOchSignal(channel))
                     .build();
         } else {
             print("Unable to create optical intent between connect points %s and %s", ingress, egress);