blob: 3b0346c8fa2558c7d31f4915f906d135824b0b63 [file] [log] [blame]
alshabibfaa1e362015-04-02 15:01:54 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
alshabibfaa1e362015-04-02 15:01:54 -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.net.flowobjective;
17
Thomas Vachuskaa9d491e2015-05-20 11:17:21 -070018import com.google.common.annotations.Beta;
alshabibfaa1e362015-04-02 15:01:54 -070019import org.onosproject.core.ApplicationId;
20
alshabib2a441c62015-04-13 18:39:38 -070021import java.util.Optional;
22
alshabibfaa1e362015-04-02 15:01:54 -070023/**
Saurav Das8a0732e2015-11-20 15:27:53 -080024 * Base representation of a flow-objective description.
alshabibfaa1e362015-04-02 15:01:54 -070025 */
Thomas Vachuskaa9d491e2015-05-20 11:17:21 -070026@Beta
alshabibfaa1e362015-04-02 15:01:54 -070027public interface Objective {
28
Sho SHIMIZUe2952e42015-09-11 17:11:21 -070029 boolean DEFAULT_PERMANENT = true;
30 int DEFAULT_TIMEOUT = 0;
31 int DEFAULT_PRIORITY = 32768;
Jayasree Ghosh3684dc72016-06-09 18:07:19 +053032 int MIN_PRIORITY = 0;
33 int MAX_PRIORITY = 65535;
alshabibfaa1e362015-04-02 15:01:54 -070034
35 /**
36 * Type of operation.
37 */
38 enum Operation {
39 /**
Saurav Das8a0732e2015-11-20 15:27:53 -080040 * Adds the objective. Can be used for any flow objective. For forwarding
41 * and filtering objectives, existing objectives with identical selector
42 * and priority fields (but different treatments or next) will be replaced.
43 * For next objectives, if modification is desired, ADD will not
44 * do anything - use ADD_TO_EXISTING.
alshabibfaa1e362015-04-02 15:01:54 -070045 */
46 ADD,
47
48 /**
Saurav Das8a0732e2015-11-20 15:27:53 -080049 * Removes the objective. Can be used for any flow objective.
alshabibfaa1e362015-04-02 15:01:54 -070050 */
Saurav Das8a0732e2015-11-20 15:27:53 -080051 REMOVE,
52
53 /**
54 * Add to an existing Next Objective. Should not be used for any other
55 * objective.
56 */
57 ADD_TO_EXISTING,
58
59 /**
60 * Remove from an existing Next Objective. Should not be used for any
61 * other objective.
62 */
Saurav Dasceccf242017-08-03 18:30:35 -070063 REMOVE_FROM_EXISTING,
64
65 /**
Jonghwan Hyunf810a7a2018-02-12 16:43:45 +090066 * Modify an existing Next Objective. Can be used to modify group buckets.
67 */
68 MODIFY,
69
70 /**
Saurav Dasceccf242017-08-03 18:30:35 -070071 * Verifies that an existing Next Objective's collection of treatments
72 * are correctly represented by the underlying implementation of the objective.
73 * Corrective action is taken if discrepancies are found during verification.
74 * For example, if the next objective defines 3 sets of treatments, which
75 * are meant to be implemented as 3 buckets in a group, but verification
76 * finds less or more buckets, then the appropriate buckets are added or
77 * removed to match the objective.
78 *
79 * Should not be used for any other objective.
80 */
81 VERIFY
alshabibfaa1e362015-04-02 15:01:54 -070082 }
83
84 /**
85 * An identifier for this objective.
86 *
87 * @return an integer
88 */
89 int id();
90
91 /**
92 * The priority for this objective.
93 *
94 * @return an integer
95 */
96 int priority();
97
98 /**
99 * The application which applied this objective.
100 *
101 * @return an application id
102 */
103 ApplicationId appId();
104
105 /**
106 * The timeout for this objective.
107 *
108 * @return an integer
109 */
110 int timeout();
111
112 /**
113 * Whether this objective is permanent.
114 *
115 * @return a boolean
116 */
117 boolean permanent();
118
119 /**
120 * The type of operation for this objective.
121 *
122 * @return an operation
123 */
124 Operation op();
125
126 /**
alshabib2a441c62015-04-13 18:39:38 -0700127 * Obtains an optional context.
128 *
129 * @return optional; which will be empty if there is no context.
130 * Otherwise it will return the context.
131 */
132 Optional<ObjectiveContext> context();
133
134 /**
Thomas Vachuska00f48162016-02-29 17:07:23 -0800135 * Returns a new builder set to create a copy of this objective.
136 *
137 * @return new builder
138 */
139 Objective.Builder copy();
140
141 /**
alshabibfaa1e362015-04-02 15:01:54 -0700142 * An objective builder.
143 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700144 interface Builder {
alshabibfaa1e362015-04-02 15:01:54 -0700145 /**
146 * Makes the filtering objective temporary.
147 *
148 * @param timeout a timeout
149 * @return an objective builder
150 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700151 Builder makeTemporary(int timeout);
alshabibfaa1e362015-04-02 15:01:54 -0700152
153 /**
154 * Makes the filtering objective permanent.
155 *
156 * @return an objective builder
157 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700158 Builder makePermanent();
alshabibfaa1e362015-04-02 15:01:54 -0700159
160 /**
161 * Specifies the application which applied the filter.
162 *
163 * @param appId an application id
164 * @return an objective builder
165 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700166 Builder fromApp(ApplicationId appId);
alshabibfaa1e362015-04-02 15:01:54 -0700167
168 /**
169 * Sets the priority for this objective.
170 *
171 * @param priority an integer
172 * @return an objective builder
173 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700174 Builder withPriority(int priority);
Saurav Das8a0732e2015-11-20 15:27:53 -0800175
Thomas Vachuska00f48162016-02-29 17:07:23 -0800176 /**
177 * Builds the objective that will be added.
178 *
179 * @return an objective
180 */
181 Objective add();
alshabibfaa1e362015-04-02 15:01:54 -0700182
Thomas Vachuska00f48162016-02-29 17:07:23 -0800183 /**
184 * Builds the objective that will be removed.
185 *
186 * @return an objective.
187 */
188 Objective remove();
189
190 /**
191 * Builds the objective that will be added.
192 * The context will be used to notify the calling application.
193 *
194 * @param context an objective context
195 * @return an objective
196 */
197 Objective add(ObjectiveContext context);
198
199 /**
200 * Builds the objective that will be removed.
201 * The context will be used to notify the calling application.
202 *
203 * @param context an objective context
204 * @return an objective
205 */
206 Objective remove(ObjectiveContext context);
207 }
alshabibfaa1e362015-04-02 15:01:54 -0700208}