[ONOS-7675] Initial implementation of IntProgrammable
Change-Id: I277ea7a56bb3a38debbb2959823df394a4103541
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java
new file mode 100644
index 0000000..a3e6148
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Network-level INT configuration.
+ */
+@Beta
+public final class IntConfig {
+ /**
+ * Represents a type of telemetry spec to collect in the dataplane.
+ */
+ enum TelemetrySpec {
+ /**
+ * Embeds telemetry metadata according to the INT specification.
+ *
+ * @see <a href="https://github.com/p4lang/p4-applications/blob/master/docs/INT.pdf">
+ * INT sepcification</a>
+ */
+ INT,
+ /**
+ * Embeds telemetry metadata according to the OAM specification.
+ *
+ * @see <a href="https://tools.ietf.org/html/draft-ietf-ippm-ioam-data">
+ * Data fields for In-situ OAM</a>
+ */
+ IOAM
+ }
+
+ private final IpAddress collectorIp;
+ private final TpPort collectorPort;
+ private final MacAddress collectorNextHopMac;
+ private final IpAddress sinkIp;
+ private final MacAddress sinkMac;
+ private final TelemetrySpec spec;
+ private boolean enabled;
+
+ private IntConfig(IpAddress collectorIp, TpPort collectorPort, MacAddress collectorNextHopMac,
+ IpAddress sinkIp, MacAddress sinkMac, TelemetrySpec spec, boolean enabled) {
+ this.collectorIp = collectorIp;
+ this.collectorPort = collectorPort;
+ this.collectorNextHopMac = collectorNextHopMac;
+ this.sinkIp = sinkIp;
+ this.sinkMac = sinkMac;
+ this.spec = spec;
+ this.enabled = enabled;
+ }
+
+ /**
+ * Returns IP address of the collector.
+ * This is the destination IP address that will be used for all INT reports
+ * generated by all sink devices.
+ *
+ * @return collector IP address
+ */
+ public IpAddress collectorIp() {
+ return collectorIp;
+ }
+
+ /**
+ * Returns UDP port number of the collector.
+ * This is the destination UDP port number that will be used for all INT reports
+ * generated by all sink devices.
+ *
+ * @return collector UDP port number
+ */
+ public TpPort collectorPort() {
+ return collectorPort;
+ }
+
+ /**
+ * Returns MAC address of next hop of INT report packets.
+ * This can be either MAC address of the collector or a router.
+ * This is an optional parameter, which means that the usage of this
+ * parameter depends on IntProgrammable implementation.
+ * (e.g., If a report packet needs to be routed to reach the collector,
+ * IntProgrammable will ignore this value and choose next hop router's MAC address.
+ * If a collector itself is the next hop of INT report packets, then
+ * this value will be used as a destination MAC address for all INT report packets.)
+ *
+ * @return MAC address of next hop of INT report packets
+ */
+ public MacAddress collectorNextHopMac() {
+ return collectorNextHopMac;
+ }
+
+ /**
+ * Returns IP address of the sink device.
+ * All sink devices share this address as the source IP address
+ * for all INT reports.
+ *
+ * @return sink device's IP address
+ */
+ public IpAddress sinkIp() {
+ return sinkIp;
+ }
+
+ /**
+ * Returns MAC address of the sink device.
+ * All sink devices share this address as the source MAC address
+ * for all INT reports.
+ *
+ * @return sink device's MAC address
+ */
+ public MacAddress sinkMac() {
+ return sinkMac;
+ }
+
+ /**
+ * Returns the type of telemetry spec as per {@link TelemetrySpec}.
+ *
+ * @return telemetry spec
+ */
+ public TelemetrySpec spec() {
+ return spec;
+ }
+
+ /**
+ * Returns the status of INT functionality.
+ *
+ * @return true if INT is enabled; false otherwise.
+ */
+ public boolean enabled() {
+ return enabled;
+ }
+
+ /**
+ * Returns a new builder.
+ *
+ * @return new builder
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * An IntConfig object builder.
+ */
+ public static final class Builder {
+
+ private IpAddress collectorIp;
+ private TpPort collectorPort;
+ private MacAddress collectorNextHopMac;
+ private IpAddress sinkIp;
+ private MacAddress sinkMac;
+ private TelemetrySpec spec = TelemetrySpec.INT;
+ private boolean enabled = false;
+
+ /**
+ * Assigns a collector IP address to the IntConfig object.
+ *
+ * @param collectorIp IP address of the collector
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withCollectorIp(IpAddress collectorIp) {
+ this.collectorIp = collectorIp;
+ return this;
+ }
+
+ /**
+ * Assigns a collector UDP port to the IntConfig object.
+ *
+ * @param collectorPort UDP port number of the collector
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withCollectorPort(TpPort collectorPort) {
+ this.collectorPort = collectorPort;
+ return this;
+ }
+
+ /**
+ * Assigns a MAC address of the next hop to the collector
+ * to the IntConfig object.
+ *
+ * @param collectorNextHopMac MAC address of the collector
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withCollectorNextHopMac(MacAddress collectorNextHopMac) {
+ this.collectorNextHopMac = collectorNextHopMac;
+ return this;
+ }
+
+ /**
+ * Assigns an IP address of the sink device to the IntConfig object.
+ *
+ * @param sinkIp sink device's IP address
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withSinkIp(IpAddress sinkIp) {
+ this.sinkIp = sinkIp;
+ return this;
+ }
+
+ /**
+ * Assigns a MAC address of the sink device to the IntConfig object.
+ *
+ * @param sinkMac sink device's MAC address
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withSinkMac(MacAddress sinkMac) {
+ this.sinkMac = sinkMac;
+ return this;
+ }
+
+ /**
+ * Assigns the type of telemetry spec to the IntConfig object.
+ *
+ * @param spec telemetry spec
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder withTelemetrySpec(TelemetrySpec spec) {
+ this.spec = spec;
+ return this;
+ }
+
+ /**
+ * Assigns the status of INT.
+ * True to enable INT functionality, false otherwise.
+ *
+ * @param enabled the status of INT
+ * @return an IntConfig builder
+ */
+ public IntConfig.Builder enabled(boolean enabled) {
+ this.enabled = enabled;
+ return this;
+ }
+
+ /**
+ * Builds the IntConfig object.
+ *
+ * @return an IntConfig object
+ */
+ public IntConfig build() {
+ checkNotNull(collectorIp, "Collector IP should be specified.");
+ checkNotNull(collectorPort, "Collector port number should be specified.");
+ checkNotNull(collectorNextHopMac, "Next hop MAC address for report packets should be provided.");
+ checkNotNull(sinkIp, "Sink IP address for report packets should be specified.");
+ checkNotNull(sinkMac, "Sink MAC address for report packets should be specified.");
+ return new IntConfig(collectorIp, collectorPort, collectorNextHopMac,
+ sinkIp, sinkMac, spec, enabled);
+ }
+ }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java
new file mode 100644
index 0000000..21d5381
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java
@@ -0,0 +1,295 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents an INT monitoring intent. Each intent is made up of a traffic slice
+ * to be monitored, as a form of TrafficSelector, types of metadata to collect,
+ * and other required parameters (INT header type, INT Report type, and Telemetry mode).
+ *
+ * IntIntent is converted to a set of flow rules to be installed on each INT-capable
+ * switch in the network, by IntService.
+ *
+ * Terminologies and descriptions are borrowed from INT specification.
+ *
+ * @see <a href="https://github.com/p4lang/p4-applications/blob/master/docs/INT.pdf">
+ * INT sepcification</a>
+ */
+@Beta
+public final class IntIntent {
+ /**
+ * Represents a type of INT metadata.
+ */
+ public enum IntMetadataType {
+ /**
+ * The unique ID of a switch.
+ */
+ SWITCH_ID,
+ /**
+ * The ports on which the INT packet was received and sent out.
+ */
+ L1_PORT_ID,
+ /**
+ * Time taken for the INT packet to be switched within the device.
+ */
+ HOP_LATENCY,
+ /**
+ * The build-up of traffic in the queue that the INT packet observes
+ * in the device while being forwarded.
+ */
+ QUEUE_OCCUPANCY,
+ /**
+ * The device local time when the INT packet was received on the ingress port.
+ */
+ INGRESS_TIMESTAMP,
+ /**
+ * The device local time when the INT packet was processed by the egress port.
+ */
+ EGRESS_TIMESTAMP,
+ /**
+ * The logical ports on which the INT packet was received and sent out.
+ */
+ L2_PORT_ID,
+ /**
+ * Current utilization of the egress port via witch the INT packet was sent out.
+ */
+ EGRESS_TX_UTIL
+ }
+
+ /**
+ * Represents an INT header type.
+ */
+ public enum IntHeaderType {
+ /**
+ * Intemediate devices must process this type of INT header.
+ */
+ HOP_BY_HOP,
+ /**
+ * Intemediate devices must ignore this type of INT header.
+ */
+ DESTINATION
+ }
+
+ /**
+ * Represents a type of telemetry report.
+ */
+ public enum IntReportType {
+ /**
+ * Report for flows matching certain definitions.
+ */
+ TRACKED_FLOW,
+ /**
+ * Reports for all dropeed packets matching a drop watchlist.
+ */
+ DROPPED_PACKET,
+ /**
+ * Reports for traffic entering a specific queue during a period of queue congestion.
+ */
+ CONGESTED_QUEUE
+ }
+
+ /**
+ * Represents telemetry mode.
+ */
+ public enum TelemetryMode {
+ /**
+ * Each network device generates its own telemetry reports.
+ */
+ POSTCARD,
+ /**
+ * Telemetry metadata is embedded in between the original
+ * headers of data packets as they traverse the network.
+ */
+ INBAND_TELEMETRY
+ }
+
+ private static final int DEFAULT_PRIORITY = 10;
+
+ // TrafficSelector to describe target flows to monitor
+ private final TrafficSelector selector;
+ // set of metadata type to collect
+ private final Set<IntMetadataType> metadataTypes;
+ // hop-by-hop or destination
+ private final IntHeaderType headerType;
+ // telemetry report types
+ private final Set<IntReportType> reportTypes;
+ // telemetry mode
+ private final TelemetryMode telemetryMode;
+
+ /**
+ * Creates an IntIntent.
+ *
+ * @param selector the traffic selector that identifies traffic to enable INT
+ * @param metadataTypes the types of metadata to collect
+ * @param headerType the type of INT header
+ * @param reportTypes the types of report to be generated
+ * @param telemetryMode the telemetry mode
+ */
+ private IntIntent(TrafficSelector selector, Set<IntMetadataType> metadataTypes,
+ IntHeaderType headerType, Set<IntReportType> reportTypes,
+ TelemetryMode telemetryMode) {
+ this.selector = selector;
+ this.metadataTypes = new HashSet<>(metadataTypes);
+ this.headerType = headerType;
+ this.reportTypes = new HashSet<>(reportTypes);
+ this.telemetryMode = telemetryMode;
+ }
+
+ /**
+ * Returns traffic selector of this intent.
+ *
+ * @return traffic selector
+ */
+ public TrafficSelector selector() {
+ return selector;
+ }
+
+ /**
+ * Returns a set of metadata type to be collected by this intent.
+ *
+ * @return set of metadata type
+ */
+ public Set<IntMetadataType> metadataTypes() {
+ return metadataTypes;
+ }
+
+ /**
+ * Returns a INT header type specified in this intent.
+ *
+ * @return INT header type
+ */
+ public IntHeaderType headerType() {
+ return headerType;
+ }
+
+ /**
+ * Returns a set of report type to be generated.
+ *
+ * @return set of report type
+ */
+ public Set<IntReportType> reportTypes() {
+ return reportTypes;
+ }
+
+ /**
+ * Returns a telemetry mode specified in this intent.
+ *
+ * @return telemtry mode
+ */
+ public TelemetryMode telemetryMode() {
+ return telemetryMode;
+ }
+
+ /**
+ * Returns a new builder.
+ *
+ * @return new builder
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * An IntIntent builder.
+ */
+ public static final class Builder {
+ private TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+ private Set<IntMetadataType> metadataTypes = new HashSet<>();
+ private IntHeaderType headerType = IntHeaderType.HOP_BY_HOP;
+ private Set<IntReportType> reportTypes = new HashSet<>();
+ private TelemetryMode telemetryMode = TelemetryMode.INBAND_TELEMETRY;
+
+ /**
+ * Assigns a selector to the IntIntent.
+ *
+ * @param selector a traffic selector
+ * @return an IntIntent builder
+ */
+ public IntIntent.Builder withSelector(TrafficSelector selector) {
+ this.selector = selector;
+ return this;
+ }
+
+ /**
+ * Add a metadata type to the IntIntent.
+ *
+ * @param metadataType a type of metadata to collect
+ * @return an IntIntent builder
+ */
+ public IntIntent.Builder withMetadataType(IntMetadataType metadataType) {
+ this.metadataTypes.add(metadataType);
+ return this;
+ }
+
+ /**
+ * Assigns a header type to the IntIntent.
+ *
+ * @param headerType a header type
+ * @return an IntIntent builder
+ */
+ public IntIntent.Builder withHeaderType(IntHeaderType headerType) {
+ this.headerType = headerType;
+ return this;
+ }
+
+ /**
+ * Add a report type to the IntIntent.
+ *
+ * @param reportType a type of report
+ * @return an IntIntent builder
+ */
+ public IntIntent.Builder withReportType(IntReportType reportType) {
+ this.reportTypes.add(reportType);
+ return this;
+ }
+
+ /**
+ * Assigns a telemetry mode to the IntIntent.
+ *
+ * @param telemetryMode a telemetry mode
+ * @return an IntIntent builder
+ */
+ public IntIntent.Builder withTelemetryMode(TelemetryMode telemetryMode) {
+ this.telemetryMode = telemetryMode;
+ return this;
+ }
+
+ /**
+ * Builds the IntIntent.
+ *
+ * @return an IntIntent
+ */
+ public IntIntent build() {
+ checkArgument(!selector.criteria().isEmpty(), "Empty selector cannot match any flow.");
+ checkArgument(!metadataTypes.isEmpty(), "Metadata types cannot be empty.");
+ checkNotNull(headerType, "Header type cannot be null.");
+ checkNotNull(!reportTypes.isEmpty(), "Report types cannot be empty.");
+ checkNotNull(telemetryMode, "Telemetry mode cannot be null.");
+
+ return new IntIntent(selector, metadataTypes, headerType, reportTypes, telemetryMode);
+ }
+ }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java
new file mode 100644
index 0000000..293cbdb
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import org.onlab.util.Identifier;
+
+/**
+ * Representation of a IntIntent ID.
+ */
+public final class IntIntentId extends Identifier<Long> {
+ private IntIntentId(long id) {
+ super(id);
+ }
+
+ /**
+ * Creates an IntIntent ID from a given long value.
+ *
+ * @param id long value
+ * @return IntIntent ID
+ */
+ public static IntIntentId valueOf(long id) {
+ return new IntIntentId(id);
+ }
+
+ /**
+ * Gets the IntIntent ID value.
+ *
+ * @return IntIntent ID value as long
+ */
+ public long value() {
+ return this.identifier;
+ }
+
+ @Override
+ public String toString() {
+ return Long.toHexString(this.identifier);
+ }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java
new file mode 100644
index 0000000..da8dc29
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.inbandtelemetry.api.IntIntent.IntMetadataType;
+import static org.onosproject.inbandtelemetry.api.IntIntent.IntHeaderType;
+
+public final class IntObjective {
+
+ private static final int DEFAULT_PRIORITY = 10;
+
+ // TrafficSelector to describe target flows to monitor
+ private final TrafficSelector selector;
+ // Set of metadata types to collect
+ private final Set<IntMetadataType> metadataTypes;
+ // Type of header (either hop-by-hop or destination)
+ private final IntHeaderType headerType;
+
+ /**
+ * Creates an IntObjective.
+ *
+ * @param selector the traffic selector that identifies traffic to enable INT
+ * @param metadataTypes a set of metadata types to collect
+ * @param headerType the type of INT header
+ */
+ private IntObjective(TrafficSelector selector, Set<IntMetadataType> metadataTypes,
+ IntHeaderType headerType) {
+ this.selector = selector;
+ this.metadataTypes = metadataTypes;
+ this.headerType = headerType;
+ }
+
+ /**
+ * Returns traffic selector of this objective.
+ *
+ * @return traffic selector
+ */
+ public TrafficSelector selector() {
+ return selector;
+ }
+
+ /**
+ * Returns a set of metadata types specified in this objective.
+ *
+ * @return instruction bitmap
+ */
+ public Set<IntMetadataType> metadataTypes() {
+ return metadataTypes;
+ }
+
+ /**
+ * Returns a INT header type specified in this objective.
+ *
+ * @return INT header type
+ */
+ public IntHeaderType headerType() {
+ return headerType;
+ }
+
+ /**
+ * An IntObjective builder.
+ */
+ public static final class Builder {
+ private TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+ private Set<IntMetadataType> metadataTypes = new HashSet<>();
+ private IntHeaderType headerType = IntHeaderType.HOP_BY_HOP;
+
+ /**
+ * Assigns a selector to the IntObjective.
+ *
+ * @param selector a traffic selector
+ * @return an IntObjective builder
+ */
+ public IntObjective.Builder withSelector(TrafficSelector selector) {
+ this.selector = selector;
+ return this;
+ }
+
+ /**
+ * Add a metadata type to the IntObjective.
+ *
+ * @param metadataTypes a set of metadata types
+ * @return an IntObjective builder
+ */
+ public IntObjective.Builder withMetadataTypes(Set<IntMetadataType> metadataTypes) {
+ this.metadataTypes.addAll(metadataTypes);
+ return this;
+ }
+
+ /**
+ * Assigns a header type to the IntObjective.
+ *
+ * @param headerType a header type
+ * @return an IntObjective builder
+ */
+ public IntObjective.Builder withHeaderType(IntHeaderType headerType) {
+ this.headerType = headerType;
+ return this;
+ }
+
+ /**
+ * Builds the IntObjective.
+ *
+ * @return an IntObjective
+ */
+ public IntObjective build() {
+ checkArgument(!selector.criteria().isEmpty(), "Empty selector cannot match any flow.");
+ checkArgument(!metadataTypes.isEmpty(), "Metadata types cannot be empty");
+ checkNotNull(headerType, "Header type cannot be null.");
+
+ return new IntObjective(selector, metadataTypes, headerType);
+ }
+ }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java
new file mode 100644
index 0000000..452b787
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+import java.util.concurrent.CompletableFuture;
+
+@Beta
+public interface IntProgrammable extends HandlerBehaviour {
+
+ /**
+ * Initializes the pipeline, by installing required flow rules
+ * not relevant to specific watchlist, report and event.
+ */
+ void init();
+
+ /**
+ * Adds a given IntObjective to the device.
+ *
+ * @param obj an IntObjective
+ * @return true if the objective is successfully added; false otherwise.
+ */
+ CompletableFuture<Boolean> addIntObjective(IntObjective obj);
+
+ /**
+ * Removes a given IntObjective entry from the device.
+ *
+ * @param obj an IntObjective
+ * @return true if the objective is successfully removed; false otherwise.
+ */
+ CompletableFuture<Boolean> removeIntObjective(IntObjective obj);
+
+ /**
+ * Set up report-related configuration.
+ *
+ * @param config a configuration regarding to the collector
+ * @return true if the objective is successfully added; false otherwise.
+ */
+ CompletableFuture<Boolean> setupIntConfig(IntConfig config);
+
+ //TODO: [ONOS-7616] Design IntEvent and related APIs
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java
new file mode 100644
index 0000000..ef2e1ad
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Service for controlling INT-capable pipelines.
+ */
+@Beta
+public interface IntService {
+ /**
+ * Represents the role of INT-capable devices.
+ */
+ enum IntDeviceRole {
+ /**
+ * Intermediate device to add its own INT metadata to an INT packet by
+ * following the INT instruction in the INT header.
+ */
+ TRANSIT,
+ /**
+ * A device that creates, inserts INT headers into the packet, and
+ * extracts the INT headers.
+ */
+ SOURCE_SINK
+ }
+
+ /**
+ * Starts the INT functionalities in all INT-capable devices.
+ * This will include populating tables to process INT packets.
+ */
+ void startInt();
+
+ /**
+ * Starts the INT functionalities in specified set of INT transit devices.
+ * <p>
+ * Note: this is an experimental API, which can be either changed or removed.
+ *
+ * @param transitDevices set of devices to start INT functionalities
+ */
+ void startInt(Set<DeviceId> transitDevices);
+
+ /**
+ * Stops the INT functionalities in all INT-capable devices.
+ */
+ void stopInt();
+
+ /**
+ * Stops the INT functionalities in specified set of INT transit devices.
+ * <p>
+ * Note: this is an experimental API, which can be either changed or removed.
+ *
+ * @param transitDevices set of devices to stop INT functionalities
+ */
+ void stopInt(Set<DeviceId> transitDevices);
+
+ /**
+ * Configures all INT-capable devices with given configuration.
+ *
+ * @param cfg configuration to set up
+ */
+ void setConfig(IntConfig cfg);
+
+ /**
+ * Retrieves the INT configuration.
+ *
+ * @return configuration
+ */
+ IntConfig getConfig();
+
+ /**
+ * Installs an IntIntent to devices.
+ *
+ * @param intIntent an IntIntent
+ * @return an IntIntent ID corresponding to given intIntent
+ */
+ IntIntentId installIntIntent(IntIntent intIntent);
+
+ /**
+ * Removes an IntIntent from devices.
+ *
+ * @param intentId ID of the intIntent to remove
+ */
+ void removeIntIntent(IntIntentId intentId);
+
+ /**
+ * Returns an IntIntent for given intent ID.
+ *
+ * @param intentId ID of the intIntent to retrieve
+ * @return an IntIntent
+ */
+ IntIntent getIntIntent(IntIntentId intentId);
+
+ /**
+ * Returns all IntIntents installed in the network.
+ *
+ * @return an IntIntent
+ */
+ Map<IntIntentId, IntIntent> getIntIntents();
+
+ //TODO: [ONOS-7616] Design IntEvent and related APIs
+}
\ No newline at end of file
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java
new file mode 100644
index 0000000..9e80ee5
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Service to control a network of devices capable of collecting and exporting
+ * data plane telemetry via in-band mechanism.
+ */
+package org.onosproject.inbandtelemetry.api;