Merge pull request #12948 from rjernst/module_culling3
Simplify custom repository type setup
This commit is contained in:
commit
7db253bbce
|
@ -131,13 +131,16 @@ public abstract class ExtensionPoint {
|
||||||
* the settings object.
|
* the settings object.
|
||||||
*
|
*
|
||||||
* @param binder the binder to use
|
* @param binder the binder to use
|
||||||
* @param settings the settings to look up the key to find the implemetation to bind
|
* @param settings the settings to look up the key to find the implementation to bind
|
||||||
* @param settingsKey the key to use with the settings
|
* @param settingsKey the key to use with the settings
|
||||||
* @param defaultValue the default value if they settings doesn't contain the key
|
* @param defaultValue the default value if the settings do not contain the key, or null if there is no default
|
||||||
* @return the actual bound type key
|
* @return the actual bound type key
|
||||||
*/
|
*/
|
||||||
public String bindType(Binder binder, Settings settings, String settingsKey, String defaultValue) {
|
public String bindType(Binder binder, Settings settings, String settingsKey, String defaultValue) {
|
||||||
final String type = settings.get(settingsKey, defaultValue);
|
final String type = settings.get(settingsKey, defaultValue);
|
||||||
|
if (type == null) {
|
||||||
|
throw new IllegalArgumentException("Missing setting [" + settingsKey + "]");
|
||||||
|
}
|
||||||
final Class<? extends T> instance = getExtension(type);
|
final Class<? extends T> instance = getExtension(type);
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
throw new IllegalArgumentException("Unknown [" + this.name + "] type [" + type + "]");
|
throw new IllegalArgumentException("Unknown [" + this.name + "] type [" + type + "]");
|
||||||
|
|
|
@ -19,44 +19,33 @@
|
||||||
|
|
||||||
package org.elasticsearch.repositories;
|
package org.elasticsearch.repositories;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import org.elasticsearch.action.admin.cluster.snapshots.status.TransportNodesSnapshotsStatus;
|
import org.elasticsearch.action.admin.cluster.snapshots.status.TransportNodesSnapshotsStatus;
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
import org.elasticsearch.common.inject.AbstractModule;
|
||||||
import org.elasticsearch.common.inject.Module;
|
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
||||||
|
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
||||||
import org.elasticsearch.repositories.fs.FsRepository;
|
import org.elasticsearch.repositories.fs.FsRepository;
|
||||||
import org.elasticsearch.repositories.fs.FsRepositoryModule;
|
|
||||||
import org.elasticsearch.repositories.uri.URLRepository;
|
import org.elasticsearch.repositories.uri.URLRepository;
|
||||||
import org.elasticsearch.repositories.uri.URLRepositoryModule;
|
|
||||||
import org.elasticsearch.snapshots.RestoreService;
|
import org.elasticsearch.snapshots.RestoreService;
|
||||||
import org.elasticsearch.snapshots.SnapshotsService;
|
|
||||||
import org.elasticsearch.snapshots.SnapshotShardsService;
|
import org.elasticsearch.snapshots.SnapshotShardsService;
|
||||||
|
import org.elasticsearch.snapshots.SnapshotsService;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module responsible for registering other repositories.
|
* Sets up classes for Snapshot/Restore.
|
||||||
* <p/>
|
*
|
||||||
* Repositories implemented as plugins should implement {@code onModule(RepositoriesModule module)} method, in which
|
* Plugins can add custom repository types by calling {@link #registerRepository(String, Class, Class)}.
|
||||||
* they should register repository using {@link #registerRepository(String, Class)} method.
|
|
||||||
*/
|
*/
|
||||||
public class RepositoriesModule extends AbstractModule {
|
public class RepositoriesModule extends AbstractModule {
|
||||||
|
|
||||||
private Map<String, Class<? extends Module>> repositoryTypes = Maps.newHashMap();
|
private final RepositoryTypesRegistry repositoryTypes = new RepositoryTypesRegistry();
|
||||||
|
|
||||||
public RepositoriesModule() {
|
public RepositoriesModule() {
|
||||||
registerRepository(FsRepository.TYPE, FsRepositoryModule.class);
|
registerRepository(FsRepository.TYPE, FsRepository.class, BlobStoreIndexShardRepository.class);
|
||||||
registerRepository(URLRepository.TYPE, URLRepositoryModule.class);
|
registerRepository(URLRepository.TYPE, URLRepository.class, BlobStoreIndexShardRepository.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Registers a custom repository type to the given {@link Repository} and {@link IndexShardRepository}. */
|
||||||
* Registers a custom repository type name against a module.
|
public void registerRepository(String type, Class<? extends Repository> repositoryType, Class<? extends IndexShardRepository> shardRepositoryType) {
|
||||||
*
|
repositoryTypes.registerRepository(type, repositoryType, shardRepositoryType);
|
||||||
* @param type The type
|
|
||||||
* @param module The module
|
|
||||||
*/
|
|
||||||
public void registerRepository(String type, Class<? extends Module> module) {
|
|
||||||
repositoryTypes.put(type, module);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -66,6 +55,6 @@ public class RepositoriesModule extends AbstractModule {
|
||||||
bind(SnapshotShardsService.class).asEagerSingleton();
|
bind(SnapshotShardsService.class).asEagerSingleton();
|
||||||
bind(TransportNodesSnapshotsStatus.class).asEagerSingleton();
|
bind(TransportNodesSnapshotsStatus.class).asEagerSingleton();
|
||||||
bind(RestoreService.class).asEagerSingleton();
|
bind(RestoreService.class).asEagerSingleton();
|
||||||
bind(RepositoryTypesRegistry.class).toInstance(new RepositoryTypesRegistry(ImmutableMap.copyOf(repositoryTypes)));
|
bind(RepositoryTypesRegistry.class).toInstance(repositoryTypes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
package org.elasticsearch.repositories;
|
package org.elasticsearch.repositories;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
import org.elasticsearch.common.inject.AbstractModule;
|
||||||
import org.elasticsearch.common.inject.Module;
|
import org.elasticsearch.common.inject.Module;
|
||||||
import org.elasticsearch.common.inject.Modules;
|
import org.elasticsearch.common.inject.Modules;
|
||||||
|
@ -29,12 +28,10 @@ import org.elasticsearch.common.settings.Settings;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import static org.elasticsearch.common.Strings.toCamelCase;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This module spawns specific repository module
|
* Binds repository classes for the specific repository type.
|
||||||
*/
|
*/
|
||||||
public class RepositoryModule extends AbstractModule implements SpawnModules {
|
public class RepositoryModule extends AbstractModule {
|
||||||
|
|
||||||
private RepositoryName repositoryName;
|
private RepositoryName repositoryName;
|
||||||
|
|
||||||
|
@ -59,28 +56,12 @@ public class RepositoryModule extends AbstractModule implements SpawnModules {
|
||||||
this.typesRegistry = typesRegistry;
|
this.typesRegistry = typesRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns repository module.
|
|
||||||
* <p/>
|
|
||||||
* First repository type is looked up in typesRegistry and if it's not found there, this module tries to
|
|
||||||
* load repository by it's class name.
|
|
||||||
*
|
|
||||||
* @return repository module
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Iterable<? extends Module> spawnModules() {
|
|
||||||
Class<? extends Module> repoModuleClass = typesRegistry.type(repositoryName.type());
|
|
||||||
if (repoModuleClass == null) {
|
|
||||||
throw new IllegalArgumentException("Could not find repository type [" + repositoryName.getType() + "] for repository [" + repositoryName.getName() + "]");
|
|
||||||
}
|
|
||||||
return Collections.unmodifiableList(Arrays.asList(Modules.createModule(repoModuleClass, globalSettings)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
|
typesRegistry.bindType(binder(), repositoryName.type());
|
||||||
bind(RepositorySettings.class).toInstance(new RepositorySettings(globalSettings, settings));
|
bind(RepositorySettings.class).toInstance(new RepositorySettings(globalSettings, settings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,31 +19,34 @@
|
||||||
|
|
||||||
package org.elasticsearch.repositories;
|
package org.elasticsearch.repositories;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import org.elasticsearch.common.inject.Binder;
|
||||||
import org.elasticsearch.common.inject.Module;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.util.ExtensionPoint;
|
||||||
|
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map of registered repository types and associated with these types modules
|
* A mapping from type name to implementations of {@link Repository} and {@link IndexShardRepository}.
|
||||||
*/
|
*/
|
||||||
public class RepositoryTypesRegistry {
|
public class RepositoryTypesRegistry {
|
||||||
private final ImmutableMap<String, Class<? extends Module>> repositoryTypes;
|
// invariant: repositories and shardRepositories have the same keyset
|
||||||
|
private final ExtensionPoint.TypeExtensionPoint<Repository> repositoryTypes =
|
||||||
|
new ExtensionPoint.TypeExtensionPoint<>("repository", Repository.class);
|
||||||
|
private final ExtensionPoint.TypeExtensionPoint<IndexShardRepository> shardRepositoryTypes =
|
||||||
|
new ExtensionPoint.TypeExtensionPoint<>("index_repository", IndexShardRepository.class);
|
||||||
|
|
||||||
/**
|
/** Adds a new repository type to the registry, bound to the given implementation classes. */
|
||||||
* Creates new repository with given map of types
|
public void registerRepository(String name, Class<? extends Repository> repositoryType, Class<? extends IndexShardRepository> shardRepositoryType) {
|
||||||
*
|
repositoryTypes.registerExtension(name, repositoryType);
|
||||||
* @param repositoryTypes
|
shardRepositoryTypes.registerExtension(name, shardRepositoryType);
|
||||||
*/
|
|
||||||
public RepositoryTypesRegistry(ImmutableMap<String, Class<? extends Module>> repositoryTypes) {
|
|
||||||
this.repositoryTypes = repositoryTypes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns repository module class for the given type
|
* Looks up the given type and binds the implementation into the given binder.
|
||||||
*
|
* Throws an {@link IllegalArgumentException} if the given type does not exist.
|
||||||
* @param type repository type
|
|
||||||
* @return repository module class or null if type is not found
|
|
||||||
*/
|
*/
|
||||||
public Class<? extends Module> type(String type) {
|
public void bindType(Binder binder, String type) {
|
||||||
return repositoryTypes.get(type);
|
Settings settings = Settings.builder().put("type", type).build();
|
||||||
|
repositoryTypes.bindType(binder, settings, "type", null);
|
||||||
|
shardRepositoryTypes.bindType(binder, settings, "type", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.repositories.fs;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
|
||||||
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
|
||||||
import org.elasticsearch.repositories.Repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* File system repository module
|
|
||||||
*/
|
|
||||||
public class FsRepositoryModule extends AbstractModule {
|
|
||||||
|
|
||||||
public FsRepositoryModule() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(Repository.class).to(FsRepository.class).asEagerSingleton();
|
|
||||||
bind(IndexShardRepository.class).to(BlobStoreIndexShardRepository.class).asEagerSingleton();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.repositories.uri;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
|
||||||
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
|
||||||
import org.elasticsearch.repositories.Repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URL repository module
|
|
||||||
*/
|
|
||||||
public class URLRepositoryModule extends AbstractModule {
|
|
||||||
|
|
||||||
public URLRepositoryModule() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(Repository.class).to(URLRepository.class).asEagerSingleton();
|
|
||||||
bind(IndexShardRepository.class).to(BlobStoreIndexShardRepository.class).asEagerSingleton();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -35,7 +35,6 @@ import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.repositories.RepositoriesService;
|
import org.elasticsearch.repositories.RepositoriesService;
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepository;
|
import org.elasticsearch.snapshots.mockstore.MockRepository;
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepositoryPlugin;
|
|
||||||
import org.elasticsearch.test.ESIntegTestCase;
|
import org.elasticsearch.test.ESIntegTestCase;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -61,7 +60,7 @@ public abstract class AbstractSnapshotIntegTestCase extends ESIntegTestCase {
|
||||||
// Rebalancing is causing some checks after restore to randomly fail
|
// Rebalancing is causing some checks after restore to randomly fail
|
||||||
// due to https://github.com/elastic/elasticsearch/issues/9421
|
// due to https://github.com/elastic/elasticsearch/issues/9421
|
||||||
.put(EnableAllocationDecider.CLUSTER_ROUTING_REBALANCE_ENABLE, EnableAllocationDecider.Rebalance.NONE)
|
.put(EnableAllocationDecider.CLUSTER_ROUTING_REBALANCE_ENABLE, EnableAllocationDecider.Rebalance.NONE)
|
||||||
.extendArray("plugin.types", MockRepositoryPlugin.class.getName()).build();
|
.extendArray("plugin.types", MockRepository.Plugin.class.getName()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getFailureCount(String repository) {
|
public static long getFailureCount(String repository) {
|
||||||
|
|
|
@ -24,7 +24,6 @@ import com.carrotsearch.hppc.IntSet;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
import org.elasticsearch.ElasticsearchParseException;
|
import org.elasticsearch.ElasticsearchParseException;
|
||||||
import org.elasticsearch.action.ListenableActionFuture;
|
import org.elasticsearch.action.ListenableActionFuture;
|
||||||
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
|
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
|
||||||
|
@ -41,8 +40,8 @@ import org.elasticsearch.cluster.AbstractDiffable;
|
||||||
import org.elasticsearch.cluster.ClusterService;
|
import org.elasticsearch.cluster.ClusterService;
|
||||||
import org.elasticsearch.cluster.ClusterState;
|
import org.elasticsearch.cluster.ClusterState;
|
||||||
import org.elasticsearch.cluster.ProcessedClusterStateUpdateTask;
|
import org.elasticsearch.cluster.ProcessedClusterStateUpdateTask;
|
||||||
import org.elasticsearch.cluster.metadata.MetaData.Custom;
|
|
||||||
import org.elasticsearch.cluster.metadata.MetaData;
|
import org.elasticsearch.cluster.metadata.MetaData;
|
||||||
|
import org.elasticsearch.cluster.metadata.MetaData.Custom;
|
||||||
import org.elasticsearch.cluster.metadata.MetaDataIndexStateService;
|
import org.elasticsearch.cluster.metadata.MetaDataIndexStateService;
|
||||||
import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider;
|
import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider;
|
||||||
import org.elasticsearch.common.Nullable;
|
import org.elasticsearch.common.Nullable;
|
||||||
|
@ -64,11 +63,9 @@ import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.RestResponse;
|
import org.elasticsearch.rest.RestResponse;
|
||||||
import org.elasticsearch.rest.action.admin.cluster.repositories.get.RestGetRepositoriesAction;
|
import org.elasticsearch.rest.action.admin.cluster.repositories.get.RestGetRepositoriesAction;
|
||||||
import org.elasticsearch.rest.action.admin.cluster.state.RestClusterStateAction;
|
import org.elasticsearch.rest.action.admin.cluster.state.RestClusterStateAction;
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepositoryModule;
|
import org.elasticsearch.snapshots.mockstore.MockRepository;
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepositoryPlugin;
|
|
||||||
import org.elasticsearch.test.InternalTestCluster;
|
import org.elasticsearch.test.InternalTestCluster;
|
||||||
import org.elasticsearch.test.rest.FakeRestRequest;
|
import org.elasticsearch.test.rest.FakeRestRequest;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -88,7 +85,15 @@ import static org.elasticsearch.test.ESIntegTestCase.Scope;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertBlocked;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertBlocked;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.allOf;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
import static org.hamcrest.Matchers.greaterThan;
|
||||||
|
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
||||||
|
import static org.hamcrest.Matchers.lessThan;
|
||||||
|
import static org.hamcrest.Matchers.not;
|
||||||
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
import static org.hamcrest.Matchers.nullValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -615,7 +620,7 @@ public class DedicatedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTest
|
||||||
@Test
|
@Test
|
||||||
public void registrationFailureTest() {
|
public void registrationFailureTest() {
|
||||||
logger.info("--> start first node");
|
logger.info("--> start first node");
|
||||||
internalCluster().startNode(settingsBuilder().put("plugin.types", MockRepositoryPlugin.class.getName()));
|
internalCluster().startNode(settingsBuilder().put("plugin.types", MockRepository.Plugin.class.getName()));
|
||||||
logger.info("--> start second node");
|
logger.info("--> start second node");
|
||||||
// Make sure the first node is elected as master
|
// Make sure the first node is elected as master
|
||||||
internalCluster().startNode(settingsBuilder().put("node.master", false));
|
internalCluster().startNode(settingsBuilder().put("node.master", false));
|
||||||
|
@ -634,7 +639,7 @@ public class DedicatedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTest
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testThatSensitiveRepositorySettingsAreNotExposed() throws Exception {
|
public void testThatSensitiveRepositorySettingsAreNotExposed() throws Exception {
|
||||||
Settings nodeSettings = settingsBuilder().put("plugin.types", MockRepositoryPlugin.class.getName()).build();
|
Settings nodeSettings = settingsBuilder().put("plugin.types", MockRepository.Plugin.class.getName()).build();
|
||||||
logger.info("--> start two nodes");
|
logger.info("--> start two nodes");
|
||||||
internalCluster().startNodesAsync(2, nodeSettings).get();
|
internalCluster().startNodesAsync(2, nodeSettings).get();
|
||||||
// Register mock repositories
|
// Register mock repositories
|
||||||
|
|
|
@ -32,15 +32,12 @@ import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.ByteSizeUnit;
|
import org.elasticsearch.common.unit.ByteSizeUnit;
|
||||||
import org.elasticsearch.repositories.RepositoryException;
|
import org.elasticsearch.repositories.RepositoryException;
|
||||||
import org.elasticsearch.repositories.RepositoryVerificationException;
|
import org.elasticsearch.repositories.RepositoryVerificationException;
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepositoryModule;
|
|
||||||
import org.elasticsearch.snapshots.mockstore.MockRepositoryPlugin;
|
|
||||||
import org.elasticsearch.test.ESIntegTestCase;
|
import org.elasticsearch.test.ESIntegTestCase;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
|
|
@ -19,10 +19,8 @@
|
||||||
|
|
||||||
package org.elasticsearch.snapshots.mockstore;
|
package org.elasticsearch.snapshots.mockstore;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
|
|
||||||
import org.elasticsearch.ElasticsearchException;
|
import org.elasticsearch.ElasticsearchException;
|
||||||
|
import org.elasticsearch.Version;
|
||||||
import org.elasticsearch.cluster.ClusterService;
|
import org.elasticsearch.cluster.ClusterService;
|
||||||
import org.elasticsearch.cluster.metadata.MetaData;
|
import org.elasticsearch.cluster.metadata.MetaData;
|
||||||
import org.elasticsearch.cluster.metadata.SnapshotId;
|
import org.elasticsearch.cluster.metadata.SnapshotId;
|
||||||
|
@ -30,11 +28,17 @@ import org.elasticsearch.common.blobstore.BlobContainer;
|
||||||
import org.elasticsearch.common.blobstore.BlobMetaData;
|
import org.elasticsearch.common.blobstore.BlobMetaData;
|
||||||
import org.elasticsearch.common.blobstore.BlobPath;
|
import org.elasticsearch.common.blobstore.BlobPath;
|
||||||
import org.elasticsearch.common.blobstore.BlobStore;
|
import org.elasticsearch.common.blobstore.BlobStore;
|
||||||
|
import org.elasticsearch.common.inject.AbstractModule;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
import org.elasticsearch.common.inject.Module;
|
||||||
import org.elasticsearch.common.io.PathUtils;
|
import org.elasticsearch.common.io.PathUtils;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.settings.SettingsFilter;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
||||||
|
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
||||||
|
import org.elasticsearch.plugins.AbstractPlugin;
|
||||||
|
import org.elasticsearch.repositories.RepositoriesModule;
|
||||||
import org.elasticsearch.repositories.RepositoryName;
|
import org.elasticsearch.repositories.RepositoryName;
|
||||||
import org.elasticsearch.repositories.RepositorySettings;
|
import org.elasticsearch.repositories.RepositorySettings;
|
||||||
import org.elasticsearch.repositories.fs.FsRepository;
|
import org.elasticsearch.repositories.fs.FsRepository;
|
||||||
|
@ -46,6 +50,10 @@ import java.io.UnsupportedEncodingException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
@ -54,10 +62,48 @@ import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public class MockRepository extends FsRepository {
|
public class MockRepository extends FsRepository {
|
||||||
|
|
||||||
|
public static class Plugin extends AbstractPlugin {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "mock-repository";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String description() {
|
||||||
|
return "Mock Repository";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onModule(RepositoriesModule repositoriesModule) {
|
||||||
|
repositoriesModule.registerRepository("mock", MockRepository.class, BlobStoreIndexShardRepository.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Class<? extends Module>> modules() {
|
||||||
|
Collection<Class<? extends Module>> modules = new ArrayList<>();
|
||||||
|
modules.add(SettingsFilteringModule.class);
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SettingsFilteringModule extends AbstractModule {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(SettingsFilteringService.class).asEagerSingleton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SettingsFilteringService {
|
||||||
|
@Inject
|
||||||
|
public SettingsFilteringService(SettingsFilter settingsFilter) {
|
||||||
|
settingsFilter.addFilter("secret.mock.password");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private final AtomicLong failureCounter = new AtomicLong();
|
private final AtomicLong failureCounter = new AtomicLong();
|
||||||
|
|
||||||
public long getFailureCount() {
|
public long getFailureCount() {
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.snapshots.mockstore;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
|
||||||
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
|
||||||
import org.elasticsearch.repositories.Repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public class MockRepositoryModule extends AbstractModule {
|
|
||||||
|
|
||||||
public MockRepositoryModule() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(Repository.class).to(MockRepository.class).asEagerSingleton();
|
|
||||||
bind(IndexShardRepository.class).to(BlobStoreIndexShardRepository.class).asEagerSingleton();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.snapshots.mockstore;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.common.inject.Inject;
|
|
||||||
import org.elasticsearch.common.inject.Module;
|
|
||||||
import org.elasticsearch.common.settings.SettingsFilter;
|
|
||||||
import org.elasticsearch.plugins.AbstractPlugin;
|
|
||||||
import org.elasticsearch.repositories.RepositoriesModule;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static com.google.common.collect.Lists.newArrayList;
|
|
||||||
|
|
||||||
public class MockRepositoryPlugin extends AbstractPlugin {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String name() {
|
|
||||||
return "mock-repository";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String description() {
|
|
||||||
return "Mock Repository";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onModule(RepositoriesModule repositoriesModule) {
|
|
||||||
repositoriesModule.registerRepository("mock", MockRepositoryModule.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<Class<? extends Module>> modules() {
|
|
||||||
Collection<Class<? extends Module>> modules = newArrayList();
|
|
||||||
modules.add(SettingsFilteringModule.class);
|
|
||||||
return modules;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class SettingsFilteringModule extends AbstractModule {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(SettingsFilteringService.class).asEagerSingleton();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class SettingsFilteringService {
|
|
||||||
@Inject
|
|
||||||
public SettingsFilteringService(SettingsFilter settingsFilter) {
|
|
||||||
settingsFilter.addFilter("secret.mock.password");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -26,10 +26,10 @@ import org.elasticsearch.common.inject.Module;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.discovery.DiscoveryModule;
|
import org.elasticsearch.discovery.DiscoveryModule;
|
||||||
import org.elasticsearch.discovery.ec2.Ec2Discovery;
|
import org.elasticsearch.discovery.ec2.Ec2Discovery;
|
||||||
|
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
||||||
import org.elasticsearch.plugins.AbstractPlugin;
|
import org.elasticsearch.plugins.AbstractPlugin;
|
||||||
import org.elasticsearch.repositories.RepositoriesModule;
|
import org.elasticsearch.repositories.RepositoriesModule;
|
||||||
import org.elasticsearch.repositories.s3.S3Repository;
|
import org.elasticsearch.repositories.s3.S3Repository;
|
||||||
import org.elasticsearch.repositories.s3.S3RepositoryModule;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -76,7 +76,7 @@ public class CloudAwsPlugin extends AbstractPlugin {
|
||||||
|
|
||||||
public void onModule(RepositoriesModule repositoriesModule) {
|
public void onModule(RepositoriesModule repositoriesModule) {
|
||||||
if (settings.getAsBoolean("cloud.enabled", true)) {
|
if (settings.getAsBoolean("cloud.enabled", true)) {
|
||||||
repositoriesModule.registerRepository(S3Repository.TYPE, S3RepositoryModule.class);
|
repositoriesModule.registerRepository(S3Repository.TYPE, S3Repository.class, BlobStoreIndexShardRepository.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.repositories.s3;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
|
||||||
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
|
||||||
import org.elasticsearch.repositories.Repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* S3 repository module
|
|
||||||
*/
|
|
||||||
public class S3RepositoryModule extends AbstractModule {
|
|
||||||
|
|
||||||
public S3RepositoryModule() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(Repository.class).to(S3Repository.class).asEagerSingleton();
|
|
||||||
bind(IndexShardRepository.class).to(BlobStoreIndexShardRepository.class).asEagerSingleton();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.elasticsearch.cloud.azure.management.AzureComputeSettingsFilter;
|
||||||
import org.elasticsearch.cloud.azure.storage.AzureStorageService;
|
import org.elasticsearch.cloud.azure.storage.AzureStorageService;
|
||||||
import org.elasticsearch.cloud.azure.storage.AzureStorageService.Storage;
|
import org.elasticsearch.cloud.azure.storage.AzureStorageService.Storage;
|
||||||
import org.elasticsearch.cloud.azure.storage.AzureStorageServiceImpl;
|
import org.elasticsearch.cloud.azure.storage.AzureStorageServiceImpl;
|
||||||
|
import org.elasticsearch.cloud.azure.storage.AzureStorageSettingsFilter;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
import org.elasticsearch.common.inject.AbstractModule;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
@ -73,6 +74,7 @@ public class AzureModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
logger.debug("starting azure services");
|
logger.debug("starting azure services");
|
||||||
|
bind(AzureStorageSettingsFilter.class).asEagerSingleton();
|
||||||
bind(AzureComputeSettingsFilter.class).asEagerSingleton();
|
bind(AzureComputeSettingsFilter.class).asEagerSingleton();
|
||||||
|
|
||||||
// If we have set discovery to azure, let's start the azure compute service
|
// If we have set discovery to azure, let's start the azure compute service
|
||||||
|
|
|
@ -26,13 +26,13 @@ import org.elasticsearch.common.logging.Loggers;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.discovery.DiscoveryModule;
|
import org.elasticsearch.discovery.DiscoveryModule;
|
||||||
import org.elasticsearch.discovery.azure.AzureDiscovery;
|
import org.elasticsearch.discovery.azure.AzureDiscovery;
|
||||||
|
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
||||||
import org.elasticsearch.index.store.IndexStoreModule;
|
import org.elasticsearch.index.store.IndexStoreModule;
|
||||||
import org.elasticsearch.index.store.smbmmapfs.SmbMmapFsIndexStore;
|
import org.elasticsearch.index.store.smbmmapfs.SmbMmapFsIndexStore;
|
||||||
import org.elasticsearch.index.store.smbsimplefs.SmbSimpleFsIndexStore;
|
import org.elasticsearch.index.store.smbsimplefs.SmbSimpleFsIndexStore;
|
||||||
import org.elasticsearch.plugins.AbstractPlugin;
|
import org.elasticsearch.plugins.AbstractPlugin;
|
||||||
import org.elasticsearch.repositories.RepositoriesModule;
|
import org.elasticsearch.repositories.RepositoriesModule;
|
||||||
import org.elasticsearch.repositories.azure.AzureRepository;
|
import org.elasticsearch.repositories.azure.AzureRepository;
|
||||||
import org.elasticsearch.repositories.azure.AzureRepositoryModule;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -71,11 +71,9 @@ public class CloudAzurePlugin extends AbstractPlugin {
|
||||||
return modules;
|
return modules;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void onModule(RepositoriesModule module) {
|
||||||
public void processModule(Module module) {
|
if (isSnapshotReady(settings, logger)) {
|
||||||
if (isSnapshotReady(settings, logger)
|
module.registerRepository(AzureRepository.TYPE, AzureRepository.class, BlobStoreIndexShardRepository.class);
|
||||||
&& module instanceof RepositoriesModule) {
|
|
||||||
((RepositoriesModule)module).registerRepository(AzureRepository.TYPE, AzureRepositoryModule.class);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.repositories.azure;
|
|
||||||
|
|
||||||
import org.elasticsearch.cloud.azure.AzureModule;
|
|
||||||
import org.elasticsearch.cloud.azure.storage.AzureStorageSettingsFilter;
|
|
||||||
import org.elasticsearch.common.inject.AbstractModule;
|
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
|
||||||
import org.elasticsearch.common.logging.Loggers;
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
|
||||||
import org.elasticsearch.index.snapshots.IndexShardRepository;
|
|
||||||
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
|
|
||||||
import org.elasticsearch.repositories.Repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Azure repository module
|
|
||||||
*/
|
|
||||||
public class AzureRepositoryModule extends AbstractModule {
|
|
||||||
|
|
||||||
protected final ESLogger logger;
|
|
||||||
private Settings settings;
|
|
||||||
|
|
||||||
public AzureRepositoryModule(Settings settings) {
|
|
||||||
super();
|
|
||||||
this.logger = Loggers.getLogger(getClass(), settings);
|
|
||||||
this.settings = settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(AzureStorageSettingsFilter.class).asEagerSingleton();
|
|
||||||
if (AzureModule.isSnapshotReady(settings, logger)) {
|
|
||||||
bind(Repository.class).to(AzureRepository.class).asEagerSingleton();
|
|
||||||
bind(IndexShardRepository.class).to(BlobStoreIndexShardRepository.class).asEagerSingleton();
|
|
||||||
} else {
|
|
||||||
logger.debug("disabling azure snapshot and restore features");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue