blob: c8c90449836f183146e5cbe1c6fb97e80acc2497 [file] [log] [blame]
sangho1e575652015-05-14 00:39:53 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
sangho1e575652015-05-14 00:39:53 -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 */
16package org.onosproject.segmentrouting;
17
Charles Chanc7b3c452018-06-19 20:31:57 -070018import com.google.common.annotations.Beta;
Pierb1fe7382018-04-17 17:25:22 +020019import com.google.common.collect.Multimap;
Charles Chanc7b3c452018-06-19 20:31:57 -070020import org.apache.commons.lang3.NotImplementedException;
Pier Luigib29144d2018-01-15 18:06:43 +010021import org.onlab.packet.IpAddress;
Pier Ventre10bd8d12016-11-26 21:05:22 -080022import org.onlab.packet.IpPrefix;
Charles Chanc7b3c452018-06-19 20:31:57 -070023import org.onlab.packet.VlanId;
Pier96f63cb2018-04-17 16:29:56 +020024import org.onosproject.cluster.NodeId;
Charles Chanc7b3c452018-06-19 20:31:57 -070025import org.onosproject.core.ApplicationId;
Pier Luigib29144d2018-01-15 18:06:43 +010026import org.onosproject.net.ConnectPoint;
Charles Chanc81c45b2016-10-20 17:02:44 -070027import org.onosproject.net.DeviceId;
Saurav Dasc568c342018-01-25 09:49:01 -080028import org.onosproject.net.Link;
29import org.onosproject.net.PortNumber;
Saurav Das7bcbe702017-06-13 15:35:54 -070030import org.onosproject.segmentrouting.grouphandler.NextNeighbors;
Pier Luigi96fe0772018-02-28 12:10:50 +010031import org.onosproject.segmentrouting.mcast.McastRole;
Pier3e793752018-04-19 16:47:06 +020032import org.onosproject.segmentrouting.mcast.McastRoleStoreKey;
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -070033import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelDescription;
Andreas Pantelopoulosb21547d2018-02-22 12:32:42 -080034import org.onosproject.segmentrouting.pwaas.L2Tunnel;
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -070035import org.onosproject.segmentrouting.pwaas.L2TunnelHandler;
Andreas Pantelopoulosb21547d2018-02-22 12:32:42 -080036import org.onosproject.segmentrouting.pwaas.L2TunnelPolicy;
Andreas Pantelopouloscd339592018-02-23 14:18:00 -080037import org.onosproject.segmentrouting.pwaas.L2TunnelDescription;
Saurav Das7bcbe702017-06-13 15:35:54 -070038import org.onosproject.segmentrouting.storekey.DestinationSetNextObjectiveStoreKey;
Saurav Dasc88d4662017-05-15 15:34:25 -070039
40import com.google.common.collect.ImmutableMap;
Pier3e793752018-04-19 16:47:06 +020041import org.onosproject.segmentrouting.mcast.McastStoreKey;
Charles Chanc81c45b2016-10-20 17:02:44 -070042
sangho1e575652015-05-14 00:39:53 -070043import java.util.List;
Charles Chanc81c45b2016-10-20 17:02:44 -070044import java.util.Map;
Charles Chanc7b3c452018-06-19 20:31:57 -070045import java.util.Optional;
Charles Chanc81c45b2016-10-20 17:02:44 -070046import java.util.Set;
sangho1e575652015-05-14 00:39:53 -070047
48/**
49 * Segment Routing Service for REST API.
50 */
51public interface SegmentRoutingService {
Charles Chan5270ed02016-01-30 23:22:37 -080052 /**
Charles Chanf76de302018-06-15 18:54:18 -070053 * VLAN cross-connect ACL priority.
Charles Chanc7b3c452018-06-19 20:31:57 -070054 *
55 * @deprecated in ONOS 1.12. Replaced by {@link org.onosproject.segmentrouting.xconnect.api.XconnectService}
Charles Chanf76de302018-06-15 18:54:18 -070056 */
Charles Chanc7b3c452018-06-19 20:31:57 -070057 @Deprecated
Charles Chanf76de302018-06-15 18:54:18 -070058 int XCONNECT_ACL_PRIORITY = 60000;
59
60 /**
61 * VLAN cross-connect Bridging priority.
Charles Chanc7b3c452018-06-19 20:31:57 -070062 *
63 * @deprecated in ONOS 1.12. Replaced by {@link org.onosproject.segmentrouting.xconnect.api.XconnectService}
Charles Chan5270ed02016-01-30 23:22:37 -080064 */
Charles Chanc7b3c452018-06-19 20:31:57 -070065 @Deprecated
Charles Chan5270ed02016-01-30 23:22:37 -080066 int XCONNECT_PRIORITY = 1000;
67
68 /**
69 * Default flow priority.
70 */
71 int DEFAULT_PRIORITY = 100;
72
73 /**
74 * Minimum IP priority.
75 *
Charles Chanb54e8ba2016-02-18 10:43:46 -080076 * Should < 0 such that priority of /0 will not conflict with lowest
Charles Chan5270ed02016-01-30 23:22:37 -080077 * priority default entries.
78 */
79 int MIN_IP_PRIORITY = 10;
80
81 /**
82 * Subnet flooding flow priority.
83 */
84 int FLOOD_PRIORITY = 5;
85
sangho1e575652015-05-14 00:39:53 -070086 /**
87 * Returns all tunnels.
88 *
89 * @return list of tunnels
90 */
91 List<Tunnel> getTunnels();
92
93 /**
94 * Creates a tunnel.
95 *
96 * @param tunnel tunnel reference to create
sangho71abe1b2015-06-29 14:58:47 -070097 * @return WRONG_PATH if the tunnel path is wrong, ID_EXISTS if the tunnel ID
98 * exists already, TUNNEL_EXISTS if the same tunnel exists, INTERNAL_ERROR
99 * if the tunnel creation failed internally, SUCCESS if the tunnel is created
100 * successfully
sangho1e575652015-05-14 00:39:53 -0700101 */
sangho71abe1b2015-06-29 14:58:47 -0700102 TunnelHandler.Result createTunnel(Tunnel tunnel);
sangho1e575652015-05-14 00:39:53 -0700103
104 /**
105 * Returns all policies.
106 *
107 * @return list of policy
108 */
109 List<Policy> getPolicies();
110
111 /**
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700112 * Returns the l2 tunnel descriptions.
113 *
Andreas Pantelopoulos811bbae2018-03-15 16:56:09 -0700114 * @param pending if true fetch pending pseudowires, else fetch installed
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700115 * @return set of l2 tunnel descriptions.
116 */
Andreas Pantelopoulos811bbae2018-03-15 16:56:09 -0700117 Set<L2TunnelDescription> getL2TunnelDescriptions(boolean pending);
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700118
119 /**
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700120 * Returns all l2 tunnels of pseudowires.
121 *
122 * @return list of l2 tunnels
123 */
Andreas Pantelopoulosb21547d2018-02-22 12:32:42 -0800124 List<L2Tunnel> getL2Tunnels();
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700125
126 /**
127 * Returns all l2 policie of pseudowires.
128 *
129 * @return list of l2 policies.
130 */
Andreas Pantelopoulosb21547d2018-02-22 12:32:42 -0800131 List<L2TunnelPolicy> getL2Policies();
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700132
133 /**
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700134 * Removes pseudowire.
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700135 *
Andreas Pantelopouloscd339592018-02-23 14:18:00 -0800136 * @param pwId The id of the pseudowire.
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700137 * @return SUCCESS if operation successful or a descriptive error otherwise.
138 */
Andreas Pantelopouloscd339592018-02-23 14:18:00 -0800139 L2TunnelHandler.Result removePseudowire(Integer pwId);
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700140
141 /**
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700142 * Adds a Pseudowire to the system.
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700143 *
Andreas Pantelopouloscd339592018-02-23 14:18:00 -0800144 * @param tunnel The pseudowire tunnel.
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700145 * @return SUCCESS if operation is successful or a descriptive error otherwise.
146 */
Andreas Pantelopouloscd339592018-02-23 14:18:00 -0800147 L2TunnelHandler.Result addPseudowire(L2TunnelDescription tunnel);
Andreas Pantelopoulos27532cd2017-10-23 12:18:25 -0700148
149 /**
Andreas Pantelopoulosffe69742018-03-20 13:58:49 -0700150 * Adds a set of pseudowires.
151 *
152 *
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700153 * @param l2TunnelDescriptions The pseudowires to add.
154 * @return SUCCESS if ALL pseudowires can be instantiated and are deployed, or a
155 * a descriptive error otherwise, without deploying any pseudowire.
Andreas Pantelopoulosffe69742018-03-20 13:58:49 -0700156 * @deprecated onos-1.12 use addPseudowire instead
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700157 */
Andreas Pantelopoulosffe69742018-03-20 13:58:49 -0700158 @Deprecated
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700159 L2TunnelHandler.Result addPseudowiresBulk(List<DefaultL2TunnelDescription> l2TunnelDescriptions);
160
161 /**
sangho1e575652015-05-14 00:39:53 -0700162 * Creates a policy.
163 *
164 * @param policy policy reference to create
sangho71abe1b2015-06-29 14:58:47 -0700165 * @return ID_EXISTS if the same policy ID exists,
166 * POLICY_EXISTS if the same policy exists, TUNNEL_NOT_FOUND if the tunnel
167 * does not exists, UNSUPPORTED_TYPE if the policy type is not supported,
168 * SUCCESS if the policy is created successfully.
sangho1e575652015-05-14 00:39:53 -0700169 */
sangho71abe1b2015-06-29 14:58:47 -0700170 PolicyHandler.Result createPolicy(Policy policy);
sangho1e575652015-05-14 00:39:53 -0700171
172 /**
173 * Removes a tunnel.
174 *
175 * @param tunnel tunnel reference to remove
sangho71abe1b2015-06-29 14:58:47 -0700176 * @return TUNNEL_NOT_FOUND if the tunnel to remove does not exists,
177 * INTERNAL_ERROR if the tunnel creation failed internally, SUCCESS
178 * if the tunnel is created successfully.
sangho1e575652015-05-14 00:39:53 -0700179 */
sangho71abe1b2015-06-29 14:58:47 -0700180 TunnelHandler.Result removeTunnel(Tunnel tunnel);
sangho1e575652015-05-14 00:39:53 -0700181
182 /**
183 * Removes a policy.
184 *
185 * @param policy policy reference to remove
sangho71abe1b2015-06-29 14:58:47 -0700186 * @return POLICY_NOT_FOUND if the policy to remove does not exists,
187 * SUCCESS if it is removed successfully
sangho1e575652015-05-14 00:39:53 -0700188 */
sangho71abe1b2015-06-29 14:58:47 -0700189 PolicyHandler.Result removePolicy(Policy policy);
Saurav Das59232cf2016-04-27 18:35:50 -0700190
191 /**
192 * Use current state of the network to repopulate forwarding rules.
193 *
194 */
195 void rerouteNetwork();
Charles Chanc81c45b2016-10-20 17:02:44 -0700196
197 /**
198 * Returns device-subnet mapping.
199 *
200 * @return device-subnet mapping
201 */
Pier Ventre10bd8d12016-11-26 21:05:22 -0800202 Map<DeviceId, Set<IpPrefix>> getDeviceSubnetMap();
Saurav Dasc88d4662017-05-15 15:34:25 -0700203
204 /**
205 * Returns the current ECMP shortest path graph in this controller instance.
206 *
207 * @return ECMP shortest path graph
208 */
209 ImmutableMap<DeviceId, EcmpShortestPathGraph> getCurrentEcmpSpg();
210
211 /**
Saurav Das7bcbe702017-06-13 15:35:54 -0700212 * Returns the destinatiomSet-NextObjective store contents.
Saurav Dasc88d4662017-05-15 15:34:25 -0700213 *
Saurav Das7bcbe702017-06-13 15:35:54 -0700214 * @return current contents of the destinationSetNextObjectiveStore
Saurav Dasc88d4662017-05-15 15:34:25 -0700215 */
Saurav Das7bcbe702017-06-13 15:35:54 -0700216 ImmutableMap<DestinationSetNextObjectiveStoreKey, NextNeighbors> getDestinationSet();
Saurav Dasceccf242017-08-03 18:30:35 -0700217
218 /**
219 * Triggers the verification of all ECMP groups in the specified device.
220 * Adjusts the group buckets if verification finds that there are more or less
221 * buckets than what should be there.
222 *
223 * @param id the device identifier
224 */
225 void verifyGroups(DeviceId id);
Saurav Dasc568c342018-01-25 09:49:01 -0800226
227 /**
228 * Returns the internal link state as seen by this instance of the
229 * controller.
230 *
231 * @return the internal link state
232 */
233 ImmutableMap<Link, Boolean> getSeenLinks();
234
235 /**
236 * Returns the ports administratively disabled by the controller.
237 *
238 * @return a map of devices and port numbers for administratively disabled
239 * ports. Does not include ports manually disabled by the operator.
240 */
241 ImmutableMap<DeviceId, Set<PortNumber>> getDownedPortState();
Pier Luigib29144d2018-01-15 18:06:43 +0100242
Pier3e793752018-04-19 16:47:06 +0200243 /**
Pier Luigib29144d2018-01-15 18:06:43 +0100244 * Returns the associated next ids to the mcast groups or to the single
245 * group if mcastIp is present.
246 *
247 * @param mcastIp the group ip
248 * @return the mapping mcastIp-device to next id
249 */
250 Map<McastStoreKey, Integer> getMcastNextIds(IpAddress mcastIp);
251
252 /**
253 * Returns the associated roles to the mcast groups or to the single
254 * group if mcastIp is present.
255 *
256 * @param mcastIp the group ip
257 * @return the mapping mcastIp-device to mcast role
Pierb1fe7382018-04-17 17:25:22 +0200258 *
259 * @deprecated in 1.12 ("Magpie") release.
Pier Luigib29144d2018-01-15 18:06:43 +0100260 */
Pierb1fe7382018-04-17 17:25:22 +0200261 @Deprecated
Pier Luigi96fe0772018-02-28 12:10:50 +0100262 Map<McastStoreKey, McastRole> getMcastRoles(IpAddress mcastIp);
Pier Luigib29144d2018-01-15 18:06:43 +0100263
264 /**
Pier3e793752018-04-19 16:47:06 +0200265 * Returns the associated roles to the mcast groups.
266 *
267 * @param mcastIp the group ip
268 * @param sourcecp the source connect point
269 * @return the mapping mcastIp-device to mcast role
270 */
271 Map<McastRoleStoreKey, McastRole> getMcastRoles(IpAddress mcastIp,
272 ConnectPoint sourcecp);
273
274 /**
Pier Luigib29144d2018-01-15 18:06:43 +0100275 * Returns the associated paths to the mcast group.
276 *
277 * @param mcastIp the group ip
278 * @return the mapping egress point to mcast path
Pierb1fe7382018-04-17 17:25:22 +0200279 *
280 * @deprecated in 1.12 ("Magpie") release.
Pier Luigib29144d2018-01-15 18:06:43 +0100281 */
Pierb1fe7382018-04-17 17:25:22 +0200282 @Deprecated
Pier Luigib29144d2018-01-15 18:06:43 +0100283 Map<ConnectPoint, List<ConnectPoint>> getMcastPaths(IpAddress mcastIp);
284
Pierb1fe7382018-04-17 17:25:22 +0200285 /**
286 * Returns the associated trees to the mcast group.
287 *
288 * @param mcastIp the group ip
289 * @param sourcecp the source connect point
290 * @return the mapping egress point to mcast path
291 */
292 Multimap<ConnectPoint, List<ConnectPoint>> getMcastTrees(IpAddress mcastIp,
293 ConnectPoint sourcecp);
294
Pier96f63cb2018-04-17 16:29:56 +0200295 /**
296 * Return the leaders of the mcast groups.
297 *
298 * @param mcastIp the group ip
299 * @return the mapping group-node
300 */
301 Map<IpAddress, NodeId> getMcastLeaders(IpAddress mcastIp);
Charles Chan8bc75ee2018-04-17 18:56:53 -0700302
303 /**
304 * Returns shouldProgram map.
305 *
306 * @return shouldProgram map
307 */
308 Map<Set<DeviceId>, NodeId> getShouldProgram();
309
310 /**
311 * Returns shouldProgram local cache.
312 *
313 * @return shouldProgram local cache
314 */
315 Map<DeviceId, Boolean> getShouldProgramCache();
Charles Chanc7b3c452018-06-19 20:31:57 -0700316
317 /**
318 * Gets application id.
319 *
320 * @return application id
321 */
322 default ApplicationId appId() {
323 throw new NotImplementedException("appId not implemented");
324 }
325
326 /**
327 * Returns internal VLAN for untagged hosts on given connect point.
328 * <p>
329 * The internal VLAN is either vlan-untagged for an access port,
330 * or vlan-native for a trunk port.
331 *
332 * @param connectPoint connect point
333 * @return internal VLAN or null if both vlan-untagged and vlan-native are undefined
334 */
335 @Beta
336 default VlanId getInternalVlanId(ConnectPoint connectPoint) {
337 throw new NotImplementedException("getInternalVlanId not implemented");
338 }
339
340
341 /**
342 * Returns optional pair device ID of given device.
343 *
344 * @param deviceId device ID
345 * @return optional pair device ID. Might be empty if pair device is not configured
346 */
347 @Beta
348 default Optional<DeviceId> getPairDeviceId(DeviceId deviceId) {
349 throw new NotImplementedException("getPairDeviceId not implemented");
350 }
351
352
353 /**
354 * Returns optional pair device local port of given device.
355 *
356 * @param deviceId device ID
357 * @return optional pair device ID. Might be empty if pair device is not configured
358 */
359 @Beta
360 default Optional<PortNumber> getPairLocalPort(DeviceId deviceId) {
361 throw new NotImplementedException("getPairLocalPort not implemented");
362 }
sangho1e575652015-05-14 00:39:53 -0700363}