Resource group to share resources between intents

Change-Id: I5bf7d4261197449924d07dabac841cf8ccbe9389
diff --git a/core/api/src/test/java/org/onosproject/net/intent/ConnectivityIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/ConnectivityIntentTest.java
index bab715f..3ac5a62 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/ConnectivityIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/ConnectivityIntentTest.java
@@ -26,6 +26,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.ResourceGroup;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
@@ -65,6 +66,8 @@
     public static final Set<FilteredConnectPoint> FPS1 = itemSet(new FilteredConnectPoint[]{FP1, FP3});
     public static final Set<FilteredConnectPoint> FPS2 = itemSet(new FilteredConnectPoint[]{FP2, FP3});
 
+    public static final ResourceGroup RESOURCE_GROUP = ResourceGroup.of(0L);
+
     public static final Map<ConnectPoint, TrafficSelector> VLANMATCHES = Maps.newHashMap();
     static {
         VLANMATCHES.put(P1, VLANMATCH1);
diff --git a/core/api/src/test/java/org/onosproject/net/intent/FlowObjectiveIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/FlowObjectiveIntentTest.java
index 69418a9..0b72e34 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/FlowObjectiveIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/FlowObjectiveIntentTest.java
@@ -24,6 +24,7 @@
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.criteria.Criteria;
@@ -59,6 +60,7 @@
     private static final List<Objective> OBJECTIVES = ImmutableList.of(FO1, FO2);
     private static final Collection<NetworkResource> RESOURCES = ImmutableSet.of();
     private static final List<DeviceId> DEVICE = ImmutableList.of(DeviceId.NONE, DeviceId.NONE);
+    private static final ResourceGroup RESOURCE_GROUP = ResourceGroup.of(0L);
 
     /**
      * Tests basics of construction and getters.
@@ -66,11 +68,12 @@
     @Test
     public void basics() {
         FlowObjectiveIntent intent =
-                new FlowObjectiveIntent(APP_ID, KEY, DEVICE, OBJECTIVES, RESOURCES);
+                new FlowObjectiveIntent(APP_ID, KEY, DEVICE, OBJECTIVES, RESOURCES, RESOURCE_GROUP);
         assertEquals("incorrect app id", APP_ID, intent.appId());
         assertEquals("incorrect key", KEY, intent.key());
         assertEquals("incorrect objectives", OBJECTIVES, intent.objectives());
         assertEquals("incorrect resources", RESOURCES, intent.resources());
+        assertEquals("incorrect resource group", RESOURCE_GROUP, intent.resourceGroup());
         assertTrue("should be installable", intent.isInstallable());
     }
 
diff --git a/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
index 0f373ff..3aba876 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
@@ -20,6 +20,7 @@
 import org.onosproject.TestApplicationId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.HostId;
+import org.onosproject.net.ResourceGroup;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import com.google.common.collect.ImmutableList;
@@ -41,6 +42,7 @@
     private final HostId id1 = hid("12:34:56:78:91:ab/1");
     private final HostId id2 = hid("12:34:56:78:92:ab/1");
     private final HostId id3 = hid("12:34:56:78:93:ab/1");
+    private final ResourceGroup resourceGrouop = ResourceGroup.of(0L);
 
     private static final ApplicationId APPID = new TestApplicationId("foo");
 
@@ -154,6 +156,18 @@
 
     }
 
+    @Test
+    public void testResourceGroup() {
+        final HostToHostIntent intent = (HostToHostIntent) createWithResourceGroup();
+        assertThat("incorrect app id", intent.appId(), is(APPID));
+        assertThat("incorrect host one", intent.one(), is(id1));
+        assertThat("incorrect host two", intent.two(), is(id3));
+        assertThat("incorrect selector", intent.selector(), is(selector));
+        assertThat("incorrect treatment", intent.treatment(), is(treatment));
+        assertThat("incorrect resource group", intent.resourceGroup(), is(resourceGrouop));
+
+    }
+
     @Override
     protected Intent createOne() {
         return HostToHostIntent.builder()
@@ -175,4 +189,15 @@
                 .treatment(treatment)
                 .build();
     }
+
+    protected Intent createWithResourceGroup() {
+        return HostToHostIntent.builder()
+                .appId(APPID)
+                .one(id1)
+                .two(id3)
+                .selector(selector)
+                .treatment(treatment)
+                .resourceGroup(resourceGrouop)
+                .build();
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/intent/LinkCollectionIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/LinkCollectionIntentTest.java
index cb25b3c..9f45582 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/LinkCollectionIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/LinkCollectionIntentTest.java
@@ -27,6 +27,7 @@
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.net.NetTestTools;
+import org.onosproject.net.ResourceGroup;
 import org.onosproject.net.flow.TrafficSelector;
 
 import com.google.common.collect.ImmutableSet;
@@ -53,6 +54,7 @@
     final IntentTestsMocks.MockTreatment treatment = new IntentTestsMocks.MockTreatment();
     final FilteredConnectPoint filteredIngress = new FilteredConnectPoint(ingress);
     final FilteredConnectPoint filteredEgress = new FilteredConnectPoint(egress);
+    final ResourceGroup resourceGroup = ResourceGroup.of(0L);
 
     /**
      * Checks that the LinkCollectionIntent class is immutable.
@@ -78,6 +80,7 @@
                         .links(links1)
                         .ingressPoints(ImmutableSet.of(ingress))
                         .egressPoints(ImmutableSet.of(egress))
+                        .resourceGroup(resourceGroup)
                         .build();
 
         final HashSet<Link> links2 = new HashSet<>();
@@ -90,6 +93,7 @@
                         .links(links2)
                         .ingressPoints(ImmutableSet.of(ingress))
                         .egressPoints(ImmutableSet.of(egress))
+                        .resourceGroup(resourceGroup)
                         .build();
 
         new EqualsTester()
@@ -113,6 +117,7 @@
                         .links(links1)
                         .ingressPoints(ImmutableSet.of(ingress))
                         .egressPoints(ImmutableSet.of(egress))
+                        .resourceGroup(resourceGroup)
                         .build();
 
         final Set<Link> createdLinks = collectionIntent.links();
@@ -122,6 +127,7 @@
         assertThat(collectionIntent.selector(), is(selector));
         assertThat(collectionIntent.ingressPoints(), is(ImmutableSet.of(ingress)));
         assertThat(collectionIntent.egressPoints(), is(ImmutableSet.of(egress)));
+        assertThat(collectionIntent.resourceGroup(), is(resourceGroup));
         assertThat(collectionIntent.resources(), hasSize(1));
         final List<Constraint> createdConstraints = collectionIntent.constraints();
         assertThat(createdConstraints, hasSize(0));
diff --git a/core/api/src/test/java/org/onosproject/net/intent/MultiPointToSinglePointIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/MultiPointToSinglePointIntentTest.java
index a41214b..5fcd8d4 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/MultiPointToSinglePointIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/MultiPointToSinglePointIntentTest.java
@@ -56,6 +56,14 @@
         assertEquals("incorrect match", VLANMATCH1, intent.selector());
         assertEquals("incorrect ingress", PS1, intent.ingressPoints());
         assertEquals("incorrect egress", P2, intent.egressPoint());
+
+        intent = createWithResourceGroup();
+        assertEquals("incorrect id", APPID, intent.appId());
+        assertEquals("incorrect match", MATCH, intent.selector());
+        assertEquals("incorrect ingress", PS1, intent.ingressPoints());
+        assertEquals("incorrect egress", P2, intent.egressPoint());
+        assertEquals("incorrect resource group", RESOURCE_GROUP, intent.resourceGroup());
+
     }
 
     /**
@@ -109,6 +117,17 @@
                 .build();
     }
 
+    protected MultiPointToSinglePointIntent createWithResourceGroup() {
+        return MultiPointToSinglePointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoints(PS1)
+                .egressPoint(P2)
+                .resourceGroup(RESOURCE_GROUP)
+                .build();
+    }
+
 
     protected MultiPointToSinglePointIntent createFilteredOne() {
         return MultiPointToSinglePointIntent.builder()
diff --git a/core/api/src/test/java/org/onosproject/net/intent/PathIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/PathIntentTest.java
index e388468..da13af0 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/PathIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/PathIntentTest.java
@@ -73,6 +73,21 @@
         assertEquals("incorrect action", NOP, intent.treatment());
         assertEquals("incorrect path", PATH1, intent.path());
         assertEquals("incorrect key", KEY, intent.key());
+
+        intent = createAnother();
+        assertEquals("incorrect id", APPID, intent.appId());
+        assertEquals("incorrect match", MATCH, intent.selector());
+        assertEquals("incorrect action", NOP, intent.treatment());
+        assertEquals("incorrect path", PATH2, intent.path());
+        assertEquals("incorrect key", KEY, intent.key());
+
+        intent = createWithResourceGroup();
+        assertEquals("incorrect id", APPID, intent.appId());
+        assertEquals("incorrect match", MATCH, intent.selector());
+        assertEquals("incorrect action", NOP, intent.treatment());
+        assertEquals("incorrect path", PATH2, intent.path());
+        assertEquals("incorrect key", KEY, intent.key());
+        assertEquals("incorrect resource group", RESOURCE_GROUP, intent.resourceGroup());
     }
 
     @Override
@@ -90,12 +105,24 @@
     protected PathIntent createAnother() {
         return PathIntent.builder()
                 .appId(APPID)
+                .key(KEY)
                 .selector(MATCH)
                 .treatment(NOP)
                 .path(PATH2)
                 .build();
     }
 
+    protected PathIntent createWithResourceGroup() {
+        return PathIntent.builder()
+                .appId(APPID)
+                .key(KEY)
+                .selector(MATCH)
+                .treatment(NOP)
+                .path(PATH2)
+                .resourceGroup(RESOURCE_GROUP)
+                .build();
+    }
+
     /**
      * Tests the constructor raises IllegalArgumentException when the same device is specified in
      * source and destination of a link.
diff --git a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
index 7f83850..8d0f900 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
@@ -40,6 +40,13 @@
         assertEquals("incorrect match", MATCH, intent.selector());
         assertEquals("incorrect ingress", P1, intent.ingressPoint());
         assertEquals("incorrect egress", P2, intent.egressPoint());
+
+        intent = createWithResourceGroup();
+        assertEquals("incorrect id", APPID, intent.appId());
+        assertEquals("incorrect match", MATCH, intent.selector());
+        assertEquals("incorrect ingress", P1, intent.ingressPoint());
+        assertEquals("incorrect egress", P2, intent.egressPoint());
+        assertEquals("incorrect resource group", RESOURCE_GROUP, intent.resourceGroup());
     }
 
     @Test
@@ -62,6 +69,17 @@
                 .build();
     }
 
+    protected PointToPointIntent createWithResourceGroup() {
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P1)
+                .egressPoint(P2)
+                .resourceGroup(RESOURCE_GROUP)
+                .build();
+    }
+
     @Override
     protected PointToPointIntent createAnother() {
         return PointToPointIntent.builder()
diff --git a/core/api/src/test/java/org/onosproject/net/intent/SinglePointToMultiPointIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/SinglePointToMultiPointIntentTest.java
index 76aaa85..1aef3bb 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/SinglePointToMultiPointIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/SinglePointToMultiPointIntentTest.java
@@ -46,6 +46,13 @@
         assertEquals("incorrect match", MATCH, intent.selector());
         assertEquals("incorrect ingress", P2, intent.ingressPoint());
         assertEquals("incorrect egress", PS1, intent.egressPoints());
+
+        intent = createWithResourceGroup();
+        assertEquals("incorrect id", APPID, intent.appId());
+        assertEquals("incorrect match", MATCH, intent.selector());
+        assertEquals("incorrect ingress", P2, intent.ingressPoint());
+        assertEquals("incorrect egress", PS1, intent.egressPoints());
+        assertEquals("incorrect resource group", RESOURCE_GROUP, intent.resourceGroup());
     }
 
     @Test
@@ -61,7 +68,6 @@
         assertEquals("incorrect match", MATCH, intent.selector());
         assertEquals("incorrect filtered ingress", FP1, intent.filteredIngressPoint());
         assertEquals("incorrect filtered egress", FPS2, intent.filteredEgressPoints());
-
     }
 
     @Override
@@ -86,6 +92,17 @@
                 .build();
     }
 
+    protected SinglePointToMultiPointIntent createWithResourceGroup() {
+        return SinglePointToMultiPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P2)
+                .egressPoints(PS1)
+                .resourceGroup(RESOURCE_GROUP)
+                .build();
+    }
+
     protected SinglePointToMultiPointIntent createFilteredOne() {
         return SinglePointToMultiPointIntent.builder()
                 .appId(APPID)