Slightly improve add-optical-connectivity usability

Change-Id: I1d1f01c56ae0e75a525d181b400b9d75ce1e575d
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 8dc73c1..7ef2c00 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
@@ -593,11 +593,13 @@
 
             // Avoid inactive links
             if (l.state() == Link.State.INACTIVE) {
+                log.trace("{} is not active", l);
                 return -1.0;
             }
 
             // Avoid cross connect links with used ports
             if (isCrossConnectLink(l) && usedCrossConnectLinkSet.contains(l)) {
+                log.trace("Cross connect {} in use", l);
                 return -1.0;
             }
 
@@ -606,6 +608,7 @@
                 if (hasEnoughBandwidth(l.src()) && hasEnoughBandwidth(l.dst())) {
                     return 1.0;
                 } else {
+                    log.trace("Not enought bandwidth on {}", l);
                     return -1.0;
                 }
             } else {
@@ -639,7 +642,13 @@
                     // Check if enough amount of bandwidth resource remains
                     ContinuousResource resource = Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class)
                             .resource(bandwidth.bps());
-                    return resourceService.isAvailable(resource);
+                    try {
+                        return resourceService.isAvailable(resource);
+                    } catch (Exception e) {
+                        log.error("Resource service failed checking availability of {}",
+                                  resource, e);
+                        throw e;
+                    }
                 }
             }
             return false;
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
index 3df2ff8..8d8c30a 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
@@ -19,8 +19,11 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.ConnectPointCompleter;
 import org.onosproject.newoptical.api.OpticalConnectivityId;
 import org.onosproject.newoptical.api.OpticalPathService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
@@ -29,6 +32,11 @@
         description = "Configure optical domain connectivity")
 public class AddOpticalConnectivityCommand extends AbstractShellCommand {
 
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    // for OSGi import workaround
+    ConnectPointCompleter portCompleter;
+
     @Argument(index = 0, name = "ingress", description = "Ingress connect point",
             required = true, multiValued = false)
     String ingressStr = null;
@@ -41,8 +49,9 @@
             required = false, multiValued = false)
     String bandwidthStr = null;
 
+    // not supported yet
     @Argument(index = 3, name = "latency", description = "Latency",
-            required = true, multiValued = false)
+            required = false, multiValued = false)
     String latencyStr = null;
 
 
@@ -63,10 +72,15 @@
         print("Trying to setup connectivity between %s and %s.", ingress, egress);
         OpticalConnectivityId id = opticalPathService.setupConnectivity(ingress, egress, bandwidth, null);
         if (id == null) {
-            print("Failed.");
+            print("Failed. See ONOS log for more details.");
+            print(" log:set TRACE org.onosproject.newoptical.OpticalPathProvisioner");
             return;
         }
+        // FIXME This is the last chance to know the Optical path ID.
+        //       there's no other way to know existing Optical Path ID
         print("Optical path ID : %s", id.id());
+        log.info("Optical path ID {} for connectivity between %s and %s: {}",
+                 id.id(), ingress, egress);
     }
 
     private ConnectPoint readConnectPoint(String str) {
diff --git a/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 7d7f035..72bdcaa 100644
--- a/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -18,10 +18,18 @@
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
         <command>
             <action class="org.onosproject.newoptical.cli.AddOpticalConnectivityCommand"/>
+            <completers>
+                <ref component-id="connectPointCompleter"/>
+                <ref component-id="connectPointCompleter"/>
+                <null/>
+            </completers>
         </command>
         <command>
             <action class="org.onosproject.newoptical.cli.RemoveOpticalConnectivityCommand"/>
         </command>
     </command-bundle>
 
+    <!-- TODO complete only applicable ports -->
+    <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
+
 </blueprint>