Adds a CLI to show/clear cached openstack states with neutron DB

Change-Id: I270c27affc669d10236ce94ec7a546a4f85aea88
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 8837a65..615de0e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -85,11 +85,13 @@
 import org.openstack4j.model.ModelEntity;
 import org.openstack4j.model.common.Identifier;
 import org.openstack4j.model.network.ExternalGateway;
+import org.openstack4j.model.network.IP;
 import org.openstack4j.model.network.NetFloatingIP;
 import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
+import org.openstack4j.model.network.SecurityGroup;
 import org.openstack4j.model.network.Subnet;
 import org.openstack4j.openstack.OSFactory;
 import org.openstack4j.openstack.networking.domain.NeutronRouterInterface;
@@ -118,12 +120,14 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -133,15 +137,22 @@
 import static org.onlab.packet.Ip4Address.valueOf;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
+import static org.onosproject.openstacknetworking.api.Constants.FLOATING_IP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.NETWORK_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_REST_PATH;
 import static org.onosproject.openstacknetworking.api.Constants.PCISLOT;
 import static org.onosproject.openstacknetworking.api.Constants.PCI_VENDOR_INFO;
+import static org.onosproject.openstacknetworking.api.Constants.PORT_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.PORT_NAME_PREFIX_VM;
 import static org.onosproject.openstacknetworking.api.Constants.PORT_NAME_VHOST_USER_PREFIX_VM;
 import static org.onosproject.openstacknetworking.api.Constants.REST_PASSWORD;
 import static org.onosproject.openstacknetworking.api.Constants.REST_PORT;
 import static org.onosproject.openstacknetworking.api.Constants.REST_USER;
 import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_INTF_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SECURITY_GROUP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SUBNET_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.UNSUPPORTED_VENDOR;
 import static org.onosproject.openstacknetworking.api.Constants.portNamePrefixMap;
 import static org.openstack4j.core.transport.ObjectMapperSingleton.getContext;
@@ -184,6 +195,11 @@
     private static final String COMMA = ",";
     private static final String TUN_ID = "tun_id=";
 
+    private static final String DEVICE_OWNER_GW = "network:router_gateway";
+    private static final String DEVICE_OWNER_IFACE = "network:router_interface";
+
+    private static final String NOT_AVAILABLE = "N/A";
+
     private static final long TIMEOUT_MS = 5000;
     private static final long WAIT_OUTPUT_STREAM_SECOND = 2;
     private static final int SSH_PORT = 22;
@@ -483,6 +499,124 @@
     }
 
     /**
+     * Prints openstack security group.
+     *
+     * @param osSg  openstack security group
+     */
+    public static void printSecurityGroup(SecurityGroup osSg) {
+        print(SECURITY_GROUP_FORMAT, osSg.getId(), osSg.getName());
+    }
+
+    /**
+     * Prints openstack network.
+     *
+     * @param osNet openstack network
+     */
+    public static void printNetwork(Network osNet) {
+        final String strNet = String.format(NETWORK_FORMAT,
+                osNet.getId(),
+                osNet.getName(),
+                osNet.getProviderSegID(),
+                osNet.getSubnets());
+        print(strNet);
+    }
+
+    /**
+     * Prints openstack subnet.
+     *
+     * @param osSubnet      openstack subnet
+     * @param osNetService  openstack network service
+     */
+    public static void printSubnet(Subnet osSubnet,
+                                   OpenstackNetworkService osNetService) {
+        final Network network = osNetService.network(osSubnet.getNetworkId());
+        final String netName = network == null ? NOT_AVAILABLE : network.getName();
+        final String strSubnet = String.format(SUBNET_FORMAT,
+                osSubnet.getId(),
+                netName,
+                osSubnet.getCidr());
+        print(strSubnet);
+    }
+
+    /**
+     * Prints openstack port.
+     *
+     * @param osPort        openstack port
+     * @param osNetService  openstack network service
+     */
+    public static void printPort(Port osPort,
+                                 OpenstackNetworkService osNetService) {
+        List<String> fixedIps = osPort.getFixedIps().stream()
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+        final Network network = osNetService.network(osPort.getNetworkId());
+        final String netName = network == null ? NOT_AVAILABLE : network.getName();
+        final String strPort = String.format(PORT_FORMAT,
+                osPort.getId(),
+                netName,
+                osPort.getMacAddress(),
+                fixedIps.isEmpty() ? "" : fixedIps);
+        print(strPort);
+    }
+
+    /**
+     * Prints openstack router.
+     *
+     * @param osRouter      openstack router
+     * @param osNetService  openstack network service
+     */
+    public static void printRouter(Router osRouter,
+                                   OpenstackNetworkService osNetService) {
+        List<String> externals = osNetService.ports().stream()
+                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
+                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_GW))
+                .flatMap(osPort -> osPort.getFixedIps().stream())
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+
+        List<String> internals = osNetService.ports().stream()
+                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
+                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_IFACE))
+                .flatMap(osPort -> osPort.getFixedIps().stream())
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+
+        final String strRouter = String.format(ROUTER_FORMAT,
+                osRouter.getId(),
+                osRouter.getName(),
+                externals.isEmpty() ? "" : externals,
+                internals.isEmpty() ? "" : internals);
+        print(strRouter);
+    }
+
+    /**
+     * Prints openstack router interface.
+     *
+     * @param osRouterIntf  openstack router interface
+     */
+    public static void printRouterIntf(RouterInterface osRouterIntf) {
+        final String strRouterIntf = String.format(ROUTER_INTF_FORMAT,
+                osRouterIntf.getId(),
+                osRouterIntf.getTenantId(),
+                osRouterIntf.getSubnetId());
+        print(strRouterIntf);
+    }
+
+    /**
+     * Prints openstack floating IP.
+     *
+     * @param floatingIp    floating IP
+     */
+    public static void printFloatingIp(NetFloatingIP floatingIp) {
+        final String strFloating = String.format(FLOATING_IP_FORMAT,
+                floatingIp.getId(),
+                floatingIp.getFloatingIpAddress(),
+                Strings.isNullOrEmpty(floatingIp.getFixedIpAddress()) ?
+                        "" : floatingIp.getFixedIpAddress());
+        print(strFloating);
+    }
+
+    /**
      * Obtains the property value with specified property key name.
      *
      * @param properties    a collection of properties
@@ -1443,4 +1577,8 @@
         }
         return gw;
     }
+
+    private static void print(String format, Object... args) {
+        System.out.println(String.format(format, args));
+    }
 }
\ No newline at end of file