mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
support maturity level on CLI and module loader
This commit is contained in:
parent
2e74116dca
commit
ba736c5f6e
@ -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<WebServiceObject> svcLoader = new SimpleServiceLoader<>(WebServiceObject.class);
|
||||
svcLoader.getNamedProviders().values()
|
||||
SimpleServiceLoader<WebServiceObject> svcLoader = new SimpleServiceLoader<>(WebServiceObject.class, Maturity.Any);
|
||||
svcLoader.getNamedProviders().stream().map(p -> p.provider)
|
||||
.forEach(p -> {
|
||||
Class<? extends WebServiceObject> 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);
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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<ExperimentalResultFilterType> FINDER =
|
||||
new SimpleServiceLoader<>(ExperimentalResultFilterType.class);
|
||||
new SimpleServiceLoader<>(ExperimentalResultFilterType.class, Maturity.Any);
|
||||
|
||||
default IntPredicateDispenser getFilterDispenser(Activity activity) {
|
||||
SimpleConfig conf = new SimpleConfig(activity, "resultfilter");
|
||||
|
@ -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<ResultValueFilterType> FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class);
|
||||
SimpleServiceLoader<ResultValueFilterType> FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class, Maturity.Any);
|
||||
|
||||
ResultFilterDispenser getDispenser(String config);
|
||||
}
|
||||
|
@ -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<InputType> FINDER =
|
||||
new SimpleServiceLoader<>(InputType.class);
|
||||
new SimpleServiceLoader<>(InputType.class, Maturity.Any);
|
||||
|
||||
InputDispenser getInputDispenser(Activity activity);
|
||||
}
|
||||
|
@ -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<OutputType> FINDER =
|
||||
new SimpleServiceLoader<>(OutputType.class);
|
||||
new SimpleServiceLoader<>(OutputType.class, Maturity.Any);
|
||||
|
||||
OutputDispenser getOutputDispenser(Activity activity);
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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<Cmd> getCommands() {
|
||||
return cmdList;
|
||||
}
|
||||
|
@ -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> ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader<ActivityType>(ActivityType.class);
|
||||
private static final SimpleServiceLoader<DriverAdapter> DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class);
|
||||
private final SimpleServiceLoader<ActivityType> ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader<ActivityType>(ActivityType.class, Maturity.Any);
|
||||
private final SimpleServiceLoader<DriverAdapter> DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class, Maturity.Any);
|
||||
private final Set<URL> jarUrls = new HashSet<>();
|
||||
|
||||
public ActivityTypeLoader setMaturity(Maturity maturity) {
|
||||
ACTIVITYTYPE_SPI_FINDER.setMaturity(maturity);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ActivityTypeLoader() {
|
||||
|
||||
List<String> libpaths = NBEnvironment.INSTANCE.interpolateEach(":", "$" + NBEnvironment.NBLIBS);
|
||||
@ -154,11 +160,11 @@ public class ActivityTypeLoader {
|
||||
.asReadOnly();
|
||||
|
||||
public Set<String> getAllSelectors() {
|
||||
List<String> allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors();
|
||||
List<String> allDrivers = DRIVERADAPTER_SPI_FINDER.getAllSelectors();
|
||||
Set<String> all = new HashSet<>();
|
||||
all.addAll(allSelectors);
|
||||
all.addAll(allDrivers);
|
||||
Map<String, Maturity> allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors();
|
||||
Map<String, Maturity> addAdapters = DRIVERADAPTER_SPI_FINDER.getAllSelectors();
|
||||
Set<String> all = new LinkedHashSet<>();
|
||||
all.addAll(allSelectors.keySet());
|
||||
all.addAll(addAdapters.keySet());
|
||||
return all;
|
||||
}
|
||||
}
|
||||
|
@ -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<String, ActivityExecutor> 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
|
||||
*/
|
||||
|
@ -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<ScenarioResult> {
|
||||
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<ScenarioResult> {
|
||||
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<ScenarioResult> {
|
||||
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<ScenarioResult> {
|
||||
break;
|
||||
}
|
||||
|
||||
scenarioController = new ScenarioController(this.scenarioName);
|
||||
scenarioController = new ScenarioController(this.scenarioName, minMaturity);
|
||||
if (!progressInterval.equals("disabled")) {
|
||||
activityProgressIndicator = new ActivityProgressIndicator(scenarioController, progressInterval);
|
||||
}
|
||||
|
@ -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...");
|
||||
|
@ -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();
|
||||
|
@ -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());
|
||||
|
||||
|
@ -15,9 +15,33 @@ package io.nosqlbench.nb.annotations;
|
||||
* <li>By default, the runtime will mark a component as Unspecified unless/until the maturity field is set of its {@link Service} annotation.</li>
|
||||
* </ul>
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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<T> {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("SERVICESAPI");
|
||||
private final Class<? extends T> serviceType;
|
||||
private Maturity maturity = Maturity.Unspecified;
|
||||
|
||||
public SimpleServiceLoader(Class<? extends T> serviceType) {
|
||||
public SimpleServiceLoader(Class<? extends T> serviceType, Maturity maturity) {
|
||||
this.serviceType = serviceType;
|
||||
this.maturity =maturity;
|
||||
}
|
||||
public SimpleServiceLoader setMaturity(Maturity maturity) {
|
||||
this.maturity = maturity;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Optional<T> get(String implName) {
|
||||
LinkedHashMap<String, ServiceLoader.Provider<? extends T>> namedProviders = getNamedProviders();
|
||||
ServiceLoader.Provider<? extends T> providers = namedProviders.get(implName);
|
||||
List<Component<? extends T>> namedProviders = getNamedProviders();
|
||||
ServiceLoader.Provider<? extends T> 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> 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<T> {
|
||||
* {@link Service} annotation.
|
||||
* @return A map of providers of T
|
||||
*/
|
||||
public synchronized LinkedHashMap<String, ServiceLoader.Provider<? extends T>> getNamedProviders(Pattern... includes) {
|
||||
public synchronized List<Component<? extends T>> getNamedProviders(String... includes) {
|
||||
ServiceLoader<? extends T> loader = ServiceLoader.load(serviceType);
|
||||
List<Pattern> patterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(Pattern.compile(".*"));
|
||||
List<String> defaultedPatterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(".*");
|
||||
List<Pattern> qualifiedPatterns = defaultedPatterns.stream().map(p -> {
|
||||
return Pattern.compile(p);
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
LinkedHashMap<String, ServiceLoader.Provider<? extends T>> providers;
|
||||
providers = new LinkedHashMap<>();
|
||||
List<Component<? extends T>> components = new ArrayList<>();
|
||||
|
||||
loader.stream().forEach(provider -> {
|
||||
logger.trace("loading provider: " + provider.type());
|
||||
@ -79,18 +87,43 @@ public class SimpleServiceLoader<T> {
|
||||
);
|
||||
}
|
||||
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<String> getAllSelectors(Pattern... patterns) {
|
||||
return new ArrayList<>(getNamedProviders(patterns).keySet());
|
||||
|
||||
public final static class Component<T> {
|
||||
|
||||
public final String selector;
|
||||
public final ServiceLoader.Provider<? extends T> provider;
|
||||
public final Maturity maturity;
|
||||
|
||||
public Component(String selector, ServiceLoader.Provider<? extends T> provider, Maturity maturity) {
|
||||
this.selector = selector;
|
||||
this.provider = provider;
|
||||
this.maturity = maturity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Component{" +
|
||||
selector + " (" + maturity + ")";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Map<String,Maturity> getAllSelectors(String... patterns) {
|
||||
LinkedHashMap<String, Maturity> map = new LinkedHashMap<>();
|
||||
for (Component<? extends T> namedProvider : getNamedProviders(patterns)) {
|
||||
map.put(namedProvider.selector,namedProvider.maturity);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user