blob: 41d927fabbdc7705d33402d1e3b9df20b9f49b03 [file] [log] [blame]
Jonghwan Hyun722275f2018-05-14 15:44:56 -07001/*
2 * Copyright 2018-present Open Networking Foundation
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 */
Carmelo Casconeb330fc72020-07-17 15:27:02 -070016package org.onosproject.net.behaviour.inbandtelemetry;
Jonghwan Hyun722275f2018-05-14 15:44:56 -070017
Yi Tsengd14f1a32020-10-13 19:15:12 -070018import com.google.common.base.Objects;
Carmelo Casconeb330fc72020-07-17 15:27:02 -070019import com.google.common.collect.ImmutableSet;
Jonghwan Hyun722275f2018-05-14 15:44:56 -070020import org.onosproject.net.flow.DefaultTrafficSelector;
21import org.onosproject.net.flow.TrafficSelector;
22
23import java.util.HashSet;
24import java.util.Set;
25
Carmelo Casconeb330fc72020-07-17 15:27:02 -070026/**
27 * Represents a device-level objective to collect INT metadata for packets
28 * identified by a traffic selector.
29 */
Jonghwan Hyun722275f2018-05-14 15:44:56 -070030public final class IntObjective {
31
32 private static final int DEFAULT_PRIORITY = 10;
33
34 // TrafficSelector to describe target flows to monitor
35 private final TrafficSelector selector;
36 // Set of metadata types to collect
Carmelo Casconeb330fc72020-07-17 15:27:02 -070037 private final ImmutableSet<IntMetadataType> metadataTypes;
Jonghwan Hyun722275f2018-05-14 15:44:56 -070038
39 /**
40 * Creates an IntObjective.
41 *
42 * @param selector the traffic selector that identifies traffic to enable INT
43 * @param metadataTypes a set of metadata types to collect
Jonghwan Hyun722275f2018-05-14 15:44:56 -070044 */
Carmelo Casconeb330fc72020-07-17 15:27:02 -070045 private IntObjective(TrafficSelector selector, Set<IntMetadataType> metadataTypes) {
Jonghwan Hyun722275f2018-05-14 15:44:56 -070046 this.selector = selector;
Carmelo Casconeb330fc72020-07-17 15:27:02 -070047 this.metadataTypes = ImmutableSet.copyOf(metadataTypes);
Jonghwan Hyun722275f2018-05-14 15:44:56 -070048 }
49
50 /**
51 * Returns traffic selector of this objective.
52 *
53 * @return traffic selector
54 */
55 public TrafficSelector selector() {
56 return selector;
57 }
58
59 /**
60 * Returns a set of metadata types specified in this objective.
61 *
62 * @return instruction bitmap
63 */
64 public Set<IntMetadataType> metadataTypes() {
65 return metadataTypes;
66 }
67
68 /**
Yi Tsengb7b79af2020-08-07 14:58:52 -070069 * Returns a new INT objective builder.
70 *
71 * @return INT objective builder
72 */
73 public static IntObjective.Builder builder() {
74 return new Builder();
75 }
76
Yi Tsengd14f1a32020-10-13 19:15:12 -070077 @Override
78 public boolean equals(Object o) {
79 if (this == o) {
80 return true;
81 }
82 if (o == null || getClass() != o.getClass()) {
83 return false;
84 }
85 IntObjective that = (IntObjective) o;
86 return Objects.equal(selector, that.selector) &&
87 Objects.equal(metadataTypes, that.metadataTypes);
88 }
89
90 @Override
91 public int hashCode() {
92 return Objects.hashCode(selector, metadataTypes);
93 }
94
Yi Tsengb7b79af2020-08-07 14:58:52 -070095 /**
Jonghwan Hyun722275f2018-05-14 15:44:56 -070096 * An IntObjective builder.
97 */
98 public static final class Builder {
99 private TrafficSelector selector = DefaultTrafficSelector.emptySelector();
Carmelo Casconeb330fc72020-07-17 15:27:02 -0700100 private final Set<IntMetadataType> metadataTypes = new HashSet<>();
Jonghwan Hyun722275f2018-05-14 15:44:56 -0700101
102 /**
103 * Assigns a selector to the IntObjective.
104 *
105 * @param selector a traffic selector
106 * @return an IntObjective builder
107 */
108 public IntObjective.Builder withSelector(TrafficSelector selector) {
109 this.selector = selector;
110 return this;
111 }
112
113 /**
114 * Add a metadata type to the IntObjective.
115 *
116 * @param metadataTypes a set of metadata types
117 * @return an IntObjective builder
118 */
119 public IntObjective.Builder withMetadataTypes(Set<IntMetadataType> metadataTypes) {
120 this.metadataTypes.addAll(metadataTypes);
121 return this;
122 }
123
124 /**
Jonghwan Hyun722275f2018-05-14 15:44:56 -0700125 * Builds the IntObjective.
126 *
127 * @return an IntObjective
128 */
129 public IntObjective build() {
Carmelo Casconeb330fc72020-07-17 15:27:02 -0700130 return new IntObjective(selector, metadataTypes);
Jonghwan Hyun722275f2018-05-14 15:44:56 -0700131 }
132 }
133}