|
@@ -6,13 +6,17 @@
|
|
|
|
|
|
package org.elasticsearch.xpack.autoscaling;
|
|
|
|
|
|
+import org.apache.logging.log4j.LogManager;
|
|
|
+import org.apache.logging.log4j.Logger;
|
|
|
import org.elasticsearch.Build;
|
|
|
import org.elasticsearch.action.ActionRequest;
|
|
|
import org.elasticsearch.action.ActionResponse;
|
|
|
+import org.elasticsearch.client.Client;
|
|
|
import org.elasticsearch.cluster.NamedDiff;
|
|
|
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
|
|
|
import org.elasticsearch.cluster.metadata.Metadata;
|
|
|
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
|
|
+import org.elasticsearch.cluster.service.ClusterService;
|
|
|
import org.elasticsearch.common.ParseField;
|
|
|
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
|
|
|
import org.elasticsearch.common.settings.ClusterSettings;
|
|
@@ -21,11 +25,18 @@ import org.elasticsearch.common.settings.Setting;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.settings.SettingsFilter;
|
|
|
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
|
|
|
+import org.elasticsearch.env.Environment;
|
|
|
+import org.elasticsearch.env.NodeEnvironment;
|
|
|
import org.elasticsearch.license.XPackLicenseState;
|
|
|
import org.elasticsearch.plugins.ActionPlugin;
|
|
|
+import org.elasticsearch.plugins.ExtensiblePlugin;
|
|
|
import org.elasticsearch.plugins.Plugin;
|
|
|
+import org.elasticsearch.repositories.RepositoriesService;
|
|
|
import org.elasticsearch.rest.RestController;
|
|
|
import org.elasticsearch.rest.RestHandler;
|
|
|
+import org.elasticsearch.script.ScriptService;
|
|
|
+import org.elasticsearch.threadpool.ThreadPool;
|
|
|
+import org.elasticsearch.watcher.ResourceWatcherService;
|
|
|
import org.elasticsearch.xpack.autoscaling.action.DeleteAutoscalingPolicyAction;
|
|
|
import org.elasticsearch.xpack.autoscaling.action.GetAutoscalingDecisionAction;
|
|
|
import org.elasticsearch.xpack.autoscaling.action.GetAutoscalingPolicyAction;
|
|
@@ -34,22 +45,29 @@ import org.elasticsearch.xpack.autoscaling.action.TransportDeleteAutoscalingPoli
|
|
|
import org.elasticsearch.xpack.autoscaling.action.TransportGetAutoscalingDecisionAction;
|
|
|
import org.elasticsearch.xpack.autoscaling.action.TransportGetAutoscalingPolicyAction;
|
|
|
import org.elasticsearch.xpack.autoscaling.action.TransportPutAutoscalingPolicyAction;
|
|
|
-import org.elasticsearch.xpack.autoscaling.decision.AlwaysAutoscalingDecider;
|
|
|
-import org.elasticsearch.xpack.autoscaling.decision.AutoscalingDecider;
|
|
|
+import org.elasticsearch.xpack.autoscaling.decision.AlwaysAutoscalingDeciderConfiguration;
|
|
|
+import org.elasticsearch.xpack.autoscaling.decision.AlwaysAutoscalingDeciderService;
|
|
|
+import org.elasticsearch.xpack.autoscaling.decision.AutoscalingDeciderConfiguration;
|
|
|
+import org.elasticsearch.xpack.autoscaling.decision.AutoscalingDeciderService;
|
|
|
+import org.elasticsearch.xpack.autoscaling.decision.AutoscalingDecisionService;
|
|
|
import org.elasticsearch.xpack.autoscaling.rest.RestDeleteAutoscalingPolicyHandler;
|
|
|
import org.elasticsearch.xpack.autoscaling.rest.RestGetAutoscalingDecisionHandler;
|
|
|
import org.elasticsearch.xpack.autoscaling.rest.RestGetAutoscalingPolicyHandler;
|
|
|
import org.elasticsearch.xpack.autoscaling.rest.RestPutAutoscalingPolicyHandler;
|
|
|
import org.elasticsearch.xpack.core.XPackPlugin;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
import java.util.function.Supplier;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* Container class for autoscaling functionality.
|
|
|
*/
|
|
|
-public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
-
|
|
|
+public class Autoscaling extends Plugin implements ActionPlugin, ExtensiblePlugin, AutoscalingExtension {
|
|
|
+ private static final Logger logger = LogManager.getLogger(AutoscalingExtension.class);
|
|
|
private static final Boolean AUTOSCALING_FEATURE_FLAG_REGISTERED;
|
|
|
|
|
|
static {
|
|
@@ -78,8 +96,11 @@ public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
|
|
|
private final boolean enabled;
|
|
|
|
|
|
+ private final List<AutoscalingExtension> autoscalingExtensions;
|
|
|
+
|
|
|
public Autoscaling(final Settings settings) {
|
|
|
this.enabled = AUTOSCALING_ENABLED_SETTING.get(settings);
|
|
|
+ this.autoscalingExtensions = new ArrayList<>(List.of(this));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -100,6 +121,23 @@ public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
return Build.CURRENT.isSnapshot();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Collection<Object> createComponents(
|
|
|
+ Client client,
|
|
|
+ ClusterService clusterService,
|
|
|
+ ThreadPool threadPool,
|
|
|
+ ResourceWatcherService resourceWatcherService,
|
|
|
+ ScriptService scriptService,
|
|
|
+ NamedXContentRegistry xContentRegistry,
|
|
|
+ Environment environment,
|
|
|
+ NodeEnvironment nodeEnvironment,
|
|
|
+ NamedWriteableRegistry namedWriteableRegistry,
|
|
|
+ IndexNameExpressionResolver indexNameExpressionResolver,
|
|
|
+ Supplier<RepositoriesService> repositoriesServiceSupplier
|
|
|
+ ) {
|
|
|
+ return List.of(new AutoscalingDecisionService.Holder(this));
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<ActionHandler<? extends ActionRequest, ? extends ActionResponse>> getActions() {
|
|
|
if (enabled) {
|
|
@@ -141,7 +179,11 @@ public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
return List.of(
|
|
|
new NamedWriteableRegistry.Entry(Metadata.Custom.class, AutoscalingMetadata.NAME, AutoscalingMetadata::new),
|
|
|
new NamedWriteableRegistry.Entry(NamedDiff.class, AutoscalingMetadata.NAME, AutoscalingMetadata.AutoscalingMetadataDiff::new),
|
|
|
- new NamedWriteableRegistry.Entry(AutoscalingDecider.class, AlwaysAutoscalingDecider.NAME, AlwaysAutoscalingDecider::new)
|
|
|
+ new NamedWriteableRegistry.Entry(
|
|
|
+ AutoscalingDeciderConfiguration.class,
|
|
|
+ AlwaysAutoscalingDeciderConfiguration.NAME,
|
|
|
+ AlwaysAutoscalingDeciderConfiguration::new
|
|
|
+ )
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -150,9 +192,9 @@ public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
return List.of(
|
|
|
new NamedXContentRegistry.Entry(Metadata.Custom.class, new ParseField(AutoscalingMetadata.NAME), AutoscalingMetadata::parse),
|
|
|
new NamedXContentRegistry.Entry(
|
|
|
- AutoscalingDecider.class,
|
|
|
- new ParseField(AlwaysAutoscalingDecider.NAME),
|
|
|
- AlwaysAutoscalingDecider::parse
|
|
|
+ AutoscalingDeciderConfiguration.class,
|
|
|
+ new ParseField(AlwaysAutoscalingDeciderConfiguration.NAME),
|
|
|
+ AlwaysAutoscalingDeciderConfiguration::parse
|
|
|
)
|
|
|
);
|
|
|
}
|
|
@@ -161,4 +203,17 @@ public class Autoscaling extends Plugin implements ActionPlugin {
|
|
|
return XPackPlugin.getSharedLicenseState();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void loadExtensions(ExtensionLoader loader) {
|
|
|
+ loader.loadExtensions(AutoscalingExtension.class).forEach(autoscalingExtensions::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Collection<AutoscalingDeciderService<? extends AutoscalingDeciderConfiguration>> deciders() {
|
|
|
+ return List.of(new AlwaysAutoscalingDeciderService());
|
|
|
+ }
|
|
|
+
|
|
|
+ public Set<AutoscalingDeciderService<? extends AutoscalingDeciderConfiguration>> createDeciderServices() {
|
|
|
+ return autoscalingExtensions.stream().flatMap(p -> p.deciders().stream()).collect(Collectors.toSet());
|
|
|
+ }
|
|
|
}
|