Skip to content

Commit ab0a5fd

Browse files
Ticket #61 : Start to develop the UI to add an EventMeshServer
1 parent 426e0c7 commit ab0a5fd

40 files changed

+1292
-9
lines changed

FaasNet.sln

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FaasNet.Bus.Startup", "src\
4343
EndProject
4444
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FaasNet.Runtime.Tests", "tests\FaasNet.Runtime.Tests\FaasNet.Runtime.Tests.csproj", "{A35870C0-7553-4A66-95EE-7226535FED0F}"
4545
EndProject
46+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. EventMesh", "03. EventMesh", "{95825677-4D42-420E-8126-220CDD2B4D8C}"
47+
EndProject
48+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventMesh.Runtime", "src\EventMesh.Runtime\EventMesh.Runtime.csproj", "{EE1A17AD-05D1-425F-8B23-19C1D69BE588}"
49+
EndProject
4650
Global
4751
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4852
Debug|Any CPU = Debug|Any CPU
@@ -105,6 +109,10 @@ Global
105109
{A35870C0-7553-4A66-95EE-7226535FED0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
106110
{A35870C0-7553-4A66-95EE-7226535FED0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
107111
{A35870C0-7553-4A66-95EE-7226535FED0F}.Release|Any CPU.Build.0 = Release|Any CPU
112+
{EE1A17AD-05D1-425F-8B23-19C1D69BE588}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113+
{EE1A17AD-05D1-425F-8B23-19C1D69BE588}.Debug|Any CPU.Build.0 = Debug|Any CPU
114+
{EE1A17AD-05D1-425F-8B23-19C1D69BE588}.Release|Any CPU.ActiveCfg = Release|Any CPU
115+
{EE1A17AD-05D1-425F-8B23-19C1D69BE588}.Release|Any CPU.Build.0 = Release|Any CPU
108116
EndGlobalSection
109117
GlobalSection(SolutionProperties) = preSolution
110118
HideSolutionNode = FALSE
@@ -126,6 +134,8 @@ Global
126134
{E06FDF2D-89CE-48B5-A530-8692390F8F7B} = {8D35E32C-AB12-44C8-8FAF-D9FF8CF805B7}
127135
{9DEBEE4B-C360-4517-A97F-7461C163FDDF} = {B0C38F6D-3F83-458A-A493-428AB3DD9F85}
128136
{A35870C0-7553-4A66-95EE-7226535FED0F} = {472FC125-267E-422D-AFFE-E33C5FFB3344}
137+
{95825677-4D42-420E-8126-220CDD2B4D8C} = {1064A767-7322-4A14-BFD4-97FDD40E76B4}
138+
{EE1A17AD-05D1-425F-8B23-19C1D69BE588} = {95825677-4D42-420E-8126-220CDD2B4D8C}
129139
EndGlobalSection
130140
GlobalSection(ExtensibilityGlobals) = postSolution
131141
SolutionGuid = {46764455-0D10-4266-9C37-35D7BD67517C}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace FaasNet.Gateway.Core.Domains
5+
{
6+
public class EventMeshServerAggregate
7+
{
8+
public EventMeshServerAggregate()
9+
{
10+
Bridges = new List<EventMeshServerAggregate>();
11+
}
12+
13+
public string Urn { get; set; }
14+
public int Port { get; set; }
15+
public string CountryIsoCode { get; set; }
16+
public string PostalCode { get; set; }
17+
public double? Latitude { get; set; }
18+
public double? Longitude { get; set; }
19+
public DateTime CreateDateTime { get; set; }
20+
public ICollection<EventMeshServerAggregate> Bridges { get; set; }
21+
22+
public static EventMeshServerAggregate Create(string urn, int port, string countryIsoCode, string postalCode, double? latitude, double? longitude)
23+
{
24+
return new EventMeshServerAggregate
25+
{
26+
CountryIsoCode = countryIsoCode,
27+
CreateDateTime = DateTime.UtcNow,
28+
Latitude = latitude,
29+
Longitude = longitude,
30+
Port = port,
31+
PostalCode = postalCode,
32+
Urn = urn
33+
};
34+
}
35+
}
36+
}

src/FaasNet.Gateway.Core/ErrorCodes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public static class ErrorCodes
1212
public const string UnknownAsyncApiOperation = "UnknownAsyncApiOperation";
1313
public const string StateMachineExists = "StateMachineExists";
1414
public const string FunctionExists = "FunctionExists";
15+
public const string EventMeshServerExists = "EventMeshServerExists";
1516
}
1617
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using FaasNet.Gateway.Core.EventMeshServer.Queries.Results;
2+
using MediatR;
3+
4+
namespace FaasNet.Gateway.Core.EventMeshServer.Commands
5+
{
6+
public class AddEventMeshServerCommand : IRequest<EventMeshServerResult>
7+
{
8+
public bool IsLocalhost { get; set; }
9+
public string Urn { get; set; }
10+
public int? Port { get; set; }
11+
}
12+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using EventMesh.Runtime;
2+
using EventMesh.Runtime.Exceptions;
3+
using FaasNet.Gateway.Core.Domains;
4+
using FaasNet.Gateway.Core.EventMeshServer.Queries.Results;
5+
using FaasNet.Gateway.Core.Exceptions;
6+
using FaasNet.Gateway.Core.Repositories;
7+
using FaasNet.Gateway.Core.Resources;
8+
using MaxMind.GeoIP2;
9+
using MaxMind.GeoIP2.Responses;
10+
using MediatR;
11+
using Microsoft.Extensions.Logging;
12+
using System.Threading;
13+
using System.Threading.Tasks;
14+
15+
namespace FaasNet.Gateway.Core.EventMeshServer.Commands.Handlers
16+
{
17+
public class AddEventMeshServerCommandHandler : IRequestHandler<AddEventMeshServerCommand, EventMeshServerResult>
18+
{
19+
private readonly WebServiceClient _maxMindClient;
20+
private readonly IEventMeshServerRepository _eventMeshServerRepository;
21+
private readonly ILogger<AddEventMeshServerCommandHandler> _logger;
22+
23+
public AddEventMeshServerCommandHandler(
24+
WebServiceClient webServiceClient,
25+
IEventMeshServerRepository eventMeshServerRepository,
26+
ILogger<AddEventMeshServerCommandHandler> logger)
27+
{
28+
_maxMindClient = webServiceClient;
29+
_eventMeshServerRepository = eventMeshServerRepository;
30+
_logger = logger;
31+
}
32+
33+
public async Task<EventMeshServerResult> Handle(AddEventMeshServerCommand request, CancellationToken cancellationToken)
34+
{
35+
var urn = request.IsLocalhost ? Constants.DefaultUrl : request.Urn;
36+
var port = request.Port ?? Constants.DefaultPort;
37+
var eventMeshServer = _eventMeshServerRepository.Get(urn, port);
38+
if (eventMeshServer == null)
39+
{
40+
throw new BadRequestException(ErrorCodes.EventMeshServerExists, string.Format(Global.EventMeshServerExists, urn, port));
41+
}
42+
43+
44+
await CheckEventMeshServer(urn, port, cancellationToken);
45+
var city = await GetCity(request.IsLocalhost, request.Urn);
46+
var record = EventMeshServerAggregate.Create(urn, port, city.Country.IsoCode, city.Postal.Code, city.Location.Latitude, city.Location.Longitude);
47+
await _eventMeshServerRepository.Add(record, cancellationToken);
48+
await _eventMeshServerRepository.SaveChanges(cancellationToken);
49+
return EventMeshServerResult.ToDto(record);
50+
}
51+
52+
private async Task CheckEventMeshServer(string urn, int port, CancellationToken cancellationToken)
53+
{
54+
try
55+
{
56+
var runtimeClient = new RuntimeClient(urn, port);
57+
await runtimeClient.HeartBeat(cancellationToken);
58+
}
59+
catch (RuntimeClientException ex)
60+
{
61+
_logger.LogError(ex.ToString());
62+
throw new EventMeshSeverUnreachableException(ex.Message);
63+
}
64+
}
65+
66+
private async Task<CityResponse> GetCity(bool isLocalhost, string urn)
67+
{
68+
CityResponse cityResponse = null;
69+
if (isLocalhost)
70+
{
71+
cityResponse = await _maxMindClient.CityAsync();
72+
}
73+
else
74+
{
75+
var ipAddress = RuntimeClient.ResolveIPAddress(urn);
76+
cityResponse = await _maxMindClient.CityAsync(ipAddress);
77+
}
78+
79+
return cityResponse;
80+
}
81+
}
82+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using FaasNet.Gateway.Core.EventMeshServer.Queries.Results;
2+
using MediatR;
3+
using System.Collections.Generic;
4+
5+
namespace FaasNet.Gateway.Core.EventMeshServer.Queries
6+
{
7+
public class GetAllEventMeshServerQuery : IRequest<IEnumerable<EventMeshServerResult>>
8+
{
9+
}
10+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using FaasNet.Gateway.Core.EventMeshServer.Queries.Results;
2+
using FaasNet.Gateway.Core.Repositories;
3+
using MediatR;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace FaasNet.Gateway.Core.EventMeshServer.Queries.Handlers
10+
{
11+
public class GetAllEventMeshServerQueryHandler : IRequestHandler<GetAllEventMeshServerQuery, IEnumerable<EventMeshServerResult>>
12+
{
13+
private readonly IEventMeshServerRepository _eventMeshServerRepository;
14+
15+
public GetAllEventMeshServerQueryHandler(IEventMeshServerRepository eventMeshServerRepository)
16+
{
17+
_eventMeshServerRepository = eventMeshServerRepository;
18+
}
19+
20+
public async Task<IEnumerable<EventMeshServerResult>> Handle(GetAllEventMeshServerQuery request, CancellationToken cancellationToken)
21+
{
22+
var result = await _eventMeshServerRepository.GetAll(cancellationToken);
23+
return result.Select(r => EventMeshServerResult.ToDto(r));
24+
}
25+
}
26+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using FaasNet.Gateway.Core.Domains;
2+
using System;
3+
4+
namespace FaasNet.Gateway.Core.EventMeshServer.Queries.Results
5+
{
6+
public class EventMeshServerResult
7+
{
8+
public string Urn { get; set; }
9+
public int Port { get; set; }
10+
public string CountryIsoCode { get; set; }
11+
public string PostalCode { get; set; }
12+
public double? Latitude { get; set; }
13+
public double? Longitude { get; set; }
14+
public DateTime CreateDateTime { get; set; }
15+
16+
public static EventMeshServerResult ToDto(EventMeshServerAggregate eventMeshServer)
17+
{
18+
return new EventMeshServerResult
19+
{
20+
CountryIsoCode = eventMeshServer.CountryIsoCode,
21+
CreateDateTime = eventMeshServer.CreateDateTime,
22+
Latitude = eventMeshServer.Latitude,
23+
Longitude = eventMeshServer.Longitude,
24+
Port = eventMeshServer.Port,
25+
PostalCode = eventMeshServer.PostalCode,
26+
Urn = eventMeshServer.Urn
27+
};
28+
}
29+
}
30+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace FaasNet.Gateway.Core.Exceptions
4+
{
5+
public class EventMeshSeverUnreachableException : Exception
6+
{
7+
public EventMeshSeverUnreachableException(string message) : base(message) { }
8+
}
9+
}

src/FaasNet.Gateway.Core/FaasNet.Gateway.Core.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66

77
<ItemGroup>
88
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0" />
9-
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
109
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
1110
<PackageReference Include="YamlDotNet" Version="11.2.1" />
11+
<PackageReference Include="MaxMind.GeoIP2" Version="5.1.0" />
1212
</ItemGroup>
1313

1414
<ItemGroup>
15+
<ProjectReference Include="..\EventMesh.Runtime\EventMesh.Runtime.csproj" />
1516
<ProjectReference Include="..\FaasNet.Runtime\FaasNet.Runtime.csproj" />
1617
</ItemGroup>
1718

0 commit comments

Comments
 (0)