Skip to content

Commit 3af09ad

Browse files
Add indices resolve index API (#4874) (#4906)
This commit adds the indices resolve index API to the high level client. Co-authored-by: Russ Cam <[email protected]>
1 parent 91d6466 commit 3af09ad

File tree

9 files changed

+280
-1
lines changed

9 files changed

+280
-1
lines changed

src/ApiGenerator/Configuration/CodeConfiguration.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public static class CodeConfiguration
3535

3636
public static string[] IgnoredApisHighLevel { get; } =
3737
{
38-
"indices.resolve_index.json", // TODO: implement
3938
"security.clear_cached_privileges.json", // TODO: implement
4039

4140
"autoscaling.get_autoscaling_decision.json", // 7.7 experimental

src/Nest/Descriptors.Indices.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,29 @@ public ReloadSearchAnalyzersDescriptor Index<TOther>()
11941194
public ReloadSearchAnalyzersDescriptor IgnoreUnavailable(bool? ignoreunavailable = true) => Qs("ignore_unavailable", ignoreunavailable);
11951195
}
11961196

1197+
///<summary>Descriptor for Resolve <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</para></summary>
1198+
public partial class ResolveIndexDescriptor : RequestDescriptorBase<ResolveIndexDescriptor, ResolveIndexRequestParameters, IResolveIndexRequest>, IResolveIndexRequest
1199+
{
1200+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesResolve;
1201+
///<summary>/_resolve/index/{name}</summary>
1202+
///<param name = "name">this parameter is required</param>
1203+
public ResolveIndexDescriptor(Names name): base(r => r.Required("name", name))
1204+
{
1205+
}
1206+
1207+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1208+
[SerializationConstructor]
1209+
protected ResolveIndexDescriptor(): base()
1210+
{
1211+
}
1212+
1213+
// values part of the url path
1214+
Names IResolveIndexRequest.Name => Self.RouteValues.Get<Names>("name");
1215+
// Request parameters
1216+
///<summary>Whether wildcard expressions should get expanded to open or closed indices (default: open)</summary>
1217+
public ResolveIndexDescriptor ExpandWildcards(ExpandWildcards? expandwildcards) => Qs("expand_wildcards", expandwildcards);
1218+
}
1219+
11971220
///<summary>Descriptor for Rollover <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-rollover-index.html</para></summary>
11981221
public partial class RolloverIndexDescriptor : RequestDescriptorBase<RolloverIndexDescriptor, RolloverIndexRequestParameters, IRolloverIndexRequest>, IRolloverIndexRequest
11991222
{

src/Nest/ElasticClient.Indices.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,30 @@ public Task<PutMappingResponse> PutMappingAsync<TDocument>(Func<PutMappingDescri
787787
/// </summary>
788788
public Task<ReloadSearchAnalyzersResponse> ReloadSearchAnalyzersAsync(IReloadSearchAnalyzersRequest request, CancellationToken ct = default) => DoRequestAsync<IReloadSearchAnalyzersRequest, ReloadSearchAnalyzersResponse>(request, request.RequestParameters, ct);
789789
/// <summary>
790+
/// <c>GET</c> request to the <c>indices.resolve_index</c> API, read more about this API online:
791+
/// <para></para>
792+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</a>
793+
/// </summary>
794+
public ResolveIndexResponse Resolve(Names name, Func<ResolveIndexDescriptor, IResolveIndexRequest> selector = null) => Resolve(selector.InvokeOrDefault(new ResolveIndexDescriptor(name: name)));
795+
/// <summary>
796+
/// <c>GET</c> request to the <c>indices.resolve_index</c> API, read more about this API online:
797+
/// <para></para>
798+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</a>
799+
/// </summary>
800+
public Task<ResolveIndexResponse> ResolveAsync(Names name, Func<ResolveIndexDescriptor, IResolveIndexRequest> selector = null, CancellationToken ct = default) => ResolveAsync(selector.InvokeOrDefault(new ResolveIndexDescriptor(name: name)), ct);
801+
/// <summary>
802+
/// <c>GET</c> request to the <c>indices.resolve_index</c> API, read more about this API online:
803+
/// <para></para>
804+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</a>
805+
/// </summary>
806+
public ResolveIndexResponse Resolve(IResolveIndexRequest request) => DoRequest<IResolveIndexRequest, ResolveIndexResponse>(request, request.RequestParameters);
807+
/// <summary>
808+
/// <c>GET</c> request to the <c>indices.resolve_index</c> API, read more about this API online:
809+
/// <para></para>
810+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</a>
811+
/// </summary>
812+
public Task<ResolveIndexResponse> ResolveAsync(IResolveIndexRequest request, CancellationToken ct = default) => DoRequestAsync<IResolveIndexRequest, ResolveIndexResponse>(request, request.RequestParameters, ct);
813+
/// <summary>
790814
/// <c>POST</c> request to the <c>indices.rollover</c> API, read more about this API online:
791815
/// <para></para>
792816
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-rollover-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-rollover-index.html</a>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
namespace Nest
6+
{
7+
/// <summary>
8+
/// A request to the resolve index API
9+
/// </summary>
10+
[MapsApi("indices.resolve_index.json")]
11+
[ReadAs(typeof(ResolveIndexRequest))]
12+
public partial interface IResolveIndexRequest
13+
{
14+
}
15+
16+
/// <inheritdoc cref="IResolveIndexRequest" />
17+
public partial class ResolveIndexRequest
18+
{
19+
}
20+
21+
/// <inheritdoc cref="IResolveIndexRequest" />
22+
public partial class ResolveIndexDescriptor
23+
{
24+
}
25+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using System.Collections.Generic;
6+
using System.Runtime.Serialization;
7+
using Elasticsearch.Net;
8+
9+
namespace Nest
10+
{
11+
public class ResolveIndexResponse : ResponseBase
12+
{
13+
[DataMember(Name = "indices")]
14+
public IReadOnlyCollection<ResolvedIndex> Indices { get; internal set; } = EmptyReadOnly<ResolvedIndex>.Collection;
15+
16+
[DataMember(Name = "aliases")]
17+
public IReadOnlyCollection<ResolvedAlias> Aliases { get; internal set; } = EmptyReadOnly<ResolvedAlias>.Collection;
18+
19+
[DataMember(Name = "data_streams")]
20+
public IReadOnlyCollection<ResolvedDataStream> DataStreams { get; internal set; } = EmptyReadOnly<ResolvedDataStream>.Collection;
21+
}
22+
23+
public class ResolvedIndex
24+
{
25+
[DataMember(Name = "name")]
26+
public string Name { get; internal set; }
27+
28+
[DataMember(Name = "aliases")]
29+
public IReadOnlyCollection<string> Aliases { get; internal set; }
30+
31+
[DataMember(Name = "attributes")]
32+
public IReadOnlyCollection<string> Attributes { get; internal set; }
33+
34+
[DataMember(Name = "data_stream")]
35+
public string DataStream { get; internal set; }
36+
}
37+
38+
public class ResolvedAlias
39+
{
40+
[DataMember(Name = "name")]
41+
public string Name { get; internal set; }
42+
43+
[DataMember(Name = "indices")]
44+
public IReadOnlyCollection<string> Indices { get; internal set; }
45+
}
46+
47+
public class ResolvedDataStream
48+
{
49+
[DataMember(Name = "name")]
50+
public string Name { get; internal set; }
51+
52+
[DataMember(Name = "backing_indices")]
53+
public IReadOnlyCollection<string> BackingIndices { get; internal set; }
54+
55+
[DataMember(Name = "timestamp_field")]
56+
public string TimestampField { get; internal set; }
57+
}
58+
}

src/Nest/Requests.Indices.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,6 +2198,46 @@ public bool? IgnoreUnavailable
21982198
}
21992199
}
22002200

2201+
[InterfaceDataContract]
2202+
public partial interface IResolveIndexRequest : IRequest<ResolveIndexRequestParameters>
2203+
{
2204+
[IgnoreDataMember]
2205+
Names Name
2206+
{
2207+
get;
2208+
}
2209+
}
2210+
2211+
///<summary>Request for Resolve <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-resolve-index.html</para></summary>
2212+
///<remarks>Note: Experimental within the Elasticsearch server, this functionality is experimental and may be changed or removed completely in a future release. Elastic will take a best effort approach to fix any issues, but experimental features are not subject to the support SLA of official GA features.</remarks>
2213+
public partial class ResolveIndexRequest : PlainRequestBase<ResolveIndexRequestParameters>, IResolveIndexRequest
2214+
{
2215+
protected IResolveIndexRequest Self => this;
2216+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesResolve;
2217+
///<summary>/_resolve/index/{name}</summary>
2218+
///<param name = "name">this parameter is required</param>
2219+
public ResolveIndexRequest(Names name): base(r => r.Required("name", name))
2220+
{
2221+
}
2222+
2223+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
2224+
[SerializationConstructor]
2225+
protected ResolveIndexRequest(): base()
2226+
{
2227+
}
2228+
2229+
// values part of the url path
2230+
[IgnoreDataMember]
2231+
Names IResolveIndexRequest.Name => Self.RouteValues.Get<Names>("name");
2232+
// Request parameters
2233+
///<summary>Whether wildcard expressions should get expanded to open or closed indices (default: open)</summary>
2234+
public ExpandWildcards? ExpandWildcards
2235+
{
2236+
get => Q<ExpandWildcards? >("expand_wildcards");
2237+
set => Q("expand_wildcards", value);
2238+
}
2239+
}
2240+
22012241
[InterfaceDataContract]
22022242
public partial interface IRolloverIndexRequest : IRequest<RolloverIndexRequestParameters>
22032243
{

src/Nest/_Generated/ApiUrlsLookup.generated.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ internal static class ApiUrlsLookups
136136
internal static ApiUrls IndicesRecoveryStatus = new ApiUrls(new[]{"_recovery", "{index}/_recovery"});
137137
internal static ApiUrls IndicesRefresh = new ApiUrls(new[]{"_refresh", "{index}/_refresh"});
138138
internal static ApiUrls IndicesReloadSearchAnalyzers = new ApiUrls(new[]{"{index}/_reload_search_analyzers"});
139+
internal static ApiUrls IndicesResolve = new ApiUrls(new[]{"_resolve/index/{name}"});
139140
internal static ApiUrls IndicesRollover = new ApiUrls(new[]{"{alias}/_rollover", "{alias}/_rollover/{new_index}"});
140141
internal static ApiUrls IndicesSegments = new ApiUrls(new[]{"_segments", "{index}/_segments"});
141142
internal static ApiUrls IndicesShardStores = new ApiUrls(new[]{"_shard_stores", "{index}/_shard_stores"});
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using Elastic.Elasticsearch.Xunit.XunitPlumbing;
9+
using Elasticsearch.Net;
10+
using FluentAssertions;
11+
using Nest;
12+
using Tests.Core.Extensions;
13+
using Tests.Core.ManagedElasticsearch.Clusters;
14+
using Tests.Framework.EndpointTests;
15+
using Tests.Framework.EndpointTests.TestState;
16+
17+
namespace Tests.Indices.IndexManagement.ResolveIndex
18+
{
19+
[SkipVersion("<7.9.0", "resolve index introduced in 7.9.0")]
20+
public class ResolveIndexApiTests
21+
: ApiIntegrationTestBase<WritableCluster, ResolveIndexResponse, IResolveIndexRequest, ResolveIndexDescriptor, ResolveIndexRequest>
22+
{
23+
public ResolveIndexApiTests(WritableCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
24+
25+
protected override void IntegrationSetup(IElasticClient client, CallUniqueValues values)
26+
{
27+
foreach (var value in values)
28+
{
29+
var createIndexResponse = client.Indices.Create(value.Value, c => c
30+
.Settings(s => s
31+
.NumberOfShards(1)
32+
.NumberOfReplicas(0)
33+
)
34+
.Aliases(a => a
35+
.Alias(value.Value + "-alias")
36+
)
37+
);
38+
39+
if (!createIndexResponse.IsValid)
40+
throw new Exception($"exception whilst setting up integration test: {createIndexResponse.DebugInformation}");
41+
42+
var clusterResponse = client.Cluster.Health(value.Value, c => c.WaitForStatus(WaitForStatus.Green));
43+
44+
if (!clusterResponse.IsValid)
45+
throw new Exception($"exception whilst setting up integration test: {clusterResponse.DebugInformation}");
46+
}
47+
}
48+
49+
protected override bool ExpectIsValid => true;
50+
51+
protected override int ExpectStatusCode => 200;
52+
53+
protected override Func<ResolveIndexDescriptor, IResolveIndexRequest> Fluent => d => d;
54+
55+
protected override HttpMethod HttpMethod => HttpMethod.GET;
56+
57+
protected override ResolveIndexRequest Initializer => new ResolveIndexRequest($"{CallIsolatedValue}*");
58+
59+
protected override string UrlPath => $"/_resolve/index/{CallIsolatedValue}%2A";
60+
61+
protected override LazyResponses ClientUsage() => Calls(
62+
(client, f) => client.Indices.Resolve($"{CallIsolatedValue}*", f),
63+
(client, f) => client.Indices.ResolveAsync($"{CallIsolatedValue}*", f),
64+
(client, r) => client.Indices.Resolve(r),
65+
(client, r) => client.Indices.ResolveAsync(r)
66+
);
67+
68+
protected override ResolveIndexDescriptor NewDescriptor() => new ResolveIndexDescriptor($"{CallIsolatedValue}*");
69+
70+
protected override void ExpectResponse(ResolveIndexResponse response)
71+
{
72+
response.ShouldBeValid();
73+
response.Indices.Should().HaveCount(1);
74+
var resolvedIndex = response.Indices.First();
75+
resolvedIndex.Name.Should().Be(CallIsolatedValue);
76+
resolvedIndex.Aliases.Should().Contain(CallIsolatedValue + "-alias");
77+
resolvedIndex.Attributes.Should().Contain("open");
78+
var resolvedAlias = response.Aliases.First();
79+
resolvedAlias.Name.Should().Be(CallIsolatedValue + "-alias");
80+
resolvedAlias.Indices.Should().Contain(CallIsolatedValue);
81+
}
82+
}
83+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using System.Threading.Tasks;
6+
using Elastic.Elasticsearch.Xunit.XunitPlumbing;
7+
using Nest;
8+
using Tests.Framework.EndpointTests;
9+
using static Tests.Framework.EndpointTests.UrlTester;
10+
11+
namespace Tests.Indices.IndexManagement.ResolveIndex
12+
{
13+
public class ResolveIndexUrlTests
14+
{
15+
[U] public async Task Urls()
16+
{
17+
var index = "index1";
18+
await GET($"/_resolve/index/{index}")
19+
.Fluent(c => c.Indices.Resolve(index))
20+
.Request(c => c.Indices.Resolve(new ResolveIndexRequest(index)))
21+
.FluentAsync(c => c.Indices.ResolveAsync(index))
22+
.RequestAsync(c => c.Indices.ResolveAsync(new ResolveIndexRequest(index)))
23+
;
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)