ONOS-688 (ONOS-1835,1836,1837) :
- Implements features to create and remove tunnels and tunnel flow policies.
- Implements REST API to create/show/delete tunnels and policies.
- Supports only single instance for now.
- Fix "apply" actions to "write" actions of all flow rules
Change-Id: I3740ed82fed8eab4ab8b03839192da72d3e223f1
diff --git a/src/main/java/org/onosproject/segmentrouting/TunnelPolicy.java b/src/main/java/org/onosproject/segmentrouting/TunnelPolicy.java
new file mode 100644
index 0000000..c96c1f9
--- /dev/null
+++ b/src/main/java/org/onosproject/segmentrouting/TunnelPolicy.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.segmentrouting;
+
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Tunnel Policy.
+ */
+public final class TunnelPolicy implements Policy {
+
+ private final SegmentRoutingManager srManager;
+ private final Type type;
+ private final String id;
+ private final TrafficSelector selector;
+ private final int priority;
+ private final String tunnelId;
+
+ private TunnelPolicy(SegmentRoutingManager srm, String policyId, Type type,
+ TrafficSelector selector, int priority, String tunnelId) {
+ this.srManager = srm;
+ this.id = checkNotNull(policyId);
+ this.type = type;
+ this.tunnelId = tunnelId;
+ this.priority = priority;
+ this.selector = selector;
+ }
+
+ /**
+ * Creates a TunnelPolicy reference.
+ *
+ * @param p TunnelPolicy reference
+ */
+ public TunnelPolicy(TunnelPolicy p) {
+ this.srManager = p.srManager;
+ this.id = p.id;
+ this.type = p.type;
+ this.tunnelId = p.tunnelId;
+ this.priority = p.priority;
+ this.selector = p.selector;
+ }
+
+ /**
+ * Creates a TunnelPolicy reference.
+ *
+ * @param p TunnelPolicy reference
+ */
+ public TunnelPolicy(SegmentRoutingManager srm, TunnelPolicy p) {
+ this.srManager = srm;
+ this.id = p.id;
+ this.type = p.type;
+ this.tunnelId = p.tunnelId;
+ this.priority = p.priority;
+ this.selector = p.selector;
+ }
+
+ /**
+ * Returns the TunnelPolicy builder reference.
+ *
+ * @return TunnelPolicy builder
+ */
+ public static TunnelPolicy.Builder builder() {
+ return new Builder();
+ }
+
+ @Override
+ public String id() {
+ return this.id;
+ }
+
+ @Override
+ public TrafficSelector selector() {
+ return selector;
+ }
+
+ @Override
+ public int priority() {
+ return priority;
+ }
+
+ @Override
+ public Type type() {
+ return type;
+ }
+
+ @Override
+ public boolean create() {
+
+ Tunnel tunnel = srManager.getTunnel(tunnelId);
+
+ ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective
+ .builder()
+ .fromApp(srManager.appId)
+ .makePermanent()
+ .nextStep(tunnel.groupId())
+ .withPriority(priority)
+ .withSelector(selector)
+ .withFlag(ForwardingObjective.Flag.VERSATILE);
+
+ srManager.flowObjectiveService.forward(tunnel.source(), fwdBuilder.add());
+
+ return true;
+ }
+
+ @Override
+ public boolean remove() {
+
+ Tunnel tunnel = srManager.getTunnel(tunnelId);
+
+ ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective
+ .builder()
+ .fromApp(srManager.appId)
+ .makePermanent()
+ .withSelector(selector)
+ .withPriority(priority)
+ .nextStep(tunnel.groupId())
+ .withFlag(ForwardingObjective.Flag.VERSATILE);
+
+ srManager.flowObjectiveService.forward(tunnel.source(), fwdBuilder.remove());
+
+ return true;
+ }
+
+ /**
+ * Returns the tunnel ID of the policy.
+ *
+ * @return Tunnel ID
+ */
+ public String tunnelId() {
+ return this.tunnelId;
+ }
+
+ /**
+ * Tunnel Policy Builder.
+ */
+ public static final class Builder {
+
+ private SegmentRoutingManager srManager;
+ private String id;
+ private Type type;
+ private TrafficSelector selector;
+ private int priority;
+ private String tunnelId;
+
+ /**
+ * Sets the policy Id.
+ *
+ * @param id policy Id
+ * @return Builder object
+ */
+ public Builder setPolicyId(String id) {
+ this.id = id;
+
+ return this;
+ }
+
+ /**
+ * Sets the policy type.
+ *
+ * @param type policy type
+ * @return Builder object
+ */
+ public Builder setType(Type type) {
+ this.type = type;
+
+ return this;
+ }
+
+ /**
+ * Sets the TrafficSelector.
+ *
+ * @param selector TrafficSelector
+ * @return Builder object
+ */
+ public Builder setSelector(TrafficSelector selector) {
+ this.selector = selector;
+
+ return this;
+ }
+
+ /**
+ * Sets the priority of the policy.
+ *
+ * @param p priority
+ * @return Builder object
+ */
+ public Builder setPriority(int p) {
+ this.priority = p;
+
+ return this;
+ }
+
+ /**
+ * Sets the tunnel Id.
+ *
+ * @param tunnelId tunnel Id
+ * @return Builder object
+ */
+ public Builder setTunnelId(String tunnelId) {
+ this.tunnelId = tunnelId;
+
+ return this;
+ }
+
+ /**
+ * Sets the Segment Routing Manager reference.
+ *
+ * @param srm Segment Routing Manager reference
+ * @return Builder object
+ */
+ public Builder setManager(SegmentRoutingManager srm) {
+ this.srManager = srm;
+
+ return this;
+ }
+
+ /**
+ * Builds the policy.
+ *
+ * @return Tunnel Policy reference
+ */
+ public Policy build() {
+ return new TunnelPolicy(srManager, id, type, selector, priority, tunnelId);
+ }
+ }
+}