diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java index 3f456faef..08dfb5760 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java @@ -39,7 +39,7 @@ import java.util.Optional; */ public interface ActivityType { - SimpleServiceLoader FINDER = new SimpleServiceLoader<>(ActivityType.class); + SimpleServiceLoader FINDER = new SimpleServiceLoader(ActivityType.class); /** * Create an instance of an activity from the activity type. diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java index 782f61bee..582fec6d6 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java @@ -8,7 +8,7 @@ import io.nosqlbench.nb.api.spi.SimpleServiceLoader; public class StandardActivityType> extends SimpleActivity implements ActivityType { - public static SimpleServiceLoader FINDER = new SimpleServiceLoader(DriverAdapter.class); + public static SimpleServiceLoader FINDER = new SimpleServiceLoader<>(DriverAdapter.class); private final DriverAdapter adapter; public StandardActivityType(DriverAdapter adapter, ActivityDef activityDef) { 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 new file mode 100644 index 000000000..032aea1ec --- /dev/null +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ActivityTypeLoader.java @@ -0,0 +1,83 @@ +package io.nosqlbench.engine.core.lifecycle; + +import io.nosqlbench.engine.api.activityapi.core.Activity; +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.api.config.standard.*; +import io.nosqlbench.nb.api.errors.BasicError; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class ActivityTypeLoader { + private static final Logger logger = LogManager.getLogger(ActivityTypeLoader.class); + + public static Optional> load(ActivityDef activityDef) { + + String activityTypeName = activityDef.getParams().getOptionalString("driver", "type").orElse(null); + + List knownTypes = ActivityType.FINDER.getAllSelectors(); + + // Infer the type from either alias or yaml if possible (exactly one matches) + if (activityTypeName == null) { + List matching = knownTypes.stream().filter( + n -> + activityDef.getParams().getOptionalString("alias").orElse("").contains(n) + || activityDef.getParams().getOptionalString("yaml", "workload").orElse("").contains(n) + ).collect(Collectors.toList()); + if (matching.size() == 1) { + activityTypeName = matching.get(0); + logger.info("param 'type' was inferred as '" + activityTypeName + "' since it was seen in yaml or alias parameter."); + } + } + + if (activityTypeName == null) { + String errmsg = "You must provide a driver= parameter. Valid examples are:\n" + + knownTypes.stream().map(t -> " driver=" + t + "\n").collect(Collectors.joining()); + throw new BasicError(errmsg); + } + + String diagName = activityTypeName; + + + Optional ato = ActivityType.FINDER.getOptionally(activityTypeName); + if (ato.isPresent()) { + return Optional.of((ActivityType) ato.get()); + } + + Optional oda = StandardActivityType.FINDER.getOptionally(activityTypeName); + + if (oda.isPresent()) { + DriverAdapter driverAdapter = oda.get(); + + activityDef.getParams().remove("driver"); + if (driverAdapter instanceof NBConfigurable) { + NBConfigModel cfgModel = ((NBConfigurable) driverAdapter).getConfigModel(); + cfgModel = cfgModel.add(ACTIVITY_CFG_MODEL); + NBConfiguration cfg = cfgModel.apply(activityDef.getParams()); + ((NBConfigurable) driverAdapter).applyConfig(cfg); + } + ActivityType activityType = new StandardActivityType<>(driverAdapter, activityDef); + return Optional.of(activityType); + + } else { + throw new RuntimeException("Found neither ActivityType named '" + activityTypeName + "' nor DriverAdapter named '" + activityTypeName + "'."); + } + + } + + private static final NBConfigModel ACTIVITY_CFG_MODEL = ConfigModel.of(Activity.class) + .add(Param.optional("threads").setRegex("\\d+|\\d+x|auto")) + .add(Param.optional(List.of("workload", "yaml"))) + .add(Param.optional("cycles")) + .add(Param.optional("alias")) + .add(Param.optional(List.of("cyclerate", "rate"))) + .add(Param.optional("tags")) + .asReadOnly(); + +} 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 0254036fc..22e14c301 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 @@ -19,16 +19,13 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType; import io.nosqlbench.engine.api.activityimpl.ActivityDef; import io.nosqlbench.engine.api.activityimpl.ParameterMap; import io.nosqlbench.engine.api.activityimpl.ProgressAndStateMeter; -import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType; import io.nosqlbench.engine.api.metrics.ActivityMetrics; import io.nosqlbench.engine.core.annotation.Annotators; -import io.nosqlbench.nb.api.annotations.Layer; import io.nosqlbench.nb.api.annotations.Annotation; -import io.nosqlbench.nb.api.config.standard.*; +import io.nosqlbench.nb.api.annotations.Layer; import io.nosqlbench.nb.api.errors.BasicError; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.security.InvalidParameterException; import java.util.*; @@ -282,58 +279,17 @@ public class ScenarioController { if (executor == null && createIfMissing) { - String activityTypeName = activityDef.getParams().getOptionalString("driver", "type").orElse(null); + ActivityType activityType = ActivityTypeLoader.load(activityDef).orElseThrow( + () -> new RuntimeException("Could not load Driver for " + activityDef + "'") + ); - List knownTypes = ActivityType.FINDER.getAllSelectors(); - - // Infer the type from either alias or yaml if possible (exactly one matches) - if (activityTypeName == null) { - List matching = knownTypes.stream().filter( - n -> - activityDef.getParams().getOptionalString("alias").orElse("").contains(n) - || activityDef.getParams().getOptionalString("yaml", "workload").orElse("").contains(n) - ).collect(Collectors.toList()); - if (matching.size() == 1) { - activityTypeName = matching.get(0); - logger.info("param 'type' was inferred as '" + activityTypeName + "' since it was seen in yaml or alias parameter."); - } - } - - if (activityTypeName == null) { - String errmsg = "You must provide a driver= parameter. Valid examples are:\n" + - knownTypes.stream().map(t -> " driver=" + t + "\n").collect(Collectors.joining()); - throw new BasicError(errmsg); - } - -// ActivityType activityType = ActivityType.FINDER.getOrThrow(activityTypeName); - - ActivityType activityType = null; - - Optional ato = ActivityType.FINDER.getOptionally(activityTypeName); - if (ato.isPresent()) { - activityType = ato.get(); - } else { - Optional oda = StandardActivityType.FINDER.getOptionally(activityTypeName); - if (oda.isPresent()) { - DriverAdapter driverAdapter = oda.get(); - - activityDef.getParams().remove("driver"); - if (driverAdapter instanceof NBConfigurable) { - NBConfigModel cfgModel = ((NBConfigurable) driverAdapter).getConfigModel(); - cfgModel = cfgModel.add(ACTIVITY_CFG_MODEL); - NBConfiguration cfg = cfgModel.apply(activityDef.getParams()); - ((NBConfigurable) driverAdapter).applyConfig(cfg); - } - activityType = new StandardActivityType<>(driverAdapter, activityDef); - - } else { - throw new RuntimeException("Found neither ActivityType named '" + activityTypeName + "' nor DriverAdapter named '" + activityTypeName + "'."); - } - - } - - executor = new ActivityExecutor(activityType.getAssembledActivity(activityDef, getActivityMap()), - this.sessionId); + executor = new ActivityExecutor( + activityType.getAssembledActivity( + activityDef, + getActivityMap() + ), + this.sessionId + ); activityExecutors.put(activityDef.getAlias(), executor); } return executor; @@ -510,12 +466,4 @@ public class ScenarioController { return indicators; } - private static final NBConfigModel ACTIVITY_CFG_MODEL = ConfigModel.of(Activity.class) - .add(Param.optional("threads").setRegex("\\d+|\\d+x|auto")) - .add(Param.optional(List.of("workload","yaml"))) - .add(Param.optional("cycles")) - .add(Param.optional("alias")) - .add(Param.optional(List.of("cyclerate","rate"))) - .add(Param.optional("tags")) - .asReadOnly(); }