diff --git a/src/Nest/Descriptors.Indices.cs b/src/Nest/Descriptors.Indices.cs index 50b6db4f9d0..1050627ca48 100644 --- a/src/Nest/Descriptors.Indices.cs +++ b/src/Nest/Descriptors.Indices.cs @@ -1000,6 +1000,27 @@ public GetIndexTemplateDescriptor(Names name): base(r => r.Optional("name", name public GetIndexTemplateDescriptor MasterTimeout(Time mastertimeout) => Qs("master_timeout", mastertimeout); } + ///Descriptor for MigrateToDataStream https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + public partial class MigrateToDataStreamDescriptor : RequestDescriptorBase, IMigrateToDataStreamRequest + { + internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream; + ////_data_stream/_migrate/{name} + ///this parameter is required + public MigrateToDataStreamDescriptor(Name name): base(r => r.Required("name", name)) + { + } + + ///Used for serialization purposes, making sure we have a parameterless constructor + [SerializationConstructor] + protected MigrateToDataStreamDescriptor(): base() + { + } + + // values part of the url path + Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get("name"); + // Request parameters + } + ///Descriptor for Open https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html public partial class OpenIndexDescriptor : RequestDescriptorBase, IOpenIndexRequest { diff --git a/src/Nest/ElasticClient.Indices.cs b/src/Nest/ElasticClient.Indices.cs index 23b2868f67c..3c8c0a05667 100644 --- a/src/Nest/ElasticClient.Indices.cs +++ b/src/Nest/ElasticClient.Indices.cs @@ -689,6 +689,30 @@ public Task GetMappingAsync(Func public Task GetTemplateAsync(IGetIndexTemplateRequest request, CancellationToken ct = default) => DoRequestAsync(request, request.RequestParameters, ct); /// + /// POST request to the indices.migrate_to_data_stream API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + /// + public MigrateToDataStreamResponse MigrateToDataStream(Name name, Func selector = null) => MigrateToDataStream(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name))); + /// + /// POST request to the indices.migrate_to_data_stream API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + /// + public Task MigrateToDataStreamAsync(Name name, Func selector = null, CancellationToken ct = default) => MigrateToDataStreamAsync(selector.InvokeOrDefault(new MigrateToDataStreamDescriptor(name: name)), ct); + /// + /// POST request to the indices.migrate_to_data_stream API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + /// + public MigrateToDataStreamResponse MigrateToDataStream(IMigrateToDataStreamRequest request) => DoRequest(request, request.RequestParameters); + /// + /// POST request to the indices.migrate_to_data_stream API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + /// + public Task MigrateToDataStreamAsync(IMigrateToDataStreamRequest request, CancellationToken ct = default) => DoRequestAsync(request, request.RequestParameters, ct); + /// /// POST request to the indices.open API, read more about this API online: /// /// https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html diff --git a/src/Nest/Requests.Indices.cs b/src/Nest/Requests.Indices.cs index f203ae483b9..bc68fecdebc 100644 --- a/src/Nest/Requests.Indices.cs +++ b/src/Nest/Requests.Indices.cs @@ -1800,6 +1800,39 @@ public Time MasterTimeout } } + [InterfaceDataContract] + public partial interface IMigrateToDataStreamRequest : IRequest + { + [IgnoreDataMember] + Name Name + { + get; + } + } + + ///Request for MigrateToDataStream https://www.elastic.co/guide/en/elasticsearch/reference/master/data-streams.html + public partial class MigrateToDataStreamRequest : PlainRequestBase, IMigrateToDataStreamRequest + { + protected IMigrateToDataStreamRequest Self => this; + internal override ApiUrls ApiUrls => ApiUrlsLookups.IndicesMigrateToDataStream; + ////_data_stream/_migrate/{name} + ///this parameter is required + public MigrateToDataStreamRequest(Name name): base(r => r.Required("name", name)) + { + } + + ///Used for serialization purposes, making sure we have a parameterless constructor + [SerializationConstructor] + protected MigrateToDataStreamRequest(): base() + { + } + + // values part of the url path + [IgnoreDataMember] + Name IMigrateToDataStreamRequest.Name => Self.RouteValues.Get("name"); + // Request parameters + } + [InterfaceDataContract] public partial interface IOpenIndexRequest : IRequest { diff --git a/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamRequest.cs b/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamRequest.cs new file mode 100644 index 00000000000..5ac1c7c03ea --- /dev/null +++ b/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamRequest.cs @@ -0,0 +1,25 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +namespace Nest +{ + /// + /// Converts an index alias to a data stream. + /// + [MapsApi("indices.migrate_to_data_stream.json")] + [ReadAs(typeof(MigrateToDataStreamRequest))] + public partial interface IMigrateToDataStreamRequest + { + } + + /// + public partial class MigrateToDataStreamRequest : IMigrateToDataStreamRequest + { + } + + /// + public partial class MigrateToDataStreamDescriptor + { + } +} diff --git a/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamResponse.cs b/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamResponse.cs new file mode 100644 index 00000000000..d2e38117604 --- /dev/null +++ b/src/Nest/XPack/DataStreams/Migrate/MigrateToDataStreamResponse.cs @@ -0,0 +1,8 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + + namespace Nest +{ + public class MigrateToDataStreamResponse : AcknowledgedResponseBase { } +} diff --git a/src/Nest/_Generated/ApiUrlsLookup.generated.cs b/src/Nest/_Generated/ApiUrlsLookup.generated.cs index d7e433dfc28..4949d38971d 100644 --- a/src/Nest/_Generated/ApiUrlsLookup.generated.cs +++ b/src/Nest/_Generated/ApiUrlsLookup.generated.cs @@ -134,6 +134,7 @@ internal static class ApiUrlsLookups internal static ApiUrls IndicesGetMapping = new ApiUrls(new[]{"_mapping", "{index}/_mapping"}); internal static ApiUrls IndicesGetSettings = new ApiUrls(new[]{"_settings", "{index}/_settings", "{index}/_settings/{name}", "_settings/{name}"}); internal static ApiUrls IndicesGetTemplate = new ApiUrls(new[]{"_template", "_template/{name}"}); + internal static ApiUrls IndicesMigrateToDataStream = new ApiUrls(new[]{"_data_stream/_migrate/{name}"}); internal static ApiUrls IndicesOpen = new ApiUrls(new[]{"{index}/_open"}); internal static ApiUrls IndicesPutAlias = new ApiUrls(new[]{"{index}/_alias/{name}"}); internal static ApiUrls IndicesPutMapping = new ApiUrls(new[]{"{index}/_mapping"}); diff --git a/tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs b/tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs index 39d6bc0bb9b..3c7db126d15 100644 --- a/tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs +++ b/tests/Tests/XPack/DataStreams/DataStreamsApiTests.cs @@ -17,7 +17,7 @@ namespace Tests.XPack.DataStreams [SkipVersion("<7.9.0", "Introduced in 7.9.0")] public class DataStreamsApiTests : CoordinatedIntegrationTestBase { - private static readonly Metric Document = new Metric + private static readonly Metric Document = new() { Timestamp = new DateTime(2020, 8, 3, 14, 0, 0, DateTimeKind.Utc), Accept = 3, @@ -27,13 +27,16 @@ public class DataStreamsApiTests : CoordinatedIntegrationTestBase d.Index(v).Refresh(Refresh.WaitFor), - (v, c, f) => c.Index(Document, f), - (v, c, f) => c.IndexAsync(Document, f), - (v, c, r) => c.Index(r), - (v, c, r) => c.IndexAsync(r) + (v, c, f) => c.Index(Document, f), + (v, c, f) => c.IndexAsync(Document, f), + (v, c, r) => c.Index(r), + (v, c, r) => c.IndexAsync(r) ) }, {GetDataStreamStep, u => @@ -125,6 +128,48 @@ public DataStreamsApiTests(WritableCluster cluster, EndpointUsage usage) : base( (v, c, r) => c.Indices.DeleteDataStreamAsync(r) ) }, + // Used for migrate step + {PrepareIndexStep, ">= 7.13.0", u => + u.Calls( + v => new CreateIndexRequest($"my-index{v}-test") + { + Mappings = new TypeMapping + { + Properties = new Properties + { + { "@timestamp", new DateNanosProperty() } + } + } + }, + (v, d) => d.Map(m=> m.Properties(p=> p.DateNanos(dn => dn.Name("@timestamp")))), + (v, c, f) => c.Indices.Create($"my-index{v}-test", f), + (v, c, f) => c.Indices.CreateAsync($"my-index{v}-test", f), + (v, c, r) => c.Indices.Create(r), + (v, c, r) => c.Indices.CreateAsync(r) + ) + }, + // Used for migrate step + {PrepareAliasStep,">= 7.13.0", u => + u.Calls( + v => new PutAliasRequest($"my-index{v}-test", $"{v}-alias"), + (v, d) => d, + (v, c, f) => c.Indices.PutAlias($"my-index{v}-test", $"{v}-alias", f), + (v, c, f) => c.Indices.PutAliasAsync($"my-index{v}-test", $"{v}-alias", f), + (v, c, r) => c.Indices.PutAlias(r), + (v, c, r) => c.Indices.PutAliasAsync(r) + ) + }, + // Migrate to data stream added in 7.13.0 + {MigrateToDataStreamStep,">= 7.13.0", u => + u.Calls( + v => new MigrateToDataStreamRequest($"{v}-alias"), + (v, d) => d, + (v, c, f) => c.Indices.MigrateToDataStream($"{v}-alias", f), + (v, c, f) => c.Indices.MigrateToDataStreamAsync($"{v}-alias", f), + (v, c, r) => c.Indices.MigrateToDataStream(r), + (v, c, r) => c.Indices.MigrateToDataStreamAsync(r) + ) + }, }) { } [I] public async Task CreateDataStreamResponse() => await Assert(CreateDataStreamStep, (v, r) => @@ -179,5 +224,11 @@ [I] public async Task DeleteDataStreamResponse() => await Assert await Assert(MigrateToDataStreamStep, r => + { + r.ShouldBeValid(); + r.Acknowledged.Should().BeTrue(); + }); } } diff --git a/tests/Tests/XPack/DataStreams/Migrate/MigrateToDataStreamUrlTests.cs b/tests/Tests/XPack/DataStreams/Migrate/MigrateToDataStreamUrlTests.cs new file mode 100644 index 00000000000..38097a29ad9 --- /dev/null +++ b/tests/Tests/XPack/DataStreams/Migrate/MigrateToDataStreamUrlTests.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; +using Elastic.Elasticsearch.Xunit.XunitPlumbing; +using Nest; +using Tests.Framework.EndpointTests; +using static Tests.Framework.EndpointTests.UrlTester; + +namespace Tests.XPack.DataStreams.Migrate +{ + public class MigrateToDataStreamUrlTests : UrlTestsBase + { + [U] + public override async Task Urls() => await POST("/_data_stream/_migrate/stream") + .Fluent(c => c.Indices.MigrateToDataStream("stream", f => f)) + .Request(c => c.Indices.MigrateToDataStream(new MigrateToDataStreamRequest("stream"))) + .FluentAsync(c => c.Indices.MigrateToDataStreamAsync("stream", f => f)) + .RequestAsync(c => c.Indices.MigrateToDataStreamAsync(new MigrateToDataStreamRequest("stream"))); + } +}