Add filtering support within Setting class

Now we have a nice Setting infra, we can define in Setting class if a setting should be filtered or not.
So when we register a setting, setting filtering would be automatically done.

Instead of writing:

```java
Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER);
settingsModule.registerSetting(AwsEc2Service.KEY_SETTING, false);
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.KEY_SETTING.getKey());
```

We could simply write:

```java
Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER, true);
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.KEY_SETTING.getKey());
```

It also removes `settingsModule.registerSettingsFilterIfMissing` method.

The plan would be to remove as well `settingsModule.registerSettingsFilter` method but it still used with wildcards. For example in Azure Repository plugin:

```java
module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.account");
module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.key");
```

Closes #16598.
This commit is contained in:
David Pilato 2016-01-29 18:05:18 +01:00
parent b5aee2075f
commit aabb124209
15 changed files with 141 additions and 84 deletions

View File

@ -71,22 +71,50 @@ public class Setting<T> extends ToXContentToBytes {
private final Function<String, T> parser; private final Function<String, T> parser;
private final boolean dynamic; private final boolean dynamic;
private final Scope scope; private final Scope scope;
private final boolean filtered;
/**
* Creates a new Setting instance, unfiltered
* @param key the settings key for this setting.
* @param defaultValue a default value function that returns the default values string representation.
* @param parser a parser that parses the string rep into a complex datatype.
* @param dynamic true if this setting can be dynamically updateable
* @param scope the scope of this setting
*/
public Setting(String key, Function<Settings, String> defaultValue, Function<String, T> parser, boolean dynamic, Scope scope) {
this(key, defaultValue, parser, dynamic, scope, false);
}
/** /**
* Creates a new Setting instance * Creates a new Setting instance
* @param key the settings key for this setting. * @param key the settings key for this setting.
* @param defaultValue a default value function that returns the default values string representation. * @param defaultValue a default value function that returns the default values string representation.
* @param parser a parser that parses the string rep into a complex datatype. * @param parser a parser that parses the string rep into a complex datatype.
* @param dynamic true iff this setting can be dynamically updateable * @param dynamic true if this setting can be dynamically updateable
* @param scope the scope of this setting * @param scope the scope of this setting
* @param filtered true if this setting should be filtered
*/ */
public Setting(String key, Function<Settings, String> defaultValue, Function<String, T> parser, boolean dynamic, Scope scope) { public Setting(String key, Function<Settings, String> defaultValue, Function<String, T> parser, boolean dynamic, Scope scope,
boolean filtered) {
assert parser.apply(defaultValue.apply(Settings.EMPTY)) != null || this.isGroupSetting(): "parser returned null"; assert parser.apply(defaultValue.apply(Settings.EMPTY)) != null || this.isGroupSetting(): "parser returned null";
this.key = key; this.key = key;
this.defaultValue = defaultValue; this.defaultValue = defaultValue;
this.parser = parser; this.parser = parser;
this.dynamic = dynamic; this.dynamic = dynamic;
this.scope = scope; this.scope = scope;
this.filtered = filtered;
}
/**
* Creates a new Setting instance, unfiltered
* @param key the settings key for this setting.
* @param fallBackSetting a setting to fall back to if the current setting is not set.
* @param parser a parser that parses the string rep into a complex datatype.
* @param dynamic true iff this setting can be dynamically updateable
* @param scope the scope of this setting
*/
public Setting(String key, Setting<T> fallBackSetting, Function<String, T> parser, boolean dynamic, Scope scope) {
this(key, fallBackSetting, parser, dynamic, scope, false);
} }
/** /**
@ -96,9 +124,10 @@ public class Setting<T> extends ToXContentToBytes {
* @param parser a parser that parses the string rep into a complex datatype. * @param parser a parser that parses the string rep into a complex datatype.
* @param dynamic true iff this setting can be dynamically updateable * @param dynamic true iff this setting can be dynamically updateable
* @param scope the scope of this setting * @param scope the scope of this setting
* @param filtered true if this setting should be filtered
*/ */
public Setting(String key, Setting<T> fallBackSetting, Function<String, T> parser, boolean dynamic, Scope scope) { public Setting(String key, Setting<T> fallBackSetting, Function<String, T> parser, boolean dynamic, Scope scope, boolean filtered) {
this(key, fallBackSetting::getRaw, parser, dynamic, scope); this(key, fallBackSetting::getRaw, parser, dynamic, scope, filtered);
} }
/** /**
@ -113,7 +142,7 @@ public class Setting<T> extends ToXContentToBytes {
} }
/** /**
* Returns <code>true</code> iff this setting is dynamically updateable, otherwise <code>false</code> * Returns <code>true</code> if this setting is dynamically updateable, otherwise <code>false</code>
*/ */
public final boolean isDynamic() { public final boolean isDynamic() {
return dynamic; return dynamic;
@ -126,6 +155,13 @@ public class Setting<T> extends ToXContentToBytes {
return scope; return scope;
} }
/**
* Returns <code>true</code> if this setting must be filtered, otherwise <code>false</code>
*/
public boolean isFiltered() {
return filtered;
}
/** /**
* Returns <code>true</code> iff this setting is a group setting. Group settings represent a set of settings * Returns <code>true</code> iff this setting is a group setting. Group settings represent a set of settings
* rather than a single value. The key, see {@link #getKey()}, in contrast to non-group settings is a prefix like <tt>cluster.store.</tt> * rather than a single value. The key, see {@link #getKey()}, in contrast to non-group settings is a prefix like <tt>cluster.store.</tt>
@ -331,7 +367,11 @@ public class Setting<T> extends ToXContentToBytes {
public Setting(String key, String defaultValue, Function<String, T> parser, boolean dynamic, Scope scope) { public Setting(String key, String defaultValue, Function<String, T> parser, boolean dynamic, Scope scope) {
this(key, (s) -> defaultValue, parser, dynamic, scope); this(key, defaultValue, parser, dynamic, scope, false);
}
public Setting(String key, String defaultValue, Function<String, T> parser, boolean dynamic, Scope scope, boolean filtered) {
this(key, (s) -> defaultValue, parser, dynamic, scope, filtered);
} }
public static Setting<Float> floatSetting(String key, float defaultValue, boolean dynamic, Scope scope) { public static Setting<Float> floatSetting(String key, float defaultValue, boolean dynamic, Scope scope) {
@ -357,11 +397,19 @@ public class Setting<T> extends ToXContentToBytes {
} }
public static Setting<Long> longSetting(String key, long defaultValue, long minValue, boolean dynamic, Scope scope) { public static Setting<Long> longSetting(String key, long defaultValue, long minValue, boolean dynamic, Scope scope) {
return new Setting<>(key, (s) -> Long.toString(defaultValue), (s) -> parseLong(s, minValue, key), dynamic, scope); return longSetting(key, defaultValue, minValue, dynamic, scope, false);
}
public static Setting<Long> longSetting(String key, long defaultValue, long minValue, boolean dynamic, Scope scope, boolean filtered) {
return new Setting<>(key, (s) -> Long.toString(defaultValue), (s) -> parseLong(s, minValue, key), dynamic, scope, filtered);
} }
public static Setting<String> simpleString(String key, boolean dynamic, Scope scope) { public static Setting<String> simpleString(String key, boolean dynamic, Scope scope) {
return new Setting<>(key, "", Function.identity(), dynamic, scope); return simpleString(key, dynamic, scope, false);
}
public static Setting<String> simpleString(String key, boolean dynamic, Scope scope, boolean filtered) {
return new Setting<>(key, s -> "", Function.identity(), dynamic, scope, filtered);
} }
public static int parseInt(String s, int minValue, String key) { public static int parseInt(String s, int minValue, String key) {
@ -392,7 +440,11 @@ public class Setting<T> extends ToXContentToBytes {
} }
public static Setting<Boolean> boolSetting(String key, boolean defaultValue, boolean dynamic, Scope scope) { public static Setting<Boolean> boolSetting(String key, boolean defaultValue, boolean dynamic, Scope scope) {
return new Setting<>(key, (s) -> Boolean.toString(defaultValue), Booleans::parseBooleanExact, dynamic, scope); return boolSetting(key, defaultValue, dynamic, scope, false);
}
public static Setting<Boolean> boolSetting(String key, boolean defaultValue, boolean dynamic, Scope scope, boolean filtered) {
return new Setting<>(key, (s) -> Boolean.toString(defaultValue), Booleans::parseBooleanExact, dynamic, scope, filtered);
} }
public static Setting<Boolean> boolSetting(String key, Setting<Boolean> fallbackSetting, boolean dynamic, Scope scope) { public static Setting<Boolean> boolSetting(String key, Setting<Boolean> fallbackSetting, boolean dynamic, Scope scope) {

View File

@ -71,6 +71,11 @@ public class SettingsModule extends AbstractModule {
* the setting during startup. * the setting during startup.
*/ */
public void registerSetting(Setting<?> setting) { public void registerSetting(Setting<?> setting) {
if (setting.isFiltered()) {
if (settingsFilterPattern.contains(setting.getKey()) == false) {
registerSettingsFilter(setting.getKey());
}
}
switch (setting.getScope()) { switch (setting.getScope()) {
case CLUSTER: case CLUSTER:
if (clusterSettings.containsKey(setting.getKey())) { if (clusterSettings.containsKey(setting.getKey())) {
@ -101,12 +106,6 @@ public class SettingsModule extends AbstractModule {
settingsFilterPattern.add(filter); settingsFilterPattern.add(filter);
} }
public void registerSettingsFilterIfMissing(String filter) {
if (settingsFilterPattern.contains(filter) == false) {
registerSettingsFilter(filter);
}
}
/** /**
* Check if a setting has already been registered * Check if a setting has already been registered
*/ */

View File

@ -50,6 +50,11 @@ public class SettingsFilteringIT extends ESIntegTestCase {
} }
public static class SettingsFilteringPlugin extends Plugin { public static class SettingsFilteringPlugin extends Plugin {
public static final Setting<Boolean> SOME_NODE_SETTING =
Setting.boolSetting("some.node.setting", false, false, Setting.Scope.CLUSTER, true);
public static final Setting<Boolean> SOME_OTHER_NODE_SETTING =
Setting.boolSetting("some.other.node.setting", false, false, Setting.Scope.CLUSTER);
/** /**
* The name of the plugin. * The name of the plugin.
*/ */
@ -72,10 +77,9 @@ public class SettingsFilteringIT extends ESIntegTestCase {
} }
public void onModule(SettingsModule module) { public void onModule(SettingsModule module) {
module.registerSetting(SOME_NODE_SETTING);
module.registerSetting(SOME_OTHER_NODE_SETTING);
module.registerSetting(Setting.groupSetting("index.filter_test.", false, Setting.Scope.INDEX)); module.registerSetting(Setting.groupSetting("index.filter_test.", false, Setting.Scope.INDEX));
module.registerSetting(Setting.boolSetting("some.node.setting", false, false, Setting.Scope.CLUSTER));
module.registerSetting(Setting.boolSetting("some.other.node.setting", false, false, Setting.Scope.CLUSTER));
module.registerSettingsFilter("some.node.setting");
module.registerSettingsFilter("index.filter_test.foo"); module.registerSettingsFilter("index.filter_test.foo");
module.registerSettingsFilter("index.filter_test.bar*"); module.registerSettingsFilter("index.filter_test.bar*");
} }
@ -104,8 +108,8 @@ public class SettingsFilteringIT extends ESIntegTestCase {
for(NodeInfo info : nodeInfos.getNodes()) { for(NodeInfo info : nodeInfos.getNodes()) {
Settings settings = info.getSettings(); Settings settings = info.getSettings();
assertNotNull(settings); assertNotNull(settings);
assertNull(settings.get("some.node.setting")); assertNull(settings.get(SettingsFilteringPlugin.SOME_NODE_SETTING.getKey()));
assertTrue(settings.getAsBoolean("some.other.node.setting", false)); assertTrue(settings.getAsBoolean(SettingsFilteringPlugin.SOME_OTHER_NODE_SETTING.getKey(), false));
assertEquals(settings.get("node.name"), info.getNode().getName()); assertEquals(settings.get("node.name"), info.getNode().getName());
} }
} }

View File

@ -132,11 +132,10 @@ public class SettingsModuleTests extends ModuleTestCase {
Settings settings = Settings.builder().put("foo.bar", "false").put("bar.foo", false).put("bar.baz", false).build(); Settings settings = Settings.builder().put("foo.bar", "false").put("bar.foo", false).put("bar.baz", false).build();
SettingsModule module = new SettingsModule(settings); SettingsModule module = new SettingsModule(settings);
module.registerSetting(Setting.boolSetting("foo.bar", true, false, Setting.Scope.CLUSTER)); module.registerSetting(Setting.boolSetting("foo.bar", true, false, Setting.Scope.CLUSTER));
module.registerSetting(Setting.boolSetting("bar.foo", true, false, Setting.Scope.CLUSTER)); module.registerSetting(Setting.boolSetting("bar.foo", true, false, Setting.Scope.CLUSTER, true));
module.registerSetting(Setting.boolSetting("bar.baz", true, false, Setting.Scope.CLUSTER)); module.registerSetting(Setting.boolSetting("bar.baz", true, false, Setting.Scope.CLUSTER));
module.registerSettingsFilter("foo.*"); module.registerSettingsFilter("foo.*");
module.registerSettingsFilterIfMissing("bar.foo");
try { try {
module.registerSettingsFilter("bar.foo"); module.registerSettingsFilter("bar.foo");
fail(); fail();

View File

@ -632,8 +632,8 @@ public class DedicatedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTest
client().admin().cluster().preparePutRepository("test-repo") client().admin().cluster().preparePutRepository("test-repo")
.setType("mock").setSettings(Settings.settingsBuilder() .setType("mock").setSettings(Settings.settingsBuilder()
.put("location", randomRepoPath()) .put("location", randomRepoPath())
.put("secret.mock.username", "notsecretusername") .put(MockRepository.Plugin.USERNAME_SETTING.getKey(), "notsecretusername")
.put("secret.mock.password", "verysecretpassword") .put(MockRepository.Plugin.PASSWORD_SETTING.getKey(), "verysecretpassword")
).get(); ).get();
RestGetRepositoriesAction getRepoAction = internalCluster().getInstance(RestGetRepositoriesAction.class); RestGetRepositoriesAction getRepoAction = internalCluster().getInstance(RestGetRepositoriesAction.class);

View File

@ -32,6 +32,7 @@ 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.inject.Module;
import org.elasticsearch.common.io.PathUtils; import org.elasticsearch.common.io.PathUtils;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsFilter; import org.elasticsearch.common.settings.SettingsFilter;
import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.settings.SettingsModule;
@ -63,6 +64,11 @@ public class MockRepository extends FsRepository {
public static class Plugin extends org.elasticsearch.plugins.Plugin { public static class Plugin extends org.elasticsearch.plugins.Plugin {
public static final Setting<String> USERNAME_SETTING =
Setting.simpleString("secret.mock.username", false, Setting.Scope.CLUSTER);
public static final Setting<String> PASSWORD_SETTING =
Setting.simpleString("secret.mock.password", false, Setting.Scope.CLUSTER, true);
@Override @Override
public String name() { public String name() {
return "mock-repository"; return "mock-repository";
@ -78,8 +84,8 @@ public class MockRepository extends FsRepository {
} }
public void onModule(SettingsModule module) { public void onModule(SettingsModule module) {
module.registerSettingsFilter("secret.mock.password"); module.registerSetting(USERNAME_SETTING);
module.registerSetting(PASSWORD_SETTING);
} }
} }

View File

@ -22,26 +22,35 @@ package org.elasticsearch.cloud.azure.management;
import com.microsoft.windowsazure.core.utils.KeyStoreType; import com.microsoft.windowsazure.core.utils.KeyStoreType;
import com.microsoft.windowsazure.management.compute.models.HostedServiceGetDetailedResponse; import com.microsoft.windowsazure.management.compute.models.HostedServiceGetDetailedResponse;
import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Setting.Scope;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.discovery.azure.AzureUnicastHostsProvider; import org.elasticsearch.discovery.azure.AzureUnicastHostsProvider;
public interface AzureComputeService { public interface AzureComputeService {
final class Management { final class Management {
public static final Setting<String> SUBSCRIPTION_ID_SETTING = Setting.simpleString("cloud.azure.management.subscription.id", false, Setting.Scope.CLUSTER); public static final Setting<String> SUBSCRIPTION_ID_SETTING =
public static final Setting<String> SERVICE_NAME_SETTING = Setting.simpleString("cloud.azure.management.cloud.service.name", false, Setting.Scope.CLUSTER); Setting.simpleString("cloud.azure.management.subscription.id", false, Scope.CLUSTER, true);
public static final Setting<String> SERVICE_NAME_SETTING =
Setting.simpleString("cloud.azure.management.cloud.service.name", false, Scope.CLUSTER);
// Keystore settings // Keystore settings
public static final Setting<String> KEYSTORE_PATH_SETTING = Setting.simpleString("cloud.azure.management.keystore.path", false, Setting.Scope.CLUSTER); public static final Setting<String> KEYSTORE_PATH_SETTING =
public static final Setting<String> KEYSTORE_PASSWORD_SETTING = Setting.simpleString("cloud.azure.management.keystore.password", false, Setting.Scope.CLUSTER); Setting.simpleString("cloud.azure.management.keystore.path", false, Scope.CLUSTER, true);
public static final Setting<KeyStoreType> KEYSTORE_TYPE_SETTING = new Setting<>("cloud.azure.management.keystore.type", KeyStoreType.pkcs12.name(), KeyStoreType::fromString, false, Setting.Scope.CLUSTER); public static final Setting<String> KEYSTORE_PASSWORD_SETTING =
Setting.simpleString("cloud.azure.management.keystore.password", false, Scope.CLUSTER, true);
public static final Setting<KeyStoreType> KEYSTORE_TYPE_SETTING =
new Setting<>("cloud.azure.management.keystore.type", KeyStoreType.pkcs12.name(), KeyStoreType::fromString, false,
Scope.CLUSTER, false);
} }
final class Discovery { final class Discovery {
public static final Setting<TimeValue> REFRESH_SETTING = Setting.positiveTimeSetting("discovery.azure.refresh_interval", TimeValue.timeValueSeconds(0), false, Setting.Scope.CLUSTER); public static final Setting<TimeValue> REFRESH_SETTING =
Setting.positiveTimeSetting("discovery.azure.refresh_interval", TimeValue.timeValueSeconds(0), false, Scope.CLUSTER);
public static final Setting<AzureUnicastHostsProvider.HostType> HOST_TYPE_SETTING = new Setting<>("discovery.azure.host.type", public static final Setting<AzureUnicastHostsProvider.HostType> HOST_TYPE_SETTING =
AzureUnicastHostsProvider.HostType.PRIVATE_IP.name(), AzureUnicastHostsProvider.HostType::fromString, false, Setting.Scope.CLUSTER); new Setting<>("discovery.azure.host.type", AzureUnicastHostsProvider.HostType.PRIVATE_IP.name(),
AzureUnicastHostsProvider.HostType::fromString, false, Scope.CLUSTER);
public static final String ENDPOINT_NAME = "discovery.azure.endpoint.name"; public static final String ENDPOINT_NAME = "discovery.azure.endpoint.name";
public static final String DEPLOYMENT_NAME = "discovery.azure.deployment.name"; public static final String DEPLOYMENT_NAME = "discovery.azure.deployment.name";

View File

@ -74,10 +74,5 @@ public class AzureDiscoveryPlugin extends Plugin {
settingsModule.registerSetting(AzureComputeService.Management.SUBSCRIPTION_ID_SETTING); settingsModule.registerSetting(AzureComputeService.Management.SUBSCRIPTION_ID_SETTING);
settingsModule.registerSetting(AzureComputeService.Management.SERVICE_NAME_SETTING); settingsModule.registerSetting(AzureComputeService.Management.SERVICE_NAME_SETTING);
settingsModule.registerSetting(AzureComputeService.Discovery.HOST_TYPE_SETTING); settingsModule.registerSetting(AzureComputeService.Discovery.HOST_TYPE_SETTING);
// Cloud management API settings we need to hide
settingsModule.registerSettingsFilter(AzureComputeService.Management.KEYSTORE_PATH_SETTING.getKey());
settingsModule.registerSettingsFilter(AzureComputeService.Management.KEYSTORE_PASSWORD_SETTING.getKey());
settingsModule.registerSettingsFilter(AzureComputeService.Management.KEYSTORE_TYPE_SETTING.getKey());
settingsModule.registerSettingsFilter(AzureComputeService.Management.SUBSCRIPTION_ID_SETTING.getKey());
} }
} }

View File

@ -40,11 +40,11 @@ public interface AwsEc2Service {
/** /**
* cloud.aws.access_key: AWS Access key. Shared with repository-s3 plugin * cloud.aws.access_key: AWS Access key. Shared with repository-s3 plugin
*/ */
Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER); Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.secret_key: AWS Secret key. Shared with repository-s3 plugin * cloud.aws.secret_key: AWS Secret key. Shared with repository-s3 plugin
*/ */
Setting<String> SECRET_SETTING = Setting.simpleString("cloud.aws.secret_key", false, Setting.Scope.CLUSTER); Setting<String> SECRET_SETTING = Setting.simpleString("cloud.aws.secret_key", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.protocol: Protocol for AWS API: http or https. Defaults to https. Shared with repository-s3 plugin * cloud.aws.protocol: Protocol for AWS API: http or https. Defaults to https. Shared with repository-s3 plugin
*/ */
@ -65,7 +65,7 @@ public interface AwsEc2Service {
/** /**
* cloud.aws.proxy.password: In case of proxy with auth, define the password. Shared with repository-s3 plugin * cloud.aws.proxy.password: In case of proxy with auth, define the password. Shared with repository-s3 plugin
*/ */
Setting<String> PROXY_PASSWORD_SETTING = Setting.simpleString("cloud.aws.proxy.password", false, Setting.Scope.CLUSTER); Setting<String> PROXY_PASSWORD_SETTING = Setting.simpleString("cloud.aws.proxy.password", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.signer: If you are using an old AWS API version, you can define a Signer. Shared with repository-s3 plugin * cloud.aws.signer: If you are using an old AWS API version, you can define a Signer. Shared with repository-s3 plugin
*/ */
@ -84,13 +84,13 @@ public interface AwsEc2Service {
* @see AwsEc2Service#KEY_SETTING * @see AwsEc2Service#KEY_SETTING
*/ */
Setting<String> KEY_SETTING = new Setting<>("cloud.aws.ec2.access_key", AwsEc2Service.KEY_SETTING, Function.identity(), false, Setting<String> KEY_SETTING = new Setting<>("cloud.aws.ec2.access_key", AwsEc2Service.KEY_SETTING, Function.identity(), false,
Setting.Scope.CLUSTER); Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.ec2.secret_key: AWS Secret key specific for EC2 API calls. Defaults to cloud.aws.secret_key. * cloud.aws.ec2.secret_key: AWS Secret key specific for EC2 API calls. Defaults to cloud.aws.secret_key.
* @see AwsEc2Service#SECRET_SETTING * @see AwsEc2Service#SECRET_SETTING
*/ */
Setting<String> SECRET_SETTING = new Setting<>("cloud.aws.ec2.secret_key", AwsEc2Service.SECRET_SETTING, Function.identity(), false, Setting<String> SECRET_SETTING = new Setting<>("cloud.aws.ec2.secret_key", AwsEc2Service.SECRET_SETTING, Function.identity(), false,
Setting.Scope.CLUSTER); Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.ec2.protocol: Protocol for AWS API specific for EC2 API calls: http or https. Defaults to cloud.aws.protocol. * cloud.aws.ec2.protocol: Protocol for AWS API specific for EC2 API calls: http or https. Defaults to cloud.aws.protocol.
* @see AwsEc2Service#PROTOCOL_SETTING * @see AwsEc2Service#PROTOCOL_SETTING
@ -122,7 +122,7 @@ public interface AwsEc2Service {
* @see AwsEc2Service#PROXY_PASSWORD_SETTING * @see AwsEc2Service#PROXY_PASSWORD_SETTING
*/ */
Setting<String> PROXY_PASSWORD_SETTING = new Setting<>("cloud.aws.ec2.proxy.password", AwsEc2Service.PROXY_PASSWORD_SETTING, Setting<String> PROXY_PASSWORD_SETTING = new Setting<>("cloud.aws.ec2.proxy.password", AwsEc2Service.PROXY_PASSWORD_SETTING,
Function.identity(), false, Setting.Scope.CLUSTER); Function.identity(), false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.ec2.signer: If you are using an old AWS API version, you can define a Signer. Specific for EC2 API calls. * cloud.aws.ec2.signer: If you are using an old AWS API version, you can define a Signer. Specific for EC2 API calls.
* Defaults to cloud.aws.signer. * Defaults to cloud.aws.signer.

View File

@ -134,14 +134,6 @@ public class Ec2DiscoveryPlugin extends Plugin {
settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.GROUPS_SETTING); settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.GROUPS_SETTING);
settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.AVAILABILITY_ZONES_SETTING); settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.AVAILABILITY_ZONES_SETTING);
settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.NODE_CACHE_TIME_SETTING); settingsModule.registerSetting(AwsEc2Service.DISCOVERY_EC2.NODE_CACHE_TIME_SETTING);
// Filter global settings
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.KEY_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.SECRET_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.PROXY_PASSWORD_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.CLOUD_EC2.KEY_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.CLOUD_EC2.SECRET_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsEc2Service.CLOUD_EC2.PROXY_PASSWORD_SETTING.getKey());
} }
/** /**

View File

@ -41,13 +41,20 @@ public interface AzureStorageService {
final class Storage { final class Storage {
public static final String PREFIX = "cloud.azure.storage."; public static final String PREFIX = "cloud.azure.storage.";
public static final Setting<TimeValue> TIMEOUT_SETTING = Setting.timeSetting("cloud.azure.storage.timeout", TimeValue.timeValueMinutes(5), false, Setting.Scope.CLUSTER); public static final Setting<TimeValue> TIMEOUT_SETTING =
public static final Setting<String> ACCOUNT_SETTING = Setting.simpleString("repositories.azure.account", false, Setting.Scope.CLUSTER); Setting.timeSetting("cloud.azure.storage.timeout", TimeValue.timeValueMinutes(5), false, Setting.Scope.CLUSTER);
public static final Setting<String> CONTAINER_SETTING = Setting.simpleString("repositories.azure.container", false, Setting.Scope.CLUSTER); public static final Setting<String> ACCOUNT_SETTING =
public static final Setting<String> BASE_PATH_SETTING = Setting.simpleString("repositories.azure.base_path", false, Setting.Scope.CLUSTER); Setting.simpleString("repositories.azure.account", false, Setting.Scope.CLUSTER, true);
public static final Setting<String> LOCATION_MODE_SETTING = Setting.simpleString("repositories.azure.location_mode", false, Setting.Scope.CLUSTER); public static final Setting<String> CONTAINER_SETTING =
public static final Setting<ByteSizeValue> CHUNK_SIZE_SETTING = Setting.byteSizeSetting("repositories.azure.chunk_size", new ByteSizeValue(-1), false, Setting.Scope.CLUSTER); Setting.simpleString("repositories.azure.container", false, Setting.Scope.CLUSTER);
public static final Setting<Boolean> COMPRESS_SETTING = Setting.boolSetting("repositories.azure.compress", false, false, Setting.Scope.CLUSTER); public static final Setting<String> BASE_PATH_SETTING =
Setting.simpleString("repositories.azure.base_path", false, Setting.Scope.CLUSTER);
public static final Setting<String> LOCATION_MODE_SETTING =
Setting.simpleString("repositories.azure.location_mode", false, Setting.Scope.CLUSTER);
public static final Setting<ByteSizeValue> CHUNK_SIZE_SETTING =
Setting.byteSizeSetting("repositories.azure.chunk_size", new ByteSizeValue(-1), false, Setting.Scope.CLUSTER);
public static final Setting<Boolean> COMPRESS_SETTING =
Setting.boolSetting("repositories.azure.compress", false, false, Setting.Scope.CLUSTER);
} }
boolean doesContainerExist(String account, LocationMode mode, String container); boolean doesContainerExist(String account, LocationMode mode, String container);
@ -62,13 +69,17 @@ public interface AzureStorageService {
void deleteBlob(String account, LocationMode mode, String container, String blob) throws URISyntaxException, StorageException; void deleteBlob(String account, LocationMode mode, String container, String blob) throws URISyntaxException, StorageException;
InputStream getInputStream(String account, LocationMode mode, String container, String blob) throws URISyntaxException, StorageException; InputStream getInputStream(String account, LocationMode mode, String container, String blob)
throws URISyntaxException, StorageException;
OutputStream getOutputStream(String account, LocationMode mode, String container, String blob) throws URISyntaxException, StorageException; OutputStream getOutputStream(String account, LocationMode mode, String container, String blob)
throws URISyntaxException, StorageException;
Map<String,BlobMetaData> listBlobsByPrefix(String account, LocationMode mode, String container, String keyPath, String prefix) throws URISyntaxException, StorageException; Map<String,BlobMetaData> listBlobsByPrefix(String account, LocationMode mode, String container, String keyPath, String prefix)
throws URISyntaxException, StorageException;
void moveBlob(String account, LocationMode mode, String container, String sourceBlob, String targetBlob) throws URISyntaxException, StorageException; void moveBlob(String account, LocationMode mode, String container, String sourceBlob, String targetBlob)
throws URISyntaxException, StorageException;
AzureStorageService start(); AzureStorageService start();
} }

View File

@ -74,9 +74,9 @@ public class AzureRepositoryPlugin extends Plugin {
module.registerSetting(AzureStorageService.Storage.BASE_PATH_SETTING); module.registerSetting(AzureStorageService.Storage.BASE_PATH_SETTING);
module.registerSetting(AzureStorageService.Storage.CHUNK_SIZE_SETTING); module.registerSetting(AzureStorageService.Storage.CHUNK_SIZE_SETTING);
module.registerSetting(AzureStorageService.Storage.LOCATION_MODE_SETTING); module.registerSetting(AzureStorageService.Storage.LOCATION_MODE_SETTING);
// Cloud storage API settings needed to be hidden
// Cloud storage API settings using a pattern needed to be hidden
module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.account"); module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.account");
module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.key"); module.registerSettingsFilter(AzureStorageService.Storage.PREFIX + "*.key");
module.registerSettingsFilter(AzureStorageService.Storage.ACCOUNT_SETTING.getKey());
} }
} }

View File

@ -38,11 +38,11 @@ public interface AwsS3Service extends LifecycleComponent<AwsS3Service> {
/** /**
* cloud.aws.access_key: AWS Access key. Shared with discovery-ec2 plugin * cloud.aws.access_key: AWS Access key. Shared with discovery-ec2 plugin
*/ */
Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER); Setting<String> KEY_SETTING = Setting.simpleString("cloud.aws.access_key", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.secret_key: AWS Secret key. Shared with discovery-ec2 plugin * cloud.aws.secret_key: AWS Secret key. Shared with discovery-ec2 plugin
*/ */
Setting<String> SECRET_SETTING = Setting.simpleString("cloud.aws.secret_key", false, Setting.Scope.CLUSTER); Setting<String> SECRET_SETTING = Setting.simpleString("cloud.aws.secret_key", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.protocol: Protocol for AWS API: http or https. Defaults to https. Shared with discovery-ec2 plugin * cloud.aws.protocol: Protocol for AWS API: http or https. Defaults to https. Shared with discovery-ec2 plugin
*/ */
@ -63,7 +63,7 @@ public interface AwsS3Service extends LifecycleComponent<AwsS3Service> {
/** /**
* cloud.aws.proxy.password: In case of proxy with auth, define the password. Shared with discovery-ec2 plugin * cloud.aws.proxy.password: In case of proxy with auth, define the password. Shared with discovery-ec2 plugin
*/ */
Setting<String> PROXY_PASSWORD_SETTING = Setting.simpleString("cloud.aws.proxy.password", false, Setting.Scope.CLUSTER); Setting<String> PROXY_PASSWORD_SETTING = Setting.simpleString("cloud.aws.proxy.password", false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.signer: If you are using an old AWS API version, you can define a Signer. Shared with discovery-ec2 plugin * cloud.aws.signer: If you are using an old AWS API version, you can define a Signer. Shared with discovery-ec2 plugin
*/ */
@ -82,13 +82,13 @@ public interface AwsS3Service extends LifecycleComponent<AwsS3Service> {
* @see AwsS3Service#KEY_SETTING * @see AwsS3Service#KEY_SETTING
*/ */
Setting<String> KEY_SETTING = Setting<String> KEY_SETTING =
new Setting<>("cloud.aws.s3.access_key", AwsS3Service.KEY_SETTING, Function.identity(), false, Setting.Scope.CLUSTER); new Setting<>("cloud.aws.s3.access_key", AwsS3Service.KEY_SETTING, Function.identity(), false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.s3.secret_key: AWS Secret key specific for S3 API calls. Defaults to cloud.aws.secret_key. * cloud.aws.s3.secret_key: AWS Secret key specific for S3 API calls. Defaults to cloud.aws.secret_key.
* @see AwsS3Service#SECRET_SETTING * @see AwsS3Service#SECRET_SETTING
*/ */
Setting<String> SECRET_SETTING = Setting<String> SECRET_SETTING =
new Setting<>("cloud.aws.s3.secret_key", AwsS3Service.SECRET_SETTING, Function.identity(), false, Setting.Scope.CLUSTER); new Setting<>("cloud.aws.s3.secret_key", AwsS3Service.SECRET_SETTING, Function.identity(), false, Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.s3.protocol: Protocol for AWS API specific for S3 API calls: http or https. Defaults to cloud.aws.protocol. * cloud.aws.s3.protocol: Protocol for AWS API specific for S3 API calls: http or https. Defaults to cloud.aws.protocol.
* @see AwsS3Service#PROTOCOL_SETTING * @see AwsS3Service#PROTOCOL_SETTING
@ -124,7 +124,7 @@ public interface AwsS3Service extends LifecycleComponent<AwsS3Service> {
*/ */
Setting<String> PROXY_PASSWORD_SETTING = Setting<String> PROXY_PASSWORD_SETTING =
new Setting<>("cloud.aws.s3.proxy.password", AwsS3Service.PROXY_PASSWORD_SETTING, Function.identity(), false, new Setting<>("cloud.aws.s3.proxy.password", AwsS3Service.PROXY_PASSWORD_SETTING, Function.identity(), false,
Setting.Scope.CLUSTER); Setting.Scope.CLUSTER, true);
/** /**
* cloud.aws.s3.signer: If you are using an old AWS API version, you can define a Signer. Specific for S3 API calls. * cloud.aws.s3.signer: If you are using an old AWS API version, you can define a Signer. Specific for S3 API calls.
* Defaults to cloud.aws.signer. * Defaults to cloud.aws.signer.

View File

@ -144,16 +144,6 @@ public class S3RepositoryPlugin extends Plugin {
settingsModule.registerSetting(S3Repository.Repository.STORAGE_CLASS_SETTING); settingsModule.registerSetting(S3Repository.Repository.STORAGE_CLASS_SETTING);
settingsModule.registerSetting(S3Repository.Repository.CANNED_ACL_SETTING); settingsModule.registerSetting(S3Repository.Repository.CANNED_ACL_SETTING);
settingsModule.registerSetting(S3Repository.Repository.BASE_PATH_SETTING); settingsModule.registerSetting(S3Repository.Repository.BASE_PATH_SETTING);
// Filter global settings
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.KEY_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.SECRET_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.PROXY_PASSWORD_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.CLOUD_S3.KEY_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.CLOUD_S3.SECRET_SETTING.getKey());
settingsModule.registerSettingsFilterIfMissing(AwsS3Service.CLOUD_S3.PROXY_PASSWORD_SETTING.getKey());
settingsModule.registerSettingsFilter(S3Repository.Repository.KEY_SETTING.getKey());
settingsModule.registerSettingsFilter(S3Repository.Repository.SECRET_SETTING.getKey());
} }
/** /**

View File

@ -140,12 +140,12 @@ public class S3Repository extends BlobStoreRepository {
* access_key * access_key
* @see Repositories#KEY_SETTING * @see Repositories#KEY_SETTING
*/ */
Setting<String> KEY_SETTING = Setting.simpleString("access_key", false, Setting.Scope.CLUSTER); Setting<String> KEY_SETTING = Setting.simpleString("access_key", false, Setting.Scope.CLUSTER, true);
/** /**
* secret_key * secret_key
* @see Repositories#SECRET_SETTING * @see Repositories#SECRET_SETTING
*/ */
Setting<String> SECRET_SETTING = Setting.simpleString("secret_key", false, Setting.Scope.CLUSTER); Setting<String> SECRET_SETTING = Setting.simpleString("secret_key", false, Setting.Scope.CLUSTER, true);
/** /**
* bucket * bucket
* @see Repositories#BUCKET_SETTING * @see Repositories#BUCKET_SETTING