Support power config ports retrieval

Change-Id: If0535eb713ca76bffdf43891d28e6357402246ac
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
index 0cda064..d171c17 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
@@ -20,6 +20,8 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.driver.HandlerBehaviour;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -87,4 +89,15 @@
     default Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
         return Optional.empty();
     }
+
+    /**
+     * Get the ports, which support {@code PowerConfig} operations for the specified
+     * {@code component}.
+     *
+     * @param component the port component
+     * @return a set of power config ports
+     */
+    default List<PortNumber> getPorts(T component) {
+        return new ArrayList<PortNumber>();
+    }
 }
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java
index 8a6b89a..f5c3d80 100644
--- a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java
@@ -54,6 +54,7 @@
     public static final String KEY_DATA_PORTCONFIG = String.format("%s.%s.%s", KEY_DATA, KEY_PORTCONFIG, KEY_PORT);
     public static final String KEY_OPM = "opm-power";
     public static final String KEY_OPM_XMLNS = String.format("%s %s", KEY_OPM, KEY_XMLNS);
+    public static final String KEY_DATA_OPM = String.format("%s.%s.%s", KEY_DATA, KEY_OPM, KEY_PORT);
     public static final String KEY_POWER = "power";
     public static final String KEY_DATA_OPM_PORT = String.format("%s.%s.%s", KEY_DATA, KEY_OPM, KEY_PORT);
     public static final String OPTICAL_CAPABILITY_PREFIX
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
index d382b90..eea7533 100644
--- a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
@@ -25,6 +25,8 @@
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.slf4j.Logger;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 import static org.onosproject.drivers.polatis.netconf.PolatisOpticalUtility.POWER_MULTIPLIER;
@@ -70,12 +72,41 @@
         return Optional.ofNullable(getRxPowerRange(port, component));
     }
 
+    @Override
+    public List<PortNumber> getPorts(T component) {
+        if (component instanceof OchSignal) {
+            log.warn("Channel component is not applicable.");
+            return new ArrayList<PortNumber>();
+        }
+        log.debug("Get port config ports...");
+        return acquirePorts();
+    }
+
+    private List<PortNumber> acquirePorts() {
+        String filter = getPortPowerFilter(null);
+        String reply = netconfGet(handler(), filter);
+        List<HierarchicalConfiguration> subtrees = configsAt(reply, KEY_DATA_OPM);
+        List<PortNumber> ports = new ArrayList<PortNumber>();
+        for (HierarchicalConfiguration portConfig : subtrees) {
+            ports.add(PortNumber.portNumber(portConfig.getLong(KEY_PORTID)));
+        }
+        return ports;
+    }
+
+    /**
+     * Get the filter string for the OPM power NETCONF request.
+     *
+     * @param port the port, null to return all the opm ports
+     * @return filter string
+     */
     private String getPortPowerFilter(PortNumber port) {
-        return new StringBuilder(xmlOpen(KEY_OPM_XMLNS))
+        StringBuilder filter = new StringBuilder(xmlOpen(KEY_OPM_XMLNS))
                 .append(xmlOpen(KEY_PORT))
-                .append(xmlOpen(KEY_PORTID))
-                .append(port.toLong())
-                .append(xmlClose(KEY_PORTID))
+                .append(xmlOpen(KEY_PORTID));
+        if (port != null) {
+            filter.append(port.toLong());
+        }
+        return filter.append(xmlClose(KEY_PORTID))
                 .append(xmlClose(KEY_PORT))
                 .append(xmlClose(KEY_OPM))
                 .toString();