Skip to content

Commit 145a500

Browse files
authored
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 2c46a10 commit 145a500

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
@@ -1000,6 +1000,27 @@ public GetIndexTemplateDescriptor(Names name): base(r => r.Optional("name", name
10001000
public GetIndexTemplateDescriptor MasterTimeout(Time mastertimeout) => Qs("master_timeout", mastertimeout);
10011001
}
10021002

1003+
///<summary>Descriptor for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
1004+
public partial class MigrateToDataStreamDescriptor : RequestDescriptorBase<MigrateToDataStreamDescriptor, MigrateToDataStreamRequestParameters, IMigrateToDataStreamRequest>, IMigrateToDataStreamRequest
1005+
{
1006+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
1007+
///<summary>/_data_stream/_migrate/{name}</summary>
1008+
///<param name = "name">this parameter is required</param>
1009+
public MigrateToDataStreamDescriptor(Name name): base(r => r.Required("name", name))
1010+
{
1011+
}
1012+
1013+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1014+
[SerializationConstructor]
1015+
protected MigrateToDataStreamDescriptor(): base()
1016+
{
1017+
}
1018+
1019+
// values part of the url path
1020+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
1021+
// Request parameters
1022+
}
1023+
10031024
///<summary>Descriptor for Open <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html</para></summary>
10041025
public partial class OpenIndexDescriptor : RequestDescriptorBase<OpenIndexDescriptor, OpenIndexRequestParameters, IOpenIndexRequest>, IOpenIndexRequest
10051026
{

src/Nest/ElasticClient.Indices.cs

+24
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,30 @@ public Task<GetMappingResponse> GetMappingAsync<TDocument>(Func<GetMappingDescri
689689
/// </summary>
690690
public Task<GetIndexTemplateResponse> GetTemplateAsync(IGetIndexTemplateRequest request, CancellationToken ct = default) => DoRequestAsync<IGetIndexTemplateRequest, GetIndexTemplateResponse>(request, request.RequestParameters, ct);
691691
/// <summary>
692+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
693+
/// <para></para>
694+
/// <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>
695+
/// </summary>
696+
public MigrateToDataStreamResponse MigrateToDataStream(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null) => MigrateToDataStream(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)));
697+
/// <summary>
698+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
699+
/// <para></para>
700+
/// <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>
701+
/// </summary>
702+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null, CancellationToken ct = default) => MigrateToDataStreamAsync(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)), ct);
703+
/// <summary>
704+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
705+
/// <para></para>
706+
/// <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>
707+
/// </summary>
708+
public MigrateToDataStreamResponse MigrateToDataStream(IMigrateToDataStreamRequest request) => DoRequest<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters);
709+
/// <summary>
710+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
711+
/// <para></para>
712+
/// <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>
713+
/// </summary>
714+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(IMigrateToDataStreamRequest request, CancellationToken ct = default) => DoRequestAsync<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters, ct);
715+
/// <summary>
692716
/// <c>POST</c> request to the <c>indices.open</c> API, read more about this API online:
693717
/// <para></para>
694718
/// <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
@@ -1800,6 +1800,39 @@ public Time MasterTimeout
18001800
}
18011801
}
18021802

1803+
[InterfaceDataContract]
1804+
public partial interface IMigrateToDataStreamRequest : IRequest<MigrateToDataStreamRequestParameters>
1805+
{
1806+
[IgnoreDataMember]
1807+
Name Name
1808+
{
1809+
get;
1810+
}
1811+
}
1812+
1813+
///<summary>Request for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
1814+
public partial class MigrateToDataStreamRequest : PlainRequestBase<MigrateToDataStreamRequestParameters>, IMigrateToDataStreamRequest
1815+
{
1816+
protected IMigrateToDataStreamRequest Self => this;
1817+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
1818+
///<summary>/_data_stream/_migrate/{name}</summary>
1819+
///<param name = "name">this parameter is required</param>
1820+
public MigrateToDataStreamRequest(Name name): base(r => r.Required("name", name))
1821+
{
1822+
}
1823+
1824+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1825+
[SerializationConstructor]
1826+
protected MigrateToDataStreamRequest(): base()
1827+
{
1828+
}
1829+
1830+
// values part of the url path
1831+
[IgnoreDataMember]
1832+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
1833+
// Request parameters
1834+
}
1835+
18031836
[InterfaceDataContract]
18041837
public partial interface IOpenIndexRequest : IRequest<OpenIndexRequestParameters>
18051838
{
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
@@ -134,6 +134,7 @@ internal static class ApiUrlsLookups
134134
internal static ApiUrls IndicesGetMapping = new ApiUrls(new[]{"_mapping", "{index}/_mapping"});
135135
internal static ApiUrls IndicesGetSettings = new ApiUrls(new[]{"_settings", "{index}/_settings", "{index}/_settings/{name}", "_settings/{name}"});
136136
internal static ApiUrls IndicesGetTemplate = new ApiUrls(new[]{"_template", "_template/{name}"});
137+
internal static ApiUrls IndicesMigrateToDataStream = new ApiUrls(new[]{"_data_stream/_migrate/{name}"});
137138
internal static ApiUrls IndicesOpen = new ApiUrls(new[]{"{index}/_open"});
138139
internal static ApiUrls IndicesPutAlias = new ApiUrls(new[]{"{index}/_alias/{name}"});
139140
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
@@ -17,7 +17,7 @@ namespace Tests.XPack.DataStreams
1717
[SkipVersion("<7.9.0", "Introduced in 7.9.0")]
1818
public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluster>
1919
{
20-
private static readonly Metric Document = new Metric
20+
private static readonly Metric Document = new()
2121
{
2222
Timestamp = new DateTime(2020, 8, 3, 14, 0, 0, DateTimeKind.Utc),
2323
Accept = 3,
@@ -27,13 +27,16 @@ public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluste
2727
Response = 300,
2828
Total = 3
2929
};
30-
30+
3131
private const string CreateDataStreamStep = nameof(CreateDataStreamStep);
3232
private const string IndexStep = nameof(IndexStep);
3333
private const string GetDataStreamStep = nameof(GetDataStreamStep);
3434
private const string PutIndexTemplateStep = nameof(PutIndexTemplateStep);
3535
private const string DataStreamsStatsStep = nameof(DataStreamsStatsStep);
3636
private const string DeleteDataStreamStep = nameof(DeleteDataStreamStep);
37+
private const string PrepareIndexStep = nameof(PrepareIndexStep);
38+
private const string PrepareAliasStep = nameof(PrepareAliasStep);
39+
private const string MigrateToDataStreamStep = nameof(MigrateToDataStreamStep);
3740

3841
public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(new CoordinatedUsage(cluster, usage, testOnlyOne: true)
3942
{
@@ -89,10 +92,10 @@ public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(
8992
Refresh = Refresh.WaitFor
9093
},
9194
(v, d) => d.Index(v).Refresh(Refresh.WaitFor),
92-
(v, c, f) => c.Index<Metric>(Document, f),
93-
(v, c, f) => c.IndexAsync<Metric>(Document, f),
94-
(v, c, r) => c.Index<Metric>(r),
95-
(v, c, r) => c.IndexAsync<Metric>(r)
95+
(v, c, f) => c.Index(Document, f),
96+
(v, c, f) => c.IndexAsync(Document, f),
97+
(v, c, r) => c.Index(r),
98+
(v, c, r) => c.IndexAsync(r)
9699
)
97100
},
98101
{GetDataStreamStep, u =>
@@ -125,6 +128,48 @@ public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base(
125128
(v, c, r) => c.Indices.DeleteDataStreamAsync(r)
126129
)
127130
},
131+
// Used for migrate step
132+
{PrepareIndexStep, ">= 7.13.0", u =>
133+
u.Calls<CreateIndexDescriptor, CreateIndexRequest, ICreateIndexRequest, CreateIndexResponse>(
134+
v => new CreateIndexRequest($"my-index{v}-test")
135+
{
136+
Mappings = new TypeMapping
137+
{
138+
Properties = new Properties
139+
{
140+
{ "@timestamp", new DateNanosProperty() }
141+
}
142+
}
143+
},
144+
(v, d) => d.Map(m=> m.Properties(p=> p.DateNanos(dn => dn.Name("@timestamp")))),
145+
(v, c, f) => c.Indices.Create($"my-index{v}-test", f),
146+
(v, c, f) => c.Indices.CreateAsync($"my-index{v}-test", f),
147+
(v, c, r) => c.Indices.Create(r),
148+
(v, c, r) => c.Indices.CreateAsync(r)
149+
)
150+
},
151+
// Used for migrate step
152+
{PrepareAliasStep,">= 7.13.0", u =>
153+
u.Calls<PutAliasDescriptor, PutAliasRequest, IPutAliasRequest, PutAliasResponse>(
154+
v => new PutAliasRequest($"my-index{v}-test", $"{v}-alias"),
155+
(v, d) => d,
156+
(v, c, f) => c.Indices.PutAlias($"my-index{v}-test", $"{v}-alias", f),
157+
(v, c, f) => c.Indices.PutAliasAsync($"my-index{v}-test", $"{v}-alias", f),
158+
(v, c, r) => c.Indices.PutAlias(r),
159+
(v, c, r) => c.Indices.PutAliasAsync(r)
160+
)
161+
},
162+
// Migrate to data stream added in 7.13.0
163+
{MigrateToDataStreamStep,">= 7.13.0", u =>
164+
u.Calls<MigrateToDataStreamDescriptor, MigrateToDataStreamRequest, IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(
165+
v => new MigrateToDataStreamRequest($"{v}-alias"),
166+
(v, d) => d,
167+
(v, c, f) => c.Indices.MigrateToDataStream($"{v}-alias", f),
168+
(v, c, f) => c.Indices.MigrateToDataStreamAsync($"{v}-alias", f),
169+
(v, c, r) => c.Indices.MigrateToDataStream(r),
170+
(v, c, r) => c.Indices.MigrateToDataStreamAsync(r)
171+
)
172+
},
128173
}) { }
129174

130175
[I] public async Task CreateDataStreamResponse() => await Assert<CreateDataStreamResponse>(CreateDataStreamStep, (v, r) =>
@@ -179,5 +224,11 @@ [I] public async Task DeleteDataStreamResponse() => await Assert<DeleteDataStrea
179224
r.ShouldBeValid();
180225
r.Acknowledged.Should().BeTrue();
181226
});
227+
228+
[I] public async Task MigrateToDataStreamResponse() => await Assert<MigrateToDataStreamResponse>(MigrateToDataStreamStep, r =>
229+
{
230+
r.ShouldBeValid();
231+
r.Acknowledged.Should().BeTrue();
232+
});
182233
}
183234
}
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)