-
Notifications
You must be signed in to change notification settings - Fork 24.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Create Snapshot to High-Level Rest Client #31215
Changes from 19 commits
92acd76
77cb270
346fb6a
13144c9
77fc66b
baa4d49
5ebf689
84b6e40
a1e50d5
2a7665c
9879a28
891b2a0
04b568e
c664596
5ea58ec
226339c
760ed40
7aaaf95
3122f47
0aaa589
ffbf58d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -37,6 +37,7 @@ | |
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest; | ||
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest; | ||
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest; | ||
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptRequest; | ||
|
@@ -1943,6 +1944,22 @@ public void testVerifyRepository() { | |
assertThat(expectedParams, equalTo(request.getParameters())); | ||
} | ||
|
||
public void testCreateSnapshot() throws IOException { | ||
Map<String, String> expectedParams = new HashMap<>(); | ||
String repository = randomIndicesNames(1, 1)[0]; | ||
String snapshot = "snapshot-" + generateRandomStringArray(1, randomInt(10), false, false)[0]; | ||
String endpoint = "/_snapshot/" + repository + "/" + snapshot; | ||
|
||
CreateSnapshotRequest createSnapshotRequest = new CreateSnapshotRequest(repository, snapshot); | ||
setRandomMasterTimeout(createSnapshotRequest, expectedParams); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can u also add a set to the withWaitForCompletion There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call, added. |
||
|
||
Request request = RequestConverters.createSnapshot(createSnapshotRequest); | ||
assertThat(endpoint, equalTo(request.getEndpoint())); | ||
assertThat(HttpPut.METHOD_NAME, equalTo(request.getMethod())); | ||
assertThat(expectedParams, equalTo(request.getParameters())); | ||
assertToXContentBody(createSnapshotRequest, request.getEntity()); | ||
} | ||
|
||
public void testDeleteSnapshot() { | ||
Map<String, String> expectedParams = new HashMap<>(); | ||
String repository = randomIndicesNames(1, 1)[0]; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,14 +28,15 @@ | |
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse; | ||
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest; | ||
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse; | ||
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotResponse; | ||
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotResponse; | ||
import org.elasticsearch.common.xcontent.XContentType; | ||
import org.elasticsearch.repositories.fs.FsRepository; | ||
import org.elasticsearch.rest.RestStatus; | ||
|
||
import java.io.IOException; | ||
import java.util.Locale; | ||
|
||
import static org.hamcrest.Matchers.equalTo; | ||
|
||
|
@@ -49,12 +50,12 @@ private PutRepositoryResponse createTestRepository(String repository, String typ | |
highLevelClient().snapshot()::createRepositoryAsync); | ||
} | ||
|
||
private Response createTestSnapshot(String repository, String snapshot) throws IOException { | ||
Request createSnapshot = new Request("put", String.format(Locale.ROOT, "_snapshot/%s/%s", repository, snapshot)); | ||
createSnapshot.addParameter("wait_for_completion", "true"); | ||
return highLevelClient().getLowLevelClient().performRequest(createSnapshot); | ||
} | ||
private CreateSnapshotResponse createTestSnapshot(CreateSnapshotRequest createSnapshotRequest) throws IOException { | ||
// assumes the repository already exists | ||
|
||
return execute(createSnapshotRequest, highLevelClient().snapshot()::createSnapshot, | ||
highLevelClient().snapshot()::createSnapshotAsync); | ||
} | ||
|
||
public void testCreateRepository() throws IOException { | ||
PutRepositoryResponse response = createTestRepository("test", FsRepository.TYPE, "{\"location\": \".\"}"); | ||
|
@@ -119,16 +120,33 @@ public void testVerifyRepository() throws IOException { | |
assertThat(response.getNodes().size(), equalTo(1)); | ||
} | ||
|
||
public void testCreateSnapshot() throws IOException { | ||
String repository = "test_repository"; | ||
assertTrue(createTestRepository(repository, FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged()); | ||
|
||
String snapshot = "test_snapshot"; | ||
CreateSnapshotRequest request = new CreateSnapshotRequest(repository, snapshot); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we should add more of the options here, randomly with some There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added several random booleans for options where it made sense. |
||
boolean waitForCompletion = randomBoolean(); | ||
request.waitForCompletion(waitForCompletion); | ||
request.partial(randomBoolean()); | ||
request.includeGlobalState(randomBoolean()); | ||
|
||
CreateSnapshotResponse response = createTestSnapshot(request); | ||
assertEquals(waitForCompletion ? RestStatus.OK : RestStatus.ACCEPTED, response.status()); | ||
} | ||
|
||
public void testDeleteSnapshot() throws IOException { | ||
String repository = "test_repository"; | ||
String snapshot = "test_snapshot"; | ||
|
||
PutRepositoryResponse putRepositoryResponse = createTestRepository(repository, FsRepository.TYPE, "{\"location\": \".\"}"); | ||
assertTrue(putRepositoryResponse.isAcknowledged()); | ||
|
||
Response putSnapshotResponse = createTestSnapshot(repository, snapshot); | ||
CreateSnapshotRequest createSnapshotRequest = new CreateSnapshotRequest(repository, snapshot); | ||
createSnapshotRequest.waitForCompletion(true); | ||
CreateSnapshotResponse createSnapshotResponse = createTestSnapshot(createSnapshotRequest); | ||
// check that the request went ok without parsing JSON here. When using the high level client, check acknowledgement instead. | ||
assertEquals(200, putSnapshotResponse.getStatusLine().getStatusCode()); | ||
assertEquals(RestStatus.OK, createSnapshotResponse.status()); | ||
|
||
DeleteSnapshotRequest request = new DeleteSnapshotRequest(repository, snapshot); | ||
DeleteSnapshotResponse response = execute(request, highLevelClient().snapshot()::delete, highLevelClient().snapshot()::deleteAsync); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,6 +29,10 @@ | |
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse; | ||
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest; | ||
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse; | ||
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotResponse; | ||
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; | ||
import org.elasticsearch.action.support.IndicesOptions; | ||
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotRequest; | ||
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotResponse; | ||
import org.elasticsearch.client.ESRestHighLevelClientTestCase; | ||
|
@@ -41,6 +45,7 @@ | |
import org.elasticsearch.common.unit.TimeValue; | ||
import org.elasticsearch.common.xcontent.XContentType; | ||
import org.elasticsearch.repositories.fs.FsRepository; | ||
import org.elasticsearch.rest.RestStatus; | ||
|
||
import java.io.IOException; | ||
import java.util.HashMap; | ||
|
@@ -367,6 +372,90 @@ public void onFailure(Exception e) { | |
} | ||
} | ||
|
||
public void testSnapshotCreate() throws IOException { | ||
RestHighLevelClient client = highLevelClient(); | ||
|
||
CreateIndexRequest createIndexRequest = new CreateIndexRequest("test-index0"); | ||
client.indices().create(createIndexRequest, RequestOptions.DEFAULT); | ||
createIndexRequest = new CreateIndexRequest("test-index1"); | ||
client.indices().create(createIndexRequest, RequestOptions.DEFAULT); | ||
|
||
createTestRepositories(); | ||
|
||
// tag::create-snapshot-request | ||
CreateSnapshotRequest request = new CreateSnapshotRequest(); | ||
// end::create-snapshot-request | ||
|
||
// tag::create-snapshot-request-repositoryName | ||
request.repository(repositoryName); // <1> | ||
// end::create-snapshot-request-repositoryName | ||
// tag::create-snapshot-request-snapshotName | ||
request.snapshot(snapshotName); // <1> | ||
// end::create-snapshot-request-snapshotName | ||
// tag::create-snapshot-request-indices | ||
request.indices("test-index0", "test-index1"); // <1> | ||
// end::create-snapshot-request-indices | ||
// tag::create-snapshot-request-indicesOptions | ||
request.indicesOptions(IndicesOptions.fromOptions(false, false, true, true)); // <1> | ||
// end::create-snapshot-request-indicesOptions | ||
// tag::create-snapshot-request-partial | ||
request.partial(false); // <1> | ||
// end::create-snapshot-request-partial | ||
// tag::create-snapshot-request-includeGlobalState | ||
request.includeGlobalState(true); // <1> | ||
// end::create-snapshot-request-includeGlobalState | ||
|
||
// tag::create-snapshot-request-masterTimeout | ||
request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1> | ||
request.masterNodeTimeout("1m"); // <2> | ||
// end::create-snapshot-request-masterTimeout | ||
// tag::create-snapshot-request-waitForCompletion | ||
request.waitForCompletion(true); // <1> | ||
// end::create-snapshot-request-waitForCompletion | ||
|
||
// tag::create-snapshot-execute | ||
CreateSnapshotResponse response = client.snapshot().createSnapshot(request, RequestOptions.DEFAULT); | ||
// end::create-snapshot-execute | ||
|
||
// tag::create-snapshot-response | ||
RestStatus status = response.status(); // <1> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jdconrad can you please expand on what can be done with the response other than looking at the status? We also return the SnapshotInfo right? That seems like an interesting thing to document for users. |
||
// end::create-snapshot-response | ||
|
||
assertEquals(RestStatus.OK, status); | ||
} | ||
|
||
public void testSnapshotCreateAsync() throws InterruptedException { | ||
RestHighLevelClient client = highLevelClient(); | ||
{ | ||
CreateSnapshotRequest request = new CreateSnapshotRequest(repositoryName, snapshotName); | ||
|
||
// tag::create-snapshot-execute-listener | ||
ActionListener<CreateSnapshotResponse> listener = | ||
new ActionListener<CreateSnapshotResponse>() { | ||
@Override | ||
public void onResponse(CreateSnapshotResponse createSnapshotResponse) { | ||
// <1> | ||
} | ||
|
||
@Override | ||
public void onFailure(Exception exception) { | ||
// <2> | ||
} | ||
}; | ||
// end::create-snapshot-execute-listener | ||
|
||
// Replace the empty listener by a blocking listener in test | ||
final CountDownLatch latch = new CountDownLatch(1); | ||
listener = new LatchedActionListener<>(listener, latch); | ||
|
||
// tag::create-snapshot-execute-async | ||
client.snapshot().createSnapshotAsync(request, RequestOptions.DEFAULT, listener); // <1> | ||
// end::create-snapshot-execute-async | ||
|
||
assertTrue(latch.await(30L, TimeUnit.SECONDS)); | ||
} | ||
} | ||
|
||
public void testSnapshotDeleteSnapshot() throws IOException { | ||
RestHighLevelClient client = highLevelClient(); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are a few extra options i see in the transport layer. Lets make sure we account for all these params / optional things.
https://github.com/elastic/elasticsearch/blob/master/server/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/TransportCreateSnapshotAction.java#L76-L82
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All of these should be covered as they end up as part of the content body including partial, indices, global_state, and settings.