blob: 520976af4283fbdfcfcdfac9c47529349bb482a7 [file] [log] [blame]
Shravan Ambati7d199542016-04-22 16:09:05 -07001/**
2 * Copyright 2016-present Open Networking Laboratory
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6
7 * http://www.apache.org/licenses/LICENSE-2.0
8
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15package org.onosproject.kafkaintegration.rest;
16
Shravan Ambatibb6b4452016-05-04 13:25:28 -070017import static com.google.common.base.Preconditions.checkNotNull;
18import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
19
20import java.io.IOException;
21import java.io.InputStream;
Shravan Ambati7d199542016-04-22 16:09:05 -070022
Jian Lic2a542b2016-05-10 11:48:19 -070023import javax.ws.rs.Consumes;
24import javax.ws.rs.DELETE;
25import javax.ws.rs.POST;
26import javax.ws.rs.Path;
27import javax.ws.rs.Produces;
28import javax.ws.rs.core.MediaType;
29import javax.ws.rs.core.Response;
Jian Lic2a542b2016-05-10 11:48:19 -070030
Shravan Ambatibb6b4452016-05-04 13:25:28 -070031import org.onosproject.codec.JsonCodec;
32import org.onosproject.kafkaintegration.api.EventExporterService;
33import org.onosproject.kafkaintegration.api.dto.EventSubscriber;
34import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId;
35import org.onosproject.rest.AbstractWebResource;
36import org.slf4j.Logger;
37import org.slf4j.LoggerFactory;
38
39import com.fasterxml.jackson.databind.ObjectMapper;
40import com.fasterxml.jackson.databind.node.ObjectNode;
Shravan Ambati7d199542016-04-22 16:09:05 -070041
42/**
43 * Rest Interfaces for subscribing/unsubscribing to event notifications.
44 */
45@Path("kafkaService")
46public class EventExporterWebResource extends AbstractWebResource {
47
48 private final Logger log = LoggerFactory.getLogger(getClass());
Shravan Ambatibb6b4452016-05-04 13:25:28 -070049 public static final String JSON_NOT_NULL =
50 "Registration Data cannot be empty";
51 public static final String REGISTRATION_SUCCESSFUL =
52 "Registered Listener successfully";
53 public static final String DEREGISTRATION_SUCCESSFUL =
54 "De-Registered Listener successfully";
55 public static final String EVENT_SUBSCRIPTION_SUCCESSFUL =
56 "Event Registration successfull";
57 public static final String EVENT_SUBSCRIPTION_REMOVED =
58 "Event De-Registration successfull";
Shravan Ambati7d199542016-04-22 16:09:05 -070059
60 /**
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
65 * Group Id
66 * @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
74 EventExporterService service = get(EventExporterService.class);
75
76 EventSubscriberGroupId groupId = service.registerListener(appName);
77
78 log.info("Registered app {}", appName);
79
80 // TODO: Should also return Kafka server information.
81 // Will glue this in when we have the config and Kafka modules ready
82 return ok(groupId.getId().toString()).build();
83 }
84
85 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -070086 * Unregisters a listener for ONOS Events.
Shravan Ambati7d199542016-04-22 16:09:05 -070087 *
88 * @param appName The application trying to unregister
89 * @return 200 OK
90 * @onos.rsModel KafkaRegistration
91 */
92 @DELETE
Shravan Ambati7d199542016-04-22 16:09:05 -070093 @Path("unregister")
94 public Response removeKafkaListener(String appName) {
95 EventExporterService service = get(EventExporterService.class);
96
97 service.unregisterListener(appName);
98
99 return ok(DEREGISTRATION_SUCCESSFUL).build();
100 }
101
102 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700103 * Creates subscription to a specific ONOS event.
Shravan Ambati7d199542016-04-22 16:09:05 -0700104 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700105 * @param input Subscription Data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700106 * @return 200 OK if successful or 400 BAD REQUEST
107 * @onos.rsModel KafkaSubscription
108 */
109 @POST
110 @Produces(MediaType.APPLICATION_JSON)
111 @Path("subscribe")
112 public Response subscribe(InputStream input) {
113
114 EventExporterService service = get(EventExporterService.class);
115
116 try {
117 EventSubscriber sub = parseSubscriptionData(input);
118 service.subscribe(sub);
119 } catch (Exception e) {
120 log.error(e.getMessage());
121 return Response.status(BAD_REQUEST).entity(e.getMessage()).build();
122 }
123
124 return ok(EVENT_SUBSCRIPTION_SUCCESSFUL).build();
125 }
126
127 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700128 * Parses JSON Subscription Data from the external application.
Shravan Ambati7d199542016-04-22 16:09:05 -0700129 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700130 * @param input Subscription Data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700131 * @return parsed DTO object
132 * @throws IOException
133 */
134 private EventSubscriber parseSubscriptionData(InputStream input)
135 throws IOException {
136
137 ObjectMapper mapper = new ObjectMapper();
138 ObjectNode node = (ObjectNode) mapper.readTree(input);
139
140 checkNotNull(node, JSON_NOT_NULL);
141
142 JsonCodec<EventSubscriber> codec = codec(EventSubscriber.class);
143 return codec.decode(node, this);
144 }
145
146 /**
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700147 * Deletes subscription from a specific ONOS event.
Shravan Ambati7d199542016-04-22 16:09:05 -0700148 *
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700149 * @param input data in JSON format
Shravan Ambati7d199542016-04-22 16:09:05 -0700150 * @return 200 OK if successful or 400 BAD REQUEST
151 * @onos.rsModel KafkaSubscription
152 */
153 @DELETE
Jian Lic2a542b2016-05-10 11:48:19 -0700154 @Consumes(MediaType.APPLICATION_JSON)
Shravan Ambati7d199542016-04-22 16:09:05 -0700155 @Path("unsubscribe")
156 public Response unsubscribe(InputStream input) {
157
158 EventExporterService service = get(EventExporterService.class);
159
160 try {
161 EventSubscriber sub = parseSubscriptionData(input);
Shravan Ambatibb6b4452016-05-04 13:25:28 -0700162 service.unsubscribe(sub);
Shravan Ambati7d199542016-04-22 16:09:05 -0700163 } catch (Exception e) {
164 log.error(e.getMessage());
165 return Response.status(BAD_REQUEST).entity(e.getMessage()).build();
166 }
167
168 return ok(EVENT_SUBSCRIPTION_REMOVED).build();
169 }
170}