diff --git a/docsys/src/main/java/io/nosqlbench/docsys/core/NBWebServer.java b/docsys/src/main/java/io/nosqlbench/docsys/core/NBWebServer.java index f19946a37..f3d49e4e4 100644 --- a/docsys/src/main/java/io/nosqlbench/docsys/core/NBWebServer.java +++ b/docsys/src/main/java/io/nosqlbench/docsys/core/NBWebServer.java @@ -4,6 +4,7 @@ import io.nosqlbench.docsys.DocsysDefaultAppPath; import io.nosqlbench.docsys.api.Docs; import io.nosqlbench.docsys.api.WebServiceObject; import io.nosqlbench.docsys.handlers.FavIconHandler; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.spi.SimpleServiceLoader; import jakarta.servlet.DispatcherType; import jakarta.servlet.ServletRegistration; @@ -123,8 +124,8 @@ public class NBWebServer implements Runnable { .collect(Collectors.toList()); } - SimpleServiceLoader svcLoader = new SimpleServiceLoader<>(WebServiceObject.class); - svcLoader.getNamedProviders().values() + SimpleServiceLoader svcLoader = new SimpleServiceLoader<>(WebServiceObject.class, Maturity.Any); + svcLoader.getNamedProviders().stream().map(p -> p.provider) .forEach(p -> { Class c = p.type(); logger.info("Adding web service object: " + c.getSimpleName()); @@ -294,7 +295,7 @@ public class NBWebServer implements Runnable { server.setHandler(handlers); for (Connector connector : server.getConnectors()) { if (connector instanceof AbstractConnector) { - logger.debug("Setting idle timeout for " + connector.toString() + " to 300,000ms"); + logger.debug("Setting idle timeout for " + connector + " to 300,000ms"); ((AbstractConnector) connector).setIdleTimeout(300000); } } diff --git a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java index d16b088b4..383370ae5 100644 --- a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java +++ b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java @@ -3,6 +3,7 @@ package io.nosqlbench.docsys.endpoints; import io.nosqlbench.docsys.api.WebServiceObject; import io.nosqlbench.docsys.core.NBWebServer; import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.nb.annotations.Maturity; import jakarta.inject.Singleton; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -13,7 +14,7 @@ import jakarta.ws.rs.core.MediaType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -@Service(value = WebServiceObject.class, selector = "docserver-status") +@Service(value = WebServiceObject.class, selector = "docserver-status", maturity = Maturity.Deprecated) @Singleton @Path("_") public class DocServerStatusEndpoint implements WebServiceObject { diff --git a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java index 29e3153a9..3efb87d4b 100644 --- a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java +++ b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java @@ -7,6 +7,7 @@ import io.nosqlbench.docsys.api.WebServiceObject; import io.nosqlbench.docsys.core.DocsysPathLoader; import io.nosqlbench.docsys.core.PathWalker; import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.nb.annotations.Maturity; import jakarta.inject.Singleton; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; @@ -20,7 +21,7 @@ import java.nio.file.Files; import java.util.*; import java.util.concurrent.atomic.AtomicLong; -@Service(value = WebServiceObject.class, selector = "docsys-markdown") +@Service(value = WebServiceObject.class, selector = "docsys-markdown",maturity = Maturity.Deprecated) @Singleton @Path("/services/docs/") public class DocsysMarkdownEndpoint implements WebServiceObject { diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java index b743cedff..8a4befbb0 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java @@ -19,6 +19,7 @@ package io.nosqlbench.engine.api.activityapi.cyclelog.filters; import io.nosqlbench.engine.api.activityapi.core.Activity; import io.nosqlbench.engine.api.util.SimpleConfig; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.spi.SimpleServiceLoader; import java.util.function.IntPredicate; @@ -26,7 +27,7 @@ import java.util.function.IntPredicate; public interface ExperimentalResultFilterType { SimpleServiceLoader FINDER = - new SimpleServiceLoader<>(ExperimentalResultFilterType.class); + new SimpleServiceLoader<>(ExperimentalResultFilterType.class, Maturity.Any); default IntPredicateDispenser getFilterDispenser(Activity activity) { SimpleConfig conf = new SimpleConfig(activity, "resultfilter"); diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java index 08d902d2e..07304c62a 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java @@ -17,11 +17,12 @@ package io.nosqlbench.engine.api.activityapi.cyclelog.filters; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.spi.SimpleServiceLoader; public interface ResultValueFilterType { - SimpleServiceLoader FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class); + SimpleServiceLoader FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class, Maturity.Any); ResultFilterDispenser getDispenser(String config); } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java index fbc2b91e0..01cfe834b 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java @@ -18,12 +18,13 @@ package io.nosqlbench.engine.api.activityapi.input; import io.nosqlbench.engine.api.activityapi.core.Activity; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.spi.SimpleServiceLoader; public interface InputType { SimpleServiceLoader FINDER = - new SimpleServiceLoader<>(InputType.class); + new SimpleServiceLoader<>(InputType.class, Maturity.Any); InputDispenser getInputDispenser(Activity activity); } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java index 0678bd69d..a41339c3f 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java @@ -18,12 +18,13 @@ package io.nosqlbench.engine.api.activityapi.output; import io.nosqlbench.engine.api.activityapi.core.Activity; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.spi.SimpleServiceLoader; public interface OutputType { SimpleServiceLoader FINDER = - new SimpleServiceLoader<>(OutputType.class); + new SimpleServiceLoader<>(OutputType.class, Maturity.Any); OutputDispenser getOutputDispenser(Activity activity); diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java index 8547629ee..9d01c2bbc 100644 --- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java +++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java @@ -17,6 +17,7 @@ import io.nosqlbench.engine.core.script.Scenario; import io.nosqlbench.engine.core.script.ScenariosExecutor; import io.nosqlbench.engine.core.script.ScriptParams; import io.nosqlbench.engine.docker.DockerMetricsManager; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.annotations.Annotation; import io.nosqlbench.nb.api.annotations.Layer; import io.nosqlbench.nb.api.content.Content; @@ -56,10 +57,8 @@ public class NBCLI { public NBCLI(String commandName) { this.commandName = commandName; - } - public static void main(String[] args) { try { NBCLI cli = new NBCLI("eb"); @@ -264,12 +263,12 @@ public class NBCLI { } if (options.wantsInputTypes()) { - InputType.FINDER.getAllSelectors().forEach(System.out::println); + InputType.FINDER.getAllSelectors().forEach((k,v) -> System.out.println(k + " (" + v.name() + ")")); System.exit(0); } if (options.wantsMarkerTypes()) { - OutputType.FINDER.getAllSelectors().forEach(System.out::println); + OutputType.FINDER.getAllSelectors().forEach((k,v) -> System.out.println(k + " (" + v.name() + ")")); System.exit(0); } @@ -365,8 +364,8 @@ public class NBCLI { options.wantsCompileScript(), options.getReportSummaryTo(), String.join("\n", args), - options.getLogsDirectory() - ); + options.getLogsDirectory(), + Maturity.Unspecified); ScriptBuffer buffer = new BasicScriptBuffer() .add(options.getCommands() diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java index 46a7f354e..3a8ac0ad0 100644 --- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java +++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java @@ -3,6 +3,7 @@ package io.nosqlbench.engine.cli; import io.nosqlbench.engine.api.metrics.IndicatorMode; import io.nosqlbench.engine.api.util.Unit; import io.nosqlbench.engine.core.script.Scenario; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.NBEnvironment; import io.nosqlbench.nb.api.errors.BasicError; import io.nosqlbench.nb.api.logging.NBLogLevel; @@ -59,6 +60,8 @@ public class NBCLIOptions { private static final String SCRIPT_FILE = "--script-file"; private static final String COPY = "--copy"; private static final String SHOW_STACKTRACES = "--show-stacktraces"; + private static final String EXPERIMENTAL = "--experimental"; + private static final String MATURITY = "--maturity"; // Execution private static final String EXPORT_CYCLE_LOG = "--export-cycle-log"; @@ -67,6 +70,7 @@ public class NBCLIOptions { // Execution Options + private static final String SESSION_NAME = "--session-name"; private static final String LOGS_DIR = "--logs-dir"; private static final String WORKSPACES_DIR = "--workspaces-dir"; @@ -162,6 +166,7 @@ public class NBCLIOptions { private String dockerPromRetentionDays = "183d"; private String reportSummaryTo = REPORT_SUMMARY_TO_DEFAULT; private boolean enableAnsi = System.getenv("TERM")!=null && !System.getenv("TERM").isEmpty(); + private Maturity minMaturity = Maturity.Unspecified; public String getAnnotatorsConfig() { return annotatorsConfig; @@ -392,6 +397,15 @@ public class NBCLIOptions { arglist.removeFirst(); showStackTraces = true; break; + case EXPERIMENTAL: + arglist.removeFirst(); + arglist.addFirst("experimental"); + arglist.addFirst("--maturity"); + break; + case MATURITY: + arglist.removeFirst(); + String maturity = readWordOrThrow(arglist,"maturity of components to allow"); + this.minMaturity = Maturity.valueOf(maturity.toLowerCase(Locale.ROOT)); default: nonincludes.addLast(arglist.removeFirst()); } @@ -626,6 +640,10 @@ public class NBCLIOptions { return configs; } + public Maturity allowMinMaturity() { + return minMaturity; + } + public List getCommands() { return cmdList; } diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ActivityTypeLoader.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ActivityTypeLoader.java index 8f2c151fb..154cffc59 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ActivityTypeLoader.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ActivityTypeLoader.java @@ -5,6 +5,7 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType; import io.nosqlbench.engine.api.activityimpl.ActivityDef; import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.NBEnvironment; import io.nosqlbench.nb.api.config.standard.*; import io.nosqlbench.nb.api.content.Content; @@ -25,10 +26,15 @@ import java.util.stream.Collectors; public class ActivityTypeLoader { private static final Logger logger = LogManager.getLogger(ActivityTypeLoader.class); - private static final SimpleServiceLoader ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader(ActivityType.class); - private static final SimpleServiceLoader DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class); + private final SimpleServiceLoader ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader(ActivityType.class, Maturity.Any); + private final SimpleServiceLoader DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class, Maturity.Any); private final Set jarUrls = new HashSet<>(); + public ActivityTypeLoader setMaturity(Maturity maturity) { + ACTIVITYTYPE_SPI_FINDER.setMaturity(maturity); + return this; + } + public ActivityTypeLoader() { List libpaths = NBEnvironment.INSTANCE.interpolateEach(":", "$" + NBEnvironment.NBLIBS); @@ -154,11 +160,11 @@ public class ActivityTypeLoader { .asReadOnly(); public Set getAllSelectors() { - List allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors(); - List allDrivers = DRIVERADAPTER_SPI_FINDER.getAllSelectors(); - Set all = new HashSet<>(); - all.addAll(allSelectors); - all.addAll(allDrivers); + Map allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors(); + Map addAdapters = DRIVERADAPTER_SPI_FINDER.getAllSelectors(); + Set all = new LinkedHashSet<>(); + all.addAll(allSelectors.keySet()); + all.addAll(addAdapters.keySet()); return all; } } diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java index e8333a81f..87bd0c395 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java @@ -22,6 +22,7 @@ import io.nosqlbench.engine.api.activityimpl.ParameterMap; import io.nosqlbench.engine.api.activityimpl.ProgressAndStateMeter; import io.nosqlbench.engine.api.metrics.ActivityMetrics; import io.nosqlbench.engine.core.annotation.Annotators; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.annotations.Annotation; import io.nosqlbench.nb.api.annotations.Layer; import io.nosqlbench.nb.api.errors.BasicError; @@ -44,9 +45,11 @@ public class ScenarioController { private final Map activityExecutors = new ConcurrentHashMap<>(); private final String sessionId; + private final Maturity minMaturity; - public ScenarioController(String sessionId) { + public ScenarioController(String sessionId, Maturity minMaturity) { this.sessionId = sessionId; + this.minMaturity = minMaturity; } /** @@ -315,9 +318,12 @@ public class ScenarioController { if (executor == null && createIfMissing) { - ActivityType activityType = new ActivityTypeLoader().load(activityDef).orElseThrow( - () -> new RuntimeException("Could not load Driver for " + activityDef + "'") - ); + ActivityType activityType = new ActivityTypeLoader() + .setMaturity(this.minMaturity) + .load(activityDef) + .orElseThrow( + () -> new RuntimeException("Could not load Driver for " + activityDef + "'") + ); executor = new ActivityExecutor( activityType.getAssembledActivity( @@ -333,7 +339,7 @@ public class ScenarioController { } /** - * Wait for a bit. This is not the best approach, and will be replace with a different system in the future. + * Wait for a bit. This is not the best approach, and will be replaced with a different system in the future. * * @param waitMillis time to wait, in milliseconds */ diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java index 8cf871ff3..d62312d27 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java @@ -19,17 +19,18 @@ import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine; import io.nosqlbench.engine.api.extensions.ScriptingPluginInfo; import io.nosqlbench.engine.api.metrics.ActivityMetrics; import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer; +import io.nosqlbench.engine.core.annotation.Annotators; import io.nosqlbench.engine.core.lifecycle.ActivityProgressIndicator; import io.nosqlbench.engine.core.lifecycle.PolyglotScenarioController; import io.nosqlbench.engine.core.lifecycle.ScenarioController; import io.nosqlbench.engine.core.lifecycle.ScenarioResult; -import io.nosqlbench.engine.core.annotation.Annotators; import io.nosqlbench.engine.core.metrics.PolyglotMetricRegistryBindings; +import io.nosqlbench.nb.annotations.Maturity; +import io.nosqlbench.nb.api.annotations.Annotation; +import io.nosqlbench.nb.api.annotations.Layer; import io.nosqlbench.nb.api.metadata.ScenarioMetadata; import io.nosqlbench.nb.api.metadata.ScenarioMetadataAware; import io.nosqlbench.nb.api.metadata.SystemId; -import io.nosqlbench.nb.api.annotations.Layer; -import io.nosqlbench.nb.api.annotations.Annotation; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.graalvm.polyglot.Context; @@ -49,7 +50,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.Callable; import java.util.stream.Collectors; @@ -58,6 +62,7 @@ public class Scenario implements Callable { private final String commandLine; private final String reportSummaryTo; private final Path logsPath; + private final Maturity minMaturity; private Logger logger = LogManager.getLogger("SCENARIO"); private State state = State.Scheduled; @@ -106,7 +111,8 @@ public class Scenario implements Callable { boolean wantsCompiledScript, String reportSummaryTo, String commandLine, - Path logsPath) { + Path logsPath, + Maturity minMaturity) { this.scenarioName = scenarioName; this.scriptfile = scriptfile; @@ -118,13 +124,15 @@ public class Scenario implements Callable { this.reportSummaryTo = reportSummaryTo; this.commandLine = commandLine; this.logsPath = logsPath; + this.minMaturity = minMaturity; } - public Scenario(String name, Engine engine, String reportSummaryTo) { + public Scenario(String name, Engine engine, String reportSummaryTo, Maturity minMaturity) { this.scenarioName = name; this.reportSummaryTo = reportSummaryTo; this.engine = engine; this.commandLine = ""; + this.minMaturity = minMaturity; this.logsPath = Path.of("logs"); } @@ -197,7 +205,7 @@ public class Scenario implements Callable { break; } - scenarioController = new ScenarioController(this.scenarioName); + scenarioController = new ScenarioController(this.scenarioName, minMaturity); if (!progressInterval.equals("disabled")) { activityProgressIndicator = new ActivityProgressIndicator(scenarioController, progressInterval); } diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/ScenarioTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/ScenarioTest.java index cda510c0e..8ca14faec 100644 --- a/engine-core/src/test/java/io/nosqlbench/engine/core/ScenarioTest.java +++ b/engine-core/src/test/java/io/nosqlbench/engine/core/ScenarioTest.java @@ -2,6 +2,7 @@ package io.nosqlbench.engine.core; import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer; import io.nosqlbench.engine.core.script.Scenario; +import io.nosqlbench.nb.annotations.Maturity; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -25,7 +26,7 @@ public class ScenarioTest { @Test public void shouldLoadScriptText() { ScriptEnvBuffer buffer = new ScriptEnvBuffer(); - Scenario env = new Scenario("testing", Scenario.Engine.Graalvm, "stdout:300"); + Scenario env = new Scenario("testing", Scenario.Engine.Graalvm, "stdout:300", Maturity.Any); env.addScriptText("print('loaded script environment...');\n"); env.runScenario(); assertThat(env.getIOLog().get().get(0)).contains("loaded script environment..."); diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScenariosExecutorTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScenariosExecutorTest.java index beb6b38f3..fc45f99a2 100644 --- a/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScenariosExecutorTest.java +++ b/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScenariosExecutorTest.java @@ -18,6 +18,7 @@ package io.nosqlbench.engine.core.script; import io.nosqlbench.engine.core.lifecycle.ScenariosResults; +import io.nosqlbench.nb.annotations.Maturity; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -27,7 +28,7 @@ public class ScenariosExecutorTest { @Disabled public void testAwaitOnTime() { ScenariosExecutor e = new ScenariosExecutor(ScenariosExecutorTest.class.getSimpleName(), 1); - Scenario s = new Scenario("testing", Scenario.Engine.Graalvm,"stdout:3000"); + Scenario s = new Scenario("testing", Scenario.Engine.Graalvm,"stdout:3000", Maturity.Any); s.addScriptText("load('classpath:scripts/asyncs.js');\nsetTimeout(\"print('waited')\",5000);\n"); e.execute(s); ScenariosResults scenariosResults = e.awaitAllResults(); diff --git a/engine-rest/src/main/java/io/nosqlbench/engine/rest/resources/ScenarioExecutorEndpoint.java b/engine-rest/src/main/java/io/nosqlbench/engine/rest/resources/ScenarioExecutorEndpoint.java index 464a87b60..81ffdad67 100644 --- a/engine-rest/src/main/java/io/nosqlbench/engine/rest/resources/ScenarioExecutorEndpoint.java +++ b/engine-rest/src/main/java/io/nosqlbench/engine/rest/resources/ScenarioExecutorEndpoint.java @@ -13,6 +13,7 @@ import io.nosqlbench.engine.rest.services.WorkspaceFinder; import io.nosqlbench.engine.rest.transfertypes.LiveScenarioView; import io.nosqlbench.engine.rest.transfertypes.RunScenarioRequest; import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.nb.annotations.Maturity; import jakarta.inject.Singleton; import jakarta.ws.rs.*; import jakarta.ws.rs.core.*; @@ -119,8 +120,8 @@ public class ScenarioExecutorEndpoint implements WebServiceObject { false, "", cmdList.toString(), - (java.nio.file.Path) config.getProperties().get("logpath") - ); + (java.nio.file.Path) config.getProperties().get("logpath"), + Maturity.Unspecified); scenario.addScriptText(buffer.getParsedScript()); diff --git a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Stability.java b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Maturity.java similarity index 50% rename from nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Stability.java rename to nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Maturity.java index c2e6969a4..938adfe08 100644 --- a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Stability.java +++ b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Maturity.java @@ -15,9 +15,33 @@ package io.nosqlbench.nb.annotations; *
  • By default, the runtime will mark a component as Unspecified unless/until the maturity field is set of its {@link Service} annotation.
  • * */ -public enum Stability { - Experimental, - Settling, - Stable, - Unspecified +public enum Maturity { + Stable(6,"Proven to work in practice and has has little to no change since"), + Proven(5, "Proven to work in practice"), + Verified(4, "Tested by a user and verified to function according to expectations"), + Tested(1, "Is tested regularly with unit tests"), + Unspecified(0, "The developer needs to be more opinionated about the status of this component"), + Deprecated(-1, "This component is no loner recommended for general use"), + Experimental(-2, "This component is provided as an experiment which may mature to something more reliable"), + Sketch(-3,"The component is presented for consideration, and not intended to be promoted without community validation"), + Any(-100,"Any component will match this, but no component should be assigned it"); + + private final int stability; + private final String description; + + Maturity(int stability, String description) { + this.stability = stability; + this.description = description; + } + + public int getStability() { + return stability; + } + public String getDescription() { + return this.description; + } + + public boolean equalOrGreater(Maturity reference) { + return this.stability >= reference.stability; + } } diff --git a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java index 2f1b9f2f2..a41d7db04 100644 --- a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java +++ b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java @@ -31,5 +31,5 @@ import java.lang.annotation.Target; public @interface Service { Class value(); String selector(); - Stability maturity() default Stability.Unspecified; + Maturity maturity() default Maturity.Unspecified; } diff --git a/nb-api/src/main/java/io/nosqlbench/nb/addins/s3/s3urlhandler/S3UrlStreamHandlerProvider.java b/nb-api/src/main/java/io/nosqlbench/nb/addins/s3/s3urlhandler/S3UrlStreamHandlerProvider.java index 389903c40..4353d0daa 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/addins/s3/s3urlhandler/S3UrlStreamHandlerProvider.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/addins/s3/s3urlhandler/S3UrlStreamHandlerProvider.java @@ -1,11 +1,12 @@ package io.nosqlbench.nb.addins.s3.s3urlhandler; import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.nb.annotations.Maturity; import java.net.URLStreamHandler; import java.net.spi.URLStreamHandlerProvider; -@Service(value = URLStreamHandlerProvider.class, selector = "s3") +@Service(value = URLStreamHandlerProvider.class, selector = "s3", maturity = Maturity.Verified) public class S3UrlStreamHandlerProvider extends URLStreamHandlerProvider { private final S3ClientCache clientCache = new S3ClientCache(); diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java index e8f0afe0c..ee2350278 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java @@ -1,10 +1,11 @@ package io.nosqlbench.nb.api.markdown; import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.api.markdown.providers.DocsRootDirectory; import io.nosqlbench.nb.api.markdown.providers.RawMarkdownSource; -@Service(value = RawMarkdownSource.class, selector = "docs-for-testing") +@Service(value = RawMarkdownSource.class, selector = "docs-for-testing", maturity = Maturity.Stable) public class DocsForTestingOnly extends DocsRootDirectory { @Override diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java b/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java index 20430d3b9..3017086bd 100644 --- a/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java @@ -17,6 +17,7 @@ package io.nosqlbench.nb.api.spi; +import io.nosqlbench.nb.annotations.Maturity; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -29,22 +30,27 @@ public class SimpleServiceLoader { private static final Logger logger = LogManager.getLogger("SERVICESAPI"); private final Class serviceType; + private Maturity maturity = Maturity.Unspecified; - public SimpleServiceLoader(Class serviceType) { + public SimpleServiceLoader(Class serviceType, Maturity maturity) { this.serviceType = serviceType; + this.maturity =maturity; + } + public SimpleServiceLoader setMaturity(Maturity maturity) { + this.maturity = maturity; + return this; } public Optional get(String implName) { - LinkedHashMap> namedProviders = getNamedProviders(); - ServiceLoader.Provider providers = namedProviders.get(implName); + List> namedProviders = getNamedProviders(); + ServiceLoader.Provider providers = namedProviders.stream().filter(n -> n.selector.equals(implName)).findFirst().get().provider; return Optional.ofNullable(providers == null ? null : providers.get()); } public T getOrThrow(String implName) { Optional t = get(implName); return t.orElseThrow( - () -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" + - this.getNamedProviders().keySet().stream().collect(Collectors.joining(","))) + () -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" + getNamedProviders()) ); } @@ -62,12 +68,14 @@ public class SimpleServiceLoader { * {@link Service} annotation. * @return A map of providers of T */ - public synchronized LinkedHashMap> getNamedProviders(Pattern... includes) { + public synchronized List> getNamedProviders(String... includes) { ServiceLoader loader = ServiceLoader.load(serviceType); - List patterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(Pattern.compile(".*")); + List defaultedPatterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(".*"); + List qualifiedPatterns = defaultedPatterns.stream().map(p -> { + return Pattern.compile(p); + }).collect(Collectors.toList()); - LinkedHashMap> providers; - providers = new LinkedHashMap<>(); + List> components = new ArrayList<>(); loader.stream().forEach(provider -> { logger.trace("loading provider: " + provider.type()); @@ -79,18 +87,43 @@ public class SimpleServiceLoader { ); } Service service = type.getAnnotation(Service.class); - for (Pattern pattern : patterns) { + for (Pattern pattern : qualifiedPatterns) { if (pattern.matcher(service.selector()).matches()) { - providers.put(service.selector(), provider); + components.add(new Component(service.selector(), provider, service.maturity())); break; } } }); - return providers; + return components; } - public List getAllSelectors(Pattern... patterns) { - return new ArrayList<>(getNamedProviders(patterns).keySet()); + + public final static class Component { + + public final String selector; + public final ServiceLoader.Provider provider; + public final Maturity maturity; + + public Component(String selector, ServiceLoader.Provider provider, Maturity maturity) { + this.selector = selector; + this.provider = provider; + this.maturity = maturity; + } + + @Override + public String toString() { + return "Component{" + + selector + " (" + maturity + ")"; + } + } + + + public Map getAllSelectors(String... patterns) { + LinkedHashMap map = new LinkedHashMap<>(); + for (Component namedProvider : getNamedProviders(patterns)) { + map.put(namedProvider.selector,namedProvider.maturity); + } + return map; } } diff --git a/nbr/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java b/nbr/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java index bffd5f68b..9a2f66468 100644 --- a/nbr/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java +++ b/nbr/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java @@ -19,6 +19,7 @@ package io.nosqlbench.engine.core.script; import io.nosqlbench.engine.core.lifecycle.ScenarioResult; import io.nosqlbench.engine.core.lifecycle.ScenariosResults; +import io.nosqlbench.nb.annotations.Maturity; import org.apache.commons.compress.utils.IOUtils; import org.assertj.core.data.Offset; import org.junit.jupiter.api.BeforeAll; @@ -52,7 +53,7 @@ public class AsyncScriptIntegrationTests { String scenarioName = "scenario " + scriptname; System.out.println("=".repeat(29) + " Running ASYNC integration test for: " + scenarioName); ScenariosExecutor executor = new ScenariosExecutor(AsyncScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); - Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300"); + Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300", Maturity.Any); s.addScenarioScriptParams(paramsMap); diff --git a/nbr/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java b/nbr/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java index 1aadcf669..189675299 100644 --- a/nbr/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java +++ b/nbr/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java @@ -19,6 +19,7 @@ package io.nosqlbench.engine.core.script; import io.nosqlbench.engine.core.lifecycle.ScenarioResult; import io.nosqlbench.engine.core.lifecycle.ScenariosResults; +import io.nosqlbench.nb.annotations.Maturity; import org.apache.commons.compress.utils.IOUtils; import org.assertj.core.data.Offset; import org.junit.jupiter.api.BeforeAll; @@ -48,7 +49,7 @@ public class ScriptIntegrationTests { String scenarioName = "scenario " + scriptname; System.out.println("=".repeat(29) + " Running SYNC integration test for: " + scenarioName); ScenariosExecutor e = new ScenariosExecutor(ScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); - Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300"); + Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300", Maturity.Any); s.addScenarioScriptParams(paramsMap); ClassLoader cl = AsyncScriptIntegrationTests.class.getClassLoader(); String script;