f8e143a41cd881930a1fd3342aab87180952b34e
[onosfw.git] /
1 /*
2  * Copyright 2014-2015 Open Networking Laboratory
3  *
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  */
16 package org.onosproject.net.resource.link;
17
18 import java.util.Collection;
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.Map;
22 import java.util.Set;
23 import java.util.Objects;
24 import java.util.stream.Collectors;
25
26 import com.google.common.annotations.Beta;
27 import com.google.common.collect.ImmutableMap;
28 import org.onlab.util.Bandwidth;
29 import org.onosproject.net.Link;
30 import org.onosproject.net.intent.Constraint;
31 import org.onosproject.net.intent.IntentId;
32
33 import org.onosproject.net.intent.constraint.BandwidthConstraint;
34 import org.onosproject.net.intent.constraint.LambdaConstraint;
35 import org.onosproject.net.resource.ResourceRequest;
36 import org.onosproject.net.resource.ResourceType;
37
38 import static com.google.common.base.Preconditions.checkNotNull;
39
40 /**
41  * Implementation of {@link LinkResourceRequest}.
42  */
43 public final class DefaultLinkResourceRequest implements LinkResourceRequest {
44
45     private final IntentId intentId;
46     protected final Map<Link, Set<ResourceRequest>> requests;
47
48     /**
49      * Creates a new link resource request with the specified Intent ID,
50      * and resource requests over links.
51      *
52      * @param intentId intent ID associated with this request
53      * @param requests resource requests over links
54      */
55     private DefaultLinkResourceRequest(IntentId intentId, Map<Link, Set<ResourceRequest>> requests) {
56         this.intentId = checkNotNull(intentId);
57         this.requests = checkNotNull(ImmutableMap.copyOf(requests));
58     }
59
60     @Override
61     public ResourceType type() {
62         return null;
63     }
64
65     @Override
66     public IntentId intentId() {
67         return intentId;
68     }
69
70     @Override
71     public Collection<Link> links() {
72         return requests.keySet();
73     }
74
75     @Override
76     public Set<ResourceRequest> 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);
85     }
86
87     /**
88      * Returns builder of link resource request.
89      *
90      * @param intentId intent ID related to this request
91      * @param links a set of links for the request
92      * @return builder of link resource request
93      */
94     public static LinkResourceRequest.Builder builder(
95             IntentId intentId, Collection<Link> links) {
96         return new Builder(intentId, links);
97     }
98
99     /**
100      * Builder of link resource request.
101      */
102     public static final class Builder implements LinkResourceRequest.Builder {
103         private IntentId intentId;
104         private Map<Link, Set<ResourceRequest>> requests;
105
106         /**
107          * Creates a new link resource request.
108          *
109          * @param intentId intent ID related to this request
110          * @param links a set of links for the request
111          */
112         private Builder(IntentId intentId, Collection<Link> links) {
113             this.intentId = intentId;
114             this.requests = new HashMap<>();
115             for (Link link : links) {
116                 requests.put(link, new HashSet<>());
117             }
118         }
119
120         /**
121          * Adds lambda request.
122          *
123          * @return self
124          * @deprecated in Emu Release
125          */
126         @Deprecated
127         @Override
128         public Builder addLambdaRequest() {
129             for (Link link : requests.keySet()) {
130                 requests.get(link).add(new LambdaResourceRequest());
131             }
132             return this;
133         }
134
135         @Beta
136         @Override
137         public LinkResourceRequest.Builder addLambdaRequest(LambdaResource lambda) {
138             for (Link link : requests.keySet()) {
139                 requests.get(link).add(new LambdaResourceRequest(lambda));
140             }
141             return this;
142         }
143
144         /**
145          * Adds Mpls request.
146          *
147          * @return self
148          * @deprecated in Emu Release
149          */
150         @Deprecated
151         @Override
152         public Builder addMplsRequest() {
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
178             return this;
179         }
180
181         /**
182          * Adds bandwidth request with bandwidth value.
183          *
184          * @param bandwidth bandwidth value in bits per second to be requested
185          * @return self
186          */
187         @Override
188         public Builder addBandwidthRequest(double bandwidth) {
189             for (Link link : requests.keySet()) {
190                 requests.get(link).add(new BandwidthResourceRequest(new BandwidthResource(Bandwidth.bps(bandwidth))));
191             }
192             return this;
193         }
194
195         @Override
196         public LinkResourceRequest.Builder addConstraint(Constraint constraint) {
197             if (constraint instanceof LambdaConstraint) {
198                 return addLambdaRequest();
199             } else if (constraint instanceof BandwidthConstraint) {
200                 BandwidthConstraint bw = (BandwidthConstraint) constraint;
201                 return addBandwidthRequest(bw.bandwidth().toDouble());
202             }
203             return this;
204         }
205
206         /**
207          * Returns link resource request.
208          *
209          * @return link resource request
210          */
211         @Override
212         public LinkResourceRequest build() {
213             return new DefaultLinkResourceRequest(intentId, requests);
214         }
215     }
216
217     @Override
218     public int hashCode() {
219         return Objects.hash(intentId, links());
220     }
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)
232                 && Objects.equals(this.links(), other.links());
233     }
234 }