Sho SHIMIZU
Committed by Gerrit Code Review

Make MPLS label request specifiable for a particular MPLS label

Change-Id: I4626229040c61e927a468ab5c486a907af0108ae
...@@ -16,49 +16,47 @@ ...@@ -16,49 +16,47 @@
16 package org.onosproject.net.resource.link; 16 package org.onosproject.net.resource.link;
17 17
18 import java.util.Collection; 18 import java.util.Collection;
19 +import java.util.HashMap;
19 import java.util.HashSet; 20 import java.util.HashSet;
21 +import java.util.Map;
20 import java.util.Set; 22 import java.util.Set;
21 import java.util.Objects; 23 import java.util.Objects;
24 +import java.util.stream.Collectors;
22 25
23 import com.google.common.annotations.Beta; 26 import com.google.common.annotations.Beta;
27 +import com.google.common.collect.ImmutableMap;
24 import org.onlab.util.Bandwidth; 28 import org.onlab.util.Bandwidth;
25 import org.onosproject.net.Link; 29 import org.onosproject.net.Link;
26 import org.onosproject.net.intent.Constraint; 30 import org.onosproject.net.intent.Constraint;
27 import org.onosproject.net.intent.IntentId; 31 import org.onosproject.net.intent.IntentId;
28 32
29 -import com.google.common.collect.ImmutableSet;
30 -
31 import org.onosproject.net.intent.constraint.BandwidthConstraint; 33 import org.onosproject.net.intent.constraint.BandwidthConstraint;
32 import org.onosproject.net.intent.constraint.LambdaConstraint; 34 import org.onosproject.net.intent.constraint.LambdaConstraint;
33 import org.onosproject.net.resource.ResourceRequest; 35 import org.onosproject.net.resource.ResourceRequest;
34 import org.onosproject.net.resource.ResourceType; 36 import org.onosproject.net.resource.ResourceType;
35 37
38 +import static com.google.common.base.Preconditions.checkNotNull;
39 +
36 /** 40 /**
37 * Implementation of {@link LinkResourceRequest}. 41 * Implementation of {@link LinkResourceRequest}.
38 */ 42 */
39 public final class DefaultLinkResourceRequest implements LinkResourceRequest { 43 public final class DefaultLinkResourceRequest implements LinkResourceRequest {
40 44
41 private final IntentId intentId; 45 private final IntentId intentId;
42 - private final Collection<Link> links; 46 + protected final Map<Link, Set<ResourceRequest>> requests;
43 - private final Set<ResourceRequest> resources;
44 47
45 /** 48 /**
46 - * Creates a new link resource request with the given ID, links, and 49 + * Creates a new link resource request with the specified Intent ID,
47 - * resource requests. 50 + * and resource requests over links.
48 * 51 *
49 - * @param intentId intent ID related to this request 52 + * @param intentId intent ID associated with this request
50 - * @param links a set of links for the request 53 + * @param requests resource requests over links
51 - * @param resources a set of resources to be requested
52 */ 54 */
53 - private DefaultLinkResourceRequest(IntentId intentId, 55 + private DefaultLinkResourceRequest(IntentId intentId, Map<Link, Set<ResourceRequest>> requests) {
54 - Collection<Link> links, 56 + this.intentId = checkNotNull(intentId);
55 - Set<ResourceRequest> resources) { 57 + this.requests = checkNotNull(ImmutableMap.copyOf(requests));
56 - this.intentId = intentId;
57 - this.links = ImmutableSet.copyOf(links);
58 - this.resources = ImmutableSet.copyOf(resources);
59 } 58 }
60 59
61 -
62 @Override 60 @Override
63 public ResourceType type() { 61 public ResourceType type() {
64 return null; 62 return null;
...@@ -71,12 +69,19 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -71,12 +69,19 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
71 69
72 @Override 70 @Override
73 public Collection<Link> links() { 71 public Collection<Link> links() {
74 - return links; 72 + return requests.keySet();
75 } 73 }
76 74
77 @Override 75 @Override
78 public Set<ResourceRequest> resources() { 76 public Set<ResourceRequest> resources() {
79 - return resources; 77 + return requests.values().stream()
78 + .flatMap(Collection::stream)
79 + .collect(Collectors.toSet());
80 + }
81 +
82 + @Override
83 + public Set<ResourceRequest> resources(Link link) {
84 + return requests.get(link);
80 } 85 }
81 86
82 /** 87 /**
...@@ -96,8 +101,7 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -96,8 +101,7 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
96 */ 101 */
97 public static final class Builder implements LinkResourceRequest.Builder { 102 public static final class Builder implements LinkResourceRequest.Builder {
98 private IntentId intentId; 103 private IntentId intentId;
99 - private Collection<Link> links; 104 + private Map<Link, Set<ResourceRequest>> requests;
100 - private Set<ResourceRequest> resources;
101 105
102 /** 106 /**
103 * Creates a new link resource request. 107 * Creates a new link resource request.
...@@ -107,8 +111,10 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -107,8 +111,10 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
107 */ 111 */
108 private Builder(IntentId intentId, Collection<Link> links) { 112 private Builder(IntentId intentId, Collection<Link> links) {
109 this.intentId = intentId; 113 this.intentId = intentId;
110 - this.links = links; 114 + this.requests = new HashMap<>();
111 - this.resources = new HashSet<>(); 115 + for (Link link : links) {
116 + requests.put(link, new HashSet<>());
117 + }
112 } 118 }
113 119
114 /** 120 /**
...@@ -120,14 +126,18 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -120,14 +126,18 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
120 @Deprecated 126 @Deprecated
121 @Override 127 @Override
122 public Builder addLambdaRequest() { 128 public Builder addLambdaRequest() {
123 - resources.add(new LambdaResourceRequest()); 129 + for (Link link : requests.keySet()) {
130 + requests.get(link).add(new LambdaResourceRequest());
131 + }
124 return this; 132 return this;
125 } 133 }
126 134
127 @Beta 135 @Beta
128 @Override 136 @Override
129 public LinkResourceRequest.Builder addLambdaRequest(LambdaResource lambda) { 137 public LinkResourceRequest.Builder addLambdaRequest(LambdaResource lambda) {
130 - resources.add(new LambdaResourceRequest(lambda)); 138 + for (Link link : requests.keySet()) {
139 + requests.get(link).add(new LambdaResourceRequest(lambda));
140 + }
131 return this; 141 return this;
132 } 142 }
133 143
...@@ -135,10 +145,36 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -135,10 +145,36 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
135 * Adds Mpls request. 145 * Adds Mpls request.
136 * 146 *
137 * @return self 147 * @return self
148 + * @deprecated in Emu Release
138 */ 149 */
150 + @Deprecated
139 @Override 151 @Override
140 public Builder addMplsRequest() { 152 public Builder addMplsRequest() {
141 - resources.add(new MplsLabelResourceRequest()); 153 + for (Link link : requests.keySet()) {
154 + requests.get(link).add(new MplsLabelResourceRequest());
155 + }
156 + return this;
157 + }
158 +
159 + @Beta
160 + @Override
161 + public Builder addMplsRequest(MplsLabel label) {
162 + for (Link link : requests.keySet()) {
163 + requests.get(link).add(new MplsLabelResourceRequest(label));
164 + }
165 + return this;
166 + }
167 +
168 + @Beta
169 + @Override
170 + public LinkResourceRequest.Builder addMplsRequest(Map<Link, MplsLabel> labels) {
171 + for (Link link : labels.keySet()) {
172 + if (!requests.containsKey(link)) {
173 + requests.put(link, new HashSet<>());
174 + }
175 + requests.get(link).add(new MplsLabelResourceRequest(labels.get(link)));
176 + }
177 +
142 return this; 178 return this;
143 } 179 }
144 180
...@@ -150,7 +186,9 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -150,7 +186,9 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
150 */ 186 */
151 @Override 187 @Override
152 public Builder addBandwidthRequest(double bandwidth) { 188 public Builder addBandwidthRequest(double bandwidth) {
153 - resources.add(new BandwidthResourceRequest(new BandwidthResource(Bandwidth.bps(bandwidth)))); 189 + for (Link link : requests.keySet()) {
190 + requests.get(link).add(new BandwidthResourceRequest(new BandwidthResource(Bandwidth.bps(bandwidth))));
191 + }
154 return this; 192 return this;
155 } 193 }
156 194
...@@ -172,13 +210,13 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -172,13 +210,13 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
172 */ 210 */
173 @Override 211 @Override
174 public LinkResourceRequest build() { 212 public LinkResourceRequest build() {
175 - return new DefaultLinkResourceRequest(intentId, links, resources); 213 + return new DefaultLinkResourceRequest(intentId, requests);
176 } 214 }
177 } 215 }
178 216
179 @Override 217 @Override
180 public int hashCode() { 218 public int hashCode() {
181 - return Objects.hash(intentId, links); 219 + return Objects.hash(intentId, links());
182 } 220 }
183 221
184 @Override 222 @Override
...@@ -191,6 +229,6 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest { ...@@ -191,6 +229,6 @@ public final class DefaultLinkResourceRequest implements LinkResourceRequest {
191 } 229 }
192 final DefaultLinkResourceRequest other = (DefaultLinkResourceRequest) obj; 230 final DefaultLinkResourceRequest other = (DefaultLinkResourceRequest) obj;
193 return Objects.equals(this.intentId, other.intentId) 231 return Objects.equals(this.intentId, other.intentId)
194 - && Objects.equals(this.links, other.links); 232 + && Objects.equals(this.links(), other.links());
195 } 233 }
196 } 234 }
......
...@@ -15,15 +15,16 @@ ...@@ -15,15 +15,16 @@
15 */ 15 */
16 package org.onosproject.net.resource.link; 16 package org.onosproject.net.resource.link;
17 17
18 +import java.util.Collection;
19 +import java.util.Map;
20 +import java.util.Set;
21 +
18 import com.google.common.annotations.Beta; 22 import com.google.common.annotations.Beta;
19 import org.onosproject.net.Link; 23 import org.onosproject.net.Link;
20 import org.onosproject.net.intent.Constraint; 24 import org.onosproject.net.intent.Constraint;
21 import org.onosproject.net.intent.IntentId; 25 import org.onosproject.net.intent.IntentId;
22 import org.onosproject.net.resource.ResourceRequest; 26 import org.onosproject.net.resource.ResourceRequest;
23 27
24 -import java.util.Collection;
25 -import java.util.Set;
26 -
27 /** 28 /**
28 * Representation of a request for link resource. 29 * Representation of a request for link resource.
29 */ 30 */
...@@ -51,6 +52,15 @@ public interface LinkResourceRequest extends ResourceRequest { ...@@ -51,6 +52,15 @@ public interface LinkResourceRequest extends ResourceRequest {
51 Set<ResourceRequest> resources(); 52 Set<ResourceRequest> resources();
52 53
53 /** 54 /**
55 + * Returns the set of resource request against the specified link.
56 + *
57 + * @param link link whose associated resource request is to be returned
58 + * @return set of resource request against the specified link
59 + */
60 + @Beta
61 + Set<ResourceRequest> resources(Link link);
62 +
63 + /**
54 * Builder of link resource request. 64 * Builder of link resource request.
55 */ 65 */
56 interface Builder { 66 interface Builder {
...@@ -76,10 +86,30 @@ public interface LinkResourceRequest extends ResourceRequest { ...@@ -76,10 +86,30 @@ public interface LinkResourceRequest extends ResourceRequest {
76 * Adds MPLS request. 86 * Adds MPLS request.
77 * 87 *
78 * @return self 88 * @return self
89 + * @deprecated in Emu Release
79 */ 90 */
91 + @Deprecated
80 Builder addMplsRequest(); 92 Builder addMplsRequest();
81 93
82 /** 94 /**
95 + * Adds MPLS request.
96 + *
97 + * @param label MPLS label to be requested
98 + * @return self
99 + */
100 + @Beta
101 + Builder addMplsRequest(MplsLabel label);
102 +
103 + /**
104 + * Adds MPLS request against the specified links.
105 + *
106 + * @param labels MPLS labels to be requested against links
107 + * @return self
108 + */
109 + @Beta
110 + Builder addMplsRequest(Map<Link, MplsLabel> labels);
111 +
112 + /**
83 * Adds bandwidth request with bandwidth value. 113 * Adds bandwidth request with bandwidth value.
84 * 114 *
85 * @param bandwidth bandwidth value to be requested 115 * @param bandwidth bandwidth value to be requested
......
...@@ -15,15 +15,50 @@ ...@@ -15,15 +15,50 @@
15 */ 15 */
16 package org.onosproject.net.resource.link; 16 package org.onosproject.net.resource.link;
17 17
18 +import com.google.common.annotations.Beta;
18 import com.google.common.base.MoreObjects; 19 import com.google.common.base.MoreObjects;
19 import org.onosproject.net.resource.ResourceRequest; 20 import org.onosproject.net.resource.ResourceRequest;
20 import org.onosproject.net.resource.ResourceType; 21 import org.onosproject.net.resource.ResourceType;
21 22
23 +import static com.google.common.base.Preconditions.checkNotNull;
24 +
22 /** 25 /**
23 * Representation of a request for lambda resource. 26 * Representation of a request for lambda resource.
24 */ 27 */
25 public class MplsLabelResourceRequest implements ResourceRequest { 28 public class MplsLabelResourceRequest implements ResourceRequest {
26 29
30 + private final MplsLabel mplsLabel;
31 +
32 + /**
33 + * Constructs a request specifying the given MPLS label.
34 + *
35 + * @param mplsLabel MPLS label to be requested
36 + */
37 + @Beta
38 + public MplsLabelResourceRequest(MplsLabel mplsLabel) {
39 + this.mplsLabel = checkNotNull(mplsLabel);
40 + }
41 +
42 + /**
43 + * Constructs a request asking an arbitrary available MPLS label.
44 + *
45 + * @deprecated in Emu Release
46 + */
47 + @Deprecated
48 + public MplsLabelResourceRequest() {
49 + this.mplsLabel = null;
50 + }
51 +
52 + /**
53 + * Returns the MPLS label this request expects.
54 + *
55 + * @return the MPLS label this request expects
56 + */
57 + @Beta
58 + public MplsLabel mplsLabel() {
59 + return mplsLabel;
60 + }
61 +
27 @Override 62 @Override
28 public ResourceType type() { 63 public ResourceType type() {
29 return ResourceType.MPLS_LABEL; 64 return ResourceType.MPLS_LABEL;
...@@ -32,6 +67,7 @@ public class MplsLabelResourceRequest implements ResourceRequest { ...@@ -32,6 +67,7 @@ public class MplsLabelResourceRequest implements ResourceRequest {
32 @Override 67 @Override
33 public String toString() { 68 public String toString() {
34 return MoreObjects.toStringHelper(this) 69 return MoreObjects.toStringHelper(this)
70 + .add("mplsLabel", mplsLabel)
35 .toString(); 71 .toString();
36 } 72 }
37 } 73 }
......
...@@ -48,8 +48,8 @@ import org.slf4j.Logger; ...@@ -48,8 +48,8 @@ import org.slf4j.Logger;
48 import java.util.Collections; 48 import java.util.Collections;
49 import java.util.HashMap; 49 import java.util.HashMap;
50 import java.util.HashSet; 50 import java.util.HashSet;
51 -import java.util.Iterator;
52 import java.util.Map; 51 import java.util.Map;
52 +import java.util.Optional;
53 import java.util.Set; 53 import java.util.Set;
54 54
55 import static org.onosproject.security.AppGuard.checkPermission; 55 import static org.onosproject.security.AppGuard.checkPermission;
...@@ -130,12 +130,15 @@ public class LinkResourceManager ...@@ -130,12 +130,15 @@ public class LinkResourceManager
130 if (allocsPerLink.get(link) == null) { 130 if (allocsPerLink.get(link) == null) {
131 allocsPerLink.put(link, new HashSet<>()); 131 allocsPerLink.put(link, new HashSet<>());
132 } 132 }
133 - Iterator<MplsLabel> mplsIter = getAvailableMplsLabels(link) 133 +
134 - .iterator(); 134 + Optional<MplsLabel> label = req.resources(link).stream()
135 - if (mplsIter.hasNext()) { 135 + .filter(x -> x.type() == ResourceType.MPLS_LABEL)
136 - allocsPerLink.get(link) 136 + .map(x -> (MplsLabelResourceRequest) x)
137 - .add(new MplsLabelResourceAllocation(mplsIter 137 + .map(MplsLabelResourceRequest::mplsLabel)
138 - .next())); 138 + .findFirst();
139 +
140 + if (label.isPresent()) {
141 + allocsPerLink.get(link).add(new MplsLabelResourceAllocation(label.get()));
139 } else { 142 } else {
140 log.info("Failed to allocate MPLS resource."); 143 log.info("Failed to allocate MPLS resource.");
141 break; 144 break;
...@@ -214,7 +217,8 @@ public class LinkResourceManager ...@@ -214,7 +217,8 @@ public class LinkResourceManager
214 ((LambdaResourceAllocation) alloc).lambda())); 217 ((LambdaResourceAllocation) alloc).lambda()));
215 break; 218 break;
216 case MPLS_LABEL: 219 case MPLS_LABEL:
217 - result.add(new MplsLabelResourceRequest()); 220 + result.add(new MplsLabelResourceRequest(
221 + ((MplsLabelResourceAllocation) alloc).mplsLabel()));
218 break; 222 break;
219 default: 223 default:
220 break; 224 break;
......