diff options
Diffstat (limited to 'infra/northbound/restconf')
9 files changed, 258 insertions, 35 deletions
diff --git a/infra/northbound/restconf/pom.xml b/infra/northbound/restconf/pom.xml index 7e873bc31..ee07c33ab 100644 --- a/infra/northbound/restconf/pom.xml +++ b/infra/northbound/restconf/pom.xml @@ -32,9 +32,10 @@ <name>${project.artifactId}</name> <properties> - <jersey.version>1.19.1</jersey.version> + <jersey.version>1.19.4</jersey.version> + <glassfish-jersey.version>2.25.1</glassfish-jersey.version> <servlet.version>3.1.0</servlet.version> - <jetty.version>9.3.11.v20160721</jetty.version> + <jetty.version>9.3.21.v20170918</jetty.version> <yang.modules.whitelist> ${project.basedir}/src/main/resources/honeycomb-minimal-resources/config/restconf-whitelist.xml </yang.modules.whitelist> @@ -96,19 +97,14 @@ <version>${jetty.version}</version> </dependency> <dependency> - <groupId>com.sun.jersey</groupId> + <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> - <version>${jersey.version}</version> + <version>${glassfish-jersey.version}</version> </dependency> <dependency> - <groupId>com.sun.jersey</groupId> - <artifactId>jersey-core</artifactId> - <version>${jersey.version}</version> - </dependency> - <dependency> - <groupId>com.sun.jersey</groupId> - <artifactId>jersey-servlet</artifactId> - <version>${jersey.version}</version> + <groupId>org.glassfish.jersey.containers</groupId> + <artifactId>jersey-container-servlet-core</artifactId> + <version>${glassfish-jersey.version}</version> </dependency> <!-- javax.annotation --> diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java new file mode 100644 index 000000000..f6a7e5e81 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import io.fd.honeycomb.binding.init.ProviderTrait; +import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; + +final class BrokerFacadeProvider extends ProviderTrait<BrokerFacade> { + + @Inject + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) + private DOMDataBroker domDataBroker; + @Inject + private DOMRpcService rpcService; + @Inject + private DOMNotificationRouter notificationService; + @Inject + private ControllerContext controllerContext; + + @Override + protected BrokerFacade create() { + BrokerFacade brokerFacade = + BrokerFacade.newInstance(rpcService, domDataBroker, notificationService, controllerContext); + return brokerFacade; + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java new file mode 100644 index 000000000..909f063d1 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; + +final class ControllerContextProvider extends ProviderTrait<ControllerContext> { + + @Inject + private DOMSchemaService schemaService; + @Inject + private DOMMountPointService mountPointService; + + @Override + protected ControllerContext create() { + ControllerContext controllerCtx = + ControllerContext.newInstance(schemaService, mountPointService, schemaService); + return controllerCtx; + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java index a87459560..8a3ee62f6 100644 --- a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java @@ -27,10 +27,21 @@ import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Password; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.webapp.WebAppContext; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletContainer; +import org.opendaylight.netconf.sal.rest.impl.JsonNormalizedNodeBodyReader; +import org.opendaylight.netconf.sal.rest.impl.NormalizedNodeJsonBodyWriter; +import org.opendaylight.netconf.sal.rest.impl.NormalizedNodeXmlBodyWriter; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.rest.impl.RestconfDocumentedExceptionMapper; +import org.opendaylight.netconf.sal.rest.impl.XmlNormalizedNodeBodyReader; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; final class JettyServerProvider extends ProviderTrait<Server> { @@ -41,6 +52,7 @@ final class JettyServerProvider extends ProviderTrait<Server> { "application/yang.data+xml", "application/json", "application/yang.data+json"}; + public static final String RESTCONF_APP_NAME = "JAXRSRestconf"; @Inject private RestconfConfiguration cfg; @@ -48,6 +60,15 @@ final class JettyServerProvider extends ProviderTrait<Server> { @Inject private CredentialsConfiguration credentialsCfg; + @Inject + private RestconfApplication restconfApplication; + + @Inject + private RestconfImpl restconf; + + @Inject + private ControllerContext controllerContext; + @Override protected Server create() { Server server = new Server(new QueuedThreadPool(cfg.restPoolMaxSize.get(), cfg.restPoolMinSize.get())); @@ -62,7 +83,26 @@ final class JettyServerProvider extends ProviderTrait<Server> { final URL resource = getClass().getResource("/"); WebAppContext webapp = new WebAppContext(resource.getPath(), cfg.restconfRootPath.get()); + // Create Restconf application implementation for server + ResourceConfig resourceConfig = new ResourceConfig(); + resourceConfig.setApplicationName(RESTCONF_APP_NAME); + resourceConfig = resourceConfig.registerInstances(restconf, new NormalizedNodeJsonBodyWriter(), + new NormalizedNodeXmlBodyWriter(), new XmlNormalizedNodeBodyReader(controllerContext), + new JsonNormalizedNodeBodyReader(controllerContext), + new RestconfDocumentedExceptionMapper(controllerContext)); + // register Restconf Application classes + resourceConfig.registerClasses(restconfApplication.getClasses()); + + // Create Servlet container which holds configured application + ServletContainer servlet = new ServletContainer(resourceConfig); + ServletHolder servletHolder = new ServletHolder(RESTCONF_APP_NAME, servlet); + // init on startup + servletHolder.setInitOrder(1); + // set service handler server.setHandler(getGzip(service, webapp)); + + //add servlet with "/*" mapping + webapp.addServlet(servletHolder, "/*"); return server; } diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java new file mode 100644 index 000000000..0f55b4947 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; + +public class RestconfApplicationProvider extends ProviderTrait<RestconfApplication> { + + @Inject + private ControllerContext controllerContext; + @Inject + private StatisticsRestconfServiceWrapper statisticsRestconfServiceWrapper; + + @Override + protected RestconfApplication create() { + return new RestconfApplication(controllerContext, statisticsRestconfServiceWrapper); + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java index 1a59b7298..d2841baef 100644 --- a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java @@ -23,6 +23,11 @@ import io.fd.honeycomb.northbound.restconf.JettyServerStarter.RestconfJettyServe import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.opendaylight.netconf.sal.rest.api.RestConnector; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,6 +35,7 @@ public class RestconfModule extends NorthboundAbstractModule<RestconfConfigurati private static final Logger LOG = LoggerFactory.getLogger(RestconfModule.class); + public static final String HONEYCOMB_RESTCONF = "honeycomb-restconf"; public static final String RESTCONF_HTTP = "restconf-http"; public static final String RESTCONF_HTTPS = "restconf-https"; @@ -46,6 +52,12 @@ public class RestconfModule extends NorthboundAbstractModule<RestconfConfigurati LOG.info("Starting RESTCONF Northbound"); install(new RestconfConfigurationModule()); + bind(ControllerContext.class).toProvider(ControllerContextProvider.class).in(Singleton.class); + bind(BrokerFacade.class).toProvider(BrokerFacadeProvider.class).in(Singleton.class); + bind(RestconfImpl.class).toProvider(RestconfServiceProvider.class).in(Singleton.class); + bind(StatisticsRestconfServiceWrapper.class) + .toProvider(StatisticsRestconfServiceWrapperProvider.class).in(Singleton.class); + bind(RestconfApplication.class).toProvider(RestconfApplicationProvider.class).in(Singleton.class); bind(Server.class).toProvider(JettyServerProvider.class).in(Singleton.class); bind(ServerConnector.class).annotatedWith(Names.named(RESTCONF_HTTP)) .toProvider(HttpConnectorProvider.class) diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfProvider.java index a3b3fe902..85caf6621 100644 --- a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfProvider.java +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfProvider.java @@ -17,17 +17,11 @@ package io.fd.honeycomb.northbound.restconf; import com.google.inject.Inject; -import com.google.inject.name.Named; import io.fd.honeycomb.binding.init.ProviderTrait; import io.fd.honeycomb.data.init.ShutdownHandler; -import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter; -import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.netconf.sal.rest.api.RestConnector; import org.opendaylight.netconf.sal.restconf.impl.RestconfProviderImpl; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; @@ -36,27 +30,15 @@ final class RestconfProvider extends ProviderTrait<RestConnector> { @Inject private RestconfConfiguration cfg; @Inject - @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) - private DOMDataBroker domDataBroker; - @Inject - private SchemaService schemaService; - @Inject - private DOMRpcService rpcService; - @Inject - private DOMNotificationRouter notificationService; - @Inject private ShutdownHandler shutdownHandler; @Inject - private DOMMountPointService mountPointService; + private StatisticsRestconfServiceWrapper statsServiceWrapper; @Override protected RestconfProviderImpl create() { - final RestconfProviderImpl instance = new RestconfProviderImpl(domDataBroker, schemaService, rpcService, - notificationService, mountPointService, - schemaService, - IpAddressBuilder.getDefaultInstance(cfg.restconfWebsocketAddress.get()), - new PortNumber(cfg.restconfWebsocketPort.get())); - + final RestconfProviderImpl instance = new RestconfProviderImpl(statsServiceWrapper, + IpAddressBuilder.getDefaultInstance(cfg.restconfWebsocketAddress.get()), + new PortNumber(cfg.restconfWebsocketPort.get())); // Required to properly initialize restconf (broker, schema ctx, etc.). // Without that restconf would fail with 503 (service not available). instance.start(); diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java new file mode 100644 index 000000000..20dcc28ad --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; + +public class RestconfServiceProvider extends ProviderTrait<RestconfImpl> { + + @Inject + private ControllerContext controllerContext; + @Inject + private BrokerFacade brokerFacade; + + @Override + protected RestconfImpl create() { + return RestconfImpl.newInstance(brokerFacade, controllerContext); + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java new file mode 100644 index 000000000..f3a4c3b73 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; + +public class StatisticsRestconfServiceWrapperProvider extends ProviderTrait<StatisticsRestconfServiceWrapper> { + + @Inject + RestconfImpl restconfService; + + @Override + protected StatisticsRestconfServiceWrapper create() { + return StatisticsRestconfServiceWrapper.newInstance(restconfService); + } +} |