Skip to content

Commit c723247

Browse files
committed
Add migrate to data stream API in NEST (#5633)
* Add request and response types * Generate NEST code * Add and update tests * Fix test
1 parent 0d5722d commit c723247

File tree

8 files changed

+187
-6
lines changed

8 files changed

+187
-6
lines changed

src/Nest/Descriptors.Indices.cs

+21
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,27 @@ public GetIndexTemplateDescriptor(Names name): base(r => r.Optional("name", name
988988
public GetIndexTemplateDescriptor MasterTimeout(Time mastertimeout) => Qs("master_timeout", mastertimeout);
989989
}
990990

991+
///<summary>Descriptor for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
992+
public partial class MigrateToDataStreamDescriptor : RequestDescriptorBase<MigrateToDataStreamDescriptor, MigrateToDataStreamRequestParameters, IMigrateToDataStreamRequest>, IMigrateToDataStreamRequest
993+
{
994+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
995+
///<summary>/_data_stream/_migrate/{name}</summary>
996+
///<param name = "name">this parameter is required</param>
997+
public MigrateToDataStreamDescriptor(Name name): base(r => r.Required("name", name))
998+
{
999+
}
1000+
1001+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1002+
[SerializationConstructor]
1003+
protected MigrateToDataStreamDescriptor(): base()
1004+
{
1005+
}
1006+
1007+
// values part of the url path
1008+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
1009+
// Request parameters
1010+
}
1011+
9911012
///<summary>Descriptor for Open <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html</para></summary>
9921013
public partial class OpenIndexDescriptor : RequestDescriptorBase<OpenIndexDescriptor, OpenIndexRequestParameters, IOpenIndexRequest>, IOpenIndexRequest
9931014
{

src/Nest/ElasticClient.Indices.cs

+24
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,30 @@ public Task<GetMappingResponse> GetMappingAsync<TDocument>(Func<GetMappingDescri
660660
/// </summary>
661661
public Task<GetIndexTemplateResponse> GetTemplateAsync(IGetIndexTemplateRequest request, CancellationToken ct = default) => DoRequestAsync<IGetIndexTemplateRequest, GetIndexTemplateResponse>(request, request.RequestParameters, ct);
662662
/// <summary>
663+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
664+
/// <para></para>
665+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</a>
666+
/// </summary>
667+
public MigrateToDataStreamResponse MigrateToDataStream(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null) => MigrateToDataStream(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)));
668+
/// <summary>
669+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
670+
/// <para></para>
671+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</a>
672+
/// </summary>
673+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null, CancellationToken ct = default) => MigrateToDataStreamAsync(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)), ct);
674+
/// <summary>
675+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
676+
/// <para></para>
677+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</a>
678+
/// </summary>
679+
public MigrateToDataStreamResponse MigrateToDataStream(IMigrateToDataStreamRequest request) => DoRequest<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters);
680+
/// <summary>
681+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
682+
/// <para></para>
683+
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</a>
684+
/// </summary>
685+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(IMigrateToDataStreamRequest request, CancellationToken ct = default) => DoRequestAsync<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters, ct);
686+
/// <summary>
663687
/// <c>POST</c> request to the <c>indices.open</c> API, read more about this API online:
664688
/// <para></para>
665689
/// <a href = "https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html">https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html</a>

src/Nest/Requests.Indices.cs

+33
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,39 @@ public Time MasterTimeout
17051705
}
17061706
}
17071707

1708+
[InterfaceDataContract]
1709+
public partial interface IMigrateToDataStreamRequest : IRequest<MigrateToDataStreamRequestParameters>
1710+
{
1711+
[IgnoreDataMember]
1712+
Name Name
1713+
{
1714+
get;
1715+
}
1716+
}
1717+
1718+
///<summary>Request for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
1719+
public partial class MigrateToDataStreamRequest : PlainRequestBase<MigrateToDataStreamRequestParameters>, IMigrateToDataStreamRequest
1720+
{
1721+
protected IMigrateToDataStreamRequest Self => this;
1722+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
1723+
///<summary>/_data_stream/_migrate/{name}</summary>
1724+
///<param name = "name">this parameter is required</param>
1725+
public MigrateToDataStreamRequest(Name name): base(r => r.Required("name", name))
1726+
{
1727+
}
1728+
1729+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1730+
[SerializationConstructor]
1731+
protected MigrateToDataStreamRequest(): base()
1732+
{
1733+
}
1734+
1735+
// values part of the url path
1736+
[IgnoreDataMember]
1737+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
1738+
// Request parameters
1739+
}
1740+
17081741
[InterfaceDataContract]
17091742
public partial interface IOpenIndexRequest : IRequest<OpenIndexRequestParameters>
17101743
{
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+
/// Converts an index alias to a data stream.
9+
/// </summary>
10+
[MapsApi("indices.migrate_to_data_stream.json")]
11+
[ReadAs(typeof(MigrateToDataStreamRequest))]
12+
public partial interface IMigrateToDataStreamRequest
13+
{
14+
}
15+
16+
/// <inheritdoc cref="IMigrateToDataStreamRequest"/>
17+
public partial class MigrateToDataStreamRequest : IMigrateToDataStreamRequest
18+
{
19+
}
20+
21+
/// <inheritdoc cref="IMigrateToDataStreamRequest"/>
22+
public partial class MigrateToDataStreamDescriptor
23+
{
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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+
public class MigrateToDataStreamResponse : AcknowledgedResponseBase { }
8+
}

src/Nest/_Generated/ApiUrlsLookup.generated.cs

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ internal static class ApiUrlsLookups
150150
internal static ApiUrls IndicesGetMapping = new ApiUrls(new[]{"_mapping", "{index}/_mapping"});
151151
internal static ApiUrls IndicesGetSettings = new ApiUrls(new[]{"_settings", "{index}/_settings", "{index}/_settings/{name}", "_settings/{name}"});
152152
internal static ApiUrls IndicesGetTemplate = new ApiUrls(new[]{"_template", "_template/{name}"});
153+
internal static ApiUrls IndicesMigrateToDataStream = new ApiUrls(new[]{"_data_stream/_migrate/{name}"});
153154
internal static ApiUrls IndicesOpen = new ApiUrls(new[]{"{index}/_open"});
154155
internal static ApiUrls IndicesPutAlias = new ApiUrls(new[]{"{index}/_alias/{name}"});
155156
internal static ApiUrls IndicesPutMapping = new ApiUrls(new[]{"{index}/_mapping"});

tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs

+57-6
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace Tests.XPack.DataStreams
3737
[SkipVersion("<7.9.0", "Introduced in 7.9.0")]
3838
public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluster>
3939
{
40-
private static readonly Metric Document = new Metric
40+
private static readonly Metric Document = new()
4141
{
4242
Timestamp = new DateTime(2020, 8, 3, 14, 0, 0, DateTimeKind.Utc),
4343
Accept = 3,
@@ -47,13 +47,16 @@ public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluste
4747
Response = 300,
4848
Total = 3
4949
};
50-
50+
5151
private const string CreateDataStreamStep = nameof(CreateDataStreamStep);
5252
private const string IndexStep = nameof(IndexStep);
5353
private const string GetDataStreamStep = nameof(GetDataStreamStep);
5454
private const string PutIndexTemplateStep = nameof(PutIndexTemplateStep);
5555
private const string DataStreamsStatsStep = nameof(DataStreamsStatsStep);
5656
private const string DeleteDataStreamStep = nameof(DeleteDataStreamStep);
57+
private const string PrepareIndexStep = nameof(PrepareIndexStep);
58+
private const string PrepareAliasStep = nameof(PrepareAliasStep);
59+
private const string MigrateToDataStreamStep = nameof(MigrateToDataStreamStep);
5760

5861
public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(new CoordinatedUsage(cluster, usage, testOnlyOne: true)
5962
{
@@ -109,10 +112,10 @@ public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(
109112
Refresh = Refresh.WaitFor
110113
},
111114
(v, d) => d.Index(v).Refresh(Refresh.WaitFor),
112-
(v, c, f) => c.Index<Metric>(Document, f),
113-
(v, c, f) => c.IndexAsync<Metric>(Document, f),
114-
(v, c, r) => c.Index<Metric>(r),
115-
(v, c, r) => c.IndexAsync<Metric>(r)
115+
(v, c, f) => c.Index(Document, f),
116+
(v, c, f) => c.IndexAsync(Document, f),
117+
(v, c, r) => c.Index(r),
118+
(v, c, r) => c.IndexAsync(r)
116119
)
117120
},
118121
{GetDataStreamStep, u =>
@@ -145,6 +148,48 @@ public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(
145148
(v, c, r) => c.Indices.DeleteDataStreamAsync(r)
146149
)
147150
},
151+
// Used for migrate step
152+
{PrepareIndexStep, ">= 7.13.0", u =>
153+
u.Calls<CreateIndexDescriptor, CreateIndexRequest, ICreateIndexRequest, CreateIndexResponse>(
154+
v => new CreateIndexRequest($"my-index{v}-test")
155+
{
156+
Mappings = new TypeMapping
157+
{
158+
Properties = new Properties
159+
{
160+
{ "@timestamp", new DateNanosProperty() }
161+
}
162+
}
163+
},
164+
(v, d) => d.Map(m=> m.Properties(p=> p.DateNanos(dn => dn.Name("@timestamp")))),
165+
(v, c, f) => c.Indices.Create($"my-index{v}-test", f),
166+
(v, c, f) => c.Indices.CreateAsync($"my-index{v}-test", f),
167+
(v, c, r) => c.Indices.Create(r),
168+
(v, c, r) => c.Indices.CreateAsync(r)
169+
)
170+
},
171+
// Used for migrate step
172+
{PrepareAliasStep,">= 7.13.0", u =>
173+
u.Calls<PutAliasDescriptor, PutAliasRequest, IPutAliasRequest, PutAliasResponse>(
174+
v => new PutAliasRequest($"my-index{v}-test", $"{v}-alias"),
175+
(v, d) => d,
176+
(v, c, f) => c.Indices.PutAlias($"my-index{v}-test", $"{v}-alias", f),
177+
(v, c, f) => c.Indices.PutAliasAsync($"my-index{v}-test", $"{v}-alias", f),
178+
(v, c, r) => c.Indices.PutAlias(r),
179+
(v, c, r) => c.Indices.PutAliasAsync(r)
180+
)
181+
},
182+
// Migrate to data stream added in 7.13.0
183+
{MigrateToDataStreamStep,">= 7.13.0", u =>
184+
u.Calls<MigrateToDataStreamDescriptor, MigrateToDataStreamRequest, IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(
185+
v => new MigrateToDataStreamRequest($"{v}-alias"),
186+
(v, d) => d,
187+
(v, c, f) => c.Indices.MigrateToDataStream($"{v}-alias", f),
188+
(v, c, f) => c.Indices.MigrateToDataStreamAsync($"{v}-alias", f),
189+
(v, c, r) => c.Indices.MigrateToDataStream(r),
190+
(v, c, r) => c.Indices.MigrateToDataStreamAsync(r)
191+
)
192+
},
148193
}) { }
149194

150195
[I] public async Task CreateDataStreamResponse() => await Assert<CreateDataStreamResponse>(CreateDataStreamStep, (v, r) =>
@@ -199,5 +244,11 @@ [I] public async Task DeleteDataStreamResponse() => await Assert<DeleteDataStrea
199244
r.ShouldBeValid();
200245
r.Acknowledged.Should().BeTrue();
201246
});
247+
248+
[I] public async Task MigrateToDataStreamResponse() => await Assert<MigrateToDataStreamResponse>(MigrateToDataStreamStep, r =>
249+
{
250+
r.ShouldBeValid();
251+
r.Acknowledged.Should().BeTrue();
252+
});
202253
}
203254
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Threading.Tasks;
2+
using Elastic.Elasticsearch.Xunit.XunitPlumbing;
3+
using Nest;
4+
using Tests.Framework.EndpointTests;
5+
using static Tests.Framework.EndpointTests.UrlTester;
6+
7+
namespace Tests.XPack.DataStreams.Migrate
8+
{
9+
public class MigrateToDataStreamUrlTests : UrlTestsBase
10+
{
11+
[U]
12+
public override async Task Urls() => await POST("/_data_stream/_migrate/stream")
13+
.Fluent(c => c.Indices.MigrateToDataStream("stream", f => f))
14+
.Request(c => c.Indices.MigrateToDataStream(new MigrateToDataStreamRequest("stream")))
15+
.FluentAsync(c => c.Indices.MigrateToDataStreamAsync("stream", f => f))
16+
.RequestAsync(c => c.Indices.MigrateToDataStreamAsync(new MigrateToDataStreamRequest("stream")));
17+
}
18+
}

0 commit comments

Comments
 (0)