Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
75e1518
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 5, 2025
9338680
Update RemoteClusterService to default skip unavailable to true for CPS
JeremyDahlgren Aug 7, 2025
c1cd712
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 7, 2025
2273e47
Remove unrelated assertion
JeremyDahlgren Aug 7, 2025
9b41038
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 7, 2025
754768b
Address code review comments
JeremyDahlgren Aug 8, 2025
bd2efd7
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 8, 2025
fefe4ae
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 8, 2025
f01504f
Move RECONNECT_UNLESS_SKIP_UNAVAILABLE check to separate PR
JeremyDahlgren Aug 9, 2025
e535ecc
Use Iterators.single()
JeremyDahlgren Aug 11, 2025
2aa8d46
Use randomized setting values
JeremyDahlgren Aug 11, 2025
e1e06b7
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Aug 11, 2025
fde9bf6
Fix merge
JeremyDahlgren Aug 11, 2025
fff29b3
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Oct 7, 2025
78cac67
Fix exception message and test
JeremyDahlgren Oct 7, 2025
4fc3323
Restore @Override
JeremyDahlgren Oct 7, 2025
b552484
[CI] Auto commit changes from spotless
Oct 7, 2025
f93d28b
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Oct 7, 2025
c1fa91a
Merge branch 'main' into tasks/es-12267-skip-unavailable-for-cps
JeremyDahlgren Oct 8, 2025
0bcd0d4
Adjust test to not explicitly set skip_unavailable in CPS environment
JeremyDahlgren Oct 8, 2025
07a5d1b
Removing test, redundant with new validator
JeremyDahlgren Oct 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,8 @@ public void skipUnavailableChanged(
String linkedProjectAlias,
boolean skipUnavailable
) {
assert crossProjectEnabled == false
: "Cannot configure setting [" + RemoteClusterSettings.REMOTE_CLUSTER_SKIP_UNAVAILABLE.getKey() + "] in CPS environments.";
final var remote = getConnectionsMapForProject(originProjectId).get(linkedProjectAlias);
if (remote != null) {
remote.setSkipUnavailable(skipUnavailable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.collect.Iterators;
import org.elasticsearch.common.settings.SecureSetting;
import org.elasticsearch.common.settings.SecureString;
import org.elasticsearch.common.settings.Setting;
Expand Down Expand Up @@ -70,7 +71,7 @@ public class RemoteClusterSettings {
(ns, key) -> boolSetting(
key,
DEFAULT_SKIP_UNAVAILABLE,
new RemoteConnectionEnabled<>(ns, key),
new UnsupportedInCPSValidator<>(ns, key),
Setting.Property.Dynamic,
Setting.Property.NodeScope
)
Expand Down Expand Up @@ -390,6 +391,10 @@ private RemoteConnectionEnabled(String clusterAlias, String key) {
this.key = key;
}

protected String getKey() {
return key;
}

@Override
public void validate(T value) {}

Expand Down Expand Up @@ -483,4 +488,25 @@ public Iterator<Setting<?>> settings() {
return settingStream.iterator();
}
}

private static class UnsupportedInCPSValidator<T> extends RemoteConnectionEnabled<T> {
private final Setting<Boolean> cpsSetting = Setting.boolSetting("serverless.cross_project.enabled", false);

private UnsupportedInCPSValidator(String clusterAlias, String key) {
super(clusterAlias, key);
}

@Override
public void validate(T value, Map<Setting<?>, Object> settings, boolean isPresent) {
if (isPresent && (Boolean) settings.get(cpsSetting)) {
throw new IllegalArgumentException("setting [" + getKey() + "] is unavailable when CPS is enabled");
}
super.validate(value, settings, isPresent);
}

@Override
public Iterator<Setting<?>> settings() {
return Iterators.concat(super.settings(), Iterators.single(cpsSetting));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@

import static org.elasticsearch.test.NodeRoles.nonRemoteClusterClientNode;
import static org.elasticsearch.test.NodeRoles.remoteClusterClientNode;
import static org.elasticsearch.transport.RemoteClusterSettings.ProxyConnectionStrategySettings.PROXY_ADDRESS;
import static org.elasticsearch.transport.RemoteClusterSettings.REMOTE_CLUSTER_CREDENTIALS;
import static org.elasticsearch.transport.RemoteClusterSettings.REMOTE_CLUSTER_SKIP_UNAVAILABLE;
import static org.elasticsearch.transport.RemoteClusterSettings.REMOTE_CONNECTION_MODE;
import static org.elasticsearch.transport.RemoteClusterSettings.REMOTE_INITIAL_CONNECTION_TIMEOUT_SETTING;
import static org.elasticsearch.transport.RemoteClusterSettings.REMOTE_NODE_ATTRIBUTE;
import static org.elasticsearch.transport.RemoteClusterSettings.SniffConnectionStrategySettings.REMOTE_CLUSTERS_PROXY;
Expand Down Expand Up @@ -95,4 +97,51 @@ public void testProxyDefault() {
final String alias = randomAlphaOfLength(8);
assertThat(REMOTE_CLUSTERS_PROXY.getConcreteSettingForNamespace(alias).get(Settings.EMPTY), equalTo(""));
}

public void testSkipUnavailableAlwaysTrueIfCPSEnabled() {
final var alias = randomAlphaOfLength(8);
final var skipUnavailableSetting = REMOTE_CLUSTER_SKIP_UNAVAILABLE.getConcreteSettingForNamespace(alias);
final var modeSetting = REMOTE_CONNECTION_MODE.getConcreteSettingForNamespace(alias);
final var proxyAddressSetting = PROXY_ADDRESS.getConcreteSettingForNamespace(alias);
final var cpsEnabledSettings = Settings.builder().put("serverless.cross_project.enabled", true).build();
final var proxyEnabledSettings = Settings.builder()
.put(modeSetting.getKey(), RemoteConnectionStrategy.ConnectionStrategy.PROXY.toString())
.put(proxyAddressSetting.getKey(), "localhost:9400")
.build();

// Ensure the validator still throws in non-CPS environment if a connection mode is not set.
var exception = expectThrows(
IllegalArgumentException.class,
() -> skipUnavailableSetting.get(Settings.builder().put(skipUnavailableSetting.getKey(), true).build())
);
assertThat(
exception.getMessage(),
equalTo("Cannot configure setting [" + skipUnavailableSetting.getKey() + "] if remote cluster is not enabled.")
);

// Ensure we can still get the set value in non-CPS environment.
final var randomSkipUnavailableSettingValue = randomBoolean();
assertThat(
skipUnavailableSetting.get(
Settings.builder().put(proxyEnabledSettings).put(skipUnavailableSetting.getKey(), randomSkipUnavailableSettingValue).build()
),
equalTo(randomSkipUnavailableSettingValue)
);

// Check the validator rejects the skip_unavailable setting if present when CPS is enabled.
exception = expectThrows(
IllegalArgumentException.class,
() -> skipUnavailableSetting.get(
Settings.builder()
.put(cpsEnabledSettings)
.put(proxyEnabledSettings)
.put(skipUnavailableSetting.getKey(), randomBoolean())
.build()
)
);
assertThat(exception.getMessage(), equalTo("setting [" + skipUnavailableSetting.getKey() + "] is unavailable when CPS is enabled"));

// Should not throw if the setting is not present, returning the expected default value of true.
assertTrue(skipUnavailableSetting.get(Settings.builder().put(cpsEnabledSettings).put(proxyEnabledSettings).build()));
}
}

This file was deleted.