blob: 607171791ec8fc5c625768a48ea7bf5e6b01fb1b [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connor6de2e202015-05-21 14:30:41 -070016package org.onosproject.net.resource.link;
Toshio Koide65e890f2014-10-23 12:02:25 -070017
18import java.util.Collection;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070019import java.util.HashMap;
Toshio Koide65e890f2014-10-23 12:02:25 -070020import java.util.HashSet;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070021import java.util.Map;
Toshio Koide65e890f2014-10-23 12:02:25 -070022import java.util.Set;
Ayaka Koshibee114f042015-05-01 11:43:00 -070023import java.util.Objects;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070024import java.util.stream.Collectors;
Toshio Koide65e890f2014-10-23 12:02:25 -070025
Sho SHIMIZUc25a0082015-10-27 17:06:29 -070026import com.google.common.annotations.Beta;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070027import com.google.common.collect.ImmutableMap;
Sho SHIMIZU6d01d3d2015-05-08 14:08:36 -070028import org.onlab.util.Bandwidth;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.net.Link;
30import org.onosproject.net.intent.Constraint;
31import org.onosproject.net.intent.IntentId;
Toshio Koide65e890f2014-10-23 12:02:25 -070032
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.intent.constraint.BandwidthConstraint;
Brian O'Connor6de2e202015-05-21 14:30:41 -070034import org.onosproject.net.resource.ResourceRequest;
35import org.onosproject.net.resource.ResourceType;
Toshio Koide65e890f2014-10-23 12:02:25 -070036
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070037import static com.google.common.base.Preconditions.checkNotNull;
38
Toshio Koide65e890f2014-10-23 12:02:25 -070039/**
40 * Implementation of {@link LinkResourceRequest}.
Sho SHIMIZU364cbac2015-10-29 15:47:35 -070041 *
42 * @deprecated in Emu Release
Toshio Koide65e890f2014-10-23 12:02:25 -070043 */
Sho SHIMIZU364cbac2015-10-29 15:47:35 -070044@Deprecated
Toshio Koide65e890f2014-10-23 12:02:25 -070045public final class DefaultLinkResourceRequest implements LinkResourceRequest {
46
47 private final IntentId intentId;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070048 protected final Map<Link, Set<ResourceRequest>> requests;
Toshio Koide65e890f2014-10-23 12:02:25 -070049
50 /**
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070051 * Creates a new link resource request with the specified Intent ID,
52 * and resource requests over links.
Toshio Koide65e890f2014-10-23 12:02:25 -070053 *
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070054 * @param intentId intent ID associated with this request
55 * @param requests resource requests over links
Toshio Koide65e890f2014-10-23 12:02:25 -070056 */
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070057 private DefaultLinkResourceRequest(IntentId intentId, Map<Link, Set<ResourceRequest>> requests) {
58 this.intentId = checkNotNull(intentId);
59 this.requests = checkNotNull(ImmutableMap.copyOf(requests));
Toshio Koide65e890f2014-10-23 12:02:25 -070060 }
61
Toshio Koideca0fcff2014-10-23 14:08:36 -070062 @Override
63 public ResourceType type() {
64 return null;
65 }
66
Toshio Koide65e890f2014-10-23 12:02:25 -070067 @Override
Ayaka Koshibee114f042015-05-01 11:43:00 -070068 public IntentId intentId() {
Toshio Koide65e890f2014-10-23 12:02:25 -070069 return intentId;
70 }
71
72 @Override
73 public Collection<Link> links() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070074 return requests.keySet();
Toshio Koide65e890f2014-10-23 12:02:25 -070075 }
76
77 @Override
78 public Set<ResourceRequest> resources() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -070079 return requests.values().stream()
80 .flatMap(Collection::stream)
81 .collect(Collectors.toSet());
82 }
83
84 @Override
85 public Set<ResourceRequest> resources(Link link) {
86 return requests.get(link);
Toshio Koide65e890f2014-10-23 12:02:25 -070087 }
88
89 /**
90 * Returns builder of link resource request.
91 *
92 * @param intentId intent ID related to this request
93 * @param links a set of links for the request
94 * @return builder of link resource request
95 */
96 public static LinkResourceRequest.Builder builder(
97 IntentId intentId, Collection<Link> links) {
98 return new Builder(intentId, links);
99 }
100
101 /**
102 * Builder of link resource request.
103 */
104 public static final class Builder implements LinkResourceRequest.Builder {
105 private IntentId intentId;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700106 private Map<Link, Set<ResourceRequest>> requests;
Toshio Koide65e890f2014-10-23 12:02:25 -0700107
108 /**
109 * Creates a new link resource request.
110 *
111 * @param intentId intent ID related to this request
112 * @param links a set of links for the request
113 */
114 private Builder(IntentId intentId, Collection<Link> links) {
115 this.intentId = intentId;
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700116 this.requests = new HashMap<>();
117 for (Link link : links) {
118 requests.put(link, new HashSet<>());
119 }
Toshio Koide65e890f2014-10-23 12:02:25 -0700120 }
121
122 /**
123 * Adds lambda request.
124 *
125 * @return self
Sho SHIMIZUc25a0082015-10-27 17:06:29 -0700126 * @deprecated in Emu Release
Toshio Koide65e890f2014-10-23 12:02:25 -0700127 */
Sho SHIMIZUc25a0082015-10-27 17:06:29 -0700128 @Deprecated
Toshio Koide65e890f2014-10-23 12:02:25 -0700129 @Override
130 public Builder addLambdaRequest() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700131 for (Link link : requests.keySet()) {
132 requests.get(link).add(new LambdaResourceRequest());
133 }
Toshio Koide65e890f2014-10-23 12:02:25 -0700134 return this;
135 }
136
Sho SHIMIZUc25a0082015-10-27 17:06:29 -0700137 @Beta
138 @Override
139 public LinkResourceRequest.Builder addLambdaRequest(LambdaResource lambda) {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700140 for (Link link : requests.keySet()) {
141 requests.get(link).add(new LambdaResourceRequest(lambda));
142 }
Sho SHIMIZUc25a0082015-10-27 17:06:29 -0700143 return this;
144 }
145
Toshio Koide65e890f2014-10-23 12:02:25 -0700146 /**
Michele Santuari4b6019e2014-12-19 11:31:45 +0100147 * Adds Mpls request.
148 *
149 * @return self
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700150 * @deprecated in Emu Release
Michele Santuari4b6019e2014-12-19 11:31:45 +0100151 */
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700152 @Deprecated
Michele Santuari4b6019e2014-12-19 11:31:45 +0100153 @Override
154 public Builder addMplsRequest() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700155 for (Link link : requests.keySet()) {
156 requests.get(link).add(new MplsLabelResourceRequest());
157 }
158 return this;
159 }
160
161 @Beta
162 @Override
163 public Builder addMplsRequest(MplsLabel label) {
164 for (Link link : requests.keySet()) {
165 requests.get(link).add(new MplsLabelResourceRequest(label));
166 }
167 return this;
168 }
169
170 @Beta
171 @Override
172 public LinkResourceRequest.Builder addMplsRequest(Map<Link, MplsLabel> labels) {
173 for (Link link : labels.keySet()) {
174 if (!requests.containsKey(link)) {
175 requests.put(link, new HashSet<>());
176 }
177 requests.get(link).add(new MplsLabelResourceRequest(labels.get(link)));
178 }
179
Michele Santuari4b6019e2014-12-19 11:31:45 +0100180 return this;
181 }
182
183 /**
Toshio Koide65e890f2014-10-23 12:02:25 -0700184 * Adds bandwidth request with bandwidth value.
185 *
Ray Milkeycf590df2015-02-23 17:43:24 -0800186 * @param bandwidth bandwidth value in bits per second to be requested
Toshio Koide65e890f2014-10-23 12:02:25 -0700187 * @return self
188 */
189 @Override
190 public Builder addBandwidthRequest(double bandwidth) {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700191 for (Link link : requests.keySet()) {
192 requests.get(link).add(new BandwidthResourceRequest(new BandwidthResource(Bandwidth.bps(bandwidth))));
193 }
Toshio Koide65e890f2014-10-23 12:02:25 -0700194 return this;
195 }
196
Thomas Vachuskaedc944c2014-11-04 15:42:25 -0800197 @Override
198 public LinkResourceRequest.Builder addConstraint(Constraint constraint) {
Sho SHIMIZU4e2149e2016-02-22 14:42:34 -0800199 if (constraint instanceof BandwidthConstraint) {
Thomas Vachuskaedc944c2014-11-04 15:42:25 -0800200 BandwidthConstraint bw = (BandwidthConstraint) constraint;
Sho SHIMIZUa88db492015-11-23 13:21:04 -0800201 return addBandwidthRequest(bw.bandwidth().bps());
Thomas Vachuskaedc944c2014-11-04 15:42:25 -0800202 }
203 return this;
204 }
205
Toshio Koide65e890f2014-10-23 12:02:25 -0700206 /**
207 * Returns link resource request.
208 *
209 * @return link resource request
210 */
211 @Override
212 public LinkResourceRequest build() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700213 return new DefaultLinkResourceRequest(intentId, requests);
Toshio Koide65e890f2014-10-23 12:02:25 -0700214 }
215 }
216
Ayaka Koshibee114f042015-05-01 11:43:00 -0700217 @Override
218 public int hashCode() {
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700219 return Objects.hash(intentId, links());
Ayaka Koshibee114f042015-05-01 11:43:00 -0700220 }
221
222 @Override
223 public boolean equals(Object obj) {
224 if (this == obj) {
225 return true;
226 }
227 if (obj == null || getClass() != obj.getClass()) {
228 return false;
229 }
230 final DefaultLinkResourceRequest other = (DefaultLinkResourceRequest) obj;
231 return Objects.equals(this.intentId, other.intentId)
Sho SHIMIZU81cdc392015-10-27 15:18:49 -0700232 && Objects.equals(this.links(), other.links());
Ayaka Koshibee114f042015-05-01 11:43:00 -0700233 }
Toshio Koide65e890f2014-10-23 12:02:25 -0700234}