Add default route option to kubevirt network

Change-Id: Ia2a2d9b34ec3c493e04d56c544c22812e32d524a
(cherry picked from commit d95d3524caff5449aded4ff9397c3ed717fc91e6)
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
index 73c96f0..2745e46 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
@@ -53,6 +53,7 @@
     private final Integer mtu;
     private final String segmentId;
     private final IpAddress gatewayIp;
+    private final boolean defaultRoute;
     private final String cidr;
     private final Set<KubevirtHostRoute> hostRoutes;
     private final KubevirtIpPool ipPool;
@@ -67,6 +68,7 @@
      * @param mtu               network MTU
      * @param segmentId         segment identifier
      * @param gatewayIp         gateway IP address
+     * @param defaultRoute      default route
      * @param cidr              CIDR of network
      * @param hostRoutes        a set of host routes
      * @param ipPool            IP pool
@@ -74,7 +76,8 @@
      */
     public DefaultKubevirtNetwork(String networkId, Type type, String name,
                                   Integer mtu, String segmentId, IpAddress gatewayIp,
-                                  String cidr, Set<KubevirtHostRoute> hostRoutes,
+                                  boolean defaultRoute, String cidr,
+                                  Set<KubevirtHostRoute> hostRoutes,
                                   KubevirtIpPool ipPool, Set<IpAddress> dnses) {
         this.networkId = networkId;
         this.type = type;
@@ -82,6 +85,7 @@
         this.mtu = mtu;
         this.segmentId = segmentId;
         this.gatewayIp = gatewayIp;
+        this.defaultRoute = defaultRoute;
         this.cidr = cidr;
         this.hostRoutes = hostRoutes;
         this.ipPool = ipPool;
@@ -133,6 +137,11 @@
     }
 
     @Override
+    public boolean defaultRoute() {
+        return defaultRoute;
+    }
+
+    @Override
     public KubevirtIpPool ipPool() {
         return ipPool;
     }
@@ -196,7 +205,7 @@
         DefaultKubevirtNetwork that = (DefaultKubevirtNetwork) o;
         return networkId.equals(that.networkId) && type == that.type &&
                 name.equals(that.name) && mtu.equals(that.mtu) &&
-                gatewayIp.equals(that.gatewayIp) &&
+                gatewayIp.equals(that.gatewayIp) && defaultRoute == that.defaultRoute &&
                 cidr.equals(that.cidr) && hostRoutes.equals(that.hostRoutes) &&
                 ipPool.equals(that.ipPool) &&
                 dnses.equals(that.dnses);
@@ -205,7 +214,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(networkId, type, name, mtu, segmentId, gatewayIp,
-                cidr, hostRoutes, ipPool, dnses);
+                defaultRoute, cidr, hostRoutes, ipPool, dnses);
     }
 
     @Override
@@ -217,6 +226,7 @@
                 .add("mtu", mtu)
                 .add("segmentId", segmentId)
                 .add("gatewayIp", gatewayIp)
+                .add("defaultRoute", defaultRoute)
                 .add("cidr", cidr)
                 .add("hostRouts", hostRoutes)
                 .add("ipPool", ipPool)
@@ -263,6 +273,7 @@
         private Integer mtu;
         private String segmentId;
         private IpAddress gatewayIp;
+        private boolean defaultRoute;
         private String cidr;
         private Set<KubevirtHostRoute> hostRouts;
         private KubevirtIpPool ipPool;
@@ -274,7 +285,6 @@
             checkArgument(type != null, NOT_NULL_MSG, "type");
             checkArgument(name != null, NOT_NULL_MSG, "name");
             checkArgument(mtu != null, NOT_NULL_MSG, "mtu");
-            checkArgument(gatewayIp != null, NOT_NULL_MSG, "gatewayIp");
             checkArgument(cidr != null, NOT_NULL_MSG, "cidr");
             checkArgument(ipPool != null, NOT_NULL_MSG, "ipPool");
 
@@ -287,7 +297,7 @@
             }
 
             return new DefaultKubevirtNetwork(networkId, type, name, mtu, segmentId,
-                    gatewayIp, cidr, hostRouts, ipPool, dnses);
+                    gatewayIp, defaultRoute, cidr, hostRouts, ipPool, dnses);
         }
 
         @Override
@@ -327,6 +337,12 @@
         }
 
         @Override
+        public KubevirtNetwork.Builder defaultRoute(boolean flag) {
+            this.defaultRoute = flag;
+            return this;
+        }
+
+        @Override
         public Builder cidr(String cidr) {
             this.cidr = cidr;
             return this;
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
index 94ed1de..2db552e 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
@@ -114,6 +114,13 @@
     Set<KubevirtHostRoute> hostRoutes();
 
     /**
+     * Returns default route flag.
+     *
+     * @return default route
+     */
+    boolean defaultRoute();
+
+    /**
      * Returns the IP pool.
      *
      * @return IP pool
@@ -220,6 +227,14 @@
         Builder gatewayIp(IpAddress ipAddress);
 
         /**
+         * Returns network builder with supplied default route flag.
+         *
+         * @param flag default route
+         * @return network builder
+         */
+        Builder defaultRoute(boolean flag);
+
+        /**
          * Returns network builder with supplied network CIDR.
          *
          * @param cidr Classless Inter-Domain Routing
diff --git a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetworkTest.java b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetworkTest.java
index 8eefe36..ceec755 100644
--- a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetworkTest.java
+++ b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetworkTest.java
@@ -43,6 +43,8 @@
     private static final String SEGMENT_ID_2 = "2";
     private static final IpAddress GATEWAY_IP_1 = IpAddress.valueOf("10.10.10.1");
     private static final IpAddress GATEWAY_IP_2 = IpAddress.valueOf("20.20.20.1");
+    private static final boolean DEFAULT_ROUTE_1 = true;
+    private static final boolean DEFAULT_ROUTE_2 = false;
     private static final String CIDR_1 = "10.10.10.0/24";
     private static final String CIDR_2 = "20.20.20.0/24";
     private static final IpAddress IP_POOL_START_1 = IpAddress.valueOf("10.10.10.100");
@@ -76,6 +78,7 @@
                 .mtu(MTU_1)
                 .segmentId(SEGMENT_ID_1)
                 .gatewayIp(GATEWAY_IP_1)
+                .defaultRoute(DEFAULT_ROUTE_1)
                 .cidr(CIDR_1)
                 .ipPool(new KubevirtIpPool(IP_POOL_START_1, IP_POOL_END_1))
                 .hostRoutes(ImmutableSet.of())
@@ -89,6 +92,7 @@
                 .mtu(MTU_1)
                 .segmentId(SEGMENT_ID_1)
                 .gatewayIp(GATEWAY_IP_1)
+                .defaultRoute(DEFAULT_ROUTE_1)
                 .cidr(CIDR_1)
                 .ipPool(new KubevirtIpPool(IP_POOL_START_1, IP_POOL_END_1))
                 .hostRoutes(ImmutableSet.of())
@@ -102,6 +106,7 @@
                 .mtu(MTU_2)
                 .segmentId(SEGMENT_ID_2)
                 .gatewayIp(GATEWAY_IP_2)
+                .defaultRoute(DEFAULT_ROUTE_2)
                 .cidr(CIDR_2)
                 .ipPool(new KubevirtIpPool(IP_POOL_START_2, IP_POOL_END_2))
                 .hostRoutes(ImmutableSet.of())
@@ -131,6 +136,7 @@
         assertEquals(NAME_1, network.name());
         assertEquals(MTU_1, network.mtu());
         assertEquals(GATEWAY_IP_1, network.gatewayIp());
+        assertEquals(DEFAULT_ROUTE_1, network.defaultRoute());
         assertEquals(CIDR_1, network.cidr());
         assertEquals(new KubevirtIpPool(IP_POOL_START_1, IP_POOL_END_1), network.ipPool());
         assertEquals(ImmutableSet.of(DNS_1), network.dnses());
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListNetworkCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListNetworkCommand.java
index dfaed15..ded79aa 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListNetworkCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListNetworkCommand.java
@@ -67,7 +67,7 @@
                                 0, CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                         net.type().toString(),
                         net.segmentId() == null ? "N/A" : net.segmentId(),
-                        net.gatewayIp() == null ? "" : net.gatewayIp().toString());
+                        net.gatewayIp() == null ? "N/A" : net.gatewayIp().toString());
             }
         }
     }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java
index f04106e..2d8a07c 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java
@@ -48,6 +48,7 @@
     private static final String MTU = "mtu";
     private static final String SEGMENT_ID = "segmentId";
     private static final String GATEWAY_IP = "gatewayIp";
+    private static final String DEFAULT_ROUTE = "defaultRoute";
     private static final String CIDR = "cidr";
     private static final String HOST_ROUTES = "hostRoutes";
     private static final String IP_POOL = "ipPool";
@@ -65,6 +66,7 @@
                 .put(NAME, network.name())
                 .put(MTU, network.mtu())
                 .put(GATEWAY_IP, network.gatewayIp().toString())
+                .put(DEFAULT_ROUTE, network.defaultRoute())
                 .put(CIDR, network.cidr());
 
         if (network.segmentId() != null) {
@@ -113,6 +115,8 @@
                 MTU + MISSING_MESSAGE);
         String gatewayIp = nullIsIllegal(json.get(GATEWAY_IP).asText(),
                 GATEWAY_IP + MISSING_MESSAGE);
+        boolean defaultRoute = nullIsIllegal(json.get(DEFAULT_ROUTE).asBoolean(),
+                DEFAULT_ROUTE + MISSING_MESSAGE);
         String cidr = nullIsIllegal(json.get(CIDR).asText(),
                 CIDR + MISSING_MESSAGE);
 
@@ -122,6 +126,7 @@
                 .name(name)
                 .mtu(mtu)
                 .gatewayIp(IpAddress.valueOf(gatewayIp))
+                .defaultRoute(defaultRoute)
                 .cidr(cidr);
 
         if (!type.equals(KubevirtNetwork.Type.FLAT.name())) {
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
index 983a5bb..1a2b7d7 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
@@ -411,8 +411,8 @@
             }
 
             // Sets the default router address up.
-            // Performs only if the gateway is set in subnet.
-            if (network.gatewayIp() != null) {
+            // Performs only if the gateway is set and default route is configure to true.
+            if (network.gatewayIp() != null && network.defaultRoute()) {
                 options.add(doRouterAddr(network));
             }
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index d4a90a5..992f2f4 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -649,7 +649,6 @@
             return;
         }
 
-
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/NetworkAttachmentDefinitionWatcher.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/NetworkAttachmentDefinitionWatcher.java
index da66b0e..7d40fee 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/NetworkAttachmentDefinitionWatcher.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/NetworkAttachmentDefinitionWatcher.java
@@ -74,6 +74,7 @@
     private static final String MTU = "mtu";
     private static final String SEGMENT_ID = "segmentId";
     private static final String GATEWAY_IP = "gatewayIp";
+    private static final String DEFAULT_ROUTE = "defaultRoute";
     private static final String CIDR = "cidr";
     private static final String HOST_ROUTES = "hostRoutes";
     private static final String DESTINATION = "destination";
@@ -284,6 +285,7 @@
                     String type = configJson.getString(TYPE);
                     Integer mtu = configJson.getInt(MTU);
                     String gatewayIp = configJson.getString(GATEWAY_IP);
+                    boolean defaultRoute = configJson.getBoolean(DEFAULT_ROUTE);
 
                     if (!type.equalsIgnoreCase(FLAT.name())) {
                         builder.segmentId(configJson.getString(SEGMENT_ID));
@@ -334,7 +336,8 @@
                     }
 
                     builder.networkId(name).name(name).type(Type.valueOf(type))
-                            .mtu(mtu).gatewayIp(IpAddress.valueOf(gatewayIp)).cidr(cidr);
+                            .mtu(mtu).gatewayIp(IpAddress.valueOf(gatewayIp))
+                            .defaultRoute(defaultRoute).cidr(cidr);
 
                     return builder.build();
                 }
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java
index 492847a..667ca4b 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java
@@ -96,6 +96,7 @@
                 .name("net-1")
                 .type(KubevirtNetwork.Type.FLAT)
                 .gatewayIp(IpAddress.valueOf("10.10.10.1"))
+                .defaultRoute(true)
                 .mtu(1500)
                 .cidr("10.10.10.0/24")
                 .hostRoutes(ImmutableSet.of(hostRoute1, hostRoute2))
@@ -121,6 +122,7 @@
         assertThat(network.type().name(), is("FLAT"));
         assertThat(network.cidr(), is("10.10.0.0/24"));
         assertThat(network.gatewayIp().toString(), is("10.10.0.1"));
+        assertThat(network.defaultRoute(), is(true));
         assertThat(network.ipPool().start().toString(), is("10.10.10.100"));
         assertThat(network.ipPool().end().toString(), is("10.10.10.200"));
         assertThat(network.dnses().size(), is(1));
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java
index 4a67e07..7cbc587 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java
@@ -35,6 +35,7 @@
     private static final String MTU = "mtu";
     private static final String SEGMENT_ID = "segmentId";
     private static final String GATEWAY_IP = "gatewayIp";
+    private static final String DEFAULT_ROUTE = "defaultRoute";
     private static final String CIDR = "cidr";
     private static final String HOST_ROUTES = "hostRoutes";
     private static final String IP_POOL = "ipPool";
@@ -86,6 +87,14 @@
             return false;
         }
 
+        // check default route
+        boolean jsonDefaultRoute = jsonNode.get(DEFAULT_ROUTE).asBoolean();
+        boolean defaultRoute = network.defaultRoute();
+        if (jsonDefaultRoute != defaultRoute) {
+            description.appendText("Default route was " + jsonDefaultRoute);
+            return false;
+        }
+
         // check CIDR
         String jsonCidr = jsonNode.get(CIDR).asText();
         String cidr = network.cidr();
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManagerTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManagerTest.java
index 1d0c676..5474433 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManagerTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManagerTest.java
@@ -61,6 +61,7 @@
     private static final Integer MTU = 1500;
     private static final String SEGMENT_ID = "1";
     private static final IpAddress GATEWAY_IP = IpAddress.valueOf("10.10.10.1");
+    private static final boolean DEFAULT_ROUTE = true;
     private static final String CIDR = "10.10.10.0/24";
     private static final IpAddress IP_POOL_START = IpAddress.valueOf("10.10.10.100");
     private static final IpAddress IP_POOL_END = IpAddress.valueOf("10.10.10.200");
@@ -72,6 +73,7 @@
             .mtu(MTU)
             .segmentId(SEGMENT_ID)
             .gatewayIp(GATEWAY_IP)
+            .defaultRoute(DEFAULT_ROUTE)
             .cidr(CIDR)
             .ipPool(new KubevirtIpPool(IP_POOL_START, IP_POOL_END))
             .hostRoutes(ImmutableSet.of())
@@ -84,6 +86,7 @@
             .mtu(MTU)
             .segmentId(SEGMENT_ID)
             .gatewayIp(GATEWAY_IP)
+            .defaultRoute(DEFAULT_ROUTE)
             .cidr(CIDR)
             .ipPool(new KubevirtIpPool(IP_POOL_START, IP_POOL_END))
             .hostRoutes(ImmutableSet.of())
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java
index 8a06018..b453dad 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java
@@ -88,6 +88,7 @@
                 .cidr("10.10.10.0/24")
                 .mtu(1500)
                 .gatewayIp(IpAddress.valueOf("10.10.10.1"))
+                .defaultRoute(true)
                 .ipPool(new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
                         IpAddress.valueOf("10.10.10.200")))
                 .build();
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json
index afef160..293cfcb 100644
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json
+++ b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json
@@ -5,6 +5,7 @@
   "mtu": 1500,
   "cidr": "10.10.0.0/24",
   "gatewayIp": "10.10.0.1",
+  "defaultRoute": true,
   "ipPool": {
     "start": "10.10.10.100",
     "end": "10.10.10.200"
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json
index d8a0a1f..c65236c 100644
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json
+++ b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json
@@ -5,6 +5,7 @@
   "mtu": 1500,
   "cidr": "10.10.10.0/24",
   "gatewayIp": "10.10.10.1",
+  "defaultRoute": true,
   "ipPool": {
     "start": "10.10.10.100",
     "end": "10.10.10.200"