Resource group to share resources between intents
Change-Id: I5bf7d4261197449924d07dabac841cf8ccbe9389
diff --git a/core/api/src/main/java/org/onosproject/net/ResourceGroup.java b/core/api/src/main/java/org/onosproject/net/ResourceGroup.java
new file mode 100644
index 0000000..8eb3e7a
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/ResourceGroup.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2014-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net;
+
+import com.google.common.annotations.Beta;
+import com.google.common.hash.HashFunction;
+import com.google.common.hash.Hashing;
+import org.onlab.util.Identifier;
+import org.onosproject.net.resource.ResourceConsumer;
+import org.onosproject.net.resource.ResourceConsumerId;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Intent identifier suitable as an external key.
+ * <p>This class is immutable.</p>
+ */
+@Beta
+public final class ResourceGroup extends Identifier<Long> implements ResourceConsumer {
+
+ private static final String HEX_PREFIX = "0x";
+ private static final HashFunction HASH_FN = Hashing.md5();
+
+ /**
+ * Creates a resource group identifier from the specified long
+ * representation.
+ *
+ * @param value long value
+ * @return resource group identifier
+ */
+ public static ResourceGroup of(long value) {
+ return new ResourceGroup(value);
+ }
+
+ /**
+ * Creates a resource group identifier from the specified string
+ * representation.
+ * Warning: it is caller responsibility to make sure the hashed value of
+ * {@code value} is unique.
+ *
+ * @param value string value
+ * @return resource group identifier
+ */
+ public static ResourceGroup of(String value) {
+ return new ResourceGroup(HASH_FN.newHasher()
+ .putString(value, StandardCharsets.UTF_8)
+ .hash()
+ .asLong());
+ }
+
+ /**
+ * Constructor for serializer.
+ */
+ protected ResourceGroup() {
+ super(0L);
+ }
+
+ /**
+ * Constructs the ID corresponding to a given long value.
+ *
+ * @param value the underlying value of this ID
+ */
+ protected ResourceGroup(long value) {
+ super(value);
+ }
+
+ /**
+ * Returns the backing value.
+ *
+ * @return the value
+ */
+ public long fingerprint() {
+ return identifier;
+ }
+
+ @Override
+ public String toString() {
+ return HEX_PREFIX + Long.toHexString(identifier);
+ }
+
+ @Override
+ public ResourceConsumerId consumerId() {
+ return ResourceConsumerId.of(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final ResourceGroup other = (ResourceGroup) obj;
+ if (this.fingerprint() != other.fingerprint()) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
index 113845d..827a042 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
@@ -21,6 +21,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.Link;
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.TrafficSelector;
@@ -64,7 +65,9 @@
* @param constraints optional prioritized list of constraints
* @param priority priority to use for flows generated by this intent
* @throws NullPointerException if the selector or treatment is null
+ * @deprecated 1.9.1
*/
+ @Deprecated
protected ConnectivityIntent(ApplicationId appId,
Key key,
Collection<NetworkResource> resources,
@@ -79,6 +82,37 @@
}
/**
+ * Creates a connectivity intent that matches on the specified selector
+ * and applies the specified treatment.
+ * <p>
+ * Path will be optimized based on the first constraint if one is given.
+ * </p>
+ *
+ * @param appId application identifier
+ * @param key explicit key to use for intent
+ * @param resources required network resources (optional)
+ * @param selector traffic selector
+ * @param treatment treatment
+ * @param constraints optional prioritized list of constraints
+ * @param priority priority to use for flows generated by this intent
+ * @param resourceGroup resource group for this intent
+ * @throws NullPointerException if the selector or treatment is null
+ */
+ protected ConnectivityIntent(ApplicationId appId,
+ Key key,
+ Collection<NetworkResource> resources,
+ TrafficSelector selector,
+ TrafficTreatment treatment,
+ List<Constraint> constraints,
+ int priority,
+ ResourceGroup resourceGroup) {
+ super(appId, key, resources, priority, resourceGroup);
+ this.selector = checkNotNull(selector);
+ this.treatment = checkNotNull(treatment);
+ this.constraints = checkNotNull(constraints);
+ }
+
+ /**
* Constructor for serializer.
*/
protected ConnectivityIntent() {
diff --git a/core/api/src/main/java/org/onosproject/net/intent/FlowObjectiveIntent.java b/core/api/src/main/java/org/onosproject/net/intent/FlowObjectiveIntent.java
index b22a7ae..e1529e3 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/FlowObjectiveIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/FlowObjectiveIntent.java
@@ -21,6 +21,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flowobjective.Objective;
import java.util.Collection;
@@ -54,12 +55,14 @@
* @param devices list of target devices; in same order as the objectives
* @param objectives backing flow objectives
* @param resources backing network resources
+ * @deprecated 1.9.1
*/
+ @Deprecated
public FlowObjectiveIntent(ApplicationId appId,
List<DeviceId> devices,
List<Objective> objectives,
Collection<NetworkResource> resources) {
- this(appId, null, devices, objectives, resources);
+ this(appId, null, devices, objectives, resources, null);
}
/**
@@ -71,13 +74,35 @@
* @param devices list of target devices; in same order as the objectives
* @param objectives backing flow objectives
* @param resources backing network resources
+ * @deprecated 1.9.1
*/
+ @Deprecated
public FlowObjectiveIntent(ApplicationId appId,
Key key,
List<DeviceId> devices,
List<Objective> objectives,
Collection<NetworkResource> resources) {
- super(appId, key, resources, DEFAULT_INTENT_PRIORITY);
+ this(appId, key, devices, objectives, resources, null);
+ }
+
+ /**
+ * Creates a flow objective intent with the specified objectives and
+ * resources.
+ *
+ * @param appId application id
+ * @param key intent key
+ * @param devices list of target devices; in same order as the objectives
+ * @param objectives backing flow objectives
+ * @param resources backing network resources
+ * @param resourceGroup resource goup for this intent
+ */
+ public FlowObjectiveIntent(ApplicationId appId,
+ Key key,
+ List<DeviceId> devices,
+ List<Objective> objectives,
+ Collection<NetworkResource> resources,
+ ResourceGroup resourceGroup) {
+ super(appId, key, resources, DEFAULT_INTENT_PRIORITY, resourceGroup);
checkArgument(devices.size() == objectives.size(),
"Number of devices and objectives does not match");
this.objectives = ImmutableList.copyOf(objectives);
@@ -117,6 +142,7 @@
.add("resources", resources())
.add("device", devices())
.add("objectives", objectives())
+ .add("resourceGroup", resourceGroup())
.toString();
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/FlowRuleIntent.java b/core/api/src/main/java/org/onosproject/net/intent/FlowRuleIntent.java
index 0bffaaa..9f4b9b9 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/FlowRuleIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/FlowRuleIntent.java
@@ -20,6 +20,7 @@
import com.google.common.collect.ImmutableList;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.FlowRule;
import java.util.Collection;
@@ -43,7 +44,9 @@
* @param appId application id
* @param flowRules flow rules to be set
* @param resources network resource to be set
+ * @deprecated 1.9.1
*/
+ @Deprecated
public FlowRuleIntent(ApplicationId appId, List<FlowRule> flowRules, Collection<NetworkResource> resources) {
this(appId, null, flowRules, resources);
}
@@ -55,10 +58,12 @@
* @param flowRules flow rules to be set
* @param resources network resource to be set
* @param type protection type
+ * @deprecated 1.9.1
*/
+ @Deprecated
public FlowRuleIntent(ApplicationId appId, List<FlowRule> flowRules, Collection<NetworkResource> resources,
PathIntent.ProtectionType type) {
- this(appId, null, flowRules, resources, type);
+ this(appId, null, flowRules, resources, type, null);
}
/**
@@ -69,10 +74,13 @@
* @param key key
* @param flowRules flow rules
* @param resources network resources
+ * @deprecated 1.9.1
*/
+ @Deprecated
public FlowRuleIntent(ApplicationId appId, Key key, Collection<FlowRule> flowRules,
Collection<NetworkResource> resources) {
- this(appId, key, flowRules, resources, PathIntent.ProtectionType.PRIMARY);
+ this(appId, key, flowRules, resources,
+ PathIntent.ProtectionType.PRIMARY, null);
}
/**
@@ -84,10 +92,32 @@
* @param flowRules flow rules
* @param resources network resources
* @param primary primary protection type
+ * @deprecated 1.9.1
+ */
+ @Deprecated
+ public FlowRuleIntent(ApplicationId appId,
+ Key key,
+ Collection<FlowRule> flowRules,
+ Collection<NetworkResource> resources,
+ PathIntent.ProtectionType primary) {
+ this(appId, key, flowRules, resources, primary, null);
+ }
+
+ /**
+ * Creates a flow rule intent with the specified key, flow rules to be set, and
+ * required network resources.
+ *
+ * @param appId application id
+ * @param key key
+ * @param flowRules flow rules
+ * @param resources network resources
+ * @param primary primary protection type
+ * @param resourceGroup resource group for this intent
*/
public FlowRuleIntent(ApplicationId appId, Key key, Collection<FlowRule> flowRules,
- Collection<NetworkResource> resources, PathIntent.ProtectionType primary) {
- super(appId, key, resources, DEFAULT_INTENT_PRIORITY);
+ Collection<NetworkResource> resources, PathIntent.ProtectionType primary,
+ ResourceGroup resourceGroup) {
+ super(appId, key, resources, DEFAULT_INTENT_PRIORITY, resourceGroup);
this.flowRules = ImmutableList.copyOf(checkNotNull(flowRules));
this.type = primary;
}
@@ -101,7 +131,7 @@
*/
public FlowRuleIntent(FlowRuleIntent intent, PathIntent.ProtectionType type) {
this(intent.appId(), intent.key(), intent.flowRules(),
- intent.resources(), type);
+ intent.resources(), type, intent.resourceGroup());
}
/**
@@ -139,6 +169,7 @@
.add("appId", appId())
.add("resources", resources())
.add("flowRule", flowRules)
+ .add("resourceGroup", resourceGroup())
.toString();
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/HostToHostIntent.java b/core/api/src/main/java/org/onosproject/net/intent/HostToHostIntent.java
index 92dd83b..a7505ae 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/HostToHostIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/HostToHostIntent.java
@@ -23,6 +23,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.HostId;
import org.onosproject.net.Link;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.intent.constraint.LinkTypeConstraint;
@@ -92,6 +93,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the first host of the intent that will be built.
*
@@ -114,8 +120,6 @@
return this;
}
-
-
/**
* Builds a host to host intent from the accumulated parameters.
*
@@ -140,12 +144,12 @@
selector,
treatment,
theConstraints,
- priority
+ priority,
+ resourceGroup
);
}
}
-
/**
* Creates a new host-to-host intent with the supplied host pair.
*
@@ -157,21 +161,22 @@
* @param treatment ingress port
* @param constraints optional prioritized list of path selection constraints
* @param priority priority to use for flows generated by this intent
+ * @param resourceGroup resource group for this intent
* @throws NullPointerException if {@code one} or {@code two} is null.
*/
private HostToHostIntent(ApplicationId appId, Key key,
- HostId one, HostId two,
- TrafficSelector selector,
- TrafficTreatment treatment,
- List<Constraint> constraints,
- int priority) {
+ HostId one, HostId two,
+ TrafficSelector selector,
+ TrafficTreatment treatment,
+ List<Constraint> constraints,
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, ImmutableSet.of(one, two), selector, treatment,
- constraints, priority);
+ constraints, priority, resourceGroup);
// TODO: consider whether the case one and two are same is allowed
this.one = checkNotNull(one);
this.two = checkNotNull(two);
-
}
/**
@@ -203,6 +208,7 @@
.add("selector", selector())
.add("treatment", treatment())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.add("one", one)
.add("two", two)
.toString();
diff --git a/core/api/src/main/java/org/onosproject/net/intent/Intent.java b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
index 4df13a6..12dad21 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/Intent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
@@ -19,6 +19,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.core.IdGenerator;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import java.util.Collection;
import java.util.Objects;
@@ -47,6 +48,7 @@
public static final int MIN_PRIORITY = 1;
private final Collection<NetworkResource> resources;
+ private final ResourceGroup resourceGroup;
private static IdGenerator idGenerator;
@@ -59,16 +61,18 @@
this.key = null;
this.resources = null;
this.priority = DEFAULT_INTENT_PRIORITY;
+ this.resourceGroup = null;
}
/**
* Creates a new intent.
- *
* @param appId application identifier
* @param key optional key
* @param resources required network resources (optional)
* @param priority flow rule priority
+ * @deprecated 1.9.1
*/
+ @Deprecated
protected Intent(ApplicationId appId,
Key key,
Collection<NetworkResource> resources,
@@ -80,6 +84,30 @@
this.key = (key != null) ? key : Key.of(id.fingerprint(), appId);
this.priority = priority;
this.resources = checkNotNull(resources);
+ this.resourceGroup = null;
+ }
+
+ /**
+ * Creates a new intent.
+ * @param appId application identifier
+ * @param key optional key
+ * @param resources required network resources (optional)
+ * @param priority flow rule priority
+ * @param resourceGroup the resource group for intent
+ */
+ protected Intent(ApplicationId appId,
+ Key key,
+ Collection<NetworkResource> resources,
+ int priority,
+ ResourceGroup resourceGroup) {
+ checkState(idGenerator != null, "Id generator is not bound.");
+ checkArgument(priority <= MAX_PRIORITY && priority >= MIN_PRIORITY);
+ this.id = IntentId.valueOf(idGenerator.getNewId());
+ this.appId = checkNotNull(appId, "Application ID cannot be null");
+ this.key = (key != null) ? key : Key.of(id.fingerprint(), appId);
+ this.priority = priority;
+ this.resources = checkNotNull(resources);
+ this.resourceGroup = resourceGroup;
}
/**
@@ -90,6 +118,7 @@
protected Key key;
protected int priority = Intent.DEFAULT_INTENT_PRIORITY;
protected Collection<NetworkResource> resources;
+ protected ResourceGroup resourceGroup;
/**
* Creates a new empty builder.
@@ -106,7 +135,8 @@
protected Builder(Intent intent) {
this.appId(intent.appId())
.key(intent.key())
- .priority(intent.priority());
+ .priority(intent.priority())
+ .resourceGroup(intent.resourceGroup());
}
/**
@@ -152,6 +182,17 @@
this.resources = resources;
return this;
}
+
+ /**
+ * Sets the resource group for this intent.
+ *
+ * @param resourceGroup the resource group
+ * @return this builder
+ */
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ this.resourceGroup = resourceGroup;
+ return this;
+ }
}
/**
@@ -191,6 +232,15 @@
}
/**
+ * Returns the resource group for this intent.
+ *
+ * @return the resource group; may be null
+ */
+ public ResourceGroup resourceGroup() {
+ return resourceGroup;
+ }
+
+ /**
* Indicates whether or not the intent is installable.
*
* @return true if installable
diff --git a/core/api/src/main/java/org/onosproject/net/intent/LinkCollectionIntent.java b/core/api/src/main/java/org/onosproject/net/intent/LinkCollectionIntent.java
index 2b5d663..0361e98 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/LinkCollectionIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/LinkCollectionIntent.java
@@ -27,6 +27,7 @@
import org.onosproject.net.FilteredConnectPoint;
import org.onosproject.net.Link;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -67,6 +68,7 @@
* @param priority priority to use for the flows generated by this intent
* @param egressTreatment true if treatment should be applied by the egress device
* @param cost the cost of the links
+ * @param resourceGroup resource group for this intent
* @throws NullPointerException {@code path} is null
*/
private LinkCollectionIntent(ApplicationId appId,
@@ -80,8 +82,9 @@
List<Constraint> constraints,
int priority,
boolean egressTreatment,
- double cost) {
- super(appId, key, resources(resources, links), selector, treatment, constraints, priority);
+ double cost,
+ ResourceGroup resourceGroup) {
+ super(appId, key, resources(resources, links), selector, treatment, constraints, priority, resourceGroup);
this.links = links;
this.ingressPoints = ingressPoints;
this.egressPoints = egressPoints;
@@ -163,6 +166,11 @@
return (Builder) super.resources(resources);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the ingress point of the single point to multi point intent
* that will be built.
@@ -280,7 +288,8 @@
constraints,
priority,
egressTreatmentFlag,
- cost
+ cost,
+ resourceGroup
);
}
}
@@ -372,7 +381,8 @@
.add("links", links())
.add("ingress", ingressPoints())
.add("egress", egressPoints())
- .add("treatementOnEgress", applyTreatmentOnEgress())
+ .add("treatmentOnEgress", applyTreatmentOnEgress())
+ .add("resourceGroup", resourceGroup())
.add("cost", cost())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/MultiPointToSinglePointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/MultiPointToSinglePointIntent.java
index 3048aac..2b0e7a8 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/MultiPointToSinglePointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/MultiPointToSinglePointIntent.java
@@ -21,6 +21,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
import org.slf4j.Logger;
@@ -66,10 +67,10 @@
Set<FilteredConnectPoint> ingressPoints,
FilteredConnectPoint egressPoint,
List<Constraint> constraints,
- int priority
- ) {
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, ImmutableSet.of(), selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
checkNotNull(ingressPoints);
checkArgument(!ingressPoints.isEmpty(), "Ingress point set cannot be empty");
@@ -169,6 +170,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the ingress point of the single point to multi point intent
* that will be built.
@@ -245,7 +251,8 @@
ingressPoints,
egressPoint,
constraints,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -307,6 +314,7 @@
.add("filteredIngressCPs", filteredIngressPoints())
.add("filteredEgressCP", filteredEgressPoint())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.toString();
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalCircuitIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalCircuitIntent.java
index 3bc9db6..afe95bc 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalCircuitIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalCircuitIntent.java
@@ -20,6 +20,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.CltSignalType;
import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.ResourceGroup;
import java.util.Collections;
@@ -47,10 +48,35 @@
* @param signalType ODU signal type
* @param isBidirectional indicate if intent is bidirectional
* @param priority priority to use for flows from this intent
+ * @deprecated 1.9.1
*/
+ @Deprecated
protected OpticalCircuitIntent(ApplicationId appId, Key key, ConnectPoint src, ConnectPoint dst,
CltSignalType signalType, boolean isBidirectional, int priority) {
- super(appId, key, Collections.emptyList(), priority);
+ super(appId, key, Collections.emptyList(), priority, null);
+ this.src = checkNotNull(src);
+ this.dst = checkNotNull(dst);
+ this.signalType = checkNotNull(signalType);
+ this.isBidirectional = isBidirectional;
+ }
+
+ /**
+ * Creates an optical circuit intent between the specified
+ * connection points.
+ *
+ * @param appId application identification
+ * @param key intent key
+ * @param src the source transponder port
+ * @param dst the destination transponder port
+ * @param signalType ODU signal type
+ * @param isBidirectional indicate if intent is bidirectional
+ * @param priority priority to use for flows from this intent
+ * @param resourceGroup resource group for this intent
+ */
+ protected OpticalCircuitIntent(ApplicationId appId, Key key, ConnectPoint src, ConnectPoint dst,
+ CltSignalType signalType, boolean isBidirectional, int priority,
+ ResourceGroup resourceGroup) {
+ super(appId, key, Collections.emptyList(), priority, resourceGroup);
this.src = checkNotNull(src);
this.dst = checkNotNull(dst);
this.signalType = checkNotNull(signalType);
@@ -91,6 +117,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the source for the intent that will be built.
*
@@ -149,7 +180,8 @@
dst,
signalType,
isBidirectional,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -213,6 +245,7 @@
.add("dst", dst)
.add("signalType", signalType)
.add("isBidirectional", isBidirectional)
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
index 651ba02..05efb15 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalConnectivityIntent.java
@@ -20,6 +20,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.OduSignalType;
+import org.onosproject.net.ResourceGroup;
import java.util.Collections;
@@ -47,7 +48,9 @@
* @param signalType signal type
* @param isBidirectional indicates if intent is unidirectional
* @param priority priority to use for flows from this intent
+ * @deprecated 1.9.1
*/
+ @Deprecated
protected OpticalConnectivityIntent(ApplicationId appId,
Key key,
ConnectPoint src,
@@ -55,7 +58,35 @@
OduSignalType signalType,
boolean isBidirectional,
int priority) {
- super(appId, key, Collections.emptyList(), priority);
+ super(appId, key, Collections.emptyList(), priority, null);
+ this.src = checkNotNull(src);
+ this.dst = checkNotNull(dst);
+ this.signalType = checkNotNull(signalType);
+ this.isBidirectional = isBidirectional;
+ }
+
+ /**
+ * Creates an optical connectivity intent between the specified
+ * connection points.
+ *
+ * @param appId application identification
+ * @param key intent key
+ * @param src the source transponder port
+ * @param dst the destination transponder port
+ * @param signalType signal type
+ * @param isBidirectional indicates if intent is unidirectional
+ * @param priority priority to use for flows from this intent
+ * @param resourceGroup resource group of this intent
+ */
+ protected OpticalConnectivityIntent(ApplicationId appId,
+ Key key,
+ ConnectPoint src,
+ ConnectPoint dst,
+ OduSignalType signalType,
+ boolean isBidirectional,
+ int priority,
+ ResourceGroup resourceGroup) {
+ super(appId, key, Collections.emptyList(), priority, resourceGroup);
this.src = checkNotNull(src);
this.dst = checkNotNull(dst);
this.signalType = checkNotNull(signalType);
@@ -96,6 +127,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the source for the intent that will be built.
*
@@ -154,7 +190,8 @@
dst,
signalType,
isBidirectional,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -218,6 +255,7 @@
.add("dst", dst)
.add("signalType", signalType)
.add("isBidirectional", isBidirectional)
+ .add("resourceGroup", resourceGroup())
.toString();
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalOduIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalOduIntent.java
index 36c4dde..ec88542 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalOduIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalOduIntent.java
@@ -20,6 +20,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.CltSignalType;
import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.ResourceGroup;
import java.util.Collections;
@@ -46,15 +47,44 @@
* @param signalType CltSignalType signal type
* @param isBidirectional indicate if intent is bidirectional
* @param priority priority to use for flows from this intent
+ * @deprecated 1.9.1
+ */
+ @Deprecated
+ protected OpticalOduIntent(ApplicationId appId,
+ Key key,
+ ConnectPoint src,
+ ConnectPoint dst,
+ CltSignalType signalType,
+ boolean isBidirectional,
+ int priority) {
+ super(appId, key, Collections.emptyList(), priority, null);
+ this.src = checkNotNull(src);
+ this.dst = checkNotNull(dst);
+ this.signalType = checkNotNull(signalType);
+ this.isBidirectional = isBidirectional;
+ }
+
+ /**
+ * Creates an optical ODU intent between the specified connection points.
+ *
+ * @param appId application identification
+ * @param key intent key
+ * @param src the source transponder port
+ * @param dst the destination transponder port
+ * @param signalType CltSignalType signal type
+ * @param isBidirectional indicate if intent is bidirectional
+ * @param priority priority to use for flows from this intent
+ * @param resourceGroup resource group for this intent
*/
protected OpticalOduIntent(ApplicationId appId,
- Key key,
- ConnectPoint src,
- ConnectPoint dst,
- CltSignalType signalType,
- boolean isBidirectional,
- int priority) {
- super(appId, key, Collections.emptyList(), priority);
+ Key key,
+ ConnectPoint src,
+ ConnectPoint dst,
+ CltSignalType signalType,
+ boolean isBidirectional,
+ int priority,
+ ResourceGroup resourceGroup) {
+ super(appId, key, Collections.emptyList(), priority, resourceGroup);
this.src = checkNotNull(src);
this.dst = checkNotNull(dst);
this.signalType = checkNotNull(signalType);
@@ -95,6 +125,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the source for the intent that will be built.
*
@@ -153,7 +188,8 @@
dst,
signalType,
isBidirectional,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -217,6 +253,7 @@
.add("dst", dst)
.add("signalType", signalType)
.add("isBidirectional", isBidirectional)
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
index 1a6ee30..d42ce99 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
@@ -24,6 +24,7 @@
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.ResourceGroup;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -48,8 +49,9 @@
OchSignal lambda,
OchSignalType signalType,
boolean isBidirectional,
- int priority) {
- super(appId, key, ImmutableSet.copyOf(path.links()), priority);
+ int priority,
+ ResourceGroup resourceGroup) {
+ super(appId, key, ImmutableSet.copyOf(path.links()), priority, resourceGroup);
this.src = checkNotNull(src);
this.dst = checkNotNull(dst);
this.path = checkNotNull(path);
@@ -104,6 +106,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the source for the intent that will be built.
*
@@ -186,7 +193,8 @@
lambda,
signalType,
isBidirectional,
- priority
+ priority,
+ resourceGroup
);
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/PathIntent.java b/core/api/src/main/java/org/onosproject/net/intent/PathIntent.java
index 94a05b2..3c386cc 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/PathIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/PathIntent.java
@@ -21,6 +21,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.Link;
import org.onosproject.net.Path;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -50,7 +51,9 @@
* @param constraints optional list of constraints
* @param priority priority to use for the generated flows
* @throws NullPointerException {@code path} is null
+ * @deprecated 1.9.1
*/
+ @Deprecated
protected PathIntent(ApplicationId appId,
Key key,
TrafficSelector selector,
@@ -59,7 +62,7 @@
List<Constraint> constraints,
int priority) {
this(appId, key, selector, treatment, path, constraints, priority,
- ProtectionType.PRIMARY);
+ ProtectionType.PRIMARY, null);
}
/**
@@ -75,6 +78,7 @@
* @param constraints optional list of constraints
* @param priority priority to use for the generated flows
* @param type PRIMARY or BACKUP
+ * @param resourceGroup resource group for this intent
* @throws NullPointerException {@code path} is null
*/
protected PathIntent(ApplicationId appId,
@@ -84,9 +88,10 @@
Path path,
List<Constraint> constraints,
int priority,
- ProtectionType type) {
+ ProtectionType type,
+ ResourceGroup resourceGroup) {
super(appId, key, resources(path.links()), selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
PathIntent.validate(path.links());
this.path = path;
this.type = type;
@@ -151,6 +156,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the path of the intent that will be built.
*
@@ -182,7 +192,8 @@
path,
constraints,
priority,
- type == null ? ProtectionType.PRIMARY : type
+ type == null ? ProtectionType.PRIMARY : type,
+ resourceGroup
);
}
}
@@ -237,6 +248,7 @@
.add("constraints", constraints())
.add("path", path)
.add("type", type)
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
index ba3b2c2..77b4556 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
@@ -22,6 +22,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -92,6 +93,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the ingress point of the point to point intent that will be built.
*
@@ -140,7 +146,6 @@
return this;
}
-
/**
* Builds a point to point intent from the accumulated parameters.
*
@@ -156,7 +161,8 @@
ingressPoint,
egressPoint,
constraints,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -179,15 +185,16 @@
* {@code egressPoints} or {@code appId} is null.
*/
private PointToPointIntent(ApplicationId appId,
- Key key,
- TrafficSelector selector,
- TrafficTreatment treatment,
- FilteredConnectPoint ingressPoint,
- FilteredConnectPoint egressPoint,
- List<Constraint> constraints,
- int priority) {
+ Key key,
+ TrafficSelector selector,
+ TrafficTreatment treatment,
+ FilteredConnectPoint ingressPoint,
+ FilteredConnectPoint egressPoint,
+ List<Constraint> constraints,
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, Collections.emptyList(), selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
checkArgument(!ingressPoint.equals(egressPoint),
"ingress and egress should be different (ingress: %s, egress: %s)", ingressPoint, egressPoint);
@@ -258,6 +265,7 @@
.add("ingress", filteredIngressPoint())
.add("egress", filteredEgressPoint())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ProtectedTransportIntent.java b/core/api/src/main/java/org/onosproject/net/intent/ProtectedTransportIntent.java
index 0ef0809..afc82e5 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/ProtectedTransportIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/ProtectedTransportIntent.java
@@ -24,6 +24,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -65,9 +66,10 @@
TrafficSelector selector,
TrafficTreatment treatment,
List<Constraint> constraints,
- int priority) {
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, resources, selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
this.one = checkNotNull(one, "one cannot be null");
this.two = checkNotNull(two, "two cannot be null");
@@ -143,6 +145,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the transport endpoint device one.
*
@@ -181,7 +188,8 @@
selector,
treatment,
constraints,
- priority
+ priority,
+ resourceGroup
);
}
@@ -199,6 +207,7 @@
.add("one", one())
.add("two", two())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ProtectionEndpointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/ProtectionEndpointIntent.java
index 518db0b..e78e893 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/ProtectionEndpointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/ProtectionEndpointIntent.java
@@ -23,6 +23,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.behaviour.protection.ProtectedTransportEndpointDescription;
import com.google.common.annotations.Beta;
@@ -39,13 +40,47 @@
private final DeviceId deviceId;
private final ProtectedTransportEndpointDescription description;
-
+ /**
+ * Creates a ProtectionEndpointIntent by specific resource and description.
+ *
+ * @param appId application identification
+ * @param key intent key
+ * @param resources network resource to be set
+ * @param priority priority to use for flows from this intent
+ * @param deviceId target device id
+ * @param description protected transport endpoint description of the intent
+ * @deprecated 1.9.1
+ */
+ @Deprecated
protected ProtectionEndpointIntent(ApplicationId appId, Key key,
- Collection<NetworkResource> resources,
- int priority,
- DeviceId deviceId,
- ProtectedTransportEndpointDescription description) {
- super(appId, key, resources, priority);
+ Collection<NetworkResource> resources,
+ int priority,
+ DeviceId deviceId,
+ ProtectedTransportEndpointDescription description) {
+ super(appId, key, resources, priority, null);
+
+ this.deviceId = checkNotNull(deviceId);
+ this.description = checkNotNull(description);
+ }
+
+ /**
+ * Creates a ProtectionEndpointIntent by specific resource and description.
+ *
+ * @param appId application identification
+ * @param key intent key
+ * @param resources network resource to be set
+ * @param priority priority to use for flows from this intent
+ * @param deviceId target device id
+ * @param description protected transport endpoint description of the intent
+ * @param resourceGroup resource group for this intent
+ */
+ protected ProtectionEndpointIntent(ApplicationId appId, Key key,
+ Collection<NetworkResource> resources,
+ int priority,
+ DeviceId deviceId,
+ ProtectedTransportEndpointDescription description,
+ ResourceGroup resourceGroup) {
+ super(appId, key, resources, priority, resourceGroup);
this.deviceId = checkNotNull(deviceId);
this.description = checkNotNull(description);
@@ -146,6 +181,11 @@
return this;
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
public Builder deviceId(DeviceId deviceId) {
this.deviceId = deviceId;
return this;
@@ -163,7 +203,8 @@
resources,
priority,
deviceId,
- description);
+ description,
+ resourceGroup);
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/SinglePointToMultiPointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/SinglePointToMultiPointIntent.java
index 8431a0a..2583b8a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/SinglePointToMultiPointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/SinglePointToMultiPointIntent.java
@@ -24,6 +24,7 @@
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
import org.slf4j.Logger;
@@ -67,9 +68,10 @@
FilteredConnectPoint ingressPoint,
Set<FilteredConnectPoint> egressPoints,
List<Constraint> constraints,
- int priority) {
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, ImmutableList.of(), selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
checkNotNull(egressPoints);
checkNotNull(ingressPoint);
checkArgument(!egressPoints.isEmpty(), "Egress point set cannot be empty");
@@ -159,6 +161,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the ingress point of the single point to multi point intent
* that will be built.
@@ -221,7 +228,6 @@
return this;
}
-
/**
* Builds a single point to multi point intent from the
* accumulated parameters.
@@ -238,7 +244,8 @@
ingressPoint,
egressPoints,
constraints,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -308,6 +315,7 @@
.add("filteredIngressCPs", filteredIngressPoint())
.add("filteredEgressCP", filteredEgressPoints())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.toString();
}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/TwoWayP2PIntent.java b/core/api/src/main/java/org/onosproject/net/intent/TwoWayP2PIntent.java
index 2a47891..cc023a4 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/TwoWayP2PIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/TwoWayP2PIntent.java
@@ -21,6 +21,7 @@
import com.google.common.annotations.Beta;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -49,16 +50,18 @@
* @param treatment ingress port
* @param constraints optional prioritized list of path selection constraints
* @param priority priority to use for flows generated by this intent
+ * @param resourceGroup resource group for this intent
* @throws NullPointerException if {@code one} or {@code two} is null.
*/
private TwoWayP2PIntent(ApplicationId appId, Key key,
- ConnectPoint one, ConnectPoint two,
- TrafficSelector selector,
- TrafficTreatment treatment,
- List<Constraint> constraints,
- int priority) {
+ ConnectPoint one, ConnectPoint two,
+ TrafficSelector selector,
+ TrafficTreatment treatment,
+ List<Constraint> constraints,
+ int priority,
+ ResourceGroup resourceGroup) {
super(appId, key, Collections.emptyList(), selector, treatment, constraints,
- priority);
+ priority, resourceGroup);
// TODO: consider whether the case one and two are same is allowed
this.one = checkNotNull(one);
@@ -116,6 +119,11 @@
return (Builder) super.priority(priority);
}
+ @Override
+ public Builder resourceGroup(ResourceGroup resourceGroup) {
+ return (Builder) super.resourceGroup(resourceGroup);
+ }
+
/**
* Sets the first connection point of the two way intent that will be built.
*
@@ -153,7 +161,8 @@
selector,
treatment,
constraints,
- priority
+ priority,
+ resourceGroup
);
}
}
@@ -187,6 +196,7 @@
.add("selector", selector())
.add("treatment", treatment())
.add("constraints", constraints())
+ .add("resourceGroup", resourceGroup())
.add("one", one)
.add("two", two)
.toString();
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)
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
index 11429d4..7686a55 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
@@ -19,6 +19,7 @@
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.CoreService;
import org.onosproject.net.NetworkResource;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.intent.PointToPointIntent;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.IntentService;
@@ -45,6 +46,7 @@
protected static final String STATE = "state";
protected static final String PRIORITY = "priority";
protected static final String RESOURCES = "resources";
+ protected static final String RESOURCE_GROUP = "resourceGroup";
protected static final String MISSING_MEMBER_MESSAGE =
" member is required in Intent";
private static final String E_APP_ID_NOT_FOUND =
@@ -59,6 +61,9 @@
.put(ID, intent.id().toString())
.put(APP_ID, UrlEscapers.urlPathSegmentEscaper()
.escape(intent.appId().name()));
+ if (intent.resourceGroup() != null) {
+ result.put(RESOURCE_GROUP, intent.resourceGroup().toString());
+ }
final ArrayNode jsonResources = result.putArray(RESOURCES);
@@ -113,5 +118,13 @@
if (priorityJson != null) {
builder.priority(priorityJson.asInt());
}
+
+ JsonNode resourceGroup = json.get(IntentCodec.RESOURCE_GROUP);
+ if (resourceGroup != null) {
+ String resourceGroupId = resourceGroup.asText();
+ builder.resourceGroup(ResourceGroup.of(
+ Long.parseUnsignedLong(resourceGroupId.substring(2), 16)
+ ));
+ }
}
}
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
index f0f0046..f2283a0 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
@@ -182,6 +182,7 @@
.applyTreatmentOnEgress(true)
.constraints(intent.constraints())
.priority(intent.priority())
+ .resourceGroup(intent.resourceGroup())
.build();
}
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
index 6a0081f..0aa4e87 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
@@ -119,7 +119,10 @@
});
}
return Collections.singletonList(
- new FlowObjectiveIntent(appId, intent.key(), devices, objectives, intent.resources()));
+ new FlowObjectiveIntent(appId, intent.key(), devices,
+ objectives,
+ intent.resources(),
+ intent.resourceGroup()));
}
@Override
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
index 758c21b5..3b4dca9 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
@@ -122,6 +122,7 @@
.filteredEgressPoints(ImmutableSet.of(intent.filteredEgressPoint()))
.priority(intent.priority())
.constraints(intent.constraints())
+ .resourceGroup(intent.resourceGroup())
.build();
return Collections.singletonList(result);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
index a2c26dd..0b0569a 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
@@ -88,7 +88,9 @@
intent.key(),
rules,
intent.resources(),
- intent.type()));
+ intent.type(),
+ intent.resourceGroup()
+ ));
}
@Override
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
index 521d6fc..7c466285 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
@@ -93,7 +93,9 @@
intent.key(),
devices,
objectives,
- intent.resources()));
+ intent.resources(),
+ intent.resourceGroup()
+ ));
}
@Override
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
index c3fc348..94fe6ed 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
@@ -259,7 +259,8 @@
intent.key(),
createFailoverFlowRules(intent),
asList(ingressPoint.deviceId()),
- PathIntent.ProtectionType.FAILOVER);
+ PathIntent.ProtectionType.FAILOVER,
+ intent.resourceGroup());
intentList.add(frIntent);
} else {
updateFailoverGroup(intent, links);
@@ -320,6 +321,7 @@
.constraints(intent.constraints())
.priority(intent.priority())
.setType(type)
+ .resourceGroup(intent.resourceGroup())
.build();
}
@@ -353,6 +355,7 @@
.constraints(intent.constraints())
.priority(intent.priority())
.cost(cost)
+ .resourceGroup(intent.resourceGroup())
.build();
}
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
index a3f7c49..504e4f3 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
@@ -101,6 +101,7 @@
.priority(intent.priority())
.applyTreatmentOnEgress(true)
.constraints(intent.constraints())
+ .resourceGroup(intent.resourceGroup())
.build();
return Collections.singletonList(result);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
index 6deba8f..862a845 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
@@ -54,6 +54,7 @@
.egressPoint(intent.two())
.constraints(intent.constraints())
.priority(intent.priority())
+ .resourceGroup(intent.resourceGroup())
.build(),
PointToPointIntent.builder()
.appId(intent.appId())
@@ -64,6 +65,7 @@
.egressPoint(intent.one())
.constraints(intent.constraints())
.priority(intent.priority())
+ .resourceGroup(intent.resourceGroup())
.build());
}
}
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
index 5eac0d4..2222b50 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
@@ -180,6 +180,7 @@
.constraints(intent.constraints())
.selector(intent.selector())
.treatment(intent.treatment())
+ .resourceGroup(intent.resourceGroup())
.build();
log.debug("Submitting physical intent: " + physicalIntent);
intentService.submit(physicalIntent);
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 1ea18a0..4db7a11 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -86,6 +86,7 @@
import org.onosproject.net.OtuSignalType;
import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
+import org.onosproject.net.ResourceGroup;
import org.onosproject.net.TributarySlot;
import org.onosproject.net.behaviour.protection.ProtectedTransportEndpointDescription;
import org.onosproject.net.device.DefaultDeviceDescription;
@@ -469,6 +470,7 @@
ContinuousResourceId.class,
ResourceAllocation.class,
ResourceConsumerId.class,
+ ResourceGroup.class,
// Constraints
BandwidthConstraint.class,
LinkTypeConstraint.class,