Clean up snapshots after each REST test

The only repository we can be sure is safe to clean is `fs` so we clean
any snapshots in those repositories after each test. Other repositories
like url and azure tend to throw exceptions rather than let us fetch
their contents during the REST test. So we clean what we can....

Closes #18159
This commit is contained in:
Nik Everett 2016-09-14 17:04:51 -04:00
parent 16ed2fb423
commit d0be96df7b
3 changed files with 33 additions and 21 deletions

View File

@ -9,13 +9,6 @@ setup:
settings:
location: "test_repo_get_1_loc"
---
teardown:
- do:
snapshot.delete_repository:
repository: test_repo_get_1
---
"Get snapshot info":

View File

@ -9,13 +9,6 @@ setup:
settings:
location: "test_repo_status_1_loc"
---
teardown:
- do:
snapshot.delete_repository:
repository: test_repo_status_1
---
"Get snapshot status":

View File

@ -55,6 +55,7 @@ import java.util.Set;
import javax.net.ssl.SSLContext;
import static java.util.Collections.singletonMap;
import static java.util.Collections.sort;
import static java.util.Collections.unmodifiableList;
@ -151,9 +152,34 @@ public class ESRestTestCase extends ESTestCase {
// wipe index templates
adminClient().performRequest("DELETE", "_template/*");
// wipe snapshots
// Technically this deletes all repositories and leave the snapshots in the repository. OK.
adminClient().performRequest("DELETE", "_snapshot/*");
wipeSnapshots();
}
/**
* Wipe fs snapshots we created one by one and all repositories so that the next test can create the repositories fresh and they'll
* start empty. There isn't an API to delete all snapshots. There is an API to delete all snapshot repositories but that leaves all of
* the snapshots intact in the repository.
*/
private void wipeSnapshots() throws IOException {
for (Map.Entry<String, ?> repo : entityAsMap(adminClient.performRequest("GET", "_snapshot/_all")).entrySet()) {
String repoName = repo.getKey();
Map<?, ?> repoSpec = (Map<?, ?>) repo.getValue();
String repoType = (String) repoSpec.get("type");
if (repoType.equals("fs")) {
// All other repo types we really don't have a chance of being able to iterate properly, sadly.
String url = "_snapshot/" + repoName + "/_all";
Map<String, String> params = singletonMap("ignore_unavailable", "true");
List<?> snapshots = (List<?>) entityAsMap(adminClient.performRequest("GET", url, params)).get("snapshots");
for (Object snapshot : snapshots) {
Map<?, ?> snapshotInfo = (Map<?, ?>) snapshot;
String name = (String) snapshotInfo.get("snapshot");
logger.debug("wiping snapshot [{}/{}]", repoName, name);
adminClient().performRequest("DELETE", "_snapshot/" + repoName + "/" + name);
}
}
logger.debug("wiping snapshot repository [{}]", repoName);
adminClient().performRequest("DELETE", "_snapshot/" + repoName);
}
}
/**