blob: aecef879724eb2089c5c4388999ce368f02819d4 [file] [log] [blame]
Sho SHIMIZU1df945b2014-11-06 18:36:11 -08001/*
2 * Copyright 2014 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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.intent.constraint;
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080017
Brian O'Connor9476fa12015-06-25 15:17:17 -040018import com.google.common.annotations.Beta;
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080019import com.google.common.base.MoreObjects;
Brian O'Connorabafb502014-12-02 22:26:20 -080020import org.onosproject.net.Link;
21import org.onosproject.net.Path;
22import org.onosproject.net.intent.Constraint;
Brian O'Connor6de2e202015-05-21 14:30:41 -070023import org.onosproject.net.resource.link.LinkResourceService;
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080024
25import java.time.Duration;
26import java.time.temporal.ChronoUnit;
27import java.util.Objects;
28
Brian O'Connorabafb502014-12-02 22:26:20 -080029import static org.onosproject.net.AnnotationKeys.LATENCY;
30import static org.onosproject.net.AnnotationKeys.getAnnotatedValue;
Sho SHIMIZUfe129db2014-11-11 14:24:51 -080031
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080032/**
33 * Constraint that evaluates the latency through a path.
34 */
Brian O'Connor9476fa12015-06-25 15:17:17 -040035@Beta
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080036public class LatencyConstraint implements Constraint {
37
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080038 private final Duration latency;
39
40 /**
41 * Creates a new constraint to keep under specified latency through a path.
42 * @param latency latency to be kept
43 */
44 public LatencyConstraint(Duration latency) {
45 this.latency = latency;
46 }
47
Sho SHIMIZUcd4bac82014-11-11 17:07:25 -080048 // Constructor for serialization
49 private LatencyConstraint() {
50 this.latency = Duration.ZERO;
51 }
52
Sho SHIMIZU412a2392014-11-10 18:11:48 -080053 public Duration latency() {
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080054 return latency;
55 }
56
57 @Override
58 public double cost(Link link, LinkResourceService resourceService) {
Sho SHIMIZU97a64cd2014-11-11 16:31:21 -080059 return getAnnotatedValue(link, LATENCY);
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080060 }
61
62 @Override
63 public boolean validate(Path path, LinkResourceService resourceService) {
64 double pathLatency = path.links().stream().mapToDouble(link -> cost(link, resourceService)).sum();
65 return Duration.of((long) pathLatency, ChronoUnit.MICROS).compareTo(latency) <= 0;
66 }
67
68 @Override
69 public int hashCode() {
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -070070 return latency.hashCode();
Sho SHIMIZU1df945b2014-11-06 18:36:11 -080071 }
72
73 @Override
74 public boolean equals(Object obj) {
75 if (this == obj) {
76 return true;
77 }
78
79 if (!(obj instanceof LatencyConstraint)) {
80 return false;
81 }
82
83 final LatencyConstraint that = (LatencyConstraint) obj;
84 return Objects.equals(this.latency, that.latency);
85 }
86
87 @Override
88 public String toString() {
89 return MoreObjects.toStringHelper(this)
90 .add("latency", latency)
91 .toString();
92 }
93}