blob: 579e44de03f235f92ed2faeb046eeb6e7e287e30 [file] [log] [blame]
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -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 SHIMIZU0e51fe52014-11-05 12:04:23 -080017
18import com.google.common.base.MoreObjects;
19import com.google.common.collect.ImmutableList;
Brian O'Connorabafb502014-12-02 22:26:20 -080020import org.onosproject.net.DeviceId;
21import org.onosproject.net.Link;
22import org.onosproject.net.Path;
23import org.onosproject.net.intent.Constraint;
Brian O'Connor6de2e202015-05-21 14:30:41 -070024import org.onosproject.net.resource.link.LinkResourceService;
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080025
Sho SHIMIZUcd4bac82014-11-11 17:07:25 -080026import java.util.Collections;
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080027import java.util.LinkedList;
28import java.util.List;
29import java.util.Objects;
30
31import static com.google.common.base.Preconditions.checkArgument;
32import static com.google.common.base.Preconditions.checkNotNull;
33
34/**
35 * Constraint that evaluates elements passed through in order.
36 */
37public class WaypointConstraint implements Constraint {
38
Sho SHIMIZUfa2cd3b2014-11-11 14:10:32 -080039 private final List<DeviceId> waypoints;
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080040
41 /**
42 * Creates a new waypoint constraint.
43 *
44 * @param waypoints waypoints
45 */
Sho SHIMIZUfa2cd3b2014-11-11 14:10:32 -080046 public WaypointConstraint(DeviceId... waypoints) {
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080047 checkNotNull(waypoints, "waypoints cannot be null");
48 checkArgument(waypoints.length > 0, "length of waypoints should be more than 0");
49 this.waypoints = ImmutableList.copyOf(waypoints);
50 }
51
Sho SHIMIZUcd4bac82014-11-11 17:07:25 -080052 // Constructor for serialization
53 private WaypointConstraint() {
54 this.waypoints = Collections.emptyList();
55 }
56
Sho SHIMIZUfa2cd3b2014-11-11 14:10:32 -080057 public List<DeviceId> waypoints() {
Sho SHIMIZU14ccab52014-11-06 11:11:40 -080058 return waypoints;
59 }
60
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080061 @Override
62 public double cost(Link link, LinkResourceService resourceService) {
63 // Always consider the number of hops
64 return 1;
65 }
66
67 @Override
68 public boolean validate(Path path, LinkResourceService resourceService) {
Sho SHIMIZUfa2cd3b2014-11-11 14:10:32 -080069 LinkedList<DeviceId> waypoints = new LinkedList<>(this.waypoints);
70 DeviceId current = waypoints.poll();
Sho SHIMIZU0e51fe52014-11-05 12:04:23 -080071 // This is safe because Path class ensures the number of links are more than 0
72 Link firstLink = path.links().get(0);
73 if (firstLink.src().elementId().equals(current)) {
74 current = waypoints.poll();
75 }
76
77 for (Link link : path.links()) {
78 if (link.dst().elementId().equals(current)) {
79 current = waypoints.poll();
80 // Empty waypoints means passing through all waypoints in the specified order
81 if (current == null) {
82 return true;
83 }
84 }
85 }
86
87 return false;
88 }
89
90 @Override
91 public int hashCode() {
92 return Objects.hash(waypoints);
93 }
94
95 @Override
96 public boolean equals(Object obj) {
97 if (this == obj) {
98 return true;
99 }
100
101 if (!(obj instanceof WaypointConstraint)) {
102 return false;
103 }
104
105 final WaypointConstraint that = (WaypointConstraint) obj;
106 return Objects.equals(this.waypoints, that.waypoints);
107 }
108
109 @Override
110 public String toString() {
111 return MoreObjects.toStringHelper(this)
112 .add("waypoints", waypoints)
113 .toString();
114 }
115}