[ONOS-8087] Per device purgeOnDisconnection Flag

Change-Id: I7cb1db12a4d910d70123f116107a898bf9e6d278
diff --git a/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index a948bfd..12bd9e4 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -486,10 +486,6 @@
         l2TunnelHandler = new DefaultL2TunnelHandler(this);
         topologyHandler = new TopologyHandler(this);
 
-        compCfgService.preSetProperty("org.onosproject.net.group.impl.GroupManager",
-                                      "purgeOnDisconnection", "true", false);
-        compCfgService.preSetProperty("org.onosproject.net.flow.impl.FlowRuleManager",
-                                      "purgeOnDisconnection", "true", false);
         compCfgService.preSetProperty("org.onosproject.provider.host.impl.HostLocationProvider",
                                       "requestInterceptsEnabled", "false", false);
         compCfgService.preSetProperty("org.onosproject.net.neighbour.impl.NeighbourResolutionManager",
diff --git a/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java b/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
index 123da37..5013e83 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
@@ -35,6 +35,7 @@
 import org.onosproject.net.HostId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.ConfigException;
+import org.onosproject.net.config.basics.BasicDeviceConfig;
 import org.onosproject.net.config.basics.InterfaceConfig;
 import org.onosproject.net.host.InterfaceIpAddress;
 import org.onosproject.net.intf.Interface;
@@ -109,6 +110,12 @@
         Set<DeviceId> deviceSubjects =
                 srManager.cfgService.getSubjects(DeviceId.class, SegmentRoutingDeviceConfig.class);
         deviceSubjects.forEach(subject -> {
+            //Setting purge on disconnection flag for the device SR has control over.
+            // addConfig returns a config if it exists or creates a new one.
+            log.info("PurgeOnDisconnection set to true for device {}", subject);
+            BasicDeviceConfig basicDeviceConfig = srManager.cfgService.addConfig(subject, BasicDeviceConfig.class);
+            basicDeviceConfig.purgeOnDisconnection(true);
+            srManager.cfgService.applyConfig(subject, BasicDeviceConfig.class, basicDeviceConfig.node());
             SegmentRoutingDeviceConfig config =
                     srManager.cfgService.getConfig(subject, SegmentRoutingDeviceConfig.class);
             SegmentRouterInfo info = new SegmentRouterInfo();
diff --git a/app/src/test/java/org/onosproject/segmentrouting/IcmpHandlerTest.java b/app/src/test/java/org/onosproject/segmentrouting/IcmpHandlerTest.java
index cc7c6a8..68472de 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/IcmpHandlerTest.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/IcmpHandlerTest.java
@@ -139,6 +139,7 @@
 
         // Apply config
         MockNetworkConfigRegistry mockNetworkConfigRegistry = new MockNetworkConfigRegistry();
+
         mockNetworkConfigRegistry.applyConfig(remoteLeafConfig);
         mockNetworkConfigRegistry.applyConfig(remoteLeafPorts1Config);
         mockNetworkConfigRegistry.applyConfig(remoteLeafPorts2Config);
diff --git a/app/src/test/java/org/onosproject/segmentrouting/MockNetworkConfigRegistry.java b/app/src/test/java/org/onosproject/segmentrouting/MockNetworkConfigRegistry.java
index e18483e..12d57ea 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/MockNetworkConfigRegistry.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/MockNetworkConfigRegistry.java
@@ -16,10 +16,14 @@
 
 package org.onosproject.segmentrouting;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigRegistryAdapter;
+import org.onosproject.net.config.basics.BasicDeviceConfig;
 
 import java.util.Objects;
 import java.util.Set;
@@ -44,6 +48,25 @@
     }
 
     @Override
+    public <S, C extends Config<S>> C addConfig(S subject, Class<C> configClass) {
+        Config c = configs.stream()
+                .filter(config -> subject.equals(config.subject()))
+                .filter(config -> configClass.equals(config.getClass()))
+                .findFirst().orElseGet(() -> {
+                    if (configClass.equals(BasicDeviceConfig.class)) {
+                        BasicDeviceConfig deviceConfig = new BasicDeviceConfig();
+                        ObjectMapper mapper = new ObjectMapper();
+                        deviceConfig.init((DeviceId) subject, ((DeviceId) subject).toString(),
+                                          JsonNodeFactory.instance.objectNode(), mapper, config -> {
+                                });
+                        return deviceConfig;
+                    }
+                    return null;
+                });
+        return (C) c;
+    }
+
+    @Override
     public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subject, Class<C> configClass) {
         ImmutableSet.Builder<S> builder = ImmutableSet.builder();
         String cName = configClass.getName();
diff --git a/app/src/test/java/org/onosproject/segmentrouting/config/DeviceConfigurationTest.java b/app/src/test/java/org/onosproject/segmentrouting/config/DeviceConfigurationTest.java
index 469def0..1674f6c 100644
--- a/app/src/test/java/org/onosproject/segmentrouting/config/DeviceConfigurationTest.java
+++ b/app/src/test/java/org/onosproject/segmentrouting/config/DeviceConfigurationTest.java
@@ -18,6 +18,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.junit.Before;
@@ -29,6 +30,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.basics.BasicDeviceConfig;
 import org.onosproject.net.config.basics.InterfaceConfig;
 import org.onosproject.net.host.InterfaceIpAddress;
 import org.onosproject.net.intf.Interface;
@@ -73,10 +75,12 @@
 
     private DeviceConfiguration devConfig;
 
+    private NetworkConfigRegistry networkConfigService;
+
     @Before
     public void setUp() throws Exception {
         InterfaceService interfaceService;
-        NetworkConfigRegistry networkConfigService;
+        networkConfigService = null;
         NeighbourResolutionService neighbourResolutionService;
         SegmentRoutingManager srManager;
 
@@ -86,6 +90,10 @@
         JsonNode jsonNode = mapper.readTree(jsonStream);
         SegmentRoutingDeviceConfig srDevConfig = new SegmentRoutingDeviceConfig();
         srDevConfig.init(DEV1, CONFIG_KEY, jsonNode, mapper, config -> { });
+        BasicDeviceConfig basicDeviceConfig = new BasicDeviceConfig();
+        basicDeviceConfig.init(DEV1, DEV1.toString(), JsonNodeFactory.instance.objectNode(), mapper, config -> { });
+        BasicDeviceConfig purgeOnDisconnectConfig = basicDeviceConfig.purgeOnDisconnection(true);
+
 
         // Mock interface netcfg
         jsonStream = InterfaceConfig.class.getResourceAsStream("/interface1.json");
@@ -102,6 +110,12 @@
                 .andReturn(Sets.newHashSet(DEV1)).anyTimes();
         expect(networkConfigService.getConfig(DEV1, SegmentRoutingDeviceConfig.class))
                 .andReturn(srDevConfig).anyTimes();
+        expect(networkConfigService.addConfig(DEV1, BasicDeviceConfig.class))
+                .andReturn(basicDeviceConfig).anyTimes();
+        expect(networkConfigService.getConfig(DEV1, BasicDeviceConfig.class))
+                .andReturn(basicDeviceConfig).anyTimes();
+        expect(networkConfigService.applyConfig(DEV1, BasicDeviceConfig.class, purgeOnDisconnectConfig.node()))
+                .andReturn(purgeOnDisconnectConfig).anyTimes();
         expect(networkConfigService.getSubjects(ConnectPoint.class, InterfaceConfig.class))
                 .andReturn(Sets.newHashSet(CP1, CP2)).anyTimes();
         expect(networkConfigService.getConfig(CP1, InterfaceConfig.class)).andReturn(interfaceConfig1).anyTimes();
@@ -157,4 +171,10 @@
         assertTrue(devConfig.inSameSubnet(DEV1, PREFIX2.address()));
         assertFalse(devConfig.inSameSubnet(DEV1, ROUTE1.address()));
     }
+
+    @Test
+    public void getPurgeOnDisconnect() {
+        assertNotNull(networkConfigService.getConfig(DEV1, BasicDeviceConfig.class));
+        assertTrue(networkConfigService.getConfig(DEV1, BasicDeviceConfig.class).purgeOnDisconnection());
+    }
 }
\ No newline at end of file