Skip to content

Commit 1c38153

Browse files
stevejgordongithub-actions[bot]
authored andcommitted
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 59f3a72 commit 1c38153

File tree

8 files changed

+187
-6
lines changed

8 files changed

+187
-6
lines changed

src/Nest/Descriptors.Indices.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,27 @@ public GetIndexTemplateDescriptor(Names name): base(r => r.Optional("name", name
969969
public GetIndexTemplateDescriptor MasterTimeout(Time mastertimeout) => Qs("master_timeout", mastertimeout);
970970
}
971971

972+
///<summary>Descriptor for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
973+
public partial class MigrateToDataStreamDescriptor : RequestDescriptorBase<MigrateToDataStreamDescriptor, MigrateToDataStreamRequestParameters, IMigrateToDataStreamRequest>, IMigrateToDataStreamRequest
974+
{
975+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
976+
///<summary>/_data_stream/_migrate/{name}</summary>
977+
///<param name = "name">this parameter is required</param>
978+
public MigrateToDataStreamDescriptor(Name name): base(r => r.Required("name", name))
979+
{
980+
}
981+
982+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
983+
[SerializationConstructor]
984+
protected MigrateToDataStreamDescriptor(): base()
985+
{
986+
}
987+
988+
// values part of the url path
989+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
990+
// Request parameters
991+
}
992+
972993
///<summary>Descriptor for Open <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html</para></summary>
973994
public partial class OpenIndexDescriptor : RequestDescriptorBase<OpenIndexDescriptor, OpenIndexRequestParameters, IOpenIndexRequest>, IOpenIndexRequest
974995
{

src/Nest/ElasticClient.Indices.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,30 @@ public Task<GetMappingResponse> GetMappingAsync<TDocument>(Func<GetMappingDescri
641641
/// </summary>
642642
public Task<GetIndexTemplateResponse> GetTemplateAsync(IGetIndexTemplateRequest request, CancellationToken ct = default) => DoRequestAsync<IGetIndexTemplateRequest, GetIndexTemplateResponse>(request, request.RequestParameters, ct);
643643
/// <summary>
644+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
645+
/// <para></para>
646+
/// <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>
647+
/// </summary>
648+
public MigrateToDataStreamResponse MigrateToDataStream(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null) => MigrateToDataStream(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)));
649+
/// <summary>
650+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
651+
/// <para></para>
652+
/// <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>
653+
/// </summary>
654+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(Name name, Func<MigrateToDataStreamDescriptor, IMigrateToDataStreamRequest> selector = null, CancellationToken ct = default) => MigrateToDataStreamAsync(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)), ct);
655+
/// <summary>
656+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
657+
/// <para></para>
658+
/// <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>
659+
/// </summary>
660+
public MigrateToDataStreamResponse MigrateToDataStream(IMigrateToDataStreamRequest request) => DoRequest<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters);
661+
/// <summary>
662+
/// <c>POST</c> request to the <c>indices.migrate_to_data_stream</c> API, read more about this API online:
663+
/// <para></para>
664+
/// <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>
665+
/// </summary>
666+
public Task<MigrateToDataStreamResponse> MigrateToDataStreamAsync(IMigrateToDataStreamRequest request, CancellationToken ct = default) => DoRequestAsync<IMigrateToDataStreamRequest, MigrateToDataStreamResponse>(request, request.RequestParameters, ct);
667+
/// <summary>
644668
/// <c>POST</c> request to the <c>indices.open</c> API, read more about this API online:
645669
/// <para></para>
646670
/// <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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,6 +1686,39 @@ public Time MasterTimeout
16861686
}
16871687
}
16881688

1689+
[InterfaceDataContract]
1690+
public partial interface IMigrateToDataStreamRequest : IRequest<MigrateToDataStreamRequestParameters>
1691+
{
1692+
[IgnoreDataMember]
1693+
Name Name
1694+
{
1695+
get;
1696+
}
1697+
}
1698+
1699+
///<summary>Request for MigrateToDataStream <para>https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html</para></summary>
1700+
public partial class MigrateToDataStreamRequest : PlainRequestBase<MigrateToDataStreamRequestParameters>, IMigrateToDataStreamRequest
1701+
{
1702+
protected IMigrateToDataStreamRequest Self => this;
1703+
internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream;
1704+
///<summary>/_data_stream/_migrate/{name}</summary>
1705+
///<param name = "name">this parameter is required</param>
1706+
public MigrateToDataStreamRequest(Name name): base(r => r.Required("name", name))
1707+
{
1708+
}
1709+
1710+
///<summary>Used for serialization purposes, making sure we have a parameterless constructor</summary>
1711+
[SerializationConstructor]
1712+
protected MigrateToDataStreamRequest(): base()
1713+
{
1714+
}
1715+
1716+
// values part of the url path
1717+
[IgnoreDataMember]
1718+
Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get<Name>("name");
1719+
// Request parameters
1720+
}
1721+
16891722
[InterfaceDataContract]
16901723
public partial interface IOpenIndexRequest : IRequest<OpenIndexRequestParameters>
16911724
{
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+
/// 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+
}
Lines changed: 8 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ internal static class ApiUrlsLookups
132132
internal static ApiUrls IndicesGetMapping = new ApiUrls(new[]{"_mapping", "{index}/_mapping"});
133133
internal static ApiUrls IndicesGetSettings = new ApiUrls(new[]{"_settings", "{index}/_settings", "{index}/_settings/{name}", "_settings/{name}"});
134134
internal static ApiUrls IndicesGetTemplate = new ApiUrls(new[]{"_template", "_template/{name}"});
135+
internal static ApiUrls IndicesMigrateToDataStream = new ApiUrls(new[]{"_data_stream/_migrate/{name}"});
135136
internal static ApiUrls IndicesOpen = new ApiUrls(new[]{"{index}/_open"});
136137
internal static ApiUrls IndicesPutAlias = new ApiUrls(new[]{"{index}/_alias/{name}"});
137138
internal static ApiUrls IndicesPutMapping = new ApiUrls(new[]{"{index}/_mapping"});

tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Tests.XPack.DataStreams
1818
[SkipVersion("<7.9.0", "Introduced in 7.9.0")]
1919
public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluster>
2020
{
21-
private static readonly Metric Document = new Metric
21+
private static readonly Metric Document = new()
2222
{
2323
Timestamp = new DateTime(2020, 8, 3, 14, 0, 0, DateTimeKind.Utc),
2424
Accept = 3,
@@ -28,13 +28,16 @@ public class DataStreamsApiTests : CoordinatedIntegrationTestBase<WritableCluste
2828
Response = 300,
2929
Total = 3
3030
};
31-
31+
3232
private const string CreateDataStreamStep = nameof(CreateDataStreamStep);
3333
private const string IndexStep = nameof(IndexStep);
3434
private const string GetDataStreamStep = nameof(GetDataStreamStep);
3535
private const string PutIndexTemplateStep = nameof(PutIndexTemplateStep);
3636
private const string DataStreamsStatsStep = nameof(DataStreamsStatsStep);
3737
private const string DeleteDataStreamStep = nameof(DeleteDataStreamStep);
38+
private const string PrepareIndexStep = nameof(PrepareIndexStep);
39+
private const string PrepareAliasStep = nameof(PrepareAliasStep);
40+
private const string MigrateToDataStreamStep = nameof(MigrateToDataStreamStep);
3841

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

131176
[I] public async Task CreateDataStreamResponse() => await Assert<CreateDataStreamResponse>(CreateDataStreamStep, (v, r) =>
@@ -180,5 +225,11 @@ [I] public async Task DeleteDataStreamResponse() => await Assert<DeleteDataStrea
180225
r.ShouldBeValid();
181226
r.Acknowledged.Should().BeTrue();
182227
});
228+
229+
[I] public async Task MigrateToDataStreamResponse() => await Assert<MigrateToDataStreamResponse>(MigrateToDataStreamStep, r =>
230+
{
231+
r.ShouldBeValid();
232+
r.Acknowledged.Should().BeTrue();
233+
});
183234
}
184235
}
Lines changed: 18 additions & 0 deletions
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)