Skip to content

Commit 7555706

Browse files
authored
Convert rollover lifecycle action to accept max size as a string instead of long?
Convert rollover lifecycle action to accept max size as a string instead of long?
1 parent 39cb86a commit 7555706

File tree

3 files changed

+162
-3
lines changed

3 files changed

+162
-3
lines changed

src/Nest/XPack/Ilm/Actions/RolloverAction.cs

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using Newtonsoft.Json;
23

34
namespace Nest
@@ -23,9 +24,16 @@ public interface IRolloverLifecycleAction : ILifecycleAction
2324
long? MaximumDocuments { get; set; }
2425

2526
/// <summary>
26-
/// Max primary shard index storage size in bytes.
27+
/// Max primary shard index storage size using byte notation (e.g. 40gb or 40000000000b).
2728
/// </summary>
2829
[JsonProperty("max_size")]
30+
string MaximumSizeAsString { get; set; }
31+
32+
/// <summary>
33+
/// Max primary shard index storage size in bytes.
34+
/// </summary>
35+
[JsonIgnore]
36+
[Obsolete("Use MaximumSizeAsString property instead")]
2937
long? MaximumSize { get; set; }
3038
}
3139

@@ -38,23 +46,91 @@ public class RolloverLifecycleAction : IRolloverLifecycleAction
3846
public long? MaximumDocuments { get; set; }
3947

4048
/// <inheritdoc />
41-
public long? MaximumSize { get; set; }
49+
public string MaximumSizeAsString { get; set; }
50+
51+
/// <inheritdoc />
52+
[Obsolete("Use MaximumSizeAsString property instead")]
53+
public long? MaximumSize
54+
{
55+
get => BytesValueConverter.ToBytes(MaximumSizeAsString);
56+
set
57+
{
58+
if (value == null)
59+
{
60+
MaximumSizeAsString = null;
61+
return;
62+
}
63+
MaximumSizeAsString = value + "b";
64+
}
65+
}
66+
}
67+
68+
public static class BytesValueConverter
69+
{
70+
public static long? ToBytes(string value)
71+
{
72+
if (string.IsNullOrEmpty(value))
73+
{
74+
return null;
75+
}
76+
77+
if (value.EndsWith("pb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_125_899_906_842_624;
78+
if (value.EndsWith("tb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_099_511_627_776;
79+
if (value.EndsWith("gb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_073_741_824;
80+
if (value.EndsWith("mb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_048_576;
81+
if (value.EndsWith("kb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_024;
82+
83+
if (value.EndsWith("p")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_125_899_906_842_624;
84+
if (value.EndsWith("t")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_099_511_627_776;
85+
if (value.EndsWith("g")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_073_741_824;
86+
if (value.EndsWith("m")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_048_576;
87+
if (value.EndsWith("k")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_024;
88+
89+
if (value.EndsWith("b")) return Convert.ToInt64(value.Substring(0, value.Length - 1));
90+
91+
// Assume bytes
92+
return Convert.ToInt64(value);
93+
}
4294
}
4395

4496
public class RolloverLifecycleActionDescriptor
4597
: DescriptorBase<RolloverLifecycleActionDescriptor, IRolloverLifecycleAction>, IRolloverLifecycleAction
4698
{
99+
private string _maximumSizeAsString;
100+
47101
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumAge" />
48102
Time IRolloverLifecycleAction.MaximumAge { get; set; }
49103

50104
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumDocuments" />
51105
long? IRolloverLifecycleAction.MaximumDocuments { get; set; }
52106

107+
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSizeAsString" />
108+
string IRolloverLifecycleAction.MaximumSizeAsString { get => _maximumSizeAsString; set => _maximumSizeAsString = value; }
109+
53110
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSize" />
54-
long? IRolloverLifecycleAction.MaximumSize { get; set; }
111+
[Obsolete("Use MaximumSizeAsString property instead")]
112+
long? IRolloverLifecycleAction.MaximumSize
113+
{
114+
get => BytesValueConverter.ToBytes(_maximumSizeAsString);
115+
set
116+
{
117+
if (value == null)
118+
{
119+
_maximumSizeAsString = null;
120+
return;
121+
}
122+
_maximumSizeAsString = value + "b";
123+
}
124+
}
125+
126+
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSizeAsString" />
127+
public RolloverLifecycleActionDescriptor MaximumSizeAsString(string maximumSizeAsString) => Assign(maximumSizeAsString, (a, v) => a.MaximumSizeAsString = maximumSizeAsString);
55128

56129
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSize" />
130+
[Obsolete("Use MaximumSizeAsString property instead")]
131+
#pragma warning disable 618
57132
public RolloverLifecycleActionDescriptor MaximumSize(long? maximumSize) => Assign(maximumSize, (a, v) => a.MaximumSize = maximumSize);
133+
#pragma warning restore 618
58134

59135
/// <inheritdoc cref="IRolloverLifecycleAction.MaximumAge" />
60136
public RolloverLifecycleActionDescriptor MaximumAge(Time maximumAge) => Assign(maximumAge, (a, v) => a.MaximumAge = maximumAge);
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Elastic.Xunit.XunitPlumbing;
2+
using FluentAssertions;
3+
using Nest;
4+
5+
namespace Tests.XPack.Ilm
6+
{
7+
public class BytesValueConverterTests
8+
{
9+
[U] public void Test()
10+
{
11+
BytesValueConverter.ToBytes("1").Should().Be(1L);
12+
BytesValueConverter.ToBytes("1b").Should().Be(1L);
13+
14+
BytesValueConverter.ToBytes("1kb").Should().Be(1024);
15+
BytesValueConverter.ToBytes("1k").Should().Be(1024);
16+
17+
BytesValueConverter.ToBytes("1mb").Should().Be(1024 * 1024);
18+
BytesValueConverter.ToBytes("1m").Should().Be(1024 * 1024);
19+
20+
BytesValueConverter.ToBytes("1gb").Should().Be(1024 * 1024 * 1024);
21+
BytesValueConverter.ToBytes("1g").Should().Be(1024 * 1024 * 1024);
22+
23+
BytesValueConverter.ToBytes("1tb").Should().Be(1024L * 1024 * 1024 * 1024);
24+
BytesValueConverter.ToBytes("1t").Should().Be(1024L * 1024 * 1024 * 1024);
25+
26+
BytesValueConverter.ToBytes("1pb").Should().Be(1024L * 1024 * 1024 * 1024 * 1024);
27+
BytesValueConverter.ToBytes("1p").Should().Be(1024L * 1024 * 1024 * 1024 * 1024);
28+
}
29+
30+
[U] public void RolloverLifecycleActionTest()
31+
{
32+
#pragma warning disable 618
33+
var rolloverLifecycleAction = new RolloverLifecycleAction();
34+
35+
rolloverLifecycleAction.MaximumSize = 1;
36+
rolloverLifecycleAction.MaximumSizeAsString.Should().Be("1b");
37+
rolloverLifecycleAction.MaximumSize.Should().Be(1);
38+
39+
rolloverLifecycleAction = new RolloverLifecycleAction();
40+
rolloverLifecycleAction.MaximumSize = 1024;
41+
rolloverLifecycleAction.MaximumSizeAsString.Should().Be("1024b");
42+
rolloverLifecycleAction.MaximumSize.Should().Be(1024);
43+
44+
rolloverLifecycleAction = new RolloverLifecycleAction();
45+
rolloverLifecycleAction.MaximumSizeAsString = "1gb";
46+
rolloverLifecycleAction.MaximumSize.Should().Be(1024 * 1024 * 1024);
47+
#pragma warning restore 618
48+
}
49+
50+
[U] public void RolloverLifecycleActionDescriptorTest()
51+
{
52+
#pragma warning disable 618
53+
var rolloverLifecycleActionDescriptor = new RolloverLifecycleActionDescriptor();
54+
rolloverLifecycleActionDescriptor.MaximumSize(1);
55+
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSize.Should().Be(1);
56+
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSizeAsString.Should().Be("1b");
57+
58+
rolloverLifecycleActionDescriptor = new RolloverLifecycleActionDescriptor();
59+
rolloverLifecycleActionDescriptor.MaximumSizeAsString("1gb");
60+
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSize.Should().Be(1024 * 1024 * 1024);
61+
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSizeAsString.Should().Be("1gb");
62+
#pragma warning restore 618
63+
}
64+
}
65+
66+
}

src/Tests/Tests/XPack/Ilm/IlmApiTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ public IlmApiTests(XPackCluster cluster, EndpointUsage usage) : base(new Coordin
7878
}
7979
}
8080
},
81+
Hot = new Phase
82+
{
83+
MinimumAge = "1d",
84+
Actions = new LifecycleActions
85+
{
86+
new RolloverLifecycleAction
87+
{
88+
MaximumDocuments = 1_000_000,
89+
MaximumSizeAsString = "40gb"
90+
}
91+
}
92+
},
8193
Delete = new Phase
8294
{
8395
MinimumAge = "30d",
@@ -92,6 +104,11 @@ public IlmApiTests(XPackCluster cluster, EndpointUsage usage) : base(new Coordin
92104
(v, d) => d
93105
.Policy(p => p.Phases(a => a.Warm(w => w.MinimumAge("10d")
94106
.Actions(ac => ac.ForceMerge(f => f.MaximumNumberOfSegments(1))))
107+
.Hot(h => h.MinimumAge("1d")
108+
.Actions(ac => ac.Rollover(r => r.MaximumDocuments(1_000_000)
109+
#pragma warning disable 612, 618
110+
.MaximumSize(40_000_000_000))))
111+
#pragma warning restore 612, 618
95112
.Delete(w => w.MinimumAge("30d")
96113
.Actions(ac => ac.Delete(f => f)))))
97114
,

0 commit comments

Comments
 (0)