b57465f28e0dcca1710292f040b770e534a22519
[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  * @deprecated in Emu Release
44  */
45 @Deprecated
46 public final class DefaultLinkResourceRequest implements LinkResourceRequest {
47
48     private final IntentId intentId;
49     protected final Map<Link, Set<ResourceRequest>> requests;
50
51     /**
52      * Creates a new link resource request with the specified Intent ID,
53      * and resource requests over links.
54      *
55      * @param intentId intent ID associated with this request
56      * @param requests resource requests over links
57      */
58     private DefaultLinkResourceRequest(IntentId intentId, Map<Link, Set<ResourceRequest>> requests) {
59         this.intentId = checkNotNull(intentId);
60         this.requests = checkNotNull(ImmutableMap.copyOf(requests));
61     }
62
63     @Override
64     public ResourceType type() {
65         return null;
66     }
67
68     @Override
69     public IntentId intentId() {
70         return intentId;
71     }
72
73     @Override
74     public Collection<Link> links() {
75         return requests.keySet();
76     }
77
78     @Override
79     public Set<ResourceRequest> resources() {
80         return requests.values().stream()
81                 .flatMap(Collection::stream)
82                 .collect(Collectors.toSet());
83     }
84
85     @Override
86     public Set<ResourceRequest> resources(Link link) {
87         return requests.get(link);
88     }
89
90     /**
91      * Returns builder of link resource request.
92      *
93      * @param intentId intent ID related to this request
94      * @param links a set of links for the request
95      * @return builder of link resource request
96      */
97     public static LinkResourceRequest.Builder builder(
98             IntentId intentId, Collection<Link> links) {
99         return new Builder(intentId, links);
100     }
101
102     /**
103      * Builder of link resource request.
104      */
105     public static final class Builder implements LinkResourceRequest.Builder {
106         private IntentId intentId;
107         private Map<Link, Set<ResourceRequest>> requests;
108
109         /**
110          * Creates a new link resource request.
111          *
112          * @param intentId intent ID related to this request
113          * @param links a set of links for the request
114          */
115         private Builder(IntentId intentId, Collection<Link> links) {
116             this.intentId = intentId;
117             this.requests = new HashMap<>();
118             for (Link link : links) {
119                 requests.put(link, new HashSet<>());
120             }
121         }
122
123         /**
124          * Adds lambda request.
125          *
126          * @return self
127          * @deprecated in Emu Release
128          */
129         @Deprecated
130         @Override
131         public Builder addLambdaRequest() {
132             for (Link link : requests.keySet()) {
133                 requests.get(link).add(new LambdaResourceRequest());
134             }
135             return this;
136         }
137
138         @Beta
139         @Override
140         public LinkResourceRequest.Builder addLambdaRequest(LambdaResource lambda) {
141             for (Link link : requests.keySet()) {
142                 requests.get(link).add(new LambdaResourceRequest(lambda));
143             }
144             return this;
145         }
146
147         /**
148          * Adds Mpls request.
149          *
150          * @return self
151          * @deprecated in Emu Release
152          */
153         @Deprecated
154         @Override
155         public Builder addMplsRequest() {
156             for (Link link : requests.keySet()) {
157                 requests.get(link).add(new MplsLabelResourceRequest());
158             }
159             return this;
160         }
161
162         @Beta
163         @Override
164         public Builder addMplsRequest(MplsLabel label) {
165             for (Link link : requests.keySet()) {
166                 requests.get(link).add(new MplsLabelResourceRequest(label));
167             }
168             return this;
169         }
170
171         @Beta
172         @Override
173         public LinkResourceRequest.Builder addMplsRequest(Map<Link, MplsLabel> labels) {
174             for (Link link : labels.keySet()) {
175                 if (!requests.containsKey(link)) {
176                     requests.put(link, new HashSet<>());
177                 }
178                 requests.get(link).add(new MplsLabelResourceRequest(labels.get(link)));
179             }
180
181             return this;
182         }
183
184         /**
185          * Adds bandwidth request with bandwidth value.
186          *
187          * @param bandwidth bandwidth value in bits per second to be requested
188          * @return self
189          */
190         @Override
191         public Builder addBandwidthRequest(double bandwidth) {
192             for (Link link : requests.keySet()) {
193                 requests.get(link).add(new BandwidthResourceRequest(new BandwidthResource(Bandwidth.bps(bandwidth))));
194             }
195             return this;
196         }
197
198         @Override
199         public LinkResourceRequest.Builder addConstraint(Constraint constraint) {
200             if (constraint instanceof LambdaConstraint) {
201                 return addLambdaRequest();
202             } else if (constraint instanceof BandwidthConstraint) {
203                 BandwidthConstraint bw = (BandwidthConstraint) constraint;
204                 return addBandwidthRequest(bw.bandwidth().toDouble());
205             }
206             return this;
207         }
208
209         /**
210          * Returns link resource request.
211          *
212          * @return link resource request
213          */
214         @Override
215         public LinkResourceRequest build() {
216             return new DefaultLinkResourceRequest(intentId, requests);
217         }
218     }
219
220     @Override
221     public int hashCode() {
222         return Objects.hash(intentId, links());
223     }
224
225     @Override
226     public boolean equals(Object obj) {
227         if (this == obj) {
228             return true;
229         }
230         if (obj == null || getClass() != obj.getClass()) {
231             return false;
232         }
233         final DefaultLinkResourceRequest other = (DefaultLinkResourceRequest) obj;
234         return Objects.equals(this.intentId, other.intentId)
235                 && Objects.equals(this.links(), other.links());
236     }
237 }