Use ID to preserve the uniqueness for kubevirt router and lb

Change-Id: I0893f8dcfb713115cee9df5a78fc8823e198a17c
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancer.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancer.java
index bf4a21d..f186c53 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancer.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancer.java
@@ -31,6 +31,7 @@
 
     private static final String NOT_NULL_MSG = "Loadbalancer % cannot be null";
 
+    private final String id;
     private final String name;
     private final String description;
     private final String networkId;
@@ -41,6 +42,7 @@
     /**
      * Default constructor.
      *
+     * @param id                load balancer id
      * @param name              load balancer name
      * @param description       load balancer description
      * @param networkId         load balancer network identifier
@@ -48,9 +50,11 @@
      * @param members           load balancer members
      * @param rules             load balancer rules
      */
-    public DefaultKubevirtLoadBalancer(String name, String description, String networkId,
-                                       IpAddress vip, Set<IpAddress> members,
+    public DefaultKubevirtLoadBalancer(String id, String name, String description,
+                                       String networkId, IpAddress vip,
+                                       Set<IpAddress> members,
                                        Set<KubevirtLoadBalancerRule> rules) {
+        this.id = id;
         this.name = name;
         this.description = description;
         this.networkId = networkId;
@@ -60,6 +64,11 @@
     }
 
     @Override
+    public String id() {
+        return id;
+    }
+
+    @Override
     public String name() {
         return name;
     }
@@ -106,19 +115,21 @@
             return false;
         }
         DefaultKubevirtLoadBalancer that = (DefaultKubevirtLoadBalancer) o;
-        return name.equals(that.name) && Objects.equals(description, that.description) &&
+        return id.equals(that.id) && name.equals(that.name) &&
+                Objects.equals(description, that.description) &&
                 networkId.equals(that.networkId) && vip.equals(that.vip) &&
                 Objects.equals(members, that.members) && Objects.equals(rules, that.rules);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(name, description, networkId, vip, members, rules);
+        return Objects.hash(id, name, description, networkId, vip, members, rules);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+                .add("id", id)
                 .add("name", name)
                 .add("description", description)
                 .add("networkId", networkId)
@@ -134,6 +145,7 @@
 
     public static final class Builder implements KubevirtLoadBalancer.Builder {
 
+        private String id;
         private String name;
         private String description;
         private String networkId;
@@ -147,11 +159,18 @@
 
         @Override
         public KubevirtLoadBalancer build() {
+            checkArgument(id != null, NOT_NULL_MSG, "id");
             checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
             checkArgument(name != null, NOT_NULL_MSG, "name");
             checkArgument(vip != null, NOT_NULL_MSG, "vip");
 
-            return new DefaultKubevirtLoadBalancer(name, description, networkId, vip, members, rules);
+            return new DefaultKubevirtLoadBalancer(id, name, description, networkId, vip, members, rules);
+        }
+
+        @Override
+        public Builder id(String id) {
+            this.id = id;
+            return this;
         }
 
         @Override
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
index 43c9c88..80948db 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
@@ -35,6 +35,7 @@
 
     private static final String NOT_NULL_MSG = "Router % cannot be null";
 
+    private final String id;
     private final String name;
     private final String description;
     private final boolean enableSnat;
@@ -47,6 +48,7 @@
     /**
      * A default constructor.
      *
+     * @param id            router id
      * @param name          router name
      * @param description   router description
      * @param enableSnat    snat use indicator
@@ -56,12 +58,13 @@
      * @param peerRouter    external peer router
      * @param gateway       elected gateway node id
      */
-    public DefaultKubevirtRouter(String name, String description,
+    public DefaultKubevirtRouter(String id, String name, String description,
                                  boolean enableSnat, MacAddress mac,
                                  Set<String> internal,
                                  Map<String, String> external,
                                  KubevirtPeerRouter peerRouter,
                                  String gateway) {
+        this.id = id;
         this.name = name;
         this.description = description;
         this.enableSnat = enableSnat;
@@ -73,6 +76,11 @@
     }
 
     @Override
+    public String id() {
+        return id;
+    }
+
+    @Override
     public String name() {
         return name;
     }
@@ -123,6 +131,7 @@
     @Override
     public KubevirtRouter updatePeerRouter(KubevirtPeerRouter updated) {
         return DefaultKubevirtRouter.builder()
+                .id(id)
                 .name(name)
                 .enableSnat(enableSnat)
                 .description(description)
@@ -137,6 +146,7 @@
     @Override
     public KubevirtRouter updatedElectedGateway(String updated) {
         return DefaultKubevirtRouter.builder()
+                .id(id)
                 .name(name)
                 .enableSnat(enableSnat)
                 .description(description)
@@ -157,7 +167,7 @@
             return false;
         }
         DefaultKubevirtRouter that = (DefaultKubevirtRouter) o;
-        return enableSnat == that.enableSnat && name.equals(that.name) &&
+        return id.equals(that.id) && enableSnat == that.enableSnat && name.equals(that.name) &&
                 description.equals(that.description) && mac.equals(that.mac) &&
                 internal.equals(that.internal) && external.equals(that.external) &&
                 peerRouter.equals(that.peerRouter) && gateway.equals(that.electedGateway());
@@ -165,12 +175,13 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(name, description, mac);
+        return Objects.hash(id, name, description, mac);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+                .add("id", id)
                 .add("name", name)
                 .add("description", description)
                 .add("enableSnat", enableSnat)
@@ -193,6 +204,7 @@
 
     public static final class Builder implements KubevirtRouter.Builder {
 
+        private String id;
         private String name;
         private String description;
         private boolean enableSnat;
@@ -204,10 +216,17 @@
 
         @Override
         public KubevirtRouter build() {
+            checkArgument(id != null, NOT_NULL_MSG, "id");
             checkArgument(name != null, NOT_NULL_MSG, "name");
 
-            return new DefaultKubevirtRouter(name, description, enableSnat, mac,
-                    internal, external, peerRouter, gateway);
+            return new DefaultKubevirtRouter(id, name, description, enableSnat,
+                    mac, internal, external, peerRouter, gateway);
+        }
+
+        @Override
+        public Builder id(String id) {
+            this.id = id;
+            return this;
         }
 
         @Override
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtLoadBalancer.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtLoadBalancer.java
index 7547547..382b9f6 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtLoadBalancer.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtLoadBalancer.java
@@ -25,6 +25,13 @@
 public interface KubevirtLoadBalancer {
 
     /**
+     * Returns the load balancer id.
+     *
+     * @return load balancer id
+     */
+    String id();
+
+    /**
      * Returns the load balancer name.
      *
      * @return load balancer name
@@ -78,6 +85,14 @@
         KubevirtLoadBalancer build();
 
         /**
+         * Returns kubevirt load balancer builder with supplied load balancer id.
+         *
+         * @param id load balancer id
+         * @return load balancer builder
+         */
+        Builder id(String id);
+
+        /**
          * Returns kubevirt load balancer builder with supplied load balancer name.
          *
          * @param name load balancer name
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouter.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouter.java
index db62c77..f129fe1 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouter.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouter.java
@@ -26,6 +26,13 @@
 public interface KubevirtRouter {
 
     /**
+     * Return the router id.
+     *
+     * @return router id
+     */
+    String id();
+
+    /**
      * Returns the router name.
      *
      * @return router name
@@ -109,6 +116,14 @@
         KubevirtRouter build();
 
         /**
+         * Returns kubevirt router builder with supplied router id.
+         *
+         * @param id router id
+         * @return router builder
+         */
+        Builder id(String id);
+
+        /**
          * Returns kubevirt router builder with supplied router name.
          *
          * @param name router name
diff --git a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancerTest.java b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancerTest.java
index e9ec471..691cf5f 100644
--- a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancerTest.java
+++ b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtLoadBalancerTest.java
@@ -31,6 +31,8 @@
  */
 public class DefaultKubevirtLoadBalancerTest {
 
+    private static final String ID_1 = "26fcc876-f39a-459f-801d-75dcd3654ab8";
+    private static final String ID_2 = "1c14194b-04ca-4c79-b0c7-2d8bb964133f";
     private static final String NAME_1 = "lb-1";
     private static final String NAME_2 = "lb-2";
     private static final String DESCRIPTION_1 = "dummy lb 1";
@@ -84,6 +86,7 @@
     @Before
     public void setUp() {
         lb1 = DefaultKubevirtLoadBalancer.builder()
+                .id(ID_1)
                 .name(NAME_1)
                 .description(DESCRIPTION_1)
                 .networkId(NETWORK_ID_1)
@@ -93,6 +96,7 @@
                 .build();
 
         sameAsLb1 = DefaultKubevirtLoadBalancer.builder()
+                .id(ID_1)
                 .name(NAME_1)
                 .description(DESCRIPTION_1)
                 .networkId(NETWORK_ID_1)
@@ -102,6 +106,7 @@
                 .build();
 
         lb2 = DefaultKubevirtLoadBalancer.builder()
+                .id(ID_2)
                 .name(NAME_2)
                 .description(DESCRIPTION_2)
                 .networkId(NETWORK_ID_2)
@@ -128,6 +133,7 @@
     public void testConstruction() {
         KubevirtLoadBalancer lb = lb1;
 
+        assertEquals(ID_1, lb.id());
         assertEquals(NAME_1, lb.name());
         assertEquals(DESCRIPTION_1, lb.description());
         assertEquals(NETWORK_ID_1, lb.networkId());
diff --git a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java
index 644b839..30c2341 100644
--- a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java
+++ b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouterTest.java
@@ -33,6 +33,8 @@
  */
 public class DefaultKubevirtRouterTest {
 
+    private static final String ID_1 = "26fcc876-f39a-459f-801d-75dcd3654ab8";
+    private static final String ID_2 = "1c14194b-04ca-4c79-b0c7-2d8bb964133f";
     private static final String NAME_1 = "router-1";
     private static final String NAME_2 = "router-2";
     private static final String DESCRIPTION_1 = "dummy router 1";
@@ -73,6 +75,7 @@
     @Before
     public void setUp() {
         router1 = DefaultKubevirtRouter.builder()
+                .id(ID_1)
                 .name(NAME_1)
                 .description(DESCRIPTION_1)
                 .enableSnat(ENABLE_SNAT_1)
@@ -83,6 +86,7 @@
                 .electedGateway(GATEWAY_HOST_1)
                 .build();
         sameAsRouter1 = DefaultKubevirtRouter.builder()
+                .id(ID_1)
                 .name(NAME_1)
                 .description(DESCRIPTION_1)
                 .enableSnat(ENABLE_SNAT_1)
@@ -93,6 +97,7 @@
                 .electedGateway(GATEWAY_HOST_1)
                 .build();
         router2 = DefaultKubevirtRouter.builder()
+                .id(ID_2)
                 .name(NAME_2)
                 .description(DESCRIPTION_2)
                 .enableSnat(ENABLE_SNAT_2)
@@ -121,6 +126,7 @@
     public void testConstruction() {
         KubevirtRouter router = router1;
 
+        assertEquals(ID_1, router.id());
         assertEquals(NAME_1, router.name());
         assertEquals(DESCRIPTION_1, router.description());
         assertEquals(ENABLE_SNAT_1, router.enableSnat());
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListLoadBalancerCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListLoadBalancerCommand.java
index 94bf069..f35c093 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListLoadBalancerCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListLoadBalancerCommand.java
@@ -29,6 +29,7 @@
 import java.util.Comparator;
 import java.util.List;
 
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_ID_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESSES_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESS_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MARGIN_LENGTH;
@@ -49,16 +50,18 @@
         List<KubevirtLoadBalancer> lbs = Lists.newArrayList(service.loadBalancers());
         lbs.sort(Comparator.comparing(KubevirtLoadBalancer::name));
 
-        String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH, CLI_NAME_LENGTH,
+        String format = genFormatString(ImmutableList.of(CLI_ID_LENGTH, CLI_NAME_LENGTH, CLI_NAME_LENGTH,
                 CLI_IP_ADDRESS_LENGTH, CLI_IP_ADDRESSES_LENGTH));
 
         if (outputJson()) {
             print("%s", json(lbs));
         } else {
-            print(format, "Name", "NetworkId", "Virtual IP", "Members");
+            print(format, "ID", "Name", "NetworkId", "Virtual IP", "Members");
 
             for (KubevirtLoadBalancer lb : lbs) {
                 print(format,
+                        StringUtils.substring(lb.id(),
+                                0, CLI_ID_LENGTH - CLI_MARGIN_LENGTH),
                         StringUtils.substring(lb.name(),
                                 0, CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                         StringUtils.substring(lb.networkId(),
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListRouterCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListRouterCommand.java
index dd08419..4081dbb 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListRouterCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListRouterCommand.java
@@ -31,6 +31,7 @@
 import java.util.Set;
 
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_FLAG_LENGTH;
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_ID_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESSES_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESS_LENGTH;
 import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MARGIN_LENGTH;
@@ -52,13 +53,13 @@
         List<KubevirtRouter> routers = Lists.newArrayList(service.routers());
         routers.sort(Comparator.comparing(KubevirtRouter::name));
 
-        String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH,
+        String format = genFormatString(ImmutableList.of(CLI_ID_LENGTH, CLI_NAME_LENGTH,
                 CLI_FLAG_LENGTH, CLI_IP_ADDRESSES_LENGTH, CLI_IP_ADDRESS_LENGTH, CLI_NAME_LENGTH));
 
         if (outputJson()) {
             print("%s", json(routers));
         } else {
-            print(format, "Name", "SNAT", "Internal", "External", "GatewayNode");
+            print(format, "ID", "Name", "SNAT", "Internal", "External", "GatewayNode");
 
             for (KubevirtRouter router : routers) {
                 Set<String> internalNetworks = router.internal();
@@ -69,7 +70,9 @@
                 String external = externalNetwork == null ? "[]" : externalNetwork;
                 String gwNode = router.electedGateway() == null ? "N/A" : router.electedGateway();
 
-                print(format, StringUtils.substring(router.name(), 0,
+                print(format, StringUtils.substring(router.id(), 0,
+                                CLI_ID_LENGTH - CLI_MARGIN_LENGTH),
+                        StringUtils.substring(router.name(), 0,
                         CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                         StringUtils.substring(String.valueOf(router.enableSnat()), 0,
                                 CLI_FLAG_LENGTH - CLI_MARGIN_LENGTH),
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtSyncStateCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtSyncStateCommand.java
index 5c51008..46ee569 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtSyncStateCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtSyncStateCommand.java
@@ -162,7 +162,7 @@
         KubevirtRouterAdminService routerService = get(KubevirtRouterAdminService.class);
         Set<KubevirtRouter> existingRouters = routerService.routers();
         Set<String> existingRouterNames = existingRouters.stream()
-                .map(KubevirtRouter::name).collect(Collectors.toSet());
+                .map(KubevirtRouter::id).collect(Collectors.toSet());
         Map<String, Object> refRouters = client.customResource(routerCrdCxt).list();
         ObjectMapper mapper = new ObjectMapper();
 
@@ -174,9 +174,9 @@
             for (JsonValue item : items) {
                 KubevirtRouter router = parseKubevirtRouter(routerService, item.toString());
                 if (router != null) {
-                    if (existingRouterNames.contains(router.name())) {
+                    if (existingRouterNames.contains(router.id())) {
 
-                        KubevirtPeerRouter oldPeerRouter = routerService.router(router.name()).peerRouter();
+                        KubevirtPeerRouter oldPeerRouter = routerService.router(router.id()).peerRouter();
                         if (oldPeerRouter != null
                                 && Objects.equals(oldPeerRouter.ipAddress(), router.peerRouter().ipAddress())
                                 && oldPeerRouter.macAddress() != null
@@ -233,7 +233,7 @@
         KubevirtSecurityGroupAdminService sgService = get(KubevirtSecurityGroupAdminService.class);
         Set<KubevirtSecurityGroup> existingSgs = sgService.securityGroups();
         Set<String> existingSgNames = existingSgs.stream()
-                .map(KubevirtSecurityGroup::name).collect(Collectors.toSet());
+                .map(KubevirtSecurityGroup::id).collect(Collectors.toSet());
         Map<String, Object> refSgs = client.customResource(securityGroupCrdCxt).list();
         ObjectMapper mapper = new ObjectMapper();
 
@@ -244,7 +244,7 @@
             for (JsonValue item : items) {
                 KubevirtSecurityGroup sg = parseSecurityGroup(item.toString());
                 if (sg != null) {
-                    if (existingSgNames.contains(sg.name())) {
+                    if (existingSgNames.contains(sg.id())) {
                         KubevirtSecurityGroup orig = sgService.securityGroup(sg.id());
 
                         if (orig != null) {
@@ -299,7 +299,7 @@
         KubevirtLoadBalancerAdminService lbService = get(KubevirtLoadBalancerAdminService.class);
         Set<KubevirtLoadBalancer> existingLbs = lbService.loadBalancers();
         Set<String> existingLbNames = existingLbs.stream()
-                .map(KubevirtLoadBalancer::name).collect(Collectors.toSet());
+                .map(KubevirtLoadBalancer::id).collect(Collectors.toSet());
         Map<String, Object> refLbs = client.customResource(lbCrdCxt).list();
         ObjectMapper mapper = new ObjectMapper();
 
@@ -311,7 +311,7 @@
             for (JsonValue item : items) {
                 KubevirtLoadBalancer lb = parseKubevirtLoadBalancer(item.toString());
                 if (lb != null) {
-                    if (existingLbNames.contains(lb.name())) {
+                    if (existingLbNames.contains(lb.id())) {
                         lbService.updateLoadBalancer(lb);
                     } else {
                         lbService.createLoadBalancer(lb);
@@ -334,7 +334,7 @@
             ObjectNode spec = (ObjectNode) json.get(SPEC);
 
             KubevirtRouter router = codec(KubevirtRouter.class).decode(spec, this);
-            KubevirtRouter existing = service.router(router.name());
+            KubevirtRouter existing = service.router(router.id());
 
             if (existing == null) {
                 return router;
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
index 1c045f3..e873a9c 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
@@ -117,8 +117,8 @@
 
     @Override
     public void createLoadBalancer(KubevirtLoadBalancer lb) {
-        loadBalancerStore.compute(lb.name(), (name, existing) -> {
-            final String error = lb.name() + ERR_DUPLICATE;
+        loadBalancerStore.compute(lb.id(), (id, existing) -> {
+            final String error = lb.id() + ERR_DUPLICATE;
             checkArgument(existing == null, error);
             return lb;
         });
@@ -126,26 +126,26 @@
 
     @Override
     public void updateLoadBalancer(KubevirtLoadBalancer lb) {
-        loadBalancerStore.compute(lb.name(), (name, existing) -> {
-            final String error = lb.name() + ERR_NOT_FOUND;
+        loadBalancerStore.compute(lb.id(), (id, existing) -> {
+            final String error = lb.id() + ERR_NOT_FOUND;
             checkArgument(existing != null, error);
             return lb;
         });
     }
 
     @Override
-    public KubevirtLoadBalancer removeLoadBalancer(String name) {
-        Versioned<KubevirtLoadBalancer> lb = loadBalancerStore.remove(name);
+    public KubevirtLoadBalancer removeLoadBalancer(String id) {
+        Versioned<KubevirtLoadBalancer> lb = loadBalancerStore.remove(id);
         if (lb == null) {
-            final String error = name + ERR_NOT_FOUND;
+            final String error = id + ERR_NOT_FOUND;
             throw new IllegalArgumentException(error);
         }
         return lb.value();
     }
 
     @Override
-    public KubevirtLoadBalancer loadBalancer(String name) {
-        return loadBalancerStore.asJavaMap().get(name);
+    public KubevirtLoadBalancer loadBalancer(String id) {
+        return loadBalancerStore.asJavaMap().get(id);
     }
 
     @Override
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
index 4b982aa..008c93f 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
@@ -156,8 +156,8 @@
 
     @Override
     public void createRouter(KubevirtRouter router) {
-        routerStore.compute(router.name(), (name, existing) -> {
-            final String error = router.name() + ERR_DUPLICATE;
+        routerStore.compute(router.id(), (id, existing) -> {
+            final String error = router.id() + ERR_DUPLICATE;
             checkArgument(existing == null, error);
             return router;
         });
@@ -165,26 +165,26 @@
 
     @Override
     public void updateRouter(KubevirtRouter router) {
-        routerStore.compute(router.name(), (name, existing) -> {
-            final String error = router.name() + ERR_NOT_FOUND;
+        routerStore.compute(router.id(), (id, existing) -> {
+            final String error = router.id() + ERR_NOT_FOUND;
             checkArgument(existing != null, error);
             return router;
         });
     }
 
     @Override
-    public KubevirtRouter removeRouter(String name) {
-        Versioned<KubevirtRouter> router = routerStore.remove(name);
+    public KubevirtRouter removeRouter(String id) {
+        Versioned<KubevirtRouter> router = routerStore.remove(id);
         if (router == null) {
-            final String error = name + ERR_NOT_FOUND;
+            final String error = id + ERR_NOT_FOUND;
             throw new IllegalArgumentException(error);
         }
         return router.value();
     }
 
     @Override
-    public KubevirtRouter router(String name) {
-        return routerStore.asJavaMap().get(name);
+    public KubevirtRouter router(String id) {
+        return routerStore.asJavaMap().get(id);
     }
 
     @Override
@@ -270,9 +270,9 @@
                             KUBEVIRT_ROUTER_UPDATED, event.newValue().value())));
 
             KubevirtRouter router = Strings.isNullOrEmpty(
-                    event.newValue().value().name()) ?
+                    event.newValue().value().id()) ?
                     null :
-                    router(event.newValue().value().name());
+                    router(event.newValue().value().id());
 
             KubevirtRouter oldValue = event.oldValue().value();
             KubevirtRouter newValue = event.newValue().value();
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerWatcher.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerWatcher.java
index 77d31a7..b662a86 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerWatcher.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerWatcher.java
@@ -215,7 +215,7 @@
 
             KubevirtLoadBalancer lb = parseKubevirtLoadBalancer(resource);
             if (lb != null) {
-                if (adminService.loadBalancer(lb.name()) == null) {
+                if (adminService.loadBalancer(lb.id()) == null) {
                     adminService.createLoadBalancer(lb);
                 }
             }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterWatcher.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterWatcher.java
index 13bce6b..a52eaab 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterWatcher.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterWatcher.java
@@ -139,7 +139,7 @@
             JsonNode json = mapper.readTree(resource);
             ObjectNode spec = (ObjectNode) json.get("spec");
             KubevirtRouter router = codec(KubevirtRouter.class).decode(spec, this);
-            KubevirtRouter existing = routerService.router(router.name());
+            KubevirtRouter existing = routerService.router(router.id());
 
             if (existing == null) {
                 return router;
@@ -221,14 +221,14 @@
                 return;
             }
 
-            String name = parseResourceName(resource);
+            String id = parseResourceName(resource);
 
             log.trace("Process Virtual Router {} creating event from API server.",
-                    name);
+                    id);
 
             KubevirtRouter router = parseKubevirtRouter(resource);
             if (router != null) {
-                if (adminService.router(router.name()) == null) {
+                if (adminService.router(router.id()) == null) {
                     adminService.createRouter(router);
                 }
             }
@@ -239,14 +239,14 @@
                 return;
             }
 
-            String name = parseResourceName(resource);
+            String id = parseResourceName(resource);
 
             log.trace("Process Virtual Router {} updating event from API server.",
-                    name);
+                    id);
 
             KubevirtRouter router = parseKubevirtRouter(resource);
 
-            KubevirtPeerRouter oldPeerRouter = adminService.router(router.name()).peerRouter();
+            KubevirtPeerRouter oldPeerRouter = adminService.router(router.id()).peerRouter();
             if (oldPeerRouter != null
                     && Objects.equals(oldPeerRouter.ipAddress(), router.peerRouter().ipAddress())
                     && oldPeerRouter.macAddress() != null
@@ -265,12 +265,12 @@
                 return;
             }
 
-            String name = parseResourceName(resource);
+            String id = parseResourceName(resource);
 
             log.trace("Process Virtual Router {} removal event from API server.",
-                    name);
+                    id);
 
-            adminService.removeRouter(name);
+            adminService.removeRouter(id);
         }
 
         private boolean isMaster() {
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
index 716ec9c..003b581 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
@@ -696,7 +696,8 @@
             if (!isRelevantHelper()) {
                 return;
             }
-            if (router.enableSnat() && !router.external().isEmpty() && router.peerRouter() != null) {
+            if (router.enableSnat() && !router.external().isEmpty() && router.peerRouter() != null &&
+                    router.electedGateway() != null) {
                 initGatewayNodeSnatForRouter(router, router.electedGateway(), true);
 
                 KubevirtNode gatewayNode = kubevirtNodeService.node(router.electedGateway());
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerManagerTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerManagerTest.java
index 73e1c35..99b90e6 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerManagerTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtLoadBalancerManagerTest.java
@@ -49,12 +49,14 @@
 
     private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
 
+    private static final String LB_ID = "26fcc876-f39a-459f-801d-75dcd3654ab8";
     private static final String LB_NAME = "lb-1";
     private static final String NETWORK_NAME = "vxlan-1";
     private static final String UPDATED_DESCRIPTION = "lb-updated";
     private static final String UNKNOWN_ID = "unknown";
 
     private static final KubevirtLoadBalancer LB = DefaultKubevirtLoadBalancer.builder()
+            .id(LB_ID)
             .name(LB_NAME)
             .description(LB_NAME)
             .networkId(NETWORK_NAME)
@@ -64,6 +66,7 @@
             .build();
 
     private static final KubevirtLoadBalancer LB_UPDATED = DefaultKubevirtLoadBalancer.builder()
+            .id(LB_ID)
             .name(LB_NAME)
             .description(UPDATED_DESCRIPTION)
             .networkId(NETWORK_NAME)
@@ -73,6 +76,7 @@
             .build();
 
     private static final KubevirtLoadBalancer LB_WITH_MEMBERS = DefaultKubevirtLoadBalancer.builder()
+            .id(LB_ID)
             .name(LB_NAME)
             .description(LB_NAME)
             .networkId(NETWORK_NAME)
@@ -124,9 +128,9 @@
      * Tests if getting a load balancer with ID returns the correct load balancer.
      */
     @Test
-    public void testGetLoadBalancerByName() {
+    public void testGetLoadBalancerById() {
         createBasicLoadBalancers();
-        assertNotNull("Load balancer did not match", target.loadBalancer(LB_NAME));
+        assertNotNull("Load balancer did not match", target.loadBalancer(LB_ID));
         assertNull("Load balancer did not match", target.loadBalancer(UNKNOWN_ID));
     }
 
@@ -137,11 +141,11 @@
     public void testCreateAndRemoveLoadBalancer() {
         target.createLoadBalancer(LB);
         assertEquals("Number of load balancers did not match", 1, target.loadBalancers().size());
-        assertNotNull("Load balancer was not created", target.loadBalancer(LB_NAME));
+        assertNotNull("Load balancer was not created", target.loadBalancer(LB_ID));
 
-        target.removeLoadBalancer(LB_NAME);
+        target.removeLoadBalancer(LB_ID);
         assertEquals("Number of load balancers did not match", 0, target.loadBalancers().size());
-        assertNull("Load balancer was not removed", target.loadBalancer(LB_NAME));
+        assertNull("Load balancer was not removed", target.loadBalancer(LB_ID));
 
         validateEvents(KUBEVIRT_LOAD_BALANCER_CREATED, KUBEVIRT_LOAD_BALANCER_REMOVED);
     }
@@ -153,11 +157,11 @@
     public void testCreateAndUpdateLoadBalancer() {
         target.createLoadBalancer(LB);
         assertEquals("Number of load balancers did not match", 1, target.loadBalancers().size());
-        assertEquals("Load balancer did not match", LB_NAME, target.loadBalancer(LB_NAME).name());
+        assertEquals("Load balancer did not match", LB_ID, target.loadBalancer(LB_ID).id());
 
         target.updateLoadBalancer(LB_UPDATED);
         assertEquals("Number of load balancers did not match", 1, target.loadBalancers().size());
-        assertEquals("Load balancer did not match", LB_NAME, target.loadBalancer(LB_NAME).name());
+        assertEquals("Load balancer did not match", LB_ID, target.loadBalancer(LB_ID).id());
 
         validateEvents(KUBEVIRT_LOAD_BALANCER_CREATED, KUBEVIRT_LOAD_BALANCER_UPDATED);
     }
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
index 26d7088..4241bf8 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
@@ -69,6 +69,7 @@
 
     private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
 
+    private static final String ROUTER_ID = "26fcc876-f39a-459f-801d-75dcd3654ab8";
     private static final String ROUTER_NAME = "router-1";
     private static final String POD_NAME = "pod-1";
     private static final String NETWORK_NAME = "flat-1";
@@ -79,6 +80,7 @@
     private static final String UNKNOWN_ID = "unknown";
 
     private static final KubevirtRouter ROUTER = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME)
             .description(ROUTER_NAME)
             .internal(ImmutableSet.of())
@@ -87,6 +89,7 @@
             .build();
 
     private static final KubevirtRouter ROUTER_UPDATED = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME)
             .description(UPDATED_DESCRIPTION)
             .internal(ImmutableSet.of())
@@ -95,6 +98,7 @@
             .build();
 
     private static final KubevirtRouter ROUTER_WITH_INTERNAL = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME)
             .description(ROUTER_NAME)
             .internal(ImmutableSet.of("vxlan-1", "vxlan-2"))
@@ -103,6 +107,7 @@
             .build();
 
     private static final KubevirtRouter ROUTER_WITH_SINGLE_INTERNAL = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME)
             .description(ROUTER_NAME)
             .internal(ImmutableSet.of("vxlan-1"))
@@ -111,6 +116,7 @@
             .build();
 
     private static final KubevirtRouter ROUTER_WITH_EXTERNAL = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME)
             .description(ROUTER_NAME)
             .internal(ImmutableSet.of())
@@ -122,14 +128,14 @@
 
     private static final KubevirtFloatingIp FLOATING_IP_DISASSOCIATED = DefaultKubevirtFloatingIp.builder()
             .id(FLOATING_IP_ID)
-            .routerName(ROUTER_NAME)
+            .routerName(ROUTER_ID)
             .networkName(NETWORK_NAME)
             .floatingIp(IpAddress.valueOf("10.10.10.10"))
             .build();
 
     private static final KubevirtFloatingIp FLOATING_IP_ASSOCIATED = DefaultKubevirtFloatingIp.builder()
             .id(FLOATING_IP_ID)
-            .routerName(ROUTER_NAME)
+            .routerName(ROUTER_ID)
             .networkName(NETWORK_NAME)
             .floatingIp(IpAddress.valueOf("10.10.10.10"))
             .fixedIp(IpAddress.valueOf("20.20.20.20"))
@@ -182,7 +188,7 @@
     @Test
     public void testGetRouterByName() {
         createBasicRouters();
-        assertNotNull("Router did not match", target.router(ROUTER_NAME));
+        assertNotNull("Router did not match", target.router(ROUTER_ID));
     }
 
     /**
@@ -192,11 +198,11 @@
     public void testCreateAndRemoveRouter() {
         target.createRouter(ROUTER);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertNotNull("Router was not created", target.router(ROUTER_NAME));
+        assertNotNull("Router was not created", target.router(ROUTER_ID));
 
-        target.removeRouter(ROUTER_NAME);
+        target.removeRouter(ROUTER_ID);
         assertEquals("Number of router did not match", 0, target.routers().size());
-        assertNull("Router was not created", target.router(ROUTER_NAME));
+        assertNull("Router was not created", target.router(ROUTER_ID));
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_REMOVED);
     }
@@ -211,7 +217,7 @@
 
         target.updateRouter(ROUTER_UPDATED);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router did not match", UPDATED_DESCRIPTION, target.router(ROUTER_NAME).description());
+        assertEquals("Router did not match", UPDATED_DESCRIPTION, target.router(ROUTER_ID).description());
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_UPDATED);
     }
@@ -223,9 +229,9 @@
     public void testPeerRouterMacUpdate() {
         target.createRouter(ROUTER_WITH_EXTERNAL);
 
-        target.updatePeerRouterMac(ROUTER_NAME, UPDATED_MAC);
+        target.updatePeerRouterMac(ROUTER_ID, UPDATED_MAC);
         assertEquals("MAC address was not updated", UPDATED_MAC,
-                target.router(ROUTER_NAME).peerRouter().macAddress());
+                target.router(ROUTER_ID).peerRouter().macAddress());
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_UPDATED);
     }
@@ -237,15 +243,15 @@
     public void testRouterInternalAttachedAndDetached() {
         target.createRouter(ROUTER);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router internal did not match", 0, target.router(ROUTER_NAME).internal().size());
+        assertEquals("Router internal did not match", 0, target.router(ROUTER_ID).internal().size());
 
         target.updateRouter(ROUTER_WITH_INTERNAL);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router internal did not match", 2, target.router(ROUTER_NAME).internal().size());
+        assertEquals("Router internal did not match", 2, target.router(ROUTER_ID).internal().size());
 
         target.updateRouter(ROUTER);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router internal did not match", 0, target.router(ROUTER_NAME).internal().size());
+        assertEquals("Router internal did not match", 0, target.router(ROUTER_ID).internal().size());
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_UPDATED,
                 KUBEVIRT_ROUTER_INTERNAL_NETWORKS_ATTACHED, KUBEVIRT_ROUTER_UPDATED,
@@ -256,11 +262,11 @@
     public void testRouterInternalShrink() {
         target.createRouter(ROUTER_WITH_INTERNAL);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router internal did not match", 2, target.router(ROUTER_NAME).internal().size());
+        assertEquals("Router internal did not match", 2, target.router(ROUTER_ID).internal().size());
 
         target.updateRouter(ROUTER_WITH_SINGLE_INTERNAL);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertEquals("Router internal did not match", 1, target.router(ROUTER_NAME).internal().size());
+        assertEquals("Router internal did not match", 1, target.router(ROUTER_ID).internal().size());
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_UPDATED,
                 KUBEVIRT_ROUTER_INTERNAL_NETWORKS_DETACHED);
@@ -275,18 +281,18 @@
     public void testRouterExternalAttachedAndDetached() {
         target.createRouter(ROUTER);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertNull(target.router(ROUTER_NAME).peerRouter());
-        assertEquals(0, target.router(ROUTER_NAME).external().size());
+        assertNull(target.router(ROUTER_ID).peerRouter());
+        assertEquals(0, target.router(ROUTER_ID).external().size());
 
         target.updateRouter(ROUTER_WITH_EXTERNAL);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertNotNull(target.router(ROUTER_NAME).peerRouter());
-        assertEquals(1, target.router(ROUTER_NAME).external().size());
+        assertNotNull(target.router(ROUTER_ID).peerRouter());
+        assertEquals(1, target.router(ROUTER_ID).external().size());
 
         target.updateRouter(ROUTER);
         assertEquals("Number of router did not match", 1, target.routers().size());
-        assertNull(target.router(ROUTER_NAME).peerRouter());
-        assertEquals(0, target.router(ROUTER_NAME).external().size());
+        assertNull(target.router(ROUTER_ID).peerRouter());
+        assertEquals(0, target.router(ROUTER_ID).external().size());
 
         validateEvents(KUBEVIRT_ROUTER_CREATED, KUBEVIRT_ROUTER_UPDATED,
                 KUBEVIRT_ROUTER_EXTERNAL_NETWORK_ATTACHED, KUBEVIRT_ROUTER_UPDATED,
@@ -362,7 +368,7 @@
     public void testGetFloatingIpsByRouterName() {
         createBasicFloatingIpDisassociated();
         assertEquals("Number of floating IPs did not match", 1,
-                target.floatingIpsByRouter(ROUTER_NAME).size());
+                target.floatingIpsByRouter(ROUTER_ID).size());
     }
 
     /**
diff --git a/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java b/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java
index c11d829..0e80b0d 100644
--- a/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java
+++ b/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java
@@ -38,6 +38,7 @@
 
     private final Logger log = getLogger(getClass());
 
+    private static final String ID = "id";
     private static final String NAME = "name";
     private static final String DESCRIPTION = "description";
     private static final String VIP = "vip";
@@ -52,6 +53,7 @@
         checkNotNull(lb, "Kubevirt load balancer cannot be null");
 
         ObjectNode result = context.mapper().createObjectNode()
+                .put(ID, lb.id())
                 .put(NAME, lb.name())
                 .put(VIP, lb.vip().toString())
                 .put(NETWORK_ID, lb.networkId());
@@ -87,6 +89,7 @@
             return null;
         }
 
+        String id = nullIsIllegal(json.get(ID).asText(), ID + MISSING_MESSAGE);
         String name = nullIsIllegal(json.get(NAME).asText(), NAME + MISSING_MESSAGE);
         IpAddress vip = IpAddress.valueOf(nullIsIllegal(json.get(VIP).asText(),
                 VIP + MISSING_MESSAGE));
@@ -94,6 +97,7 @@
                 NETWORK_ID + MISSING_MESSAGE);
 
         KubevirtLoadBalancer.Builder builder = DefaultKubevirtLoadBalancer.builder()
+                .id(id)
                 .name(name)
                 .vip(vip)
                 .networkId(networkId);
diff --git a/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java b/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java
index 5ca4ab6..3bfb44d 100644
--- a/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java
+++ b/apps/kubevirt-networking/web/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java
@@ -43,6 +43,7 @@
 
     private final Logger log = getLogger(getClass());
 
+    private static final String ID = "id";
     private static final String NAME = "name";
     private static final String DESCRIPTION = "description";
     private static final String ENABLE_SNAT = "enableSnat";
@@ -61,6 +62,7 @@
         checkNotNull(router, "Kubevirt router cannot be null");
 
         ObjectNode result = context.mapper().createObjectNode()
+                .put(ID, router.id())
                 .put(NAME, router.name())
                 .put(ENABLE_SNAT, router.enableSnat())
                 .put(MAC_ADDRESS, router.mac().toString());
@@ -111,6 +113,9 @@
             return null;
         }
 
+        String id = nullIsIllegal(json.get(ID).asText(),
+                ID + MISSING_MESSAGE);
+
         String name = nullIsIllegal(json.get(NAME).asText(),
                 NAME + MISSING_MESSAGE);
 
@@ -118,6 +123,7 @@
                 MAC_ADDRESS + MISSING_MESSAGE);
 
         KubevirtRouter.Builder builder = DefaultKubevirtRouter.builder()
+                .id(id)
                 .name(name)
                 .mac(MacAddress.valueOf(vrouterMac));
 
diff --git a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtFloatingIps.json b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtFloatingIps.json
index 07a45e2..43d1dd1 100644
--- a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtFloatingIps.json
+++ b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtFloatingIps.json
@@ -30,7 +30,7 @@
           },
           "routerName": {
             "type": "string",
-            "example": "router-1",
+            "example": "26fcc876-f39a-459f-801d-75dcd3654ab8",
             "description": "Name of router."
           },
           "networkName": {
diff --git a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtLoadBalancers.json b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtLoadBalancers.json
index f06aedf..9695249 100644
--- a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtLoadBalancers.json
+++ b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtLoadBalancers.json
@@ -15,6 +15,7 @@
         "type": "object",
         "description": "A load balancer object.",
         "required": [
+          "id",
           "name",
           "description",
           "networkId",
@@ -23,6 +24,11 @@
           "rules"
         ],
         "properties": {
+          "id": {
+            "type": "string",
+            "example": "26fcc876-f39a-459f-801d-75dcd3654ab8",
+            "description": "The ID of load balancer."
+          },
           "name": {
             "type": "string",
             "example": "lb-1",
diff --git a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtRouters.json b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtRouters.json
index 835dfea..db64213 100644
--- a/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtRouters.json
+++ b/apps/kubevirt-networking/web/src/main/resources/definitions/KubevirtRouters.json
@@ -15,6 +15,7 @@
         "type": "object",
         "description": "A router object.",
         "required": [
+          "id",
           "name",
           "enableSnat",
           "mac",
@@ -23,6 +24,11 @@
           "peerRouter"
         ],
         "properties": {
+          "id": {
+            "type": "string",
+            "example": "26fcc876-f39a-459f-801d-75dcd3654ab8",
+            "description": "The ID of router."
+          },
           "name": {
             "type": "string",
             "example": "router-1",
diff --git a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java
index cd86402..d15a38d 100644
--- a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java
+++ b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java
@@ -96,6 +96,7 @@
     @Test
     public void testKubevirtLoadBalancerEncode() {
         KubevirtLoadBalancer lb = DefaultKubevirtLoadBalancer.builder()
+                .id("26fcc876-f39a-459f-801d-75dcd3654ab8")
                 .name("lb-1")
                 .networkId("net-1")
                 .vip(IpAddress.valueOf("10.10.10.10"))
@@ -116,6 +117,7 @@
     public void testKubevirtLoadBalancerDecode() throws IOException {
         KubevirtLoadBalancer lb = getKubevirtLoadBalancer("KubevirtLoadBalancer.json");
 
+        assertThat(lb.id(), is("26fcc876-f39a-459f-801d-75dcd3654ab8"));
         assertThat(lb.name(), is("lb-1"));
         assertThat(lb.description(), is("Example Load Balancer"));
         assertThat(lb.networkId(), is("net-1"));
diff --git a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java
index 9122bd0..5a75b2b 100644
--- a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java
+++ b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java
@@ -28,6 +28,7 @@
  */
 public final class KubevirtLoadBalancerJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
 
+    private static final String ID = "id";
     private static final String NAME = "name";
     private static final String DESCRIPTION = "description";
     private static final String VIP = "vip";
@@ -43,6 +44,14 @@
 
     @Override
     protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+        // check ID
+        String jsonId = jsonNode.get(ID).asText();
+        String id = lb.id();
+        if (!jsonId.equals(id)) {
+            description.appendText("ID was " + jsonId);
+            return false;
+        }
+
         // check name
         String jsonName = jsonNode.get(NAME).asText();
         String name = lb.name();
diff --git a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java
index 1ff8951..104833c 100644
--- a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java
+++ b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java
@@ -77,6 +77,7 @@
                 MacAddress.valueOf("11:22:33:44:55:66"));
 
         KubevirtRouter router = DefaultKubevirtRouter.builder()
+                .id("26fcc876-f39a-459f-801d-75dcd3654ab8")
                 .name("router-1")
                 .enableSnat(true)
                 .mac(MacAddress.valueOf("11:22:33:44:55:66"))
@@ -95,6 +96,7 @@
     public void testKubevirtRouterDecode() throws IOException {
         KubevirtRouter router = getKubevirtRouter("KubevirtRouter.json");
 
+        assertEquals("26fcc876-f39a-459f-801d-75dcd3654ab8", router.id());
         assertEquals("router-1", router.name());
         assertEquals("Example Virtual Router", router.description());
         assertTrue(router.enableSnat());
diff --git a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java
index a855f42..dcbd193 100644
--- a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java
+++ b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java
@@ -28,6 +28,8 @@
 public final class KubevirtRouterJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
 
     private final KubevirtRouter router;
+
+    private static final String ID = "id";
     private static final String NAME = "name";
     private static final String DESCRIPTION = "description";
     private static final String ENABLE_SNAT = "enableSnat";
@@ -44,6 +46,13 @@
 
     @Override
     protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+        // check ID
+        String jsonId = jsonNode.get(ID).asText();
+        String id = router.id();
+        if (!jsonId.equals(id)) {
+            description.appendText("ID was " + jsonId);
+            return false;
+        }
 
         // check name
         String jsonName = jsonNode.get(NAME).asText();
diff --git a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java
index c1415fd..8dafe86 100644
--- a/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java
+++ b/apps/kubevirt-networking/web/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java
@@ -66,6 +66,7 @@
     private static final String VR_STATUS_PATH = "api/mm5/v1/status/vr/";
     private static final String NETWORK_PATH = "api/mm5/v1/network";
 
+    private static final String ROUTER_ID = "26fcc876-f39a-459f-801d-75dcd3654ab8";
     private static final String ROUTER_NAME = "router1";
     private static final String HOST_NAME = "hostname1";
 
@@ -94,6 +95,7 @@
 
 
     private static final KubevirtRouter ROUTER_1 = DefaultKubevirtRouter.builder()
+            .id(ROUTER_ID)
             .name(ROUTER_NAME).build();
 
     /**
diff --git a/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json b/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json
index 806fd73..77b9385 100644
--- a/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json
+++ b/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json
@@ -1,4 +1,5 @@
 {
+  "id": "26fcc876-f39a-459f-801d-75dcd3654ab8",
   "name": "lb-1",
   "description": "Example Load Balancer",
   "networkId": "net-1",
diff --git a/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json b/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json
index 5d9d53c..57a3b6c 100644
--- a/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json
+++ b/apps/kubevirt-networking/web/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json
@@ -1,4 +1,5 @@
 {
+  "id": "26fcc876-f39a-459f-801d-75dcd3654ab8",
   "name": "router-1",
   "description": "Example Virtual Router",
   "enableSnat": true,