Skip to content

Commit a8d6234

Browse files
committed
Fix get certificates HLRC API (#36198)
- GetSslCertificatesRequest need not implement toXContentObject - getRequest() returns a new Request object - Add tests for GetSslCertificatesResponse - Adjust docs to the new format
1 parent 30257f3 commit a8d6234

File tree

4 files changed

+129
-47
lines changed

4 files changed

+129
-47
lines changed

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,19 @@
2222
import org.apache.http.client.methods.HttpGet;
2323
import org.elasticsearch.client.Request;
2424
import org.elasticsearch.client.Validatable;
25-
import org.elasticsearch.common.xcontent.ToXContentObject;
26-
import org.elasticsearch.common.xcontent.XContentBuilder;
27-
28-
import java.io.IOException;
2925

3026
/**
3127
* Request object to retrieve the X.509 certificates that are used to encrypt communications in an Elasticsearch cluster.
3228
*/
33-
public final class GetSslCertificatesRequest implements Validatable, ToXContentObject {
29+
public final class GetSslCertificatesRequest implements Validatable{
3430

3531
public static final GetSslCertificatesRequest INSTANCE = new GetSslCertificatesRequest();
36-
private final Request request;
3732

38-
private GetSslCertificatesRequest() {
39-
request = new Request(HttpGet.METHOD_NAME, "/_xpack/ssl/certificates");
33+
private GetSslCertificatesRequest(){
4034
}
4135

4236
public Request getRequest() {
43-
return request;
37+
return new Request(HttpGet.METHOD_NAME, "/_xpack/ssl/certificates");
4438
}
4539

46-
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
47-
return builder.startObject().endObject();
48-
}
4940
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public String getSerialNumber() {
8080
return serialNumber;
8181
}
8282

83-
public boolean isHasPrivateKey() {
83+
public boolean hasPrivateKey() {
8484
return hasPrivateKey;
8585
}
8686

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.client.security;
21+
22+
import org.elasticsearch.client.security.support.CertificateInfo;
23+
import org.elasticsearch.common.xcontent.XContentBuilder;
24+
import org.elasticsearch.test.ESTestCase;
25+
import org.elasticsearch.test.EqualsHashCodeTestUtils;
26+
27+
import java.io.IOException;
28+
import java.util.ArrayList;
29+
import java.util.Arrays;
30+
import java.util.Collections;
31+
import java.util.List;
32+
33+
import static org.elasticsearch.test.AbstractXContentTestCase.xContentTester;
34+
35+
public class GetSslCertificatesResponseTests extends ESTestCase {
36+
public void testFromXContent() throws IOException {
37+
xContentTester(
38+
this::createParser,
39+
this::createTestInstance,
40+
this::toXContent,
41+
GetSslCertificatesResponse::fromXContent)
42+
.supportsUnknownFields(false)
43+
.test();
44+
}
45+
public void testEqualsAndHashCode() {
46+
final GetSslCertificatesResponse reponse = createTestInstance();
47+
EqualsHashCodeTestUtils.checkEqualsAndHashCode(reponse, this::copy,
48+
this::mutate);
49+
}
50+
51+
protected GetSslCertificatesResponse createTestInstance() {
52+
final CertificateInfo info1 = new CertificateInfo("certs/elastic-certificates.p12", "PKCS12", "instance",
53+
"CN=Elastic Certificate Tool Autogenerated CA", "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
54+
false, "2021-01-15T20:42:49.000Z");
55+
final CertificateInfo info2 = new CertificateInfo("certs/elastic-certificates.p12", "PKCS12", "ca",
56+
"CN=Elastic Certificate Tool Autogenerated CA", "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
57+
false, "2021-01-15T20:42:49.000Z");
58+
final CertificateInfo info3 = new CertificateInfo("certs/elastic-certificates.p12", "PKCS12", "instance",
59+
"CN=instance", "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
60+
true, "2021-01-15T20:44:32.000Z");
61+
return new GetSslCertificatesResponse(Arrays.asList(info1, info2, info3));
62+
}
63+
64+
private void toXContent(GetSslCertificatesResponse response, XContentBuilder builder) throws IOException {
65+
builder.startArray();
66+
for (CertificateInfo info : response.getCertificates()){
67+
builder.startObject();
68+
builder.field(CertificateInfo.PATH.getPreferredName(), info.getPath());
69+
builder.field(CertificateInfo.FORMAT.getPreferredName(), info.getFormat());
70+
builder.field(CertificateInfo.ALIAS.getPreferredName(), info.getAlias());
71+
builder.field(CertificateInfo.SUBJECT_DN.getPreferredName(), info.getSubjectDn());
72+
builder.field(CertificateInfo.SERIAL_NUMBER.getPreferredName(), info.getSerialNumber());
73+
builder.field(CertificateInfo.HAS_PRIVATE_KEY.getPreferredName(), info.hasPrivateKey());
74+
builder.field(CertificateInfo.EXPIRY.getPreferredName(), info.getExpiry());
75+
builder.endObject();
76+
}
77+
builder.endArray();
78+
}
79+
80+
private GetSslCertificatesResponse copy(GetSslCertificatesResponse original) {
81+
final List<CertificateInfo> infoList = new ArrayList<>(original.getCertificates());
82+
return new GetSslCertificatesResponse(infoList);
83+
}
84+
85+
private GetSslCertificatesResponse mutate(GetSslCertificatesResponse original) {
86+
final int i = randomIntBetween(1,5);
87+
final List<CertificateInfo> infoList = new ArrayList<>(original.getCertificates());
88+
switch (i) {
89+
case 1:
90+
infoList.remove(0);
91+
return new GetSslCertificatesResponse(infoList);
92+
case 2:
93+
final CertificateInfo info = new CertificateInfo("certs/elastic-certificates.crt", "PEM", "instance",
94+
"CN=instance2", "a20f0ee901e8f64t33ff633e5cd5437cdb4137",
95+
true, "2028-01-15T20:44:32.000Z");
96+
infoList.add(info);
97+
return new GetSslCertificatesResponse(infoList);
98+
case 3:
99+
final CertificateInfo info2 = new CertificateInfo("certs/elastic-certificates.p12", "PKCS12", "instance",
100+
"CN=instance1", "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
101+
true, "2021-01-15T20:44:32.000Z");
102+
infoList.remove(2);
103+
infoList.add(info2);
104+
return new GetSslCertificatesResponse(infoList);
105+
default:
106+
return new GetSslCertificatesResponse(Collections.emptyList());
107+
}
108+
}
109+
}
Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,35 @@
1-
[[java-rest-high-security-get-certificates]]
1+
2+
--
3+
:api: get-certificates
4+
:response: GetSslCertificatesResponse
5+
--
6+
7+
8+
[id="{upid}-{api}"]
29
=== SSL Certificate API
310

4-
[[java-rest-high-security-get-certificates-execution]]
5-
==== Execution
11+
[id="{upid}-{api}-request"]
12+
==== Get Certificates Request
613

714
The X.509 Certificates that are used to encrypt communications in an
815
Elasticsearch cluster using the `security().getSslCertificates()` method:
916

1017
["source","java",subs="attributes,callouts,macros"]
1118
--------------------------------------------------
12-
include-tagged::{doc-tests}/SecurityDocumentationIT.java[get-certificates-execute]
19+
include-tagged::{doc-tests}/SecurityDocumentationIT.java[{api}-execute]
1320
--------------------------------------------------
1421

15-
[[java-rest-high-security-get-certificates-response]]
16-
==== Response
22+
[id="{upid}-{api}-response"]
23+
==== Get Certificates Response
1724

18-
The returned `GetSslCertificatesResponse` contains a single field, `certificates`.
25+
The returned +{response}+ contains a single field, `certificates`.
1926
This field, accessed with `getCertificates` returns a List of `CertificateInfo`
2027
objects containing the information for all the certificates used.
2128

2229
["source","java",subs="attributes,callouts,macros"]
2330
--------------------------------------------------
24-
include-tagged::{doc-tests}/SecurityDocumentationIT.java[get-certificates-response]
31+
include-tagged::{doc-tests}/SecurityDocumentationIT.java[{api}-response]
2532
--------------------------------------------------
2633
<1> `certificates` is a List of `CertificateInfo`
2734

28-
[[java-rest-high-security-get-certificates-execute-async]]
29-
==== Asynchronous Execution
30-
31-
This request can be executed asynchronously using the `security().getSslCertificatesAsync()`
32-
method:
33-
34-
["source","java",subs="attributes,callouts,macros"]
35-
--------------------------------------------------
36-
include-tagged::{doc-tests}/SecurityDocumentationIT.java[get-certificates-execute-async]
37-
--------------------------------------------------
38-
<1> The `ActionListener` to use when the execution completes.
39-
40-
The asynchronous method does not block and returns immediately. Once the request
41-
has completed the `ActionListener` is called back using the `onResponse` method
42-
if the execution successfully completed or using the `onFailure` method if
43-
it failed.
44-
45-
A typical listener for a `GetSslCertificatesResponse` looks like:
46-
47-
["source","java",subs="attributes,callouts,macros"]
48-
--------------------------------------------------
49-
include-tagged::{doc-tests}/SecurityDocumentationIT.java[get-certificates-execute-listener]
50-
--------------------------------------------------
51-
<1> Called when the execution is successfully completed. The response is
52-
provided as an argument.
53-
<2> Called in case of failure. The raised exception is provided as an argument.
35+
include::../execution.asciidoc[]

0 commit comments

Comments
 (0)