Skip to content

Commit 1d05889

Browse files
committed
WIP convert CommunityRestConf to JaxRsEndpoint
This change also required us to convert LightyServerBuilder to use JettyWebServer since it is used in CommunityRestConf to initialize JaxRsEndpoint. Signed-off-by: tobias.pobocik <[email protected]>
1 parent a17c6b4 commit 1d05889

File tree

19 files changed

+440
-428
lines changed

19 files changed

+440
-428
lines changed

lighty-applications/lighty-rnc-app-aggregator/lighty-rnc-module/src/main/java/io/lighty/applications/rnc/module/RncLightyModule.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import io.lighty.openapi.OpenApiLighty;
3030
import io.lighty.server.Http2LightyServerBuilder;
3131
import io.lighty.server.HttpsLightyServerBuilder;
32-
import io.lighty.server.LightyServerBuilder;
32+
import io.lighty.server.LightyJettyServerProvider;
3333
import io.lighty.server.config.LightyServerConfig;
3434
import java.net.InetSocketAddress;
3535
import java.security.Security;
@@ -52,7 +52,7 @@ public class RncLightyModule {
5252
private CommunityRestConf lightyRestconf;
5353
private NetconfSBPlugin lightyNetconf;
5454
private AAALighty aaaLighty;
55-
private LightyServerBuilder jettyServerBuilder;
55+
private LightyJettyServerProvider jettyServerBuilder;
5656
private OpenApiLighty openApi;
5757

5858
public RncLightyModule(final RncLightyModuleConfiguration rncModuleConfig) {
@@ -127,7 +127,7 @@ private CommunityRestConf initRestconf(final RestConfConfiguration rcConfig, fin
127127
} else if (serverConfig.isUseHttps()) {
128128
jettyServerBuilder = new HttpsLightyServerBuilder(inetSocketAddress, serverConfig.getSecurityConfig());
129129
} else {
130-
jettyServerBuilder = new LightyServerBuilder(inetSocketAddress);
130+
jettyServerBuilder = new LightyJettyServerProvider(inetSocketAddress);
131131
}
132132

133133
return CommunityRestConfBuilder.from(restConfConfiguration)
@@ -143,7 +143,7 @@ private AAALighty initAAA(final AAAConfiguration config, final LightyServices se
143143
}
144144

145145
private OpenApiLighty initOpenApiLighty(final RestConfConfiguration config,
146-
final LightyServerBuilder serverBuilder, final LightyServices services) {
146+
final LightyJettyServerProvider serverBuilder, final LightyServices services) {
147147
return new OpenApiLighty(config, serverBuilder, services);
148148
}
149149

lighty-examples/lighty-community-aaa-restconf-app/src/main/java/io/lighty/kit/examples/community/aaa/restconf/Main.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConfBuilder;
2525
import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration;
2626
import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils;
27-
import io.lighty.server.LightyServerBuilder;
27+
import io.lighty.server.LightyJettyServerProvider;
2828
import java.net.InetSocketAddress;
2929
import java.nio.file.Files;
3030
import java.nio.file.Path;
@@ -108,18 +108,8 @@ private void startLighty(final ControllerConfiguration controllerConfiguration,
108108
}
109109

110110
// 2. Initialize and start Restconf server
111-
final LightyServerBuilder jettyServerBuilder = new LightyServerBuilder(new InetSocketAddress(
111+
final LightyJettyServerProvider jettyServerBuilder = new LightyJettyServerProvider(new InetSocketAddress(
112112
restconfConfiguration.getInetAddress(), restconfConfiguration.getHttpPort()));
113-
this.restconf = CommunityRestConfBuilder
114-
.from(RestConfConfigUtils.getRestConfConfiguration(restconfConfiguration,
115-
this.lightyController.getServices()))
116-
.withLightyServer(jettyServerBuilder)
117-
.build();
118-
final boolean restconfStartOk = this.restconf.start()
119-
.get(modulesConfig.getModuleTimeoutSeconds(), TimeUnit.SECONDS);
120-
if (!restconfStartOk) {
121-
throw new ModuleStartupException("Community Restconf startup failed!");
122-
}
123113

124114
// 3. Initialize and start Lighty AAA
125115
final DataBroker bindingDataBroker = this.lightyController.getServices().getBindingDataBroker();
@@ -134,6 +124,18 @@ private void startLighty(final ControllerConfiguration controllerConfiguration,
134124
throw new ModuleStartupException("AAA module startup failed!");
135125
}
136126

127+
this.restconf = CommunityRestConfBuilder
128+
.from(RestConfConfigUtils.getRestConfConfiguration(restconfConfiguration,
129+
this.lightyController.getServices()))
130+
.withLightyServer(jettyServerBuilder)
131+
.withWebSecurer(aaaLighty.getWebContextSecurer())
132+
.build();
133+
final boolean restconfStartOk = this.restconf.start()
134+
.get(modulesConfig.getModuleTimeoutSeconds(), TimeUnit.SECONDS);
135+
if (!restconfStartOk) {
136+
throw new ModuleStartupException("Community Restconf startup failed!");
137+
}
138+
137139
// 4. Start Lighty jetty server
138140
this.restconf.startServer();
139141
}

lighty-examples/lighty-community-restconf-actions-app/src/main/java/io/lighty/examples/controllers/actions/Main.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import io.lighty.modules.southbound.netconf.impl.config.NetconfConfiguration;
3030
import io.lighty.modules.southbound.netconf.impl.util.NetconfConfigUtils;
3131
import io.lighty.openapi.OpenApiLighty;
32-
import io.lighty.server.LightyServerBuilder;
32+
import io.lighty.server.LightyJettyServerProvider;
3333
import java.io.IOException;
3434
import java.net.InetSocketAddress;
3535
import java.nio.file.Files;
@@ -150,7 +150,7 @@ private void startLighty(final ControllerConfiguration controllerConfiguration,
150150
}
151151

152152
//2. build RestConf server
153-
LightyServerBuilder jettyServerBuilder = new LightyServerBuilder(new InetSocketAddress(
153+
LightyJettyServerProvider jettyServerBuilder = new LightyJettyServerProvider(new InetSocketAddress(
154154
restconfConfiguration.getInetAddress(), restconfConfiguration.getHttpPort()));
155155
this.restconf = CommunityRestConfBuilder
156156
.from(RestConfConfigUtils.getRestConfConfiguration(restconfConfiguration,

lighty-examples/lighty-community-restconf-netconf-app/src/main/java/io/lighty/examples/controllers/restconfapp/Main.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import io.lighty.modules.southbound.netconf.impl.config.NetconfConfiguration;
2828
import io.lighty.modules.southbound.netconf.impl.util.NetconfConfigUtils;
2929
import io.lighty.openapi.OpenApiLighty;
30-
import io.lighty.server.LightyServerBuilder;
30+
import io.lighty.server.LightyJettyServerProvider;
3131
import java.io.IOException;
3232
import java.net.InetSocketAddress;
3333
import java.nio.file.Files;
@@ -143,7 +143,7 @@ private void startLighty(final ControllerConfiguration controllerConfiguration,
143143
}
144144

145145
//2. build RestConf server
146-
LightyServerBuilder jettyServerBuilder = new LightyServerBuilder(new InetSocketAddress(
146+
LightyJettyServerProvider jettyServerBuilder = new LightyJettyServerProvider(new InetSocketAddress(
147147
restconfConfiguration.getInetAddress(), restconfConfiguration.getHttpPort()));
148148
this.restconf = CommunityRestConfBuilder
149149
.from(RestConfConfigUtils.getRestConfConfiguration(restconfConfiguration,

lighty-modules/lighty-aaa-aggregator/lighty-aaa/src/main/java/io/lighty/aaa/AAALighty.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,26 @@
99

1010
import io.lighty.aaa.config.AAAConfiguration;
1111
import io.lighty.core.controller.api.AbstractLightyModule;
12-
import io.lighty.server.LightyServerBuilder;
12+
import io.lighty.server.LightyJettyServerProvider;
1313
import java.util.concurrent.CompletableFuture;
1414
import java.util.concurrent.CountDownLatch;
1515
import org.opendaylight.aaa.api.CredentialAuth;
1616
import org.opendaylight.aaa.api.PasswordCredentials;
17+
import org.opendaylight.aaa.web.WebContextSecurer;
1718
import org.opendaylight.mdsal.binding.api.DataBroker;
1819

1920
public final class AAALighty extends AbstractLightyModule {
2021

2122
private final AAAShiroProviderHandler aaaShiroProviderHandler;
22-
private final LightyServerBuilder server;
23+
private final LightyJettyServerProvider server;
2324
private final CredentialAuth<PasswordCredentials> credentialAuth;
2425
private final DataBroker dataBroker;
26+
private WebContextSecurer webContextSecurer;
2527

2628
private final AAAConfiguration aaaConfiguration;
2729

2830
public AAALighty(final DataBroker dataBroker, final CredentialAuth<PasswordCredentials> credentialAuth,
29-
final LightyServerBuilder server, final AAAConfiguration config) {
31+
final LightyJettyServerProvider server, final AAAConfiguration config) {
3032
this.dataBroker = dataBroker;
3133
this.aaaConfiguration = config;
3234
this.credentialAuth = credentialAuth;
@@ -41,6 +43,7 @@ protected boolean initProcedure() throws InterruptedException {
4143
final CountDownLatch cdl = new CountDownLatch(1);
4244
newInstance.whenComplete((t, u) -> {
4345
AAALighty.this.aaaShiroProviderHandler.setAaaLightyShiroProvider(t);
46+
this.webContextSecurer = aaaShiroProviderHandler.getAaaLightyShiroProvider().getWebContextSecurer();
4447
cdl.countDown();
4548
});
4649

@@ -70,4 +73,8 @@ AAALightyShiroProvider getAaaLightyShiroProvider() {
7073
return this.aaaLightyShiroProvider;
7174
}
7275
}
76+
77+
public WebContextSecurer getWebContextSecurer() {
78+
return webContextSecurer;
79+
}
7380
}

lighty-modules/lighty-aaa-aggregator/lighty-aaa/src/main/java/io/lighty/aaa/AAALightyShiroProvider.java

Lines changed: 71 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,16 @@
88
package io.lighty.aaa;
99

1010
import io.lighty.aaa.config.AAAConfiguration;
11-
import io.lighty.server.LightyServerBuilder;
11+
import io.lighty.server.LightyJettyServerProvider;
1212
import java.util.ArrayList;
1313
import java.util.HashMap;
1414
import java.util.List;
1515
import java.util.Map;
1616
import java.util.concurrent.CompletableFuture;
17+
import javax.servlet.ServletException;
1718
import org.eclipse.jetty.server.Handler;
18-
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
19-
import org.eclipse.jetty.servlet.FilterHolder;
20-
import org.eclipse.jetty.servlet.ServletContextHandler;
21-
import org.eclipse.jetty.servlet.ServletHolder;
2219
import org.eclipse.jetty.servlets.CrossOriginFilter;
2320
import org.glassfish.jersey.internal.guava.Preconditions;
24-
import org.glassfish.jersey.server.ResourceConfig;
25-
import org.glassfish.jersey.servlet.ServletContainer;
2621
import org.opendaylight.aaa.api.AuthenticationService;
2722
import org.opendaylight.aaa.api.ClaimCache;
2823
import org.opendaylight.aaa.api.CredentialAuth;
@@ -44,15 +39,20 @@
4439
import org.opendaylight.aaa.shiro.idm.IdmLightProxy;
4540
import org.opendaylight.aaa.shiro.moon.MoonTokenEndpoint;
4641
import org.opendaylight.aaa.shiro.web.env.AAAWebEnvironment;
42+
import org.opendaylight.aaa.shiro.web.env.ShiroWebContextSecurer;
4743
import org.opendaylight.aaa.tokenauthrealm.auth.AuthenticationManager;
4844
import org.opendaylight.aaa.tokenauthrealm.auth.HttpBasicAuth;
4945
import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators;
46+
import org.opendaylight.aaa.web.FilterDetails;
47+
import org.opendaylight.aaa.web.ServletDetails;
48+
import org.opendaylight.aaa.web.WebContext;
5049
import org.opendaylight.aaa.web.servlet.jersey2.JerseyServletSupport;
5150
import org.opendaylight.mdsal.binding.api.DataBroker;
5251
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.DatastoreConfig;
5352
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.ShiroConfiguration;
5453
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.password.service.config.rev170619.PasswordServiceConfig;
5554
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.password.service.config.rev170619.PasswordServiceConfigBuilder;
55+
import org.opendaylight.yangtools.concepts.Registration;
5656
import org.slf4j.Logger;
5757
import org.slf4j.LoggerFactory;
5858

@@ -62,7 +62,6 @@ public final class AAALightyShiroProvider {
6262

6363
private static AAALightyShiroProvider INSTANCE;
6464

65-
private final List<Handler> handlers;
6665
private final DataBroker dataBroker;
6766
private final ICertificateManager certificateManager;
6867
private final ShiroConfiguration shiroConfiguration;
@@ -73,18 +72,19 @@ public final class AAALightyShiroProvider {
7372
private ClaimCache claimCache;
7473
private PasswordHashService passwordHashService;
7574
private IIDMStore iidmStore;
75+
private Registration registration;
76+
private ShiroWebContextSecurer webContextSecurer;
7677

7778
private AAAWebEnvironment aaaWebEnvironment;
7879

7980
private AAALightyShiroProvider(final DataBroker dataBroker,
8081
final AAAConfiguration aaaConfiguration,
8182
final CredentialAuth<PasswordCredentials> credentialAuth,
82-
final LightyServerBuilder server) {
83+
final LightyJettyServerProvider server) {
8384
this.dataBroker = dataBroker;
8485
this.certificateManager = aaaConfiguration.getCertificateManager();
8586
this.credentialAuth = credentialAuth;
8687
this.shiroConfiguration = aaaConfiguration.getShiroConf();
87-
this.handlers = new ArrayList<>();
8888
this.authenticationService = new AuthenticationManager();
8989
final DatastoreConfig datastoreConfig = aaaConfiguration.getDatastoreConf();
9090

@@ -127,46 +127,71 @@ private AAALightyShiroProvider(final DataBroker dataBroker,
127127
initAAAonServer(server);
128128
}
129129

130-
private void initAAAonServer(final LightyServerBuilder server) {
131-
final ContextHandlerCollection contexts = new ContextHandlerCollection();
132-
final ServletContextHandler mainHandler = new ServletContextHandler(contexts, "/auth", true, false);
133-
final IdmLightApplication idmLightApplication = new IdmLightApplication(iidmStore, claimCache);
134-
final ServletHolder idmLightServlet = new ServletHolder(new ServletContainer(ResourceConfig.forApplication(
135-
idmLightApplication)));
136-
idmLightServlet.setInitParameter("jersey.config.server.provider.packages",
137-
"org.opendaylight.aaa.impl.provider");
138-
mainHandler.addServlet(idmLightServlet, "/*");
139-
server.addContextHandler(contexts);
140-
this.handlers.add(contexts);
141-
this.handlers.add(mainHandler);
142-
this.aaaWebEnvironment = new AAAWebEnvironment(shiroConfiguration,
143-
dataBroker,
144-
certificateManager,
145-
authenticationService,
146-
tokenAuthenticators,
147-
passwordHashService,
148-
new JerseyServletSupport());
149-
130+
private void initAAAonServer(final LightyJettyServerProvider server) {
150131
final Map<String, String> properties = new HashMap<>();
151132
final CustomFilterAdapterConfigurationImpl customFilterAdapterConfig =
152-
new CustomFilterAdapterConfigurationImpl();
133+
new CustomFilterAdapterConfigurationImpl();
153134
customFilterAdapterConfig.update(properties);
154-
final FilterHolder customFilterAdapter = new FilterHolder(new CustomFilterAdapter(customFilterAdapterConfig));
155-
server.addCommonFilter(customFilterAdapter, "/*");
156135

157-
final FilterHolder shiroFilter = new FilterHolder(new AAAShiroFilter(aaaWebEnvironment));
158-
server.addCommonFilter(shiroFilter, "/*");
136+
this.aaaWebEnvironment = new AAAWebEnvironment(
137+
shiroConfiguration,
138+
dataBroker,
139+
certificateManager,
140+
authenticationService,
141+
tokenAuthenticators,
142+
passwordHashService,
143+
new JerseyServletSupport()
144+
);
145+
146+
final AAAShiroFilter aaaShiroFilter = new AAAShiroFilter(aaaWebEnvironment);
147+
148+
final var webContextBuilder = WebContext.builder()
149+
.name("RealmManagement")
150+
.contextPath("/auth")
151+
.supportsSessions(true)
152+
153+
// Add servlet
154+
.addServlet(ServletDetails.builder()
155+
.servlet(new JerseyServletSupport().createHttpServletBuilder(
156+
new IdmLightApplication(iidmStore, claimCache)).build())
157+
.addUrlPattern("/*")
158+
.build())
159+
160+
// CustomFilterAdapter
161+
.addFilter(FilterDetails.builder()
162+
.filter(new CustomFilterAdapter(customFilterAdapterConfig))
163+
.addUrlPattern("/*")
164+
.build())
165+
166+
// Shiro filter
167+
.addFilter(FilterDetails.builder()
168+
.filter(aaaShiroFilter)
169+
.addUrlPattern("/*")
170+
.build())
171+
172+
// CORS filter
173+
.addFilter(FilterDetails.builder()
174+
.filter(new CrossOriginFilter())
175+
.addUrlPattern("/*")
176+
.putInitParam("allowedMethods", "GET,POST,OPTIONS,DELETE,PUT,HEAD")
177+
.putInitParam("allowedHeaders", "origin, content-type, accept, authorization, Authorization")
178+
.build());
159179

160-
final FilterHolder crossOriginFilter = new FilterHolder(new CrossOriginFilter());
161-
crossOriginFilter.setInitParameter("allowedMethods", "GET,POST,OPTIONS,DELETE,PUT,HEAD");
162-
crossOriginFilter.setInitParameter("allowedHeaders",
163-
"origin, content-type, accept, authorization, Authorization");
164-
server.addCommonFilter(crossOriginFilter, "/*");
180+
this.webContextSecurer = new ShiroWebContextSecurer(aaaWebEnvironment);
181+
this.webContextSecurer.requireAuthentication(webContextBuilder, "/*", "/moon/*");
182+
183+
aaaShiroFilter.init();
184+
185+
try {
186+
this.registration = server.build().registerWebContext(webContextBuilder.build());
187+
} catch (ServletException e) {
188+
LOG.error("Failed to register AAA web context: {}!", server.getClass(), e);
189+
}
165190
}
166191

167192
public static CompletableFuture<AAALightyShiroProvider> newInstance(final DataBroker dataBroker,
168193
final AAAConfiguration aaaConfig, final CredentialAuth<PasswordCredentials> credentialAuth,
169-
final LightyServerBuilder server) {
194+
final LightyJettyServerProvider server) {
170195
final CompletableFuture<AAALightyShiroProvider> completableFuture = new CompletableFuture<>();
171196
INSTANCE = new AAALightyShiroProvider(dataBroker, aaaConfig, credentialAuth, server);
172197
completableFuture.complete(INSTANCE);
@@ -225,6 +250,10 @@ public static IIDMStore getIdmStore() {
225250
return INSTANCE.iidmStore;
226251
}
227252

253+
public ShiroWebContextSecurer getWebContextSecurer() {
254+
return webContextSecurer;
255+
}
256+
228257
/**
229258
* Set IDM data store, only used for test.
230259
*
@@ -236,15 +265,7 @@ public static void setIdmStore(final IIDMStore store) {
236265

237266
@SuppressWarnings("IllegalCatch")
238267
public void close() {
239-
this.handlers.forEach((handler) -> {
240-
try {
241-
handler.stop();
242-
} catch (Exception e) {
243-
LOG.error("Failed to close AAA handler [{}]", handler, e);
244-
} finally {
245-
handler.destroy();
246-
}
247-
});
268+
registration.close();
248269
}
249270

250271
private static TokenAuthenticators buildTokenAuthenticators(

0 commit comments

Comments
 (0)