1010package org .elasticsearch .repositories .url ;
1111
1212import fixture .url .URLFixture ;
13+ import io .netty .handler .codec .http .HttpMethod ;
1314
1415import com .carrotsearch .randomizedtesting .annotations .Name ;
1516import com .carrotsearch .randomizedtesting .annotations .ParametersFactory ;
1617
17- import org .apache .http .HttpEntity ;
18- import org .apache .http .entity .ContentType ;
19- import org .apache .http .nio .entity .NStringEntity ;
2018import org .elasticsearch .client .Request ;
2119import org .elasticsearch .client .Response ;
22- import org .elasticsearch .common .Strings ;
2320import org .elasticsearch .common .settings .Settings ;
2421import org .elasticsearch .common .xcontent .support .XContentMapValues ;
2522import org .elasticsearch .core .PathUtils ;
2623import org .elasticsearch .repositories .fs .FsRepository ;
27- import org .elasticsearch .rest .RestStatus ;
2824import org .elasticsearch .test .cluster .ElasticsearchCluster ;
25+ import org .elasticsearch .test .rest .ESRestTestCase ;
2926import org .elasticsearch .test .rest .yaml .ClientYamlTestCandidate ;
3027import org .elasticsearch .test .rest .yaml .ESClientYamlSuiteTestCase ;
31- import org .elasticsearch .xcontent .ToXContent ;
32- import org .elasticsearch .xcontent .XContentBuilder ;
3328import org .junit .Before ;
3429import org .junit .ClassRule ;
3530import org .junit .rules .RuleChain ;
3631import org .junit .rules .TestRule ;
3732
3833import java .io .IOException ;
39- import java .net .InetAddress ;
4034import java .net .URI ;
41- import java .net .URL ;
4235import java .util .List ;
4336import java .util .Map ;
37+ import java .util .function .UnaryOperator ;
4438
45- import static org .elasticsearch .xcontent .XContentFactory .jsonBuilder ;
46- import static org .hamcrest .Matchers .equalTo ;
4739import static org .hamcrest .Matchers .hasSize ;
4840import static org .hamcrest .Matchers .notNullValue ;
41+ import static org .hamcrest .Matchers .startsWith ;
4942
5043public class RepositoryURLClientYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
5144
@@ -54,7 +47,7 @@ public class RepositoryURLClientYamlTestSuiteIT extends ESClientYamlSuiteTestCas
5447 public static ElasticsearchCluster cluster = ElasticsearchCluster .local ()
5548 .module ("repository-url" )
5649 .setting ("path.repo" , urlFixture ::getRepositoryDir )
57- .setting ("repositories.url.allowed_urls" , () -> "http://snapshot.test*, " + urlFixture .getAddress ())
50+ .setting ("repositories.url.allowed_urls" , () -> "http://snapshot.test*, " + urlFixture .getAddress () + "," + urlFixture . getFtpUrl () )
5851 .build ();
5952
6053 @ ClassRule
@@ -75,11 +68,16 @@ public static Iterable<Object[]> parameters() throws Exception {
7568 }
7669
7770 /**
78- * This method registers 3 snapshot/restore repositories:
79- * - repository-fs: this FS repository is used to create snapshots.
80- * - repository-url: this URL repository is used to restore snapshots created using the previous repository. It uses
81- * the URLFixture to restore snapshots over HTTP.
82- * - repository-file: similar as the previous repository but using a file:// prefix instead of http://.
71+ * This method registers 4 snapshot/restore repositories:
72+ * <ol>
73+ * <li>{@code repository-fs}: this FS repository is used to create snapshots.</li>
74+ * <li>{@code repository-url-http}: this URL repository is used to restore snapshots created using the previous repository. It uses
75+ * the {@link URLFixture} to restore snapshots over HTTP.</li>
76+ * <li>{@code repository-url-file}: similar as the previous repository but using the {@code file://} scheme instead of
77+ * {@code http://}.</li>
78+ * <li>{@code repository-url-ftp}: similar as the previous repository but using the {@code ftp://} scheme instead of
79+ * {@code http://}.</li>
80+ * </ol>
8381 **/
8482 @ Before
8583 public void registerRepositories () throws IOException {
@@ -97,54 +95,25 @@ public void registerRepositories() throws IOException {
9795 final String pathRepo = pathRepos .get (0 );
9896 final URI pathRepoUri = PathUtils .get (pathRepo ).toUri ().normalize ();
9997
100- // Create a FS repository using the path.repo location
101- Request createFsRepositoryRequest = new Request ("PUT" , "/_snapshot/repository-fs" );
102- createFsRepositoryRequest .setEntity (
103- buildRepositorySettings (FsRepository .TYPE , Settings .builder ().put ("location" , pathRepo ).build ())
104- );
105- Response createFsRepositoryResponse = client ().performRequest (createFsRepositoryRequest );
106- assertThat (createFsRepositoryResponse .getStatusLine ().getStatusCode (), equalTo (RestStatus .OK .getStatus ()));
107-
108- // Create a URL repository using the file://{path.repo} URL
109- Request createFileRepositoryRequest = new Request ("PUT" , "/_snapshot/repository-file" );
110- createFileRepositoryRequest .setEntity (
111- buildRepositorySettings ("url" , Settings .builder ().put ("url" , pathRepoUri .toString ()).build ())
112- );
113- Response createFileRepositoryResponse = client ().performRequest (createFileRepositoryRequest );
114- assertThat (createFileRepositoryResponse .getStatusLine ().getStatusCode (), equalTo (RestStatus .OK .getStatus ()));
115-
116- // Create a URL repository using the http://{fixture} URL
117- @ SuppressWarnings ("unchecked" )
118- List <String > allowedUrls = (List <String >) XContentMapValues .extractValue ("defaults.repositories.url.allowed_urls" , clusterSettings );
119- for (String allowedUrl : allowedUrls ) {
120- try {
121- InetAddress inetAddress = InetAddress .getByName (new URL (allowedUrl ).getHost ());
122- if (inetAddress .isAnyLocalAddress () || inetAddress .isLoopbackAddress ()) {
123- Request createUrlRepositoryRequest = new Request ("PUT" , "/_snapshot/repository-url" );
124- createUrlRepositoryRequest .setEntity (buildRepositorySettings ("url" , Settings .builder ().put ("url" , allowedUrl ).build ()));
125- Response createUrlRepositoryResponse = client ().performRequest (createUrlRepositoryRequest );
126- assertThat (createUrlRepositoryResponse .getStatusLine ().getStatusCode (), equalTo (RestStatus .OK .getStatus ()));
127- break ;
128- }
129- } catch (Exception e ) {
130- logger .debug ("Failed to resolve inet address for allowed URL [{}], skipping" , allowedUrl );
131- }
132- }
98+ createRepository ("repository-fs" , FsRepository .TYPE , b -> b .put ("location" , pathRepo ));
99+ createUrlRepository ("file" , pathRepoUri .toString ());
100+ createUrlRepository ("http" , urlFixture .getAddress ());
101+ createUrlRepository ("ftp" , urlFixture .getFtpUrl ());
102+ }
103+
104+ private static void createUrlRepository (final String nameSuffix , final String url ) throws IOException {
105+ assertThat (url , startsWith (nameSuffix + "://" ));
106+ createRepository ("repository-url-" + nameSuffix , URLRepository .TYPE , b -> b .put ("url" , url ));
133107 }
134108
135- private static HttpEntity buildRepositorySettings (final String type , final Settings settings ) throws IOException {
136- try (XContentBuilder builder = jsonBuilder ()) {
137- builder .startObject ();
138- {
139- builder .field ("type" , type );
140- builder .startObject ("settings" );
141- {
142- settings .toXContent (builder , ToXContent .EMPTY_PARAMS );
143- }
144- builder .endObject ();
145- }
109+ private static void createRepository (final String name , final String type , final UnaryOperator <Settings .Builder > settings )
110+ throws IOException {
111+ assertOK (client ().performRequest (ESRestTestCase .newXContentRequest (HttpMethod .PUT , "/_snapshot/" + name , (builder , params ) -> {
112+ builder .field ("type" , type );
113+ builder .startObject ("settings" );
114+ settings .apply (Settings .builder ()).build ().toXContent (builder , params );
146115 builder .endObject ();
147- return new NStringEntity ( Strings . toString ( builder ), ContentType . APPLICATION_JSON ) ;
148- }
116+ return builder ;
117+ })));
149118 }
150119}
0 commit comments