Fix: make all openstack resource name optional

Change-Id: I6f4fd34ab691701ea0d6a15eb77428c9e8f4e700
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 cb78448..87b8d50 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,6 +85,7 @@
 import org.openstack4j.core.transport.Config;
 import org.openstack4j.core.transport.ObjectMapperSingleton;
 import org.openstack4j.model.ModelEntity;
+import org.openstack4j.model.common.BasicResource;
 import org.openstack4j.model.common.Identifier;
 import org.openstack4j.model.network.ExternalGateway;
 import org.openstack4j.model.network.IP;
@@ -173,6 +174,9 @@
     private static final String PREFIX_DEVICE_NUMBER = "s";
     private static final String PREFIX_FUNCTION_NUMBER = "f";
 
+    private static final String PARENTHESES_START = "(";
+    private static final String PARENTHESES_END = ")";
+
     // keystone endpoint related variables
     private static final String DOMAIN_DEFAULT = "default";
     private static final String KEYSTONE_V2 = "v2.0";
@@ -526,7 +530,7 @@
      * @param osSg  openstack security group
      */
     public static void printSecurityGroup(SecurityGroup osSg) {
-        print(SECURITY_GROUP_FORMAT, osSg.getId(), osSg.getName());
+        print(SECURITY_GROUP_FORMAT, osSg.getId(), deriveResourceName(osSg));
     }
 
     /**
@@ -537,7 +541,7 @@
     public static void printNetwork(Network osNet) {
         final String strNet = String.format(NETWORK_FORMAT,
                 osNet.getId(),
-                osNet.getName(),
+                deriveResourceName(osNet),
                 osNet.getProviderSegID(),
                 osNet.getSubnets());
         print(strNet);
@@ -552,7 +556,7 @@
     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 netName = network == null ? NOT_AVAILABLE : deriveResourceName(network);
         final String strSubnet = String.format(SUBNET_FORMAT,
                 osSubnet.getId(),
                 netName,
@@ -572,7 +576,7 @@
                 .map(IP::getIpAddress)
                 .collect(Collectors.toList());
         final Network network = osNetService.network(osPort.getNetworkId());
-        final String netName = network == null ? NOT_AVAILABLE : network.getName();
+        final String netName = network == null ? NOT_AVAILABLE : deriveResourceName(network);
         final String strPort = String.format(PORT_FORMAT,
                 osPort.getId(),
                 netName,
@@ -605,7 +609,7 @@
 
         final String strRouter = String.format(ROUTER_FORMAT,
                 osRouter.getId(),
-                osRouter.getName(),
+                deriveResourceName(osRouter),
                 externals.isEmpty() ? "" : externals,
                 internals.isEmpty() ? "" : internals);
         print(strRouter);
@@ -1160,8 +1164,7 @@
         }
         if (osRouter.getExternalGatewayInfo() == null) {
             // this router does not have external connectivity
-            log.trace("router({}) has no external gateway",
-                    osRouter.getName());
+            log.trace("router({}) has no external gateway", deriveResourceName(osRouter));
             return null;
         }
 
@@ -1501,6 +1504,20 @@
         return getDhcpOptionValue(port, "tag:ipxe,67");
     }
 
+    /**
+     * Returns a valid resource name.
+     *
+     * @param resource openstack basic resource object
+     * @return a valid resource name
+     */
+    public static String deriveResourceName(BasicResource resource) {
+        if (Strings.isNullOrEmpty(resource.getName())) {
+            return PARENTHESES_START + resource.getId() + PARENTHESES_END;
+        } else {
+            return resource.getName();
+        }
+    }
+
     private static String getDhcpOptionValue(NeutronPort port, String optionNameStr) {
         ObjectNode node = modelEntityToJson(port, NeutronPort.class);