Skip to content

Commit f44c13a

Browse files
Ticket #62 : Add bridge between two servers
1 parent 974cf7e commit f44c13a

37 files changed

+823
-44
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,7 @@ log-*.txt
212212
docs/_build/
213213

214214
## Ignore Javascript
215-
wwwroot/
215+
wwwroot/
216+
217+
# Ignore DB
218+
*.db

src/EventMesh.Runtime.Website/Program.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Microsoft.Extensions.DependencyInjection;
66
using Microsoft.Extensions.Hosting;
77
using System;
8-
using System.Collections.Generic;
98
using System.IO;
109
using System.Reflection;
1110

@@ -19,6 +18,7 @@ public static void Main(string[] args)
1918
// LaunchAMQPEventMeshServer();
2019
// LaunchKafkaEventMeshServer();
2120
LaunchFullEventMeshServer();
21+
LaunchFullEventMeshServer(4001, "Runtime2.db");
2222
CreateHostBuilder(args).Build().Run();
2323
}
2424

@@ -87,15 +87,15 @@ private static IRuntimeHost LaunchKafkaEventMeshServer()
8787
return runtimeHost;
8888
}
8989

90-
private static IRuntimeHost LaunchFullEventMeshServer()
90+
private static IRuntimeHost LaunchFullEventMeshServer(int port = 4000, string dbName = "Runtime.db")
9191
{
9292
var migrationsAssembly = typeof(Program).GetTypeInfo().Assembly.GetName().Name;
9393
Console.WriteLine("Launch EventMesh server...");
94-
var path = Path.Combine(Environment.CurrentDirectory, "Runtime.db");
94+
var path = Path.Combine(Environment.CurrentDirectory, dbName);
9595
var builder = new RuntimeHostBuilder(opt =>
9696
{
9797
opt.Urn = "localhost";
98-
opt.Port = 4000;
98+
opt.Port = port;
9999
})
100100
.AddKafka()
101101
.AddAMQP()
-104 KB
Binary file not shown.

src/FaasNet.Gateway.Core/Domains/EventMeshServerAggregate.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
using System;
1+
using FaasNet.Gateway.Core.Exceptions;
2+
using FaasNet.Gateway.Core.Resources;
3+
using System;
24
using System.Collections.Generic;
5+
using System.Linq;
36

47
namespace FaasNet.Gateway.Core.Domains
58
{
69
public class EventMeshServerAggregate
710
{
811
public EventMeshServerAggregate()
912
{
10-
Bridges = new List<EventMeshServerAggregate>();
13+
Bridges = new List<EventMeshServerBridge>();
1114
}
1215

1316
public string Urn { get; set; }
@@ -17,7 +20,7 @@ public EventMeshServerAggregate()
1720
public double? Latitude { get; set; }
1821
public double? Longitude { get; set; }
1922
public DateTime CreateDateTime { get; set; }
20-
public ICollection<EventMeshServerAggregate> Bridges { get; set; }
23+
public ICollection<EventMeshServerBridge> Bridges { get; set; }
2124

2225
public static EventMeshServerAggregate Create(string urn, int port, string countryIsoCode, string postalCode, double? latitude, double? longitude)
2326
{
@@ -32,5 +35,19 @@ public static EventMeshServerAggregate Create(string urn, int port, string count
3235
Urn = urn
3336
};
3437
}
38+
39+
public void AddBridge(string urn, int port)
40+
{
41+
if(Bridges.Any(b => b.Urn == urn && b.Port == port))
42+
{
43+
throw new DomainException(ErrorCodes.BridgeAlreadyExists, Global.BridgeAlreadyExists);
44+
}
45+
46+
Bridges.Add(new EventMeshServerBridge
47+
{
48+
Port = port,
49+
Urn = urn
50+
});
51+
}
3552
}
3653
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace FaasNet.Gateway.Core.Domains
2+
{
3+
public class EventMeshServerBridge
4+
{
5+
public string Urn { get; set; }
6+
public int Port { get; set; }
7+
}
8+
}

src/FaasNet.Gateway.Core/ErrorCodes.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ public static class ErrorCodes
1010
public const string UnknownStateMachine = "UnknownStateMachine";
1111
public const string UnknownOpenApiOperation = "UnknownOpenApiOperation";
1212
public const string UnknownAsyncApiOperation = "UnknownAsyncApiOperation";
13+
public const string UnknownEventMeshServer = "UnknownEventMeshServer";
1314
public const string StateMachineExists = "StateMachineExists";
1415
public const string FunctionExists = "FunctionExists";
1516
public const string EventMeshServerExists = "EventMeshServerExists";
17+
public const string BridgeAlreadyExists = "BridgeAlreadyExists";
1618
}
1719
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using MediatR;
2+
3+
namespace FaasNet.Gateway.Core.EventMeshServer.Commands
4+
{
5+
public class AddEventMeshServerBridgeCommand : IRequest<bool>
6+
{
7+
public EventMeshServer From { get; set; }
8+
public EventMeshServer To { get; set; }
9+
}
10+
11+
public class EventMeshServer
12+
{
13+
public string Urn { get; set; }
14+
public int Port { get; set; }
15+
}
16+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using EventMesh.Runtime;
2+
using EventMesh.Runtime.Exceptions;
3+
using FaasNet.Gateway.Core.Exceptions;
4+
using FaasNet.Gateway.Core.Repositories;
5+
using FaasNet.Gateway.Core.Resources;
6+
using MediatR;
7+
using Microsoft.Extensions.Logging;
8+
using System.Threading;
9+
using System.Threading.Tasks;
10+
11+
namespace FaasNet.Gateway.Core.EventMeshServer.Commands.Handlers
12+
{
13+
public class AddEventMeshServerBridgeCommandHandler : IRequestHandler<AddEventMeshServerBridgeCommand, bool>
14+
{
15+
private readonly IEventMeshServerRepository _eventMeshServerRepository;
16+
private readonly ILogger<AddEventMeshServerBridgeCommandHandler> _logger;
17+
18+
public AddEventMeshServerBridgeCommandHandler(IEventMeshServerRepository eventMeshServerRepository, ILogger<AddEventMeshServerBridgeCommandHandler> logger)
19+
{
20+
_eventMeshServerRepository = eventMeshServerRepository;
21+
_logger = logger;
22+
}
23+
24+
public async Task<bool> Handle(AddEventMeshServerBridgeCommand request, CancellationToken cancellationToken)
25+
{
26+
var fromServer = await _eventMeshServerRepository.Get(request.From.Urn, request.From.Port);
27+
if(fromServer == null)
28+
{
29+
throw new BadRequestException(ErrorCodes.UnknownEventMeshServer, string.Format(Global.UnknownEventMeshServer, request.From.Urn, request.From.Port));
30+
}
31+
32+
var toServer = await _eventMeshServerRepository.Get(request.To.Urn, request.To.Port);
33+
if(toServer == null)
34+
{
35+
throw new BadRequestException(ErrorCodes.UnknownEventMeshServer, string.Format(Global.UnknownEventMeshServer, request.To.Urn, request.To.Port));
36+
}
37+
38+
fromServer.AddBridge(request.To.Urn, request.To.Port);
39+
await AddBridge(request.From, request.To, cancellationToken);
40+
await _eventMeshServerRepository.Update(fromServer, cancellationToken);
41+
await _eventMeshServerRepository.SaveChanges(cancellationToken);
42+
return true;
43+
}
44+
private async Task AddBridge(EventMeshServer from, EventMeshServer to, CancellationToken cancellationToken)
45+
{
46+
try
47+
{
48+
var runtimeClient = new RuntimeClient(from.Urn, from.Port);
49+
await runtimeClient.AddBridge(to.Urn, to.Port, cancellationToken);
50+
}
51+
catch (RuntimeClientException ex)
52+
{
53+
_logger.LogError(ex.ToString());
54+
throw new EventMeshSeverUnreachableException(ex.Message);
55+
}
56+
}
57+
}
58+
}

src/FaasNet.Gateway.Core/EventMeshServer/Commands/Handlers/AddEventMeshServerCommandHandler.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,12 @@ public async Task<EventMeshServerResult> Handle(AddEventMeshServerCommand reques
3434
{
3535
var urn = request.IsLocalhost ? Constants.DefaultUrl : request.Urn;
3636
var port = request.Port ?? Constants.DefaultPort;
37-
var eventMeshServer = _eventMeshServerRepository.Get(urn, port);
38-
if (eventMeshServer == null)
37+
var eventMeshServer = await _eventMeshServerRepository.Get(urn, port);
38+
if (eventMeshServer != null)
3939
{
4040
throw new BadRequestException(ErrorCodes.EventMeshServerExists, string.Format(Global.EventMeshServerExists, urn, port));
4141
}
4242

43-
4443
await CheckEventMeshServer(urn, port, cancellationToken);
4544
var city = await GetCity(request.IsLocalhost, request.Urn);
4645
var record = EventMeshServerAggregate.Create(urn, port, city.Country.IsoCode, city.Postal.Code, city.Location.Latitude, city.Location.Longitude);
@@ -65,7 +64,7 @@ private async Task CheckEventMeshServer(string urn, int port, CancellationToken
6564

6665
private async Task<CityResponse> GetCity(bool isLocalhost, string urn)
6766
{
68-
CityResponse cityResponse = null;
67+
CityResponse cityResponse = null; // new CityResponse(country: new MaxMind.GeoIP2.Model.Country(isoCode: "BE"), postal: new MaxMind.GeoIP2.Model.Postal(code: "1342"), location: new MaxMind.GeoIP2.Model.Location(longitude: 4.555060, latitude: 50.676090));
6968
if (isLocalhost)
7069
{
7170
cityResponse = await _maxMindClient.CityAsync();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using FaasNet.Gateway.Core.Domains;
2+
3+
namespace FaasNet.Gateway.Core.EventMeshServer.Queries.Results
4+
{
5+
public class EventMeshServerBridgeResult
6+
{
7+
public string Urn { get; set; }
8+
public int Port { get; set; }
9+
10+
public static EventMeshServerBridgeResult ToDto(EventMeshServerBridge parameter)
11+
{
12+
return new EventMeshServerBridgeResult
13+
{
14+
Urn = parameter.Urn,
15+
Port = parameter.Port
16+
};
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)