blob: cfa1a63b8d5e5796a1f99acb20dc75277eb2c34f [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Thomas Vachuska140d5852014-10-16 12:17:45 -070016package org.onlab.onos.calendar;
17
Ray Milkeycaa450b2014-10-29 15:54:24 -070018import java.net.URI;
Ray Milkeycaa450b2014-10-29 15:54:24 -070019import org.onlab.onos.net.ConnectPoint;
20import org.onlab.onos.net.DeviceId;
Hongtao Yin621c57a2014-10-30 14:28:03 -070021import org.onlab.onos.net.intent.IntentService;
22import org.onlab.rest.BaseResource;
23import javax.ws.rs.POST;
24import javax.ws.rs.DELETE;
25import javax.ws.rs.PathParam;
26import javax.ws.rs.core.Response;
27import org.onlab.onos.core.ApplicationId;
28import org.onlab.onos.core.CoreService;
Ray Milkeycaa450b2014-10-29 15:54:24 -070029import org.onlab.onos.net.flow.DefaultTrafficSelector;
30import org.onlab.onos.net.flow.TrafficSelector;
31import org.onlab.onos.net.flow.TrafficTreatment;
Hongtao Yin621c57a2014-10-30 14:28:03 -070032import org.onlab.onos.net.intent.PointToPointIntent;
Ray Milkeycaa450b2014-10-29 15:54:24 -070033import org.onlab.packet.Ethernet;
Thomas Vachuska140d5852014-10-16 12:17:45 -070034import static org.onlab.onos.net.PortNumber.portNumber;
Ray Milkeycaa450b2014-10-29 15:54:24 -070035import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
Thomas Vachuska140d5852014-10-16 12:17:45 -070036
Hongtao Yin621c57a2014-10-30 14:28:03 -070037import static org.slf4j.LoggerFactory.getLogger;
38import org.slf4j.Logger;
39
Thomas Vachuska140d5852014-10-16 12:17:45 -070040/**
41 * Web resource for triggering calendared intents.
42 */
Hongtao Yin621c57a2014-10-30 14:28:03 -070043@javax.ws.rs.Path("intent")
Thomas Vachuska140d5852014-10-16 12:17:45 -070044public class BandwidthCalendarResource extends BaseResource {
45
Hongtao Yin621c57a2014-10-30 14:28:03 -070046 private static final Logger log = getLogger(BandwidthCalendarResource.class);
47
48 @javax.ws.rs.Path("/{src}/{dst}/{srcPort}/{dstPort}/{bandwidth}")
Thomas Vachuska140d5852014-10-16 12:17:45 -070049 @POST
Thomas Vachuska140d5852014-10-16 12:17:45 -070050 public Response createIntent(@PathParam("src") String src,
51 @PathParam("dst") String dst,
52 @PathParam("srcPort") String srcPort,
53 @PathParam("dstPort") String dstPort,
54 @PathParam("bandwidth") String bandwidth) {
Hongtao Yin621c57a2014-10-30 14:28:03 -070055
56 log.info("Receiving Create Intent request...");
57 log.info("Path Constraints: Src = {} SrcPort = {} Dest = {} DestPort = {} BW = {}",
58 src, srcPort, dst, dstPort, bandwidth);
59
Thomas Vachuska140d5852014-10-16 12:17:45 -070060 IntentService service = get(IntentService.class);
61
62 ConnectPoint srcPoint = new ConnectPoint(deviceId(src), portNumber(srcPort));
63 ConnectPoint dstPoint = new ConnectPoint(deviceId(dst), portNumber(dstPort));
64
Ray Milkeycaa450b2014-10-29 15:54:24 -070065 TrafficSelector selector = buildTrafficSelector();
66 TrafficTreatment treatment = builder().build();
67
Hongtao Yin621c57a2014-10-30 14:28:03 -070068 PointToPointIntent intentP2P =
69 new PointToPointIntent(appId(), selector, treatment,
70 srcPoint, dstPoint);
71 service.submit(intentP2P);
72 log.info("Submitted Calendar App intent: src = " + src + "dest = " + dst
73 + "srcPort = " + srcPort + "destPort" + dstPort + "intentID = " + intentP2P.id().toString());
74 String reply = intentP2P.id().toString() + "\n";
Ray Milkeycaa450b2014-10-29 15:54:24 -070075
Hongtao Yin621c57a2014-10-30 14:28:03 -070076 return Response.ok(reply).build();
77 }
78
79 @javax.ws.rs.Path("/cancellation/{intentId}")
80 @DELETE
81 public Response withdrawIntent(@PathParam("intentId") String intentId) {
82
83 log.info("Receiving Teardown request...");
84 log.info("Withdraw intentId = {} ", intentId);
85
86 String reply = "ok\n";
87 return Response.ok(reply).build();
88 }
89
90 @javax.ws.rs.Path("/modification/{intentId}/{bandwidth}")
91 @POST
92 public Response modifyBandwidth(@PathParam("intentId") String intentId,
93 @PathParam("bandwidth") String bandwidth) {
94
95 log.info("Receiving Modify request...");
96 log.info("Modify bw for intentId = {} with new bandwidth = {}", intentId, bandwidth);
97
98 String reply = "ok\n";
99 return Response.ok(reply).build();
Thomas Vachuska140d5852014-10-16 12:17:45 -0700100 }
101
Ray Milkeycaa450b2014-10-29 15:54:24 -0700102 private TrafficSelector buildTrafficSelector() {
103 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
104 Short ethType = Ethernet.TYPE_IPV4;
105
106 selectorBuilder.matchEthType(ethType);
107
108 return selectorBuilder.build();
109 }
110
Thomas Vachuska140d5852014-10-16 12:17:45 -0700111 private DeviceId deviceId(String dpid) {
112 return DeviceId.deviceId(URI.create("of:" + dpid));
113 }
114
Ray Milkeycaa450b2014-10-29 15:54:24 -0700115 protected ApplicationId appId() {
116 return get(CoreService.class).registerApplication("org.onlab.onos.calendar");
117 }
Thomas Vachuska140d5852014-10-16 12:17:45 -0700118}