public static NamedPlugin namedPlugin(String name, Plugin plugin) { return new NamedPlugin(name, plugin); }
@Override public Map<String, HttpHandler> adminInterfaceHandlers() { return plugin.adminInterfaceHandlers(); }
private PluginEnabledState currentState(NamedPlugin plugin) { return plugin.enabled() ? PluginEnabledState.ENABLED : PluginEnabledState.DISABLED; }
@Override public void stopping(Service.State from) { for (NamedPlugin plugin : plugins) { try { plugin.styxStopping(); } catch (Exception e) { LOG.error("Error stopping plugin '{}'", plugin.name(), e); } } } }
private static void initialisePlugins(Iterable<NamedPlugin> plugins) { int exceptions = 0; for (NamedPlugin plugin : plugins) { try { plugin.styxStarting(); } catch (Exception e) { exceptions++; LOG.error("Error starting plugin '{}'", plugin.name(), e); } } if (exceptions > 0) { throw new RuntimeException(format("%s plugins failed to start", exceptions)); } }
private static String pluginPath(NamedPlugin namedPlugin) { return "/admin/plugins/" + namedPlugin.name(); }
private NamedPlugin loadPlugin(Pair<String, SpiExtension> pair) { String pluginName = pair.key(); SpiExtension spiExtension = pair.value(); PluginFactory factory = pluginFactoryLoader.load(spiExtension); Plugin plugin = factory.create(new PluginEnvironment(pluginName, environment, spiExtension, DEFAULT_PLUGINS_METRICS_SCOPE)); return namedPlugin(pluginName, plugin); }
@Override public Eventual<LiveHttpResponse> intercept(LiveHttpRequest request, Chain originalChain) { StatusRecordingChain chain = new StatusRecordingChain(originalChain); try { return new Eventual<>(toPublisher( toObservable(plugin.intercept(request, chain)) .doOnNext(response -> recordStatusCode(chain, response)) .onErrorResumeNext(error -> error(recordAndWrapError(chain, error))))); } catch (Throwable e) { recordException(e); return Eventual.error(new PluginException(e, plugin.name())); } }
@Override public void styxStarting() { plugin.styxStarting(); }
@Override public void styxStopping() { plugin.styxStopping(); }
boolean apply() { if (isPluginAlreadyInDesiredState()) { return false; } plugin.setEnabled(newState.isEnabled()); return true; }
@JsonProperty("name") public String name() { return plugin.name(); }
private StyxServer(Builder builder) { acceptAllSslRequests(); MemoryBackedRegistry<com.hotels.styx.api.extension.service.BackendService> backendServicesRegistry = new MemoryBackedRegistry<>(); PluginsLoader loader = environment -> builder.pluginFactories.stream() .map(pluginConfig -> namedPlugin( pluginConfig.name, pluginConfig.pluginFactory.create(toPluginEnvironment(environment, pluginConfig)))) .collect(toList()); StyxServerComponents config = new StyxServerComponents.Builder() .styxConfig(styxConfig(builder)) .plugins(loader) .additionalServices(ImmutableMap.of("backendServiceRegistry", new RegistryServiceAdapter(backendServicesRegistry))) .build(); metricRegistry = config.environment().metricRegistry(); this.server = new com.hotels.styx.StyxServer(config); builder.routes.forEach((path, backendService) -> backendServicesRegistry.add(backendService)); }
/** * Construct an instance given the plugins that you want to be able to enable and disable. * * @param namedPlugins the plugins */ public PluginToggleHandler(Iterable<NamedPlugin> namedPlugins) { this.plugins = new HashMap<>(); namedPlugins.forEach(namedPlugin -> this.plugins.put(namedPlugin.name(), namedPlugin)); }
public boolean matches(NamedPlugin plugin) { return plugin.enabled() == isEnabled(); }
private static List<PluginAdminEndpointRoute> pluginAdminEndpointRoutes(NamedPlugin namedPlugin) { Map<String, HttpHandler> adminInterfaceHandlers = namedPlugin.adminInterfaceHandlers(); return mapToList(adminInterfaceHandlers, (relativePath, handler) -> new PluginAdminEndpointRoute(namedPlugin, relativePath, handler)); }
String linkLabel() { String relativePath = path().substring(pluginPath(namedPlugin).length() + 1); return namedPlugin.name() + ": " + dropFirstForwardSlash(relativePath); }
@Override public Eventual<LiveHttpResponse> handle(LiveHttpRequest request, HttpInterceptor.Context context) { Stream<NamedPlugin> enabled = plugins.stream().filter(NamedPlugin::enabled); Stream<NamedPlugin> disabled = plugins.stream().filter(plugin -> !plugin.enabled()); String output = section("Enabled", enabled) + section("Disabled", disabled); return Eventual.of(response(OK) .body(output, UTF_8) .addHeader(CONTENT_TYPE, HTML_UTF_8.toString()) .build() .stream()); }
private String wasNotChangedMessage(RequestedUpdate requestedUpdate) { return format("State of '%s' was already '%s'", requestedUpdate.plugin().name(), requestedUpdate.newState()); }
private String wasChangedMessage(RequestedUpdate requestedUpdate) { return format("State of '%s' changed to '%s'", requestedUpdate.plugin().name(), requestedUpdate.newState()); }