Skip to content

Commit 5d3b6bf

Browse files
authored
Allow node to enroll to cluster on startup (#77718)
The functionality to enroll a new node to a cluster was introduced in #77292 as a CLI tool. This change replaces this CLI tool with the option to trigger the enrollment functionality on startup of elasticsearch via a named argument that can be passed to the elasticsearch startup script (--enrollment-token) so that the users that want to enroll a node to a cluster can do this with one command instead of two. In a followup PR we are introducing a CLI tool version of this functionality, that can be used to reconfigure packaged installations.
1 parent e82a70c commit 5d3b6bf

29 files changed

Lines changed: 764 additions & 1226 deletions

File tree

client/rest-high-level/qa/ssl-enabled/src/javaRestTest/java/org/elasticsearch/client/EnrollmentIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void testEnrollNode() throws Exception {
7676
assertThat(nodeEnrollmentResponse, notNullValue());
7777
assertThat(nodeEnrollmentResponse.getHttpCaKey(), endsWith("K2S3vidA="));
7878
assertThat(nodeEnrollmentResponse.getHttpCaCert(), endsWith("LfkRjirc="));
79+
assertThat(nodeEnrollmentResponse.getTransportCaCert(), endsWith("3J9+kpgIbE"));
7980
assertThat(nodeEnrollmentResponse.getTransportKey(), endsWith("1I+r8vOQ=="));
8081
assertThat(nodeEnrollmentResponse.getTransportCert(), endsWith("OpTdtgJo="));
8182
List<String> nodesAddresses = nodeEnrollmentResponse.getNodesAddresses();

client/rest-high-level/qa/ssl-enabled/src/javaRestTest/java/org/elasticsearch/client/documentation/EnrollmentDocumentationIT.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,10 @@ public void testNodeEnrollment() throws Exception {
7575
// tag::node-enrollment-response
7676
String httpCaKey = response.getHttpCaKey(); // <1>
7777
String httpCaCert = response.getHttpCaCert(); // <2>
78-
String transportKey = response.getTransportKey(); // <3>
79-
String transportCert = response.getTransportCert(); // <4>
80-
List<String> nodesAddresses = response.getNodesAddresses(); // <5>
78+
String transportCaCert = response.getTransportCaCert(); // <3>
79+
String transportKey = response.getTransportKey(); // <4>
80+
String transportCert = response.getTransportCert(); // <5>
81+
List<String> nodesAddresses = response.getNodesAddresses(); // <6>
8182
// end::node-enrollment-response
8283
}
8384

client/rest-high-level/src/main/java/org/elasticsearch/client/security/NodeEnrollmentResponse.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@ public class NodeEnrollmentResponse {
2121

2222
private final String httpCaKey;
2323
private final String httpCaCert;
24+
private final String transportCaCert;
2425
private final String transportKey;
2526
private final String transportCert;
2627
private final List<String> nodesAddresses;
2728

28-
public NodeEnrollmentResponse(String httpCaKey, String httpCaCert, String transportKey, String transportCert,
29+
public NodeEnrollmentResponse(String httpCaKey, String httpCaCert, String transportCaCert, String transportKey, String transportCert,
2930
List<String> nodesAddresses){
3031
this.httpCaKey = httpCaKey;
3132
this.httpCaCert = httpCaCert;
33+
this.transportCaCert = transportCaCert;
3234
this.transportKey = transportKey;
3335
this.transportCert = transportCert;
3436
this.nodesAddresses = Collections.unmodifiableList(nodesAddresses);
@@ -46,6 +48,10 @@ public String getTransportKey() {
4648
return transportKey;
4749
}
4850

51+
public String getTransportCaCert() {
52+
return transportCaCert;
53+
}
54+
4955
public String getTransportCert() {
5056
return transportCert;
5157
}
@@ -56,6 +62,7 @@ public List<String> getNodesAddresses() {
5662

5763
private static final ParseField HTTP_CA_KEY = new ParseField("http_ca_key");
5864
private static final ParseField HTTP_CA_CERT = new ParseField("http_ca_cert");
65+
private static final ParseField TRANSPORT_CA_CERT = new ParseField("transport_ca_cert");
5966
private static final ParseField TRANSPORT_KEY = new ParseField("transport_key");
6067
private static final ParseField TRANSPORT_CERT = new ParseField("transport_cert");
6168
private static final ParseField NODES_ADDRESSES = new ParseField("nodes_addresses");
@@ -66,15 +73,17 @@ public List<String> getNodesAddresses() {
6673
new ConstructingObjectParser<>(NodeEnrollmentResponse.class.getName(), true, a -> {
6774
final String httpCaKey = (String) a[0];
6875
final String httpCaCert = (String) a[1];
69-
final String transportKey = (String) a[2];
70-
final String transportCert = (String) a[3];
71-
final List<String> nodesAddresses = (List<String>) a[4];
72-
return new NodeEnrollmentResponse(httpCaKey, httpCaCert, transportKey, transportCert, nodesAddresses);
76+
final String transportCaCert = (String) a[2];
77+
final String transportKey = (String) a[3];
78+
final String transportCert = (String) a[4];
79+
final List<String> nodesAddresses = (List<String>) a[5];
80+
return new NodeEnrollmentResponse(httpCaKey, httpCaCert, transportCaCert, transportKey, transportCert, nodesAddresses);
7381
});
7482

7583
static {
7684
PARSER.declareString(ConstructingObjectParser.constructorArg(), HTTP_CA_KEY);
7785
PARSER.declareString(ConstructingObjectParser.constructorArg(), HTTP_CA_CERT);
86+
PARSER.declareString(ConstructingObjectParser.constructorArg(), TRANSPORT_CA_CERT);
7887
PARSER.declareString(ConstructingObjectParser.constructorArg(), TRANSPORT_KEY);
7988
PARSER.declareString(ConstructingObjectParser.constructorArg(), TRANSPORT_CERT);
8089
PARSER.declareStringArray(ConstructingObjectParser.constructorArg(), NODES_ADDRESSES);
@@ -88,12 +97,15 @@ public static NodeEnrollmentResponse fromXContent(XContentParser parser) throws
8897
if (this == o) return true;
8998
if (o == null || getClass() != o.getClass()) return false;
9099
NodeEnrollmentResponse that = (NodeEnrollmentResponse) o;
91-
return httpCaKey.equals(that.httpCaKey) && httpCaCert.equals(that.httpCaCert) && transportKey.equals(that.transportKey)
100+
return httpCaKey.equals(that.httpCaKey)
101+
&& httpCaCert.equals(that.httpCaCert)
102+
&& transportCaCert.equals(that.transportCaCert)
103+
&& transportKey.equals(that.transportKey)
92104
&& transportCert.equals(that.transportCert)
93105
&& nodesAddresses.equals(that.nodesAddresses);
94106
}
95107

96108
@Override public int hashCode() {
97-
return Objects.hash(httpCaKey, httpCaCert, transportKey, transportCert, nodesAddresses);
109+
return Objects.hash(httpCaKey, httpCaCert, transportCaCert, transportKey, transportCert, nodesAddresses);
98110
}
99111
}

distribution/packages/src/common/scripts/postinst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ if [ "x$IS_UPGRADE" != "xtrue" ]; then
5757
# Don't exit immediately on error, we want to hopefully print some helpful banners
5858
set +e
5959
# Attempt to auto-configure security, this seems to be an installation
60-
if ES_MAIN_CLASS=org.elasticsearch.xpack.security.cli.ConfigInitialNode \
60+
if ES_MAIN_CLASS=org.elasticsearch.xpack.security.cli.AutoConfigureNode \
6161
ES_ADDITIONAL_SOURCES="x-pack-env;x-pack-security-env" \
6262
ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/security-cli \
6363
/usr/share/elasticsearch/bin/elasticsearch-cli <<< ""; then
6464
# Above command runs as root and TLS keystores are created group-owned by root. It's simple to correct the ownership here
65-
for dir in "${ES_PATH_CONF}"/tls_auto_config_initial_node_*
65+
for dir in "${ES_PATH_CONF}"/tls_auto_config_*
6666
do
6767
chown root:elasticsearch "${dir}"/http_keystore_local_node.p12
6868
chown root:elasticsearch "${dir}"/http_ca.crt
@@ -83,13 +83,13 @@ if [ "x$IS_UPGRADE" != "xtrue" ]; then
8383
echo "You can complete the following actions at any time:"
8484
echo
8585
echo "Reset the password of the elastic built-in superuser with "
86-
echo "'/usr/share/bin/elasticsearch-reset-password -u elastic'."
86+
echo "'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'."
8787
echo
8888
echo "Generate an enrollment token for Kibana instances with "
89-
echo " 'bin/elasticsearch-create-enrollment-token -s kibana'."
89+
echo " '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'."
9090
echo
9191
echo "Generate an enrollment token for Elasticsearch nodes with "
92-
echo "'bin/elasticsearch-create-enrollment-token -s node'."
92+
echo "'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'."
9393
echo
9494
echo "-------------------------------------------------------------------------------------------------"
9595
fi
@@ -108,7 +108,7 @@ if [ "x$IS_UPGRADE" != "xtrue" ]; then
108108
echo "However, authentication and authorization are still enabled."
109109
echo
110110
echo "You can reset the password of the elastic built-in superuser with "
111-
echo "'/usr/share/bin/elasticsearch-reset-password -u elastic' at any time."
111+
echo "'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic' at any time."
112112
echo "-------------------------------------------------------------------------------------------------"
113113
fi
114114
fi

distribution/packages/src/common/scripts/postrm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ if [ "$REMOVE_DIRS" = "true" ]; then
103103

104104
# delete the security auto config directory if we are purging
105105
if [ "$REMOVE_SECURITY_AUTO_CONFIG_DIRECTORY" = "true" ]; then
106-
for dir in "${ES_PATH_CONF}"/tls_auto_config_initial_node_*
106+
for dir in "${ES_PATH_CONF}"/tls_auto_config_*
107107
do
108108
echo -n "Deleting security auto-configuration directory..."
109109
rm -rf "${dir}"

distribution/src/bin/elasticsearch

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,29 @@ source "`dirname "$0"`"/elasticsearch-env
1818
CHECK_KEYSTORE=true
1919
ATTEMPT_SECURITY_AUTO_CONFIG=true
2020
DAEMONIZE=false
21-
for option in "$@"; do
22-
case "$option" in
23-
-h|--help|-V|--version)
24-
CHECK_KEYSTORE=false
25-
ATTEMPT_SECURITY_AUTO_CONFIG=false
26-
;;
27-
-d|--daemonize)
28-
DAEMONIZE=true
29-
;;
30-
esac
21+
ENROLL_TO_CLUSTER=false
22+
# Store original arg array as we will be shifting through it below
23+
ARG_LIST=("$@")
24+
25+
while [ $# -gt 0 ]; do
26+
if [[ $1 == "--enrollment-token" ]]; then
27+
if [ $ENROLL_TO_CLUSTER = true ]; then
28+
echo "Multiple --enrollment-token parameters are not allowed" 1>&2
29+
exit 1
30+
fi
31+
ENROLL_TO_CLUSTER=true
32+
ATTEMPT_SECURITY_AUTO_CONFIG=false
33+
ENROLLMENT_TOKEN="$2"
34+
shift
35+
elif [[ $1 == "-h" || $1 == "--help" || $1 == "-V" || $1 == "--version" ]]; then
36+
CHECK_KEYSTORE=false
37+
ATTEMPT_SECURITY_AUTO_CONFIG=false
38+
elif [[ $1 == "-d" || $1 == "--daemonize" ]]; then
39+
DAEMONIZE=true
40+
fi
41+
if [[ $# -gt 0 ]]; then
42+
shift
43+
fi
3144
done
3245

3346
if [ -z "$ES_TMPDIR" ]; then
@@ -47,16 +60,21 @@ then
4760
fi
4861
fi
4962

50-
if [[ $ATTEMPT_SECURITY_AUTO_CONFIG = true ]]; then
63+
if [[ $ENROLL_TO_CLUSTER = true ]]; then
64+
ES_MAIN_CLASS=org.elasticsearch.xpack.security.cli.AutoConfigureNode \
65+
ES_ADDITIONAL_SOURCES="x-pack-env;x-pack-security-env" \
66+
ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/security-cli \
67+
bin/elasticsearch-cli "${ARG_LIST[@]}" <<<"$KEYSTORE_PASSWORD"
68+
elif [[ $ATTEMPT_SECURITY_AUTO_CONFIG = true ]]; then
5169
# It is possible that an auto-conf failure prevents the node from starting, but this is only the exceptional case (exit code 1).
5270
# Most likely an auto-conf failure will leave the configuration untouched (exit codes 73, 78 and 80), optionally printing a message
5371
# if the error is uncommon or unexpected, but it should otherwise let the node to start as usual.
5472
# It is passed in all the command line options in order to read the node settings ones (-E), while the other parameters are ignored
5573
# (a small caveat is that it also inspects the -v option in order to provide more information on how auto config went)
56-
if ES_MAIN_CLASS=org.elasticsearch.xpack.security.cli.ConfigInitialNode \
74+
if ES_MAIN_CLASS=org.elasticsearch.xpack.security.cli.AutoConfigureNode \
5775
ES_ADDITIONAL_SOURCES="x-pack-env;x-pack-security-env" \
5876
ES_ADDITIONAL_CLASSPATH_DIRECTORIES=lib/tools/security-cli \
59-
bin/elasticsearch-cli "$@" <<<"$KEYSTORE_PASSWORD"; then
77+
bin/elasticsearch-cli "${ARG_LIST[@]}" <<<"$KEYSTORE_PASSWORD"; then
6078
:
6179
else
6280
retval=$?
@@ -77,6 +95,13 @@ fi
7795
# - fourth, ergonomic JVM options are applied
7896
ES_JAVA_OPTS=`export ES_TMPDIR; "$JAVA" "$XSHARE" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JvmOptionsParser "$ES_PATH_CONF" "$ES_HOME/plugins"`
7997

98+
# Remove enrollment related parameters before passing the arg list to Elasticsearch
99+
for i in "${!ARG_LIST[@]}"; do
100+
if [[ ${ARG_LIST[i]} = "--enrollment-token" || ${ARG_LIST[i]} = "$ENROLLMENT_TOKEN" ]]; then
101+
unset 'ARG_LIST[i]'
102+
fi
103+
done
104+
80105
# manual parsing to find out, if process should be detached
81106
if [[ $DAEMONIZE = false ]]; then
82107
exec \
@@ -90,7 +115,7 @@ if [[ $DAEMONIZE = false ]]; then
90115
-Des.bundled_jdk="$ES_BUNDLED_JDK" \
91116
-cp "$ES_CLASSPATH" \
92117
org.elasticsearch.bootstrap.Elasticsearch \
93-
"$@" <<<"$KEYSTORE_PASSWORD"
118+
"${ARG_LIST[@]}" <<<"$KEYSTORE_PASSWORD"
94119
else
95120
exec \
96121
"$JAVA" \
@@ -103,7 +128,7 @@ else
103128
-Des.bundled_jdk="$ES_BUNDLED_JDK" \
104129
-cp "$ES_CLASSPATH" \
105130
org.elasticsearch.bootstrap.Elasticsearch \
106-
"$@" \
131+
"${ARG_LIST[@]}" \
107132
<<<"$KEYSTORE_PASSWORD" &
108133
retval=$?
109134
pid=$!

distribution/src/bin/elasticsearch.bat

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ setlocal enableextensions
55

66
SET params='%*'
77
SET checkpassword=Y
8+
SET enrolltocluster=N
89
SET attemptautoconfig=Y
910

1011
:loop
1112
FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO (
13+
SET previous=!current!
1214
SET current=%%A
1315
SET params='%%B'
1416
SET silent=N
15-
1617
IF "!current!" == "-s" (
1718
SET silent=Y
1819
)
@@ -38,14 +39,33 @@ FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO (
3839
SET attemptautoconfig=N
3940
)
4041

42+
IF "!current!" == "--enrollment-token" (
43+
IF "!enrolltocluster!" == "Y" (
44+
ECHO "Multiple --enrollment-token parameters are not allowed" 1>&2
45+
goto exitwithone
46+
)
47+
SET enrolltocluster=Y
48+
SET attemptautoconfig=N
49+
)
50+
51+
IF "!previous!" == "--enrollment-token" (
52+
SET enrollmenttoken="!current!"
53+
)
54+
4155
IF "!silent!" == "Y" (
4256
SET nopauseonerror=Y
4357
) ELSE (
44-
IF "x!newparams!" NEQ "x" (
45-
SET newparams=!newparams! !current!
46-
) ELSE (
47-
SET newparams=!current!
48-
)
58+
SET SHOULD_SKIP=false
59+
IF "!previous!" == "--enrollment-token" SET SHOULD_SKIP=true
60+
IF "!current!" == "--enrollment-token" SET SHOULD_SKIP=true
61+
IF "!SHOULD_SKIP!" == "false" (
62+
IF "x!newparams!" NEQ "x" (
63+
SET newparams=!newparams! !current!
64+
) ELSE (
65+
SET newparams=!current!
66+
)
67+
)
68+
4969
)
5070

5171
IF "x!params!" NEQ "x" (
@@ -73,13 +93,21 @@ IF "%checkpassword%"=="Y" (
7393
)
7494
)
7595

96+
rem windows batch pipe will choke on special characters in strings
97+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^^=^^^^!
98+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^&=^^^&!
99+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^|=^^^|!
100+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^<=^^^<!
101+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^>=^^^>!
102+
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^\=^^^\!
103+
76104
IF "%attemptautoconfig%"=="Y" (
77105
ECHO.!KEYSTORE_PASSWORD!| %JAVA% %ES_JAVA_OPTS% ^
78106
-Des.path.home="%ES_HOME%" ^
79107
-Des.path.conf="%ES_PATH_CONF%" ^
80108
-Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" ^
81109
-Des.distribution.type="%ES_DISTRIBUTION_TYPE%" ^
82-
-cp "!ES_CLASSPATH!;!ES_HOME!/lib/tools/security-cli/*;!ES_HOME!/modules/x-pack-core/*;!ES_HOME!/modules/x-pack-security/*" "org.elasticsearch.xpack.security.cli.ConfigInitialNode" !newparams!
110+
-cp "!ES_CLASSPATH!;!ES_HOME!/lib/tools/security-cli/*;!ES_HOME!/modules/x-pack-core/*;!ES_HOME!/modules/x-pack-security/*" "org.elasticsearch.xpack.security.cli.AutoConfigureNode" !newparams!
83111
SET SHOULDEXIT=Y
84112
IF !ERRORLEVEL! EQU 0 SET SHOULDEXIT=N
85113
IF !ERRORLEVEL! EQU 73 SET SHOULDEXIT=N
@@ -90,6 +118,19 @@ IF "%attemptautoconfig%"=="Y" (
90118
)
91119
)
92120

121+
IF "!enrolltocluster!"=="Y" (
122+
ECHO.!KEYSTORE_PASSWORD!| %JAVA% %ES_JAVA_OPTS% ^
123+
-Des.path.home="%ES_HOME%" ^
124+
-Des.path.conf="%ES_PATH_CONF%" ^
125+
-Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" ^
126+
-Des.distribution.type="%ES_DISTRIBUTION_TYPE%" ^
127+
-cp "!ES_CLASSPATH!;!ES_HOME!/lib/tools/security-cli/*;!ES_HOME!/modules/x-pack-core/*;!ES_HOME!/modules/x-pack-security/*" "org.elasticsearch.xpack.security.cli.AutoConfigureNode" ^
128+
!newparams! --enrollment-token %enrollmenttoken%
129+
IF !ERRORLEVEL! NEQ 0 (
130+
exit /b !ERRORLEVEL!
131+
)
132+
)
133+
93134
if not defined ES_TMPDIR (
94135
for /f "tokens=* usebackq" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.TempDirectory"`) do set ES_TMPDIR=%%a
95136
)
@@ -111,14 +152,6 @@ if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (
111152
exit /b 1
112153
)
113154

114-
rem windows batch pipe will choke on special characters in strings
115-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^^=^^^^!
116-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^&=^^^&!
117-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^|=^^^|!
118-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^<=^^^<!
119-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^>=^^^>!
120-
SET KEYSTORE_PASSWORD=!KEYSTORE_PASSWORD:^\=^^^\!
121-
122155
ECHO.!KEYSTORE_PASSWORD!| %JAVA% %ES_JAVA_OPTS% -Delasticsearch ^
123156
-Des.path.home="%ES_HOME%" -Des.path.conf="%ES_PATH_CONF%" ^
124157
-Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" ^
@@ -129,3 +162,8 @@ ECHO.!KEYSTORE_PASSWORD!| %JAVA% %ES_JAVA_OPTS% -Delasticsearch ^
129162
endlocal
130163
endlocal
131164
exit /b %ERRORLEVEL%
165+
166+
rem this hack is ugly but necessary because we can't exit with /b X from within the argument parsing loop.
167+
rem exit 1 (without /b) would work for powershell but it will terminate the cmd process when run in cmd
168+
:exitwithone
169+
exit /b 1

docs/java-rest/high-level/security/enroll_node.asciidoc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ include-tagged::{doc-tests}/EnrollmentDocumentationIT.java[{api}-response]
3333
for the HTTP layer, as a Base64 encoded string of the ASN.1 DER encoding of the key.
3434
<2> The CA certificate that can be used by the new node in order to sign its certificate
3535
for the HTTP layer, as a Base64 encoded string of the ASN.1 DER encoding of the certificate.
36-
<3> The private key that the node can use for TLS for its transport layer, as a Base64
36+
<3> The CA certificate that is used to sign the TLS certificate for the transport layer, as
37+
a Base64 encoded string of the ASN.1 DER encoding of the certificate.
38+
<4> The private key that the node can use for TLS for its transport layer, as a Base64
3739
encoded string of the ASN.1 DER encoding of the key.
38-
<4> The certificate that the node can use for TLS for its transport layer, as a Base64
40+
<5> The certificate that the node can use for TLS for its transport layer, as a Base64
3941
encoded string of the ASN.1 DER encoding of the certificate.
40-
<5> A list of transport addresses in the form of `host:port` for the nodes that are already
42+
<6> A list of transport addresses in the form of `host:port` for the nodes that are already
4143
members of the cluster.
4244

4345

qa/os/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ plugins {
1313
dependencies {
1414
testImplementation project(':server')
1515
testImplementation project(':libs:elasticsearch-core')
16+
testImplementation(testArtifact(project(':x-pack:plugin:core')))
1617
testImplementation "junit:junit:${versions.junit}"
1718
testImplementation "org.hamcrest:hamcrest:${versions.hamcrest}"
1819
testImplementation "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"

0 commit comments

Comments
 (0)