IPv6RA : Global prefix listing command support

Change-Id: I3c2cd28feab202273b14532c6ed0403df4e36344
diff --git a/apps/routeradvertisement/BUCK b/apps/routeradvertisement/BUCK
index cb0936c..6eafe8d 100644
--- a/apps/routeradvertisement/BUCK
+++ b/apps/routeradvertisement/BUCK
@@ -1,7 +1,9 @@
 COMPILE_DEPS = [
     '//lib:CORE_DEPS',
     '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api'
+    '//incubator/api:onos-incubator-api',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli'
 ]
 
 osgi_jar (
diff --git a/apps/routeradvertisement/pom.xml b/apps/routeradvertisement/pom.xml
index ecf6c38..2dc1687 100644
--- a/apps/routeradvertisement/pom.xml
+++ b/apps/routeradvertisement/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2015-present Open Networking Foundation
+  ~ Copyright 2017-present Open Networking Foundation
   ~ Originally created by Pengfei Lu, Network and Cloud Computing Laboratory, Dalian University of Technology, China
   ~ Advisers: Keqiu Li and Heng Qi
   ~ This work is supported by the State Key Program of National Natural Science of China(Grant No. 61432002)
@@ -66,6 +66,15 @@
             <artifactId>onlab-misc</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-cli</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
index 1c08c07..5f31bdf 100644
--- a/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
@@ -18,6 +18,7 @@
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Modified;
 import org.apache.felix.scr.annotations.Property;
@@ -87,12 +88,14 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import com.google.common.collect.ImmutableMap;
 
 /**
  * Manages IPv6 Router Advertisements.
  */
+@Service
 @Component(immediate = true)
-public class RouterAdvertisementManager {
+public class RouterAdvertisementManager implements RoutingAdvertisementService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
     private static final String PROP_RA_THREADS_POOL = "raPoolSize";
@@ -160,6 +163,11 @@
     @GuardedBy(value = "this")
     private final Map<DeviceId, List<InterfaceIpAddress>> globalPrefixes = new LinkedHashMap<>();
 
+    @Override
+    public ImmutableMap<DeviceId, List<InterfaceIpAddress>> getGlobalPrefixes() {
+        return ImmutableMap.copyOf(globalPrefixes);
+    }
+
     private Function<Interface, Map.Entry<ConnectPoint, List<InterfaceIpAddress>>> prefixGenerator =
             i -> {
                 Map.Entry<ConnectPoint, List<InterfaceIpAddress>> prefixEntry;
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/RoutingAdvertisementService.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RoutingAdvertisementService.java
new file mode 100644
index 0000000..ad40fc1
--- /dev/null
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RoutingAdvertisementService.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.ra;
+
+import java.util.List;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.host.InterfaceIpAddress;
+
+import com.google.common.collect.ImmutableMap;
+
+public interface RoutingAdvertisementService {
+
+    /**
+     * Returns global prefixes.
+     *
+     * @return global prefixes
+     */
+    ImmutableMap<DeviceId, List<InterfaceIpAddress>> getGlobalPrefixes();
+}
+
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java
new file mode 100644
index 0000000..554db34
--- /dev/null
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.ra.cli;
+
+import java.util.List;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.ra.RoutingAdvertisementService;
+import org.onosproject.cli.AbstractShellCommand;
+
+import org.apache.karaf.shell.commands.Command;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Command to list global-prefixes in Routing Advertisement.
+ */
+@Command(scope = "onos", name = "ra-global-prefixes",
+        description = "List Routing Advertisement global prefixes")
+public class GlobalPrefixesListCommand extends AbstractShellCommand {
+
+    @Override
+    protected void execute() {
+        RoutingAdvertisementService raService =
+                AbstractShellCommand.get(RoutingAdvertisementService.class);
+        printGlobalPrefixes(raService.getGlobalPrefixes());
+    }
+
+    private void printGlobalPrefixes(ImmutableMap<DeviceId, List<InterfaceIpAddress>> globalPrefixes) {
+        globalPrefixes.forEach(((deviceId, interfaceIpAddresses) -> {
+            print("%s", deviceId);
+            interfaceIpAddresses.forEach(interfaceIpAddress -> print("    %s", interfaceIpAddress));
+        }));
+    }
+}
+
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/package-info.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/package-info.java
new file mode 100644
index 0000000..26c7c48
--- /dev/null
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.
+ */
+
+/**
+ * Router Advertisement application CLI handlers.
+ */
+package org.onosproject.ra.cli;
diff --git a/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml
new file mode 100644
index 0000000..4e8b59e
--- /dev/null
+++ b/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -0,0 +1,24 @@
+<!--
+  ~ Copyright 2017-present Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+        <command>
+            <action class="org.onosproject.ra.cli.GlobalPrefixesListCommand"/>
+        </command>
+    </command-bundle>
+</blueprint>
+