blob: 59bf2dfb2fce5c3e3c771e37c8c76e743a7ee737 [file] [log] [blame]
Ray Milkey2d572dd2017-04-14 10:01:24 -07001/*
Shravan Ambati7d199542016-04-22 16:09:05 -07002 * Copyright 2016-present Open Networking Laboratory
Ray Milkey2d572dd2017-04-14 10:01:24 -07003 *
Shravan Ambati7d199542016-04-22 16:09:05 -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
Ray Milkey2d572dd2017-04-14 10:01:24 -07007 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Shravan Ambati7d199542016-04-22 16:09:05 -070010 * 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.kafkaintegration.rest;
17
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070018import com.fasterxml.jackson.databind.ObjectMapper;
19import com.fasterxml.jackson.databind.node.ObjectNode;
20import org.onosproject.kafkaintegration.api.EventSubscriptionService;
21import org.onosproject.kafkaintegration.api.dto.EventSubscriber;
Shravan Ambati5a11e172016-07-21 15:55:28 -070022import org.onosproject.kafkaintegration.api.dto.RegistrationResponse;
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070023import org.onosproject.rest.AbstractWebResource;
24import org.slf4j.Logger;
25import org.slf4j.LoggerFactory;
Shravan Ambatibb6b4452016-05-04 13:25:28 -070026
Jian Lic2a542b2016-05-10 11:48:19 -070027import javax.ws.rs.Consumes;
28import javax.ws.rs.DELETE;
29import javax.ws.rs.POST;
30import javax.ws.rs.Path;
31import javax.ws.rs.Produces;
32import javax.ws.rs.core.MediaType;
33import javax.ws.rs.core.Response;
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070034import java.io.IOException;
35import java.io.InputStream;
Jian Lic2a542b2016-05-10 11:48:19 -070036
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070037import static com.google.common.base.Preconditions.checkNotNull;
38import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
Shravan Ambati7d199542016-04-22 16:09:05 -070039
40/**
41 * Rest Interfaces for subscribing/unsubscribing to event notifications.
42 */
43@Path("kafkaService")
44public class EventExporterWebResource extends AbstractWebResource {
45
46 private final Logger log = LoggerFactory.getLogger(getClass());
Shravan Ambatibb6b4452016-05-04 13:25:28 -070047 public static final String JSON_NOT_NULL =
48 "Registration Data cannot be empty";
49 public static final String REGISTRATION_SUCCESSFUL =
50 "Registered Listener successfully";
51 public static final String DEREGISTRATION_SUCCESSFUL =
52 "De-Registered Listener successfully";
53 public static final String EVENT_SUBSCRIPTION_SUCCESSFUL =
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070054 "Event Registration successful";
Sanjana Agarwaleb9f0c52016-06-07 11:10:34 -070055 public static final String EVENT_SUBSCRIPTION_UNSUCCESSFUL =
56 "Event subscription unsuccessful";
Shravan Ambatibb6b4452016-05-04 13:25:28 -070057 public static final String EVENT_SUBSCRIPTION_REMOVED =
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070058 "Event De-Registration successful";
59
Shravan Ambati7d199542016-04-22 16:09:05 -070060 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -070061 * Registers a listener for ONOS Events.
Shravan Ambati7d199542016-04-22 16:09:05 -070062 *
63 * @param appName The application trying to register
64 * @return 200 OK with UUID string which should be used as Kafka Consumer
Shravan Ambati5a11e172016-07-21 15:55:28 -070065 * Group Id and Kafka Server, port information.
Shravan Ambati7d199542016-04-22 16:09:05 -070066 * @onos.rsModel KafkaRegistration
67 */
68 @POST
69 @Produces(MediaType.APPLICATION_JSON)
70 @Consumes(MediaType.APPLICATION_JSON)
71 @Path("register")
72 public Response registerKafkaListener(String appName) {
73
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070074 EventSubscriptionService service = get(EventSubscriptionService.class);
Shravan Ambati7d199542016-04-22 16:09:05 -070075
Shravan Ambati5a11e172016-07-21 15:55:28 -070076 RegistrationResponse response = service.registerListener(appName);
77
78 ObjectNode result = mapper().createObjectNode();
79 result.put("groupId", response.getGroupId().getId().toString());
80 result.put("ipAddress", response.getIpAddress());
81 result.put("port", response.getPort());
Shravan Ambati7d199542016-04-22 16:09:05 -070082
83 log.info("Registered app {}", appName);
Shravan Ambati5a11e172016-07-21 15:55:28 -070084
85 return ok(result.toString()).build();
Shravan Ambati7d199542016-04-22 16:09:05 -070086 }
87
88 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -070089 * Unregisters a listener for ONOS Events.
Shravan Ambati7d199542016-04-22 16:09:05 -070090 *
91 * @param appName The application trying to unregister
92 * @return 200 OK
93 * @onos.rsModel KafkaRegistration
94 */
95 @DELETE
Shravan Ambati7d199542016-04-22 16:09:05 -070096 @Path("unregister")
97 public Response removeKafkaListener(String appName) {
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -070098 EventSubscriptionService service = get(EventSubscriptionService.class);
Shravan Ambati7d199542016-04-22 16:09:05 -070099
100 service.unregisterListener(appName);
Sanjana Agarwaleb9f0c52016-06-07 11:10:34 -0700101 log.info("Unregistered app {}", appName);
Shravan Ambati7d199542016-04-22 16:09:05 -0700102 return ok(DEREGISTRATION_SUCCESSFUL).build();
103 }
104
105 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700106 * Creates subscription to a specific ONOS event.
Shravan Ambati7d199542016-04-22 16:09:05 -0700107 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700108 * @param input Subscription Data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700109 * @return 200 OK if successful or 400 BAD REQUEST
110 * @onos.rsModel KafkaSubscription
111 */
112 @POST
Sanjana Agarwaleb9f0c52016-06-07 11:10:34 -0700113 @Consumes(MediaType.APPLICATION_JSON)
Shravan Ambati7d199542016-04-22 16:09:05 -0700114 @Produces(MediaType.APPLICATION_JSON)
115 @Path("subscribe")
116 public Response subscribe(InputStream input) {
117
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -0700118 EventSubscriptionService service = get(EventSubscriptionService.class);
Shravan Ambati7d199542016-04-22 16:09:05 -0700119
120 try {
121 EventSubscriber sub = parseSubscriptionData(input);
122 service.subscribe(sub);
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -0700123 // It will subscribe to all the topics. Not only the one that is sent by the consumer.
Shravan Ambati7d199542016-04-22 16:09:05 -0700124 } catch (Exception e) {
125 log.error(e.getMessage());
126 return Response.status(BAD_REQUEST).entity(e.getMessage()).build();
127 }
128
129 return ok(EVENT_SUBSCRIPTION_SUCCESSFUL).build();
130 }
131
132 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700133 * Parses JSON Subscription Data from the external application.
Shravan Ambati7d199542016-04-22 16:09:05 -0700134 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700135 * @param input Subscription Data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700136 * @return parsed DTO object
137 * @throws IOException
138 */
139 private EventSubscriber parseSubscriptionData(InputStream input)
140 throws IOException {
141
142 ObjectMapper mapper = new ObjectMapper();
143 ObjectNode node = (ObjectNode) mapper.readTree(input);
Shravan Ambati7d199542016-04-22 16:09:05 -0700144 checkNotNull(node, JSON_NOT_NULL);
Sanjana Agarwaleb9f0c52016-06-07 11:10:34 -0700145 EventSubscriber codec = codec(EventSubscriber.class).decode(node, this);
146 checkNotNull(codec, JSON_NOT_NULL);
147 return codec;
Shravan Ambati7d199542016-04-22 16:09:05 -0700148 }
149
150 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700151 * Deletes subscription from a specific ONOS event.
Shravan Ambati7d199542016-04-22 16:09:05 -0700152 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700153 * @param input data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700154 * @return 200 OK if successful or 400 BAD REQUEST
155 * @onos.rsModel KafkaSubscription
156 */
157 @DELETE
Jian Lic2a542b2016-05-10 11:48:19 -0700158 @Consumes(MediaType.APPLICATION_JSON)
Shravan Ambati7d199542016-04-22 16:09:05 -0700159 @Path("unsubscribe")
160 public Response unsubscribe(InputStream input) {
161
Sanjana Agarwalcb4a3db2016-07-14 11:42:48 -0700162 EventSubscriptionService service = get(EventSubscriptionService.class);
Shravan Ambati7d199542016-04-22 16:09:05 -0700163
164 try {
165 EventSubscriber sub = parseSubscriptionData(input);
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700166 service.unsubscribe(sub);
Shravan Ambati7d199542016-04-22 16:09:05 -0700167 } catch (Exception e) {
168 log.error(e.getMessage());
169 return Response.status(BAD_REQUEST).entity(e.getMessage()).build();
170 }
171
172 return ok(EVENT_SUBSCRIPTION_REMOVED).build();
173 }
174}