Skip to content

Commit 424ed33

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 424ed33

File tree

19 files changed

+435
-432
lines changed

19 files changed

+435
-432
lines changed

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

+4-4
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

+14-12
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

+2-2
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

+2-2
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

+10-3
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

+66-54
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,15 @@
88
package io.lighty.aaa;
99

1010
import io.lighty.aaa.config.AAAConfiguration;
11-
import io.lighty.server.LightyServerBuilder;
12-
import java.util.ArrayList;
11+
import io.lighty.server.LightyJettyServerProvider;
1312
import java.util.HashMap;
14-
import java.util.List;
1513
import java.util.Map;
1614
import java.util.concurrent.CompletableFuture;
17-
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;
15+
import javax.servlet.ServletException;
16+
import org.apache.shiro.mgt.DefaultSecurityManager;
17+
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
2218
import org.eclipse.jetty.servlets.CrossOriginFilter;
2319
import org.glassfish.jersey.internal.guava.Preconditions;
24-
import org.glassfish.jersey.server.ResourceConfig;
25-
import org.glassfish.jersey.servlet.ServletContainer;
2620
import org.opendaylight.aaa.api.AuthenticationService;
2721
import org.opendaylight.aaa.api.ClaimCache;
2822
import org.opendaylight.aaa.api.CredentialAuth;
@@ -39,20 +33,24 @@
3933
import org.opendaylight.aaa.filterchain.configuration.impl.CustomFilterAdapterConfigurationImpl;
4034
import org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter;
4135
import org.opendaylight.aaa.impl.password.service.DefaultPasswordHashService;
42-
import org.opendaylight.aaa.shiro.filters.AAAShiroFilter;
4336
import org.opendaylight.aaa.shiro.idm.IdmLightApplication;
4437
import org.opendaylight.aaa.shiro.idm.IdmLightProxy;
4538
import org.opendaylight.aaa.shiro.moon.MoonTokenEndpoint;
4639
import org.opendaylight.aaa.shiro.web.env.AAAWebEnvironment;
40+
import org.opendaylight.aaa.shiro.web.env.ShiroWebContextSecurer;
4741
import org.opendaylight.aaa.tokenauthrealm.auth.AuthenticationManager;
4842
import org.opendaylight.aaa.tokenauthrealm.auth.HttpBasicAuth;
4943
import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators;
44+
import org.opendaylight.aaa.web.FilterDetails;
45+
import org.opendaylight.aaa.web.ServletDetails;
46+
import org.opendaylight.aaa.web.WebContext;
5047
import org.opendaylight.aaa.web.servlet.jersey2.JerseyServletSupport;
5148
import org.opendaylight.mdsal.binding.api.DataBroker;
5249
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.DatastoreConfig;
5350
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.ShiroConfiguration;
5451
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.password.service.config.rev170619.PasswordServiceConfig;
5552
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.password.service.config.rev170619.PasswordServiceConfigBuilder;
53+
import org.opendaylight.yangtools.concepts.Registration;
5654
import org.slf4j.Logger;
5755
import org.slf4j.LoggerFactory;
5856

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

6361
private static AAALightyShiroProvider INSTANCE;
6462

65-
private final List<Handler> handlers;
6663
private final DataBroker dataBroker;
6764
private final ICertificateManager certificateManager;
6865
private final ShiroConfiguration shiroConfiguration;
@@ -73,18 +70,19 @@ public final class AAALightyShiroProvider {
7370
private ClaimCache claimCache;
7471
private PasswordHashService passwordHashService;
7572
private IIDMStore iidmStore;
73+
private Registration registration;
74+
private ShiroWebContextSecurer webContextSecurer;
7675

7776
private AAAWebEnvironment aaaWebEnvironment;
7877

7978
private AAALightyShiroProvider(final DataBroker dataBroker,
8079
final AAAConfiguration aaaConfiguration,
8180
final CredentialAuth<PasswordCredentials> credentialAuth,
82-
final LightyServerBuilder server) {
81+
final LightyJettyServerProvider server) {
8382
this.dataBroker = dataBroker;
8483
this.certificateManager = aaaConfiguration.getCertificateManager();
8584
this.credentialAuth = credentialAuth;
8685
this.shiroConfiguration = aaaConfiguration.getShiroConf();
87-
this.handlers = new ArrayList<>();
8886
this.authenticationService = new AuthenticationManager();
8987
final DatastoreConfig datastoreConfig = aaaConfiguration.getDatastoreConf();
9088

@@ -127,46 +125,62 @@ private AAALightyShiroProvider(final DataBroker dataBroker,
127125
initAAAonServer(server);
128126
}
129127

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-
128+
private void initAAAonServer(final LightyJettyServerProvider server) {
150129
final Map<String, String> properties = new HashMap<>();
151130
final CustomFilterAdapterConfigurationImpl customFilterAdapterConfig =
152-
new CustomFilterAdapterConfigurationImpl();
131+
new CustomFilterAdapterConfigurationImpl();
153132
customFilterAdapterConfig.update(properties);
154-
final FilterHolder customFilterAdapter = new FilterHolder(new CustomFilterAdapter(customFilterAdapterConfig));
155-
server.addCommonFilter(customFilterAdapter, "/*");
156133

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

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, "/*");
174+
try {
175+
this.registration = server.build().registerWebContext(webContextBuilder.build());
176+
} catch (ServletException e) {
177+
LOG.error("Failed to register AAA web context: {}!", server.getClass(), e);
178+
}
165179
}
166180

167181
public static CompletableFuture<AAALightyShiroProvider> newInstance(final DataBroker dataBroker,
168182
final AAAConfiguration aaaConfig, final CredentialAuth<PasswordCredentials> credentialAuth,
169-
final LightyServerBuilder server) {
183+
final LightyJettyServerProvider server) {
170184
final CompletableFuture<AAALightyShiroProvider> completableFuture = new CompletableFuture<>();
171185
INSTANCE = new AAALightyShiroProvider(dataBroker, aaaConfig, credentialAuth, server);
172186
completableFuture.complete(INSTANCE);
@@ -225,6 +239,10 @@ public static IIDMStore getIdmStore() {
225239
return INSTANCE.iidmStore;
226240
}
227241

242+
public ShiroWebContextSecurer getWebContextSecurer() {
243+
return webContextSecurer;
244+
}
245+
228246
/**
229247
* Set IDM data store, only used for test.
230248
*
@@ -236,15 +254,9 @@ public static void setIdmStore(final IIDMStore store) {
236254

237255
@SuppressWarnings("IllegalCatch")
238256
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-
});
257+
if (registration != null) {
258+
registration.close();
259+
}
248260
}
249261

250262
private static TokenAuthenticators buildTokenAuthenticators(

0 commit comments

Comments
 (0)