Committed by
Gerrit Code Review
CodeReview - Initial Commit for Kafka Integration Application
1. Partial REST API implementation 2. Partial Event Manager backend implementation Change-Id: Ieaf703f7a3f6e296aea8ffcf155c7a1b603236ca
Showing
20 changed files
with
1109 additions
and
0 deletions
apps/kafka-integration/pom.xml
0 → 100644
| 1 | +<?sxml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!-- | ||
| 3 | + ~ Copyright 2016 Open Networking Laboratory | ||
| 4 | + ~ | ||
| 5 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 6 | + ~ you may not use this file except in compliance with the License. | ||
| 7 | + ~ You may obtain a copy of the License at | ||
| 8 | + ~ | ||
| 9 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| 10 | + ~ | ||
| 11 | + ~ Unless required by applicable law or agreed to in writing, software | ||
| 12 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
| 13 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 14 | + ~ See the License for the specific language governing permissions and | ||
| 15 | + ~ limitations under the License. | ||
| 16 | + --> | ||
| 17 | +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 18 | + <modelVersion>4.0.0</modelVersion> | ||
| 19 | + | ||
| 20 | + <parent> | ||
| 21 | + <groupId>org.onosproject</groupId> | ||
| 22 | + <artifactId>onos-apps</artifactId> | ||
| 23 | + <version>1.6.0-SNAPSHOT</version> | ||
| 24 | + <relativePath>../pom.xml</relativePath> | ||
| 25 | + </parent> | ||
| 26 | + | ||
| 27 | + <artifactId>onos-app-kafka</artifactId> | ||
| 28 | + <packaging>bundle</packaging> | ||
| 29 | + | ||
| 30 | + <description> | ||
| 31 | + ONOS Kafka Integration Application. | ||
| 32 | + This will export ONOS events to an external Kafka Server | ||
| 33 | + </description> | ||
| 34 | + <url>http://onosproject.org</url> | ||
| 35 | + | ||
| 36 | + <properties> | ||
| 37 | + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
| 38 | + <onos.version>1.6.0-SNAPSHOT</onos.version> | ||
| 39 | + <onos.app.name>org.onosproject.kafkaintegration</onos.app.name> | ||
| 40 | + <onos.app.title>Kafka Integration Application</onos.app.title> | ||
| 41 | + <onos.app.origin>Calix, Inc.</onos.app.origin> | ||
| 42 | + <web.context>/onos/kafka</web.context> | ||
| 43 | + <api.version>1.0.0</api.version> | ||
| 44 | + <api.package>org.onosproject.kafkaintegration.rest</api.package> | ||
| 45 | + <api.title>Kafka Integration Application REST API</api.title> | ||
| 46 | + <api.description> | ||
| 47 | + APIs for subscribing to Events generated by onos | ||
| 48 | + </api.description> | ||
| 49 | + <onos.app.category>Utility</onos.app.category> | ||
| 50 | + <onos.app.url>https://wiki.onosproject.org/display/ONOS/Kafka+Integration</onos.app.url> | ||
| 51 | + <onos.app.readme>Export onos events to a Northbound Kafka server</onos.app.readme> | ||
| 52 | + </properties> | ||
| 53 | + | ||
| 54 | + <dependencies> | ||
| 55 | + <dependency> | ||
| 56 | + <groupId>org.onosproject</groupId> | ||
| 57 | + <artifactId>onos-api</artifactId> | ||
| 58 | + <version>${onos.version}</version> | ||
| 59 | + </dependency> | ||
| 60 | + | ||
| 61 | + <dependency> | ||
| 62 | + <groupId>org.onosproject</groupId> | ||
| 63 | + <artifactId>onlab-osgi</artifactId> | ||
| 64 | + <version>${onos.version}</version> | ||
| 65 | + </dependency> | ||
| 66 | + | ||
| 67 | + <dependency> | ||
| 68 | + <groupId>org.onosproject</groupId> | ||
| 69 | + <artifactId>onos-rest</artifactId> | ||
| 70 | + <version>${onos.version}</version> | ||
| 71 | + </dependency> | ||
| 72 | + | ||
| 73 | + <dependency> | ||
| 74 | + <groupId>junit</groupId> | ||
| 75 | + <artifactId>junit</artifactId> | ||
| 76 | + <version>4.12</version> | ||
| 77 | + <scope>test</scope> | ||
| 78 | + </dependency> | ||
| 79 | + | ||
| 80 | + <dependency> | ||
| 81 | + <groupId>org.onosproject</groupId> | ||
| 82 | + <artifactId>onos-api</artifactId> | ||
| 83 | + <version>${onos.version}</version> | ||
| 84 | + <scope>test</scope> | ||
| 85 | + <classifier>tests</classifier> | ||
| 86 | + </dependency> | ||
| 87 | + | ||
| 88 | + <dependency> | ||
| 89 | + <groupId>javax.ws.rs</groupId> | ||
| 90 | + <artifactId>javax.ws.rs-api</artifactId> | ||
| 91 | + <version>2.0.1</version> | ||
| 92 | + </dependency> | ||
| 93 | + | ||
| 94 | + <dependency> | ||
| 95 | + <groupId>com.google.protobuf</groupId> | ||
| 96 | + <artifactId>protobuf-java</artifactId> | ||
| 97 | + <version>2.5.0</version> | ||
| 98 | + </dependency> | ||
| 99 | + | ||
| 100 | + <dependency> | ||
| 101 | + <groupId>org.codehaus.jackson</groupId> | ||
| 102 | + <artifactId>jackson-core-asl</artifactId> | ||
| 103 | + <version>1.9.13</version> | ||
| 104 | + </dependency> | ||
| 105 | + | ||
| 106 | + <dependency> | ||
| 107 | + <groupId>org.codehaus.jackson</groupId> | ||
| 108 | + <artifactId>jackson-mapper-asl</artifactId> | ||
| 109 | + <version>1.9.13</version> | ||
| 110 | + </dependency> | ||
| 111 | + | ||
| 112 | + <dependency> | ||
| 113 | + <groupId>org.glassfish.jersey.containers</groupId> | ||
| 114 | + <artifactId>jersey-container-servlet</artifactId> | ||
| 115 | + <version>2.22.2</version> | ||
| 116 | + </dependency> | ||
| 117 | + | ||
| 118 | + <dependency> | ||
| 119 | + <groupId>com.fasterxml.jackson.core</groupId> | ||
| 120 | + <artifactId>jackson-annotations</artifactId> | ||
| 121 | + <version>2.6.4</version> | ||
| 122 | + </dependency> | ||
| 123 | + | ||
| 124 | + <dependency> | ||
| 125 | + <groupId>org.onosproject</groupId> | ||
| 126 | + <artifactId>onos-core-serializers</artifactId> | ||
| 127 | + <version>${onos.version}</version> | ||
| 128 | + </dependency> | ||
| 129 | + | ||
| 130 | + <dependency> | ||
| 131 | + <groupId>org.apache.felix</groupId> | ||
| 132 | + <artifactId>org.apache.felix.scr.annotations</artifactId> | ||
| 133 | + <version>1.9.12</version> | ||
| 134 | + <scope>provided</scope> | ||
| 135 | + </dependency> | ||
| 136 | + </dependencies> | ||
| 137 | + | ||
| 138 | + <build> | ||
| 139 | + <plugins> | ||
| 140 | + <plugin> | ||
| 141 | + <groupId>org.apache.felix</groupId> | ||
| 142 | + <artifactId>maven-bundle-plugin</artifactId> | ||
| 143 | + <version>3.0.1</version> | ||
| 144 | + <extensions>true</extensions> | ||
| 145 | + <configuration> | ||
| 146 | + <instructions> | ||
| 147 | + <Bundle-SymbolicName> | ||
| 148 | + ${project.groupId}.${project.artifactId} | ||
| 149 | + </Bundle-SymbolicName> | ||
| 150 | + <_wab>src/main/webapp/</_wab> | ||
| 151 | + <Include-Resource> | ||
| 152 | + WEB-INF/classes/apidoc/swagger.json=target/swagger.json, | ||
| 153 | + {maven-resources} | ||
| 154 | + </Include-Resource> | ||
| 155 | + <Import-Package> | ||
| 156 | + org.slf4j, | ||
| 157 | + org.osgi.framework, | ||
| 158 | + javax.ws.rs, | ||
| 159 | + javax.ws.rs.core, | ||
| 160 | + org.glassfish.jersey.servlet, | ||
| 161 | + com.fasterxml.jackson.databind, | ||
| 162 | + com.fasterxml.jackson.databind.node, | ||
| 163 | + com.fasterxml.jackson.core, | ||
| 164 | + org.onlab.packet.*, | ||
| 165 | + org.onosproject.*, | ||
| 166 | + com.google.common.* | ||
| 167 | + </Import-Package> | ||
| 168 | + <Web-ContextPath>${web.context}</Web-ContextPath> | ||
| 169 | + </instructions> | ||
| 170 | + </configuration> | ||
| 171 | + </plugin> | ||
| 172 | + <plugin> | ||
| 173 | + <groupId>org.apache.maven.plugins</groupId> | ||
| 174 | + <artifactId>maven-compiler-plugin</artifactId> | ||
| 175 | + <version>2.5.1</version> | ||
| 176 | + <configuration> | ||
| 177 | + <source>1.8</source> | ||
| 178 | + <target>1.8</target> | ||
| 179 | + </configuration> | ||
| 180 | + </plugin> | ||
| 181 | + <plugin> | ||
| 182 | + <groupId>org.apache.felix</groupId> | ||
| 183 | + <artifactId>maven-scr-plugin</artifactId> | ||
| 184 | + <version>1.21.0</version> | ||
| 185 | + <executions> | ||
| 186 | + <execution> | ||
| 187 | + <id>generate-scr-srcdescriptor</id> | ||
| 188 | + <goals> | ||
| 189 | + <goal>scr</goal> | ||
| 190 | + </goals> | ||
| 191 | + </execution> | ||
| 192 | + </executions> | ||
| 193 | + <configuration> | ||
| 194 | + <supportedProjectTypes> | ||
| 195 | + <supportedProjectType>bundle</supportedProjectType> | ||
| 196 | + <supportedProjectType>war</supportedProjectType> | ||
| 197 | + </supportedProjectTypes> | ||
| 198 | + </configuration> | ||
| 199 | + </plugin> | ||
| 200 | + <plugin> | ||
| 201 | + <groupId>org.onosproject</groupId> | ||
| 202 | + <artifactId>onos-maven-plugin</artifactId> | ||
| 203 | + <version>1.9</version> | ||
| 204 | + <executions> | ||
| 205 | + <execution> | ||
| 206 | + <id>cfg</id> | ||
| 207 | + <phase>generate-resources</phase> | ||
| 208 | + <goals> | ||
| 209 | + <goal>cfg</goal> | ||
| 210 | + </goals> | ||
| 211 | + </execution> | ||
| 212 | + <execution> | ||
| 213 | + <id>swagger</id> | ||
| 214 | + <phase>generate-sources</phase> | ||
| 215 | + <goals> | ||
| 216 | + <goal>swagger</goal> | ||
| 217 | + </goals> | ||
| 218 | + </execution> | ||
| 219 | + <execution> | ||
| 220 | + <id>app</id> | ||
| 221 | + <phase>package</phase> | ||
| 222 | + <goals> | ||
| 223 | + <goal>app</goal> | ||
| 224 | + </goals> | ||
| 225 | + </execution> | ||
| 226 | + </executions> | ||
| 227 | + </plugin> | ||
| 228 | + </plugins> | ||
| 229 | + </build> | ||
| 230 | + | ||
| 231 | +</project> |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/EventExporterManager.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * 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 | ||
| 7 | + * | ||
| 8 | + * 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. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.kafkaintegration; | ||
| 17 | + | ||
| 18 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 19 | + | ||
| 20 | +import java.util.Map; | ||
| 21 | +import java.util.UUID; | ||
| 22 | + | ||
| 23 | +import org.apache.felix.scr.annotations.Activate; | ||
| 24 | +import org.apache.felix.scr.annotations.Component; | ||
| 25 | +import org.apache.felix.scr.annotations.Deactivate; | ||
| 26 | +import org.apache.felix.scr.annotations.Reference; | ||
| 27 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 28 | +import org.apache.felix.scr.annotations.Service; | ||
| 29 | +import org.onosproject.core.ApplicationId; | ||
| 30 | +import org.onosproject.core.CoreService; | ||
| 31 | +import org.onosproject.kafkaintegration.api.EventExporterService; | ||
| 32 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriber; | ||
| 33 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId; | ||
| 34 | +import org.onosproject.kafkaintegration.errors.InvalidApplicationException; | ||
| 35 | +import org.onosproject.kafkaintegration.errors.InvalidGroupIdException; | ||
| 36 | +import org.onosproject.kafkaintegration.errors.UnsupportedEventException; | ||
| 37 | +import org.onosproject.net.device.DeviceService; | ||
| 38 | +import org.onosproject.net.link.LinkService; | ||
| 39 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
| 40 | +import org.onosproject.store.service.Serializer; | ||
| 41 | +import org.onosproject.store.service.StorageService; | ||
| 42 | +import org.slf4j.Logger; | ||
| 43 | +import org.slf4j.LoggerFactory; | ||
| 44 | + | ||
| 45 | +/** | ||
| 46 | + * Implementation of Event Exporter Service. | ||
| 47 | + * | ||
| 48 | + */ | ||
| 49 | +@Component(immediate = true) | ||
| 50 | +@Service | ||
| 51 | +public class EventExporterManager implements EventExporterService { | ||
| 52 | + | ||
| 53 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 54 | + | ||
| 55 | + // Stores the currently registered applications for event export service. | ||
| 56 | + // Map of Appname to groupId | ||
| 57 | + private Map<ApplicationId, EventSubscriberGroupId> registeredApps; | ||
| 58 | + | ||
| 59 | + private static final String REGISTERED_APPS = "registered-applications"; | ||
| 60 | + | ||
| 61 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 62 | + protected DeviceService deviceService; | ||
| 63 | + | ||
| 64 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 65 | + protected LinkService linkService; | ||
| 66 | + | ||
| 67 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 68 | + protected CoreService coreService; | ||
| 69 | + | ||
| 70 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 71 | + protected StorageService storageService; | ||
| 72 | + | ||
| 73 | + private static final String NOT_YET_SUPPORTED = "Not yet supported."; | ||
| 74 | + | ||
| 75 | + private ApplicationId appId; | ||
| 76 | + | ||
| 77 | + @Activate | ||
| 78 | + protected void activate() { | ||
| 79 | + appId = coreService | ||
| 80 | + .registerApplication("org.onosproject.kafkaintegration"); | ||
| 81 | + | ||
| 82 | + registeredApps = storageService | ||
| 83 | + .<ApplicationId, EventSubscriberGroupId>consistentMapBuilder() | ||
| 84 | + .withName(REGISTERED_APPS) | ||
| 85 | + .withSerializer(Serializer.using(KryoNamespaces.API, | ||
| 86 | + EventSubscriberGroupId.class, | ||
| 87 | + UUID.class)) | ||
| 88 | + .build().asJavaMap(); | ||
| 89 | + | ||
| 90 | + log.info("Started"); | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + @Deactivate | ||
| 94 | + protected void deactivate() { | ||
| 95 | + log.info("Stopped"); | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + @Override | ||
| 99 | + public EventSubscriberGroupId registerListener(String appName) { | ||
| 100 | + | ||
| 101 | + // TODO: Remove it once ONOS provides a mechanism for external apps | ||
| 102 | + // to register with the core service. See Jira - 4409 | ||
| 103 | + ApplicationId externalAppId = coreService.registerApplication(appName); | ||
| 104 | + | ||
| 105 | + return registeredApps.computeIfAbsent(externalAppId, | ||
| 106 | + (key) -> new EventSubscriberGroupId(UUID | ||
| 107 | + .randomUUID())); | ||
| 108 | + | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + @Override | ||
| 112 | + public void unregisterListener(String appName) { | ||
| 113 | + ApplicationId externalAppId = | ||
| 114 | + checkNotNull(coreService.getAppId(appName)); | ||
| 115 | + registeredApps.remove(externalAppId); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + @Override | ||
| 119 | + public void subscribe(EventSubscriber subscriber) | ||
| 120 | + throws UnsupportedEventException, InvalidGroupIdException, | ||
| 121 | + InvalidApplicationException { | ||
| 122 | + | ||
| 123 | + throw new UnsupportedOperationException(NOT_YET_SUPPORTED); | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + @Override | ||
| 127 | + public void unsubscribe(EventSubscriber subscriber) | ||
| 128 | + throws InvalidGroupIdException, InvalidApplicationException { | ||
| 129 | + | ||
| 130 | + throw new UnsupportedOperationException(NOT_YET_SUPPORTED); | ||
| 131 | + } | ||
| 132 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/api/EventExporterService.java
0 → 100644
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.api; | ||
| 16 | + | ||
| 17 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriber; | ||
| 18 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId; | ||
| 19 | +import org.onosproject.kafkaintegration.errors.InvalidApplicationException; | ||
| 20 | +import org.onosproject.kafkaintegration.errors.InvalidGroupIdException; | ||
| 21 | +import org.onosproject.kafkaintegration.errors.UnsupportedEventException; | ||
| 22 | + | ||
| 23 | +/** | ||
| 24 | + * APIs for subscribing to Onos Event Messages. | ||
| 25 | + */ | ||
| 26 | +public interface EventExporterService { | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * Registers the external application to receive events generated in ONOS. | ||
| 30 | + * | ||
| 31 | + * @param appName Application Name | ||
| 32 | + * @return unique consumer group identifier | ||
| 33 | + */ | ||
| 34 | + EventSubscriberGroupId registerListener(String appName); | ||
| 35 | + | ||
| 36 | + /** | ||
| 37 | + * Removes the Registered Listener. | ||
| 38 | + * | ||
| 39 | + * @param appName Application Name | ||
| 40 | + */ | ||
| 41 | + void unregisterListener(String appName); | ||
| 42 | + | ||
| 43 | + /** | ||
| 44 | + * Allows registered listener to subscribe for a specific event type. | ||
| 45 | + * | ||
| 46 | + * @param subscriber Subscription data containing the event type | ||
| 47 | + * @throws UnsupportedEventException | ||
| 48 | + * @throws InvalidGroupIdException | ||
| 49 | + * @throws InvalidApplicationException | ||
| 50 | + */ | ||
| 51 | + void subscribe(EventSubscriber subscriber) | ||
| 52 | + throws UnsupportedEventException, InvalidGroupIdException, | ||
| 53 | + InvalidApplicationException; | ||
| 54 | + | ||
| 55 | + /** | ||
| 56 | + * Allows the registered listener to unsubscribe for a specific event. | ||
| 57 | + * | ||
| 58 | + * @param subscriber Subscription data containing the event type | ||
| 59 | + * @throws InvalidGroupIdException | ||
| 60 | + * @throws InvalidApplicationException | ||
| 61 | + */ | ||
| 62 | + void unsubscribe(EventSubscriber subscriber) | ||
| 63 | + throws InvalidGroupIdException, InvalidApplicationException; | ||
| 64 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/api/dto/EventSubscriber.java
0 → 100644
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.api.dto; | ||
| 16 | + | ||
| 17 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 18 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 19 | + | ||
| 20 | +import java.util.Objects; | ||
| 21 | + | ||
| 22 | +import org.onosproject.kafkaintegration.api.dto.OnosEvent.Type; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * Representation of a subscription to an event type. | ||
| 26 | + * | ||
| 27 | + */ | ||
| 28 | +public final class EventSubscriber { | ||
| 29 | + private final String appName; | ||
| 30 | + private final EventSubscriberGroupId subscriberGroupId; | ||
| 31 | + private final Type eventType; | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * Creates a new Event Subscriber. | ||
| 35 | + * | ||
| 36 | + * @param name Application Name | ||
| 37 | + * @param groupId Subscriber group id of the application | ||
| 38 | + * @param eventType ONOS event type | ||
| 39 | + */ | ||
| 40 | + public EventSubscriber(String name, EventSubscriberGroupId groupId, | ||
| 41 | + Type eventType) { | ||
| 42 | + this.appName = checkNotNull(name); | ||
| 43 | + this.subscriberGroupId = checkNotNull(groupId); | ||
| 44 | + this.eventType = checkNotNull(eventType); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + /** | ||
| 48 | + * Returns the Application Name. | ||
| 49 | + * | ||
| 50 | + * @return application name | ||
| 51 | + */ | ||
| 52 | + public String appName() { | ||
| 53 | + return appName; | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * Returns the Subscriber Group Id. | ||
| 58 | + * | ||
| 59 | + * @return Subscriber Group Id | ||
| 60 | + */ | ||
| 61 | + public EventSubscriberGroupId subscriberGroupId() { | ||
| 62 | + return subscriberGroupId; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + /** | ||
| 66 | + * Returns the Event type. | ||
| 67 | + * | ||
| 68 | + * @return ONOS Event Type | ||
| 69 | + */ | ||
| 70 | + public Type eventType() { | ||
| 71 | + return eventType; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + @Override | ||
| 75 | + public int hashCode() { | ||
| 76 | + return Objects.hash(appName, subscriberGroupId, eventType); | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + @Override | ||
| 80 | + public boolean equals(Object o) { | ||
| 81 | + if (o instanceof EventSubscriber) { | ||
| 82 | + EventSubscriber sub = (EventSubscriber) o; | ||
| 83 | + if (sub.appName.equals(appName) | ||
| 84 | + && sub.subscriberGroupId.equals(subscriberGroupId) | ||
| 85 | + && sub.eventType.equals(eventType)) { | ||
| 86 | + return true; | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + return false; | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + @Override | ||
| 94 | + public String toString() { | ||
| 95 | + return toStringHelper(this).add("appName", appName) | ||
| 96 | + .addValue(subscriberGroupId.toString()) | ||
| 97 | + .add("eventType", eventType).toString(); | ||
| 98 | + } | ||
| 99 | +} |
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.api.dto; | ||
| 16 | + | ||
| 17 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 18 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 19 | + | ||
| 20 | +import java.util.Objects; | ||
| 21 | +import java.util.UUID; | ||
| 22 | + | ||
| 23 | +/** | ||
| 24 | + * Wrapper Object for storing the consumer group id. Group ids are used by | ||
| 25 | + * external applications when consuming events from Kafka server. | ||
| 26 | + * | ||
| 27 | + */ | ||
| 28 | +public final class EventSubscriberGroupId { | ||
| 29 | + private final UUID id; | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * Creates a new Subscriber Group Id. | ||
| 33 | + * | ||
| 34 | + * @param uuid representing the group id. | ||
| 35 | + */ | ||
| 36 | + public EventSubscriberGroupId(UUID uuid) { | ||
| 37 | + id = checkNotNull(uuid); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Returns the Group Id of the subscriber. | ||
| 42 | + * | ||
| 43 | + * @return uuid representing the group id. | ||
| 44 | + */ | ||
| 45 | + public UUID getId() { | ||
| 46 | + return id; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + @Override | ||
| 50 | + public boolean equals(Object o) { | ||
| 51 | + if (o instanceof EventSubscriberGroupId) { | ||
| 52 | + EventSubscriberGroupId sub = (EventSubscriberGroupId) o; | ||
| 53 | + if (sub.id.equals(id)) { | ||
| 54 | + return true; | ||
| 55 | + } | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + return false; | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + @Override | ||
| 62 | + public int hashCode() { | ||
| 63 | + return Objects.hash(id); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + @Override | ||
| 67 | + public String toString() { | ||
| 68 | + return toStringHelper(this).add("subscriberGroupId", id).toString(); | ||
| 69 | + } | ||
| 70 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/api/dto/OnosEvent.java
0 → 100644
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.api.dto; | ||
| 16 | + | ||
| 17 | +import org.onosproject.event.AbstractEvent; | ||
| 18 | + | ||
| 19 | +import com.google.protobuf.GeneratedMessage; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * Represents the converted Onos Event data into GPB format. | ||
| 23 | + * | ||
| 24 | + */ | ||
| 25 | +public class OnosEvent extends AbstractEvent<OnosEvent.Type, GeneratedMessage> { | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * Creates a new Onos Event. | ||
| 29 | + * | ||
| 30 | + * @param type The Type of Onos Event | ||
| 31 | + * @param subject Protobuf message corresponding to the Onos Event | ||
| 32 | + */ | ||
| 33 | + public OnosEvent(Type type, GeneratedMessage subject) { | ||
| 34 | + super(type, subject); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + /** | ||
| 38 | + * List of Event Types supported. | ||
| 39 | + */ | ||
| 40 | + public enum Type { | ||
| 41 | + DEVICE, LINK; | ||
| 42 | + } | ||
| 43 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/api/dto/package-info.java
0 → 100644
| 1 | +/** | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory Licensed under the Apache | ||
| 3 | + * License, Version 2.0 (the "License"); you may not use this file except in | ||
| 4 | + * compliance with the License. You may obtain a copy of the License at | ||
| 5 | + * | ||
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 7 | + * | ||
| 8 | + * Unless required by applicable law or agreed to in writing, software | ||
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
| 10 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
| 11 | + * License for the specific language governing permissions and limitations under | ||
| 12 | + * the License. | ||
| 13 | + */ | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * Immutable Data Transfer Objects. | ||
| 17 | + */ | ||
| 18 | +package org.onosproject.kafkaintegration.api.dto; |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/api/package-info.java
0 → 100644
| 1 | +/** | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory Licensed under the Apache | ||
| 3 | + * License, Version 2.0 (the "License"); you may not use this file except in | ||
| 4 | + * compliance with the License. You may obtain a copy of the License at | ||
| 5 | + * | ||
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 7 | + * | ||
| 8 | + * Unless required by applicable law or agreed to in writing, software | ||
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
| 10 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
| 11 | + * License for the specific language governing permissions and limitations under | ||
| 12 | + * the License. | ||
| 13 | + */ | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * API definitions for the Application. | ||
| 17 | + */ | ||
| 18 | +package org.onosproject.kafkaintegration.api; |
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.errors; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * Represents that an unregistered application trying to subscribe to ONOS | ||
| 19 | + * events. | ||
| 20 | + * | ||
| 21 | + */ | ||
| 22 | +public class InvalidApplicationException extends RuntimeException { | ||
| 23 | + | ||
| 24 | + private static final long serialVersionUID = 1L; | ||
| 25 | + | ||
| 26 | + public InvalidApplicationException(String message) { | ||
| 27 | + super(message); | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | +} |
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.errors; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * The groupId given by the external application is already in use by another | ||
| 19 | + * application or groupId does not exist. | ||
| 20 | + * | ||
| 21 | + */ | ||
| 22 | +public class InvalidGroupIdException extends RuntimeException { | ||
| 23 | + | ||
| 24 | + private static final long serialVersionUID = 1L; | ||
| 25 | + | ||
| 26 | + public InvalidGroupIdException(String message) { | ||
| 27 | + super(message); | ||
| 28 | + } | ||
| 29 | +} |
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.errors; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * Event Type requested for subscription is not supported/available for export. | ||
| 19 | + * | ||
| 20 | + */ | ||
| 21 | +public class UnsupportedEventException extends RuntimeException { | ||
| 22 | + | ||
| 23 | + private static final long serialVersionUID = 1L; | ||
| 24 | + | ||
| 25 | + public UnsupportedEventException(String message) { | ||
| 26 | + super(message); | ||
| 27 | + } | ||
| 28 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/errors/package-info.java
0 → 100644
| 1 | +/** | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory Licensed under the Apache | ||
| 3 | + * License, Version 2.0 (the "License"); you may not use this file except in | ||
| 4 | + * compliance with the License. You may obtain a copy of the License at | ||
| 5 | + * | ||
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 7 | + * | ||
| 8 | + * Unless required by applicable law or agreed to in writing, software | ||
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
| 10 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
| 11 | + * License for the specific language governing permissions and limitations under | ||
| 12 | + * the License. | ||
| 13 | + */ | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * Application specific Exception classes. | ||
| 17 | + */ | ||
| 18 | +package org.onosproject.kafkaintegration.errors; |
| 1 | +/** | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory Licensed under the Apache | ||
| 3 | + * License, Version 2.0 (the "License"); you may not use this file except in | ||
| 4 | + * compliance with the License. You may obtain a copy of the License at | ||
| 5 | + * | ||
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 7 | + * | ||
| 8 | + * Unless required by applicable law or agreed to in writing, software | ||
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
| 10 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
| 11 | + * License for the specific language governing permissions and limitations under | ||
| 12 | + * the License. | ||
| 13 | + */ | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * API implementation classes. | ||
| 17 | + */ | ||
| 18 | +package org.onosproject.kafkaintegration; |
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.rest; | ||
| 16 | + | ||
| 17 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 18 | +import static javax.ws.rs.core.Response.Status.BAD_REQUEST; | ||
| 19 | + | ||
| 20 | +import java.io.IOException; | ||
| 21 | +import java.io.InputStream; | ||
| 22 | + | ||
| 23 | +import javax.ws.rs.Consumes; | ||
| 24 | +import javax.ws.rs.DELETE; | ||
| 25 | +import javax.ws.rs.POST; | ||
| 26 | +import javax.ws.rs.Path; | ||
| 27 | +import javax.ws.rs.Produces; | ||
| 28 | +import javax.ws.rs.core.MediaType; | ||
| 29 | +import javax.ws.rs.core.Response; | ||
| 30 | + | ||
| 31 | +import org.onosproject.codec.JsonCodec; | ||
| 32 | +import org.onosproject.kafkaintegration.api.EventExporterService; | ||
| 33 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriber; | ||
| 34 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId; | ||
| 35 | +import org.onosproject.rest.AbstractWebResource; | ||
| 36 | +import org.slf4j.Logger; | ||
| 37 | +import org.slf4j.LoggerFactory; | ||
| 38 | + | ||
| 39 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 40 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 41 | + | ||
| 42 | +/** | ||
| 43 | + * Rest Interfaces for subscribing/unsubscribing to event notifications. | ||
| 44 | + */ | ||
| 45 | +@Path("kafkaService") | ||
| 46 | +public class EventExporterWebResource extends AbstractWebResource { | ||
| 47 | + | ||
| 48 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 49 | + public static final String JSON_NOT_NULL = "Registration Data cannot be empty"; | ||
| 50 | + public static final String REGISTRATION_SUCCESSFUL = "Registered Listener successfully"; | ||
| 51 | + public static final String DEREGISTRATION_SUCCESSFUL = "De-Registered Listener successfully"; | ||
| 52 | + public static final String EVENT_SUBSCRIPTION_SUCCESSFUL = "Event Registration successfull"; | ||
| 53 | + public static final String EVENT_SUBSCRIPTION_REMOVED = "Event De-Registration successfull"; | ||
| 54 | + | ||
| 55 | + /** | ||
| 56 | + * Registers a listener for Onos Events. | ||
| 57 | + * | ||
| 58 | + * @param appName The application trying to register | ||
| 59 | + * @return 200 OK with UUID string which should be used as Kafka Consumer | ||
| 60 | + * Group Id | ||
| 61 | + * @onos.rsModel KafkaRegistration | ||
| 62 | + */ | ||
| 63 | + @POST | ||
| 64 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 65 | + @Consumes(MediaType.APPLICATION_JSON) | ||
| 66 | + @Path("register") | ||
| 67 | + public Response registerKafkaListener(String appName) { | ||
| 68 | + | ||
| 69 | + EventExporterService service = get(EventExporterService.class); | ||
| 70 | + | ||
| 71 | + EventSubscriberGroupId groupId = service.registerListener(appName); | ||
| 72 | + | ||
| 73 | + log.info("Registered app {}", appName); | ||
| 74 | + | ||
| 75 | + // TODO: Should also return Kafka server information. | ||
| 76 | + // Will glue this in when we have the config and Kafka modules ready | ||
| 77 | + return ok(groupId.getId().toString()).build(); | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + /** | ||
| 81 | + * Unregisters a listener for Onos Events. | ||
| 82 | + * | ||
| 83 | + * @param appName The application trying to unregister | ||
| 84 | + * @return 200 OK | ||
| 85 | + * @onos.rsModel KafkaRegistration | ||
| 86 | + */ | ||
| 87 | + @DELETE | ||
| 88 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 89 | + @Consumes(MediaType.APPLICATION_JSON) | ||
| 90 | + @Path("unregister") | ||
| 91 | + public Response removeKafkaListener(String appName) { | ||
| 92 | + EventExporterService service = get(EventExporterService.class); | ||
| 93 | + | ||
| 94 | + service.unregisterListener(appName); | ||
| 95 | + | ||
| 96 | + return ok(DEREGISTRATION_SUCCESSFUL).build(); | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + /** | ||
| 100 | + * Creates subscription to a specific Onos event. | ||
| 101 | + * | ||
| 102 | + * @param input Subscription Data in Json format | ||
| 103 | + * @return 200 OK if successful or 400 BAD REQUEST | ||
| 104 | + * @onos.rsModel KafkaSubscription | ||
| 105 | + */ | ||
| 106 | + @POST | ||
| 107 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 108 | + @Path("subscribe") | ||
| 109 | + public Response subscribe(InputStream input) { | ||
| 110 | + | ||
| 111 | + EventExporterService service = get(EventExporterService.class); | ||
| 112 | + | ||
| 113 | + try { | ||
| 114 | + EventSubscriber sub = parseSubscriptionData(input); | ||
| 115 | + service.subscribe(sub); | ||
| 116 | + } catch (Exception e) { | ||
| 117 | + log.error(e.getMessage()); | ||
| 118 | + return Response.status(BAD_REQUEST).entity(e.getMessage()).build(); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + return ok(EVENT_SUBSCRIPTION_SUCCESSFUL).build(); | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + /** | ||
| 125 | + * Parses Json Subscription Data from the external application. | ||
| 126 | + * | ||
| 127 | + * @param node node within the parsed json tree. | ||
| 128 | + * @return parsed DTO object | ||
| 129 | + * @throws IOException | ||
| 130 | + */ | ||
| 131 | + private EventSubscriber parseSubscriptionData(InputStream input) | ||
| 132 | + throws IOException { | ||
| 133 | + | ||
| 134 | + ObjectMapper mapper = new ObjectMapper(); | ||
| 135 | + ObjectNode node = (ObjectNode) mapper.readTree(input); | ||
| 136 | + | ||
| 137 | + checkNotNull(node, JSON_NOT_NULL); | ||
| 138 | + | ||
| 139 | + JsonCodec<EventSubscriber> codec = codec(EventSubscriber.class); | ||
| 140 | + return codec.decode(node, this); | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + /** | ||
| 144 | + * Deletes subscription from a specific Onos event. | ||
| 145 | + * | ||
| 146 | + * @param input data in json format | ||
| 147 | + * @return 200 OK if successful or 400 BAD REQUEST | ||
| 148 | + * @onos.rsModel KafkaSubscription | ||
| 149 | + */ | ||
| 150 | + @DELETE | ||
| 151 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 152 | + @Path("unsubscribe") | ||
| 153 | + public Response unsubscribe(InputStream input) { | ||
| 154 | + | ||
| 155 | + EventExporterService service = get(EventExporterService.class); | ||
| 156 | + | ||
| 157 | + try { | ||
| 158 | + EventSubscriber sub = parseSubscriptionData(input); | ||
| 159 | + service.subscribe(sub); | ||
| 160 | + } catch (Exception e) { | ||
| 161 | + log.error(e.getMessage()); | ||
| 162 | + return Response.status(BAD_REQUEST).entity(e.getMessage()).build(); | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + return ok(EVENT_SUBSCRIPTION_REMOVED).build(); | ||
| 166 | + } | ||
| 167 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/rest/SubscriberCodec.java
0 → 100644
| 1 | +/** | ||
| 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 | + */ | ||
| 15 | +package org.onosproject.kafkaintegration.rest; | ||
| 16 | + | ||
| 17 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 18 | + | ||
| 19 | +import java.util.UUID; | ||
| 20 | + | ||
| 21 | +import org.onosproject.codec.CodecContext; | ||
| 22 | +import org.onosproject.codec.JsonCodec; | ||
| 23 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriber; | ||
| 24 | +import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId; | ||
| 25 | +import org.onosproject.kafkaintegration.api.dto.OnosEvent.Type; | ||
| 26 | + | ||
| 27 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + * Codec for encoding/decoding a Subscriber object to/from JSON. | ||
| 31 | + * | ||
| 32 | + */ | ||
| 33 | +public final class SubscriberCodec extends JsonCodec<EventSubscriber> { | ||
| 34 | + | ||
| 35 | + // JSON field names | ||
| 36 | + private static final String NAME = "appName"; | ||
| 37 | + private static final String GROUP_ID = "groupId"; | ||
| 38 | + private static final String EVENT_TYPE = "eventType"; | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public ObjectNode encode(EventSubscriber data, CodecContext context) { | ||
| 42 | + checkNotNull(data, "Subscriber cannot be null"); | ||
| 43 | + return context.mapper().createObjectNode().put(NAME, data.appName()) | ||
| 44 | + .put(GROUP_ID, data.subscriberGroupId().getId().toString()) | ||
| 45 | + .put(EVENT_TYPE, data.eventType().toString()); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public EventSubscriber decode(ObjectNode json, CodecContext context) { | ||
| 50 | + String name = json.path(NAME).asText(); | ||
| 51 | + String groupId = json.path(GROUP_ID).asText(); | ||
| 52 | + EventSubscriberGroupId subscriberGroupId = new EventSubscriberGroupId(UUID | ||
| 53 | + .fromString(groupId)); | ||
| 54 | + String eventType = json.path(EVENT_TYPE).asText(); | ||
| 55 | + | ||
| 56 | + return new EventSubscriber(name, subscriberGroupId, | ||
| 57 | + Type.valueOf(eventType)); | ||
| 58 | + } | ||
| 59 | +} |
apps/kafka-integration/src/main/java/org/onosproject/kafkaintegration/rest/package-info.java
0 → 100644
| 1 | +/** | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory Licensed under the Apache | ||
| 3 | + * License, Version 2.0 (the "License"); you may not use this file except in | ||
| 4 | + * compliance with the License. You may obtain a copy of the License at | ||
| 5 | + * | ||
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 7 | + * | ||
| 8 | + * Unless required by applicable law or agreed to in writing, software | ||
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
| 10 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
| 11 | + * License for the specific language governing permissions and limitations under | ||
| 12 | + * the License. | ||
| 13 | + */ | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * REST API Definitions. | ||
| 17 | + */ | ||
| 18 | +package org.onosproject.kafkaintegration.rest; |
| 1 | +{ | ||
| 2 | + "type": "object", | ||
| 3 | + "title": "KafkaSubscription", | ||
| 4 | + "required": [ | ||
| 5 | + "appName", | ||
| 6 | + "groupId", | ||
| 7 | + "eventType" | ||
| 8 | + ], | ||
| 9 | + "properties": { | ||
| 10 | + "appName": { | ||
| 11 | + "type": "string", | ||
| 12 | + "example": "forwardingApp" | ||
| 13 | + }, | ||
| 14 | + "groupId": { | ||
| 15 | + "type": "string", | ||
| 16 | + "example": "18285435-2c62-4684-96dd-fb03b7cd0c83" | ||
| 17 | + }, | ||
| 18 | + "eventType": { | ||
| 19 | + "type": "string", | ||
| 20 | + "example": "DEVICE" | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!-- | ||
| 3 | + ~ Copyright 2016 Open Networking Laboratory | ||
| 4 | + ~ | ||
| 5 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 6 | + ~ you may not use this file except in compliance with the License. | ||
| 7 | + ~ You may obtain a copy of the License at | ||
| 8 | + ~ | ||
| 9 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| 10 | + ~ | ||
| 11 | + ~ Unless required by applicable law or agreed to in writing, software | ||
| 12 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
| 13 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 14 | + ~ See the License for the specific language governing permissions and | ||
| 15 | + ~ limitations under the License. | ||
| 16 | + --> | ||
| 17 | +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" | ||
| 18 | + xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" | ||
| 19 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" | ||
| 20 | + id="ONOS" version="2.5"> | ||
| 21 | + <display-name>Event Exporter REST API</display-name> | ||
| 22 | + | ||
| 23 | + <servlet> | ||
| 24 | + <servlet-name>JAX-RS Service</servlet-name> | ||
| 25 | + <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> | ||
| 26 | + <init-param> | ||
| 27 | + <param-name>jersey.config.server.provider.classnames</param-name> | ||
| 28 | + <param-value>org.onosproject.kafkaintegration.rest.EventExporterWebResource</param-value> | ||
| 29 | + </init-param> | ||
| 30 | + <load-on-startup>10</load-on-startup> | ||
| 31 | + </servlet> | ||
| 32 | + | ||
| 33 | + <servlet-mapping> | ||
| 34 | + <servlet-name>JAX-RS Service</servlet-name> | ||
| 35 | + <url-pattern>/*</url-pattern> | ||
| 36 | + </servlet-mapping> | ||
| 37 | + | ||
| 38 | +</web-app> |
| ... | @@ -46,6 +46,7 @@ | ... | @@ -46,6 +46,7 @@ |
| 46 | <module>test</module> | 46 | <module>test</module> |
| 47 | <module>segmentrouting</module> | 47 | <module>segmentrouting</module> |
| 48 | <module>xos-integration</module> | 48 | <module>xos-integration</module> |
| 49 | + <module>kafka-integration</module> | ||
| 49 | <module>pcep-api</module> | 50 | <module>pcep-api</module> |
| 50 | <module>iptopology-api</module> | 51 | <module>iptopology-api</module> |
| 51 | <module>pce</module> | 52 | <module>pce</module> | ... | ... |
-
Please register or login to post a comment