Skip to content

Commit 93ab9ae

Browse files
Add network direction ingest processor (#5360) (#5375)
Co-authored-by: Steve Gordon <[email protected]>
1 parent b1b9795 commit 93ab9ae

File tree

4 files changed

+134
-1
lines changed

4 files changed

+134
-1
lines changed

src/Nest/Ingest/ProcessorFormatter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ internal class ProcessorFormatter : IJsonFormatter<IProcessor>
4848
{ "csv", 32 },
4949
{ "uri_parts", 33 },
5050
{ "fingerprint", 34 },
51-
{ "community_id", 35 }
51+
{ "community_id", 35 },
52+
{ "network_direction", 36 }
5253
};
5354

5455
public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
@@ -177,6 +178,9 @@ public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver form
177178
case 35:
178179
processor = Deserialize<NetworkCommunityIdProcessor>(ref reader, formatterResolver);
179180
break;
181+
case 36:
182+
processor = Deserialize<NetworkDirectionProcessor>(ref reader, formatterResolver);
183+
break;
180184
}
181185
}
182186
else
@@ -306,6 +310,9 @@ public void Serialize(ref JsonWriter writer, IProcessor value, IJsonFormatterRes
306310
case "community_id":
307311
Serialize<INetworkCommunityIdProcessor>(ref writer, value, formatterResolver);
308312
break;
313+
case "network_direction":
314+
Serialize<INetworkDirectionProcessor>(ref writer, value, formatterResolver);
315+
break;
309316
default:
310317
var formatter = DynamicObjectResolver.ExcludeNullCamelCase.GetFormatter<IProcessor>();
311318
formatter.Serialize(ref writer, value, formatterResolver);
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq.Expressions;
4+
using System.Runtime.Serialization;
5+
using Elasticsearch.Net.Utf8Json;
6+
7+
namespace Nest
8+
{
9+
[InterfaceDataContract]
10+
public interface INetworkDirectionProcessor : IProcessor
11+
{
12+
[DataMember(Name = "destination_ip")]
13+
Field DestinationIp { get; set; }
14+
15+
[DataMember(Name = "ignore_missing")]
16+
bool? IgnoreMissing { get; set; }
17+
18+
[DataMember(Name = "internal_networks")]
19+
IEnumerable<string> InternalNetworks { get; set; }
20+
21+
[DataMember(Name = "source_ip")]
22+
Field SourceIp { get; set; }
23+
24+
[DataMember(Name = "target_field")]
25+
Field TargetField { get; set; }
26+
}
27+
28+
public class NetworkDirectionProcessor : ProcessorBase, INetworkDirectionProcessor
29+
{
30+
protected override string Name => "network_direction";
31+
32+
/// <inheritdoc />
33+
public Field DestinationIp { get; set; }
34+
/// <inheritdoc />
35+
public bool? IgnoreMissing { get; set; }
36+
/// <inheritdoc />
37+
public IEnumerable<string> InternalNetworks { get; set; }
38+
/// <inheritdoc />
39+
public Field SourceIp { get; set; }
40+
/// <inheritdoc />
41+
public Field TargetField { get; set; }
42+
}
43+
44+
/// <inheritdoc cref="IFingerprintProcessor" />
45+
public class NetworkDirectionProcessorDescriptor<T>
46+
: ProcessorDescriptorBase<NetworkDirectionProcessorDescriptor<T>, INetworkDirectionProcessor>, INetworkDirectionProcessor
47+
where T : class
48+
{
49+
protected override string Name => "network_direction";
50+
51+
Field INetworkDirectionProcessor.DestinationIp { get; set; }
52+
bool? INetworkDirectionProcessor.IgnoreMissing { get; set; }
53+
IEnumerable<string> INetworkDirectionProcessor.InternalNetworks { get; set; }
54+
Field INetworkDirectionProcessor.SourceIp { get; set; }
55+
Field INetworkDirectionProcessor.TargetField { get; set; }
56+
57+
/// <inheritdoc cref="INetworkDirectionProcessor.DestinationIp" />
58+
public NetworkDirectionProcessorDescriptor<T> DestinationIp(Field field) => Assign(field, (a, v) => a.DestinationIp = v);
59+
60+
/// <inheritdoc cref="INetworkDirectionProcessor.DestinationIp" />
61+
public NetworkDirectionProcessorDescriptor<T> DestinationIp<TValue>(Expression<Func<T, TValue>> objectPath) =>
62+
Assign(objectPath, (a, v) => a.DestinationIp = v);
63+
64+
/// <inheritdoc cref="INetworkDirectionProcessor.IgnoreMissing" />
65+
public NetworkDirectionProcessorDescriptor<T> IgnoreMissing(bool? ignoreMissing = true) => Assign(ignoreMissing, (a, v) => a.IgnoreMissing = v);
66+
67+
/// <inheritdoc cref="INetworkDirectionProcessor.InternalNetworks" />
68+
public NetworkDirectionProcessorDescriptor<T> InternalNetworks(IEnumerable<string> internalNetworks) => Assign(internalNetworks, (a, v) => a.InternalNetworks = v);
69+
70+
/// <inheritdoc cref="INetworkDirectionProcessor.InternalNetworks" />
71+
public NetworkDirectionProcessorDescriptor<T> InternalNetworks(params string[] internalNetworks) => Assign(internalNetworks, (a, v) => a.InternalNetworks = v);
72+
73+
/// <inheritdoc cref="INetworkDirectionProcessor.SourceIp" />
74+
public NetworkDirectionProcessorDescriptor<T> SourceIp(Field field) => Assign(field, (a, v) => a.SourceIp = v);
75+
76+
/// <inheritdoc cref="INetworkDirectionProcessor.SourceIp" />
77+
public NetworkDirectionProcessorDescriptor<T> SourceIp<TValue>(Expression<Func<T, TValue>> objectPath) =>
78+
Assign(objectPath, (a, v) => a.SourceIp = v);
79+
80+
/// <inheritdoc cref="INetworkDirectionProcessor.TargetField" />
81+
public NetworkDirectionProcessorDescriptor<T> TargetField(Field field) => Assign(field, (a, v) => a.TargetField = v);
82+
83+
/// <inheritdoc cref="INetworkDirectionProcessor.TargetField" />
84+
public NetworkDirectionProcessorDescriptor<T> TargetField<TValue>(Expression<Func<T, TValue>> objectPath) =>
85+
Assign(objectPath, (a, v) => a.TargetField = v);
86+
}
87+
}

src/Nest/Ingest/ProcessorsDescriptor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,9 @@ public ProcessorsDescriptor Fingerprint<T>(Func<FingerprintProcessorDescriptor<T
189189
/// <inheritdoc cref="INetworkCommunityIdProcessor"/>
190190
public ProcessorsDescriptor NetworkCommunityId<T>(Func<NetworkCommunityIdProcessorDescriptor<T>, INetworkCommunityIdProcessor> selector) where T : class =>
191191
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new NetworkCommunityIdProcessorDescriptor<T>())));
192+
193+
/// <inheritdoc cref="INetworkDirectionProcessor"/>
194+
public ProcessorsDescriptor NetworkDirection<T>(Func<NetworkDirectionProcessorDescriptor<T>, INetworkDirectionProcessor> selector) where T : class =>
195+
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new NetworkDirectionProcessorDescriptor<T>())));
192196
}
193197
}

tests/Tests/Ingest/ProcessorAssertions.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,5 +783,40 @@ public class NetworkCommunityId : ProcessorAssertion
783783

784784
public override string Key => "community_id";
785785
}
786+
787+
[SkipVersion("<7.12.0", "Uses network direction processor which was introduced in 7.12.0")]
788+
public class NetworkDirection : ProcessorAssertion
789+
{
790+
public override Func<ProcessorsDescriptor, IPromise<IList<IProcessor>>> Fluent => d => d
791+
.NetworkDirection<Project>(ud => ud
792+
.DestinationIp(f => f.LeadDeveloper.IpAddress)
793+
.SourceIp(f => f.LeadDeveloper.IpAddress)
794+
.InternalNetworks("network-a", "network-b")
795+
.TargetField(p => p.Description)
796+
.IgnoreMissing());
797+
798+
public override IProcessor Initializer => new NetworkDirectionProcessor
799+
{
800+
DestinationIp = Field<Project>(f => f.LeadDeveloper.IpAddress),
801+
SourceIp = Field<Project>(f => f.LeadDeveloper.IpAddress),
802+
InternalNetworks = new [] { "network-a", "network-b" },
803+
TargetField = "description",
804+
IgnoreMissing = true
805+
};
806+
807+
public override object Json => new
808+
{
809+
destination_ip = "leadDeveloper.ipAddress",
810+
internal_networks = new[]
811+
{
812+
"network-a", "network-b"
813+
},
814+
source_ip = "leadDeveloper.ipAddress",
815+
target_field = "description",
816+
ignore_missing = true
817+
};
818+
819+
public override string Key => "network_direction";
820+
}
786821
}
787822
}

0 commit comments

Comments
 (0)