From 64e33abf996ca4d668da768834c22f33e947356b Mon Sep 17 00:00:00 2001 From: Ian Haken Date: Fri, 23 Jun 2017 11:23:46 -0700 Subject: [PATCH 1/2] Add configuration option to add additional connectors to admin's embedded jetty server. Allows for standing up an extra SSL-enabled port. --- .../java/netflix/admin/AdminConfigImpl.java | 29 +++++++++++++++++++ .../netflix/admin/AdminContainerConfig.java | 2 ++ .../AdminResourcesContainer.java | 4 +++ 3 files changed, 35 insertions(+) diff --git a/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java b/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java index bebfb5a9..33d3f6e4 100644 --- a/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java +++ b/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java @@ -12,6 +12,7 @@ import javax.inject.Singleton; import javax.servlet.Filter; +import org.mortbay.jetty.Connector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +50,9 @@ public class AdminConfigImpl implements AdminContainerConfig { public static final String NETFLIX_ADMIN_CTX_FILTERS = ADMIN_PREFIX + "additional.filters"; public static final String DEFAULT_CONTEXT_FILTERS = ""; + public static final String NETFLIX_ADMIN_CTX_CONNECTORS = ADMIN_PREFIX + "additional.connectors"; + public static final String DEFAULT_CONTEXT_CONNECTORS = ""; + private static final String JERSEY_PROPERTY_PREFIX = "com.sun.jersey.config"; private static final String ADMIN_JERSEY_PROPERTY_PREFIX = ADMIN_PREFIX + JERSEY_PROPERTY_PREFIX; @@ -137,4 +141,29 @@ public List additionalFilters() { } return filters; } + + @Override + public List additionalConnectors() { + String rootContextConnectors = ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_CONNECTORS, DEFAULT_CONTEXT_CONNECTORS); + + if (rootContextConnectors.isEmpty()) { + return Collections.emptyList(); + } + + List connectors = new ArrayList<>(); + final String[] connectorClasses = rootContextConnectors.split(","); + for (String connectorClass : connectorClasses) { + try { + final Class connectorCls = Class.forName(connectorClass, false, getClass().getClassLoader()); + if (Connector.class.isAssignableFrom(connectorCls)) { + connectors.add((Connector)(injector == null ? connectorCls.newInstance() : injector.getInstance(connectorCls))); + } + } catch (InstantiationException | IllegalAccessException e) { + logger.warn("Connector class can not be instantiated " + connectorClass); + } catch (ClassNotFoundException e) { + logger.warn("Connector class not found " + connectorClass); + } + } + return connectors; + } } diff --git a/karyon2-admin/src/main/java/netflix/admin/AdminContainerConfig.java b/karyon2-admin/src/main/java/netflix/admin/AdminContainerConfig.java index 1ad99001..d14303b8 100644 --- a/karyon2-admin/src/main/java/netflix/admin/AdminContainerConfig.java +++ b/karyon2-admin/src/main/java/netflix/admin/AdminContainerConfig.java @@ -6,6 +6,7 @@ import javax.servlet.Filter; import com.google.inject.ImplementedBy; +import org.mortbay.jetty.Connector; @ImplementedBy(AdminConfigImpl.class) public interface AdminContainerConfig { @@ -18,6 +19,7 @@ public interface AdminContainerConfig { boolean shouldScanClassPathForPluginDiscovery(); int listenPort(); List additionalFilters(); + List additionalConnectors(); Map getJerseyConfigProperties(); } diff --git a/karyon2-admin/src/main/java/netflix/adminresources/AdminResourcesContainer.java b/karyon2-admin/src/main/java/netflix/adminresources/AdminResourcesContainer.java index 1a4a6a7e..1ef8e377 100644 --- a/karyon2-admin/src/main/java/netflix/adminresources/AdminResourcesContainer.java +++ b/karyon2-admin/src/main/java/netflix/adminresources/AdminResourcesContainer.java @@ -34,6 +34,7 @@ import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.handler.ResourceHandler; +import org.mortbay.jetty.security.SslSocketConnector; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.DefaultServlet; import org.mortbay.jetty.servlet.FilterHolder; @@ -198,6 +199,9 @@ public Resource getResource(String path) throws MalformedURLException { HandlerCollection handlers = new HandlerCollection(); handlers.setHandlers(new Handler[]{resource_handler, adminTemplatesResHandler, adminDataResHandler, rootHandler}); server.setHandler(handlers); + for (Connector connector : adminContainerConfig.additionalConnectors()) { + server.addConnector(connector); + } server.start(); From e651e6806be2090743c7f7576384060dc985353b Mon Sep 17 00:00:00 2001 From: Ian Haken Date: Fri, 23 Jun 2017 11:46:20 -0700 Subject: [PATCH 2/2] Factored some common code. --- .../java/netflix/admin/AdminConfigImpl.java | 73 +++++++------------ 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java b/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java index 33d3f6e4..7205b29d 100644 --- a/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java +++ b/karyon2-admin/src/main/java/netflix/admin/AdminConfigImpl.java @@ -1,24 +1,17 @@ package netflix.admin; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; - -import javax.inject.Inject; -import javax.inject.Singleton; -import javax.servlet.Filter; - +import com.google.inject.Injector; +import com.netflix.config.ConfigurationManager; +import com.netflix.config.util.ConfigurationUtils; import org.mortbay.jetty.Connector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.inject.Injector; -import com.netflix.config.ConfigurationManager; -import com.netflix.config.util.ConfigurationUtils; +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.servlet.Filter; +import java.util.*; +import java.util.Map.Entry; @Singleton public class AdminConfigImpl implements AdminContainerConfig { @@ -119,51 +112,37 @@ public Map getJerseyConfigProperties() { @Override public List additionalFilters() { - String rootContextFilters = ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_FILTERS, DEFAULT_CONTEXT_FILTERS); - - if (rootContextFilters.isEmpty()) { - return Collections.emptyList(); - } - - List filters = new ArrayList<>(); - final String[] filterClasses = rootContextFilters.split(","); - for (String filterClass : filterClasses) { - try { - final Class filterCls = Class.forName(filterClass, false, getClass().getClassLoader()); - if (Filter.class.isAssignableFrom(filterCls)) { - filters.add((Filter)(injector == null ? filterCls.newInstance() : injector.getInstance(filterCls))); - } - } catch (InstantiationException | IllegalAccessException e) { - logger.warn("Filter class can not be instantiated " + filterClass); - } catch (ClassNotFoundException e) { - logger.warn("Filter class not found " + filterClass); - } - } - return filters; + return getInstancesFromClassList( + ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_FILTERS, DEFAULT_CONTEXT_FILTERS), + Filter.class); } @Override public List additionalConnectors() { - String rootContextConnectors = ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_CONNECTORS, DEFAULT_CONTEXT_CONNECTORS); + return getInstancesFromClassList( + ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_CONNECTORS, DEFAULT_CONTEXT_CONNECTORS), + Connector.class); + } - if (rootContextConnectors.isEmpty()) { + private List getInstancesFromClassList(String classList, Class clazz) { + if (classList.isEmpty()) { return Collections.emptyList(); } - List connectors = new ArrayList<>(); - final String[] connectorClasses = rootContextConnectors.split(","); - for (String connectorClass : connectorClasses) { + List instances = new ArrayList<>(); + final String[] classNames = classList.split(","); + for (String className : classNames) { try { - final Class connectorCls = Class.forName(connectorClass, false, getClass().getClassLoader()); - if (Connector.class.isAssignableFrom(connectorCls)) { - connectors.add((Connector)(injector == null ? connectorCls.newInstance() : injector.getInstance(connectorCls))); + final Class implClass = Class.forName(className, false, getClass().getClassLoader()); + if (clazz.isAssignableFrom(implClass)) { + instances.add(clazz.cast(injector == null ? implClass.newInstance() : injector.getInstance(implClass))); } } catch (InstantiationException | IllegalAccessException e) { - logger.warn("Connector class can not be instantiated " + connectorClass); + logger.warn("Class can not be instantiated " + className); } catch (ClassNotFoundException e) { - logger.warn("Connector class not found " + connectorClass); + logger.warn("Class not found " + className); } } - return connectors; + return instances; } }