Skip to content

Commit

Permalink
BREAKING CHANGES: Perform port-forward for kubernetes deployment only…
Browse files Browse the repository at this point in the history
… if specified
  • Loading branch information
cezarypiatek committed Jul 25, 2023
1 parent 09e33dd commit ef2a9aa
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 31 deletions.
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,15 @@ stateDiagram-v2
```

```cs
await using var connector = new TestChartGrpcMockServerConnector(protoDirectory: "protos", grpcPort:5033);
var settings = new TestChartGrpcMockServerConnectorSettings
{
ProtoDirectory = "protos",
GrpcPort = 8889,
ExposeStubbingPortOnLocalhost = true
};
await using var connector = new TestChartGrpcMockServerConnector(settings);

await connector.Install();
var connectionInfo = await connector.Install();
```

[![NuGet](https://img.shields.io/nuget/vpre/GrpcTestKit.svg)](https://www.nuget.org/packages/GrpcTestKit/)
Expand Down
7 changes: 6 additions & 1 deletion src/GrpcTestKit.Demo/Examples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,12 @@ await grpcMockClient.MockClientStreaming
[Test]
public async Task test_with_testcharts()
{
await using var connector = new TestChartGrpcMockServerConnector("protos", grpcPort: 8889);
await using var connector = new TestChartGrpcMockServerConnector( new TestChartGrpcMockServerConnectorSettings
{
ProtoDirectory ="protos",
GrpcPort = 8889,
ExposeStubbingPortOnLocalhost = true
});

var connectionInfo = await connector.Install();

Expand Down
2 changes: 1 addition & 1 deletion src/GrpcTestKit/GrpcTestKit.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="7.0.0" />
<PackageReference Include="Protobuf.System.Text.Json" Version="1.2.0" />
<PackageReference Include="SmoothSailing" Version="1.0.0" />
<PackageReference Include="SmoothSailing" Version="2.0.0" />
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="7.0.2" />
<PackageReference Include="Testcontainers" Version="3.1.0" />
<PackageReference Include="WireMock.Net.Abstractions" Version="1.5.25" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,18 @@ namespace GrpcTestKit.TestConnectors.Kubernetes;

public class TestChartGrpcMockServerConnector : IGrpcMockServerConnector
{
private readonly TestChartGrpcMockServerConnectorSettings _settings;
private readonly string _protoDirectory;
private readonly int _grpcPort;
private readonly string _dockerImage;
private readonly bool _exposeGrpcPortOnLocalhost;
private readonly string _releaseName;
private readonly ChartInstaller _chartInstaller;
private readonly ChartFromLocalPath _chart;
private Release? _release;
private int _wireMockPort;
private GrpcMockServerConnectionInfo? _connectionInfo;

public TestChartGrpcMockServerConnector(string protoDirectory, int grpcPort = 5033, string dockerImage = "cezarypiatek/grpc-mock-server", string? releaseName = null, bool exposeGrpcPortOnLocalhost = false)
public TestChartGrpcMockServerConnector(TestChartGrpcMockServerConnectorSettings settings)
{
_protoDirectory = Path.GetFullPath(protoDirectory);
_grpcPort = grpcPort;
_dockerImage = dockerImage;
_exposeGrpcPortOnLocalhost = exposeGrpcPortOnLocalhost;
_releaseName = releaseName ?? "grpcmockserverconnector";
_chartInstaller = new ChartInstaller(new ProcessLauncher(new ConsoleProcessOutputWriter()));
_settings = settings;
_protoDirectory = Path.GetFullPath(settings.ProtoDirectory);
_chartInstaller = new ChartInstaller();
_chart = new ChartFromLocalPath("./charts/grpcmockserver");
}

Expand All @@ -33,8 +27,9 @@ public async Task<GrpcMockServerConnectionInfo> Install()

var overrides = new
{
dockerImage = _dockerImage,
grpcPort = _grpcPort,
dockerImage = _settings.DockerImage,
grpcPort = _settings.GrpcPort,
stubbingPort = _settings.StubbingPort,
protoFiles = allProtoFile.Select(x => new
{
key = Guid.NewGuid().ToString("N"),
Expand All @@ -43,28 +38,35 @@ public async Task<GrpcMockServerConnectionInfo> Install()
}).ToArray()
};

_release = await _chartInstaller.Install(_chart, _releaseName, overrides);
if (_exposeGrpcPortOnLocalhost)
{
_ = await _release.StartPortForwardForService(serviceName: $"{_releaseName}-grpcmockserver-service", servicePort: _grpcPort, localPort: _grpcPort);
}
_wireMockPort = await _release.StartPortForwardForService(serviceName: $"{_releaseName}-grpcmockserver-service", servicePort: 9095);
return new GrpcMockServerConnectionInfo
_release = await _chartInstaller.Install(_chart, _settings.ReleaseName, overrides, context: _settings.Context);

var grpcPort = _settings.ExposeGrpcPortOnLocalhost
? await _release.StartPortForwardForService(serviceName: $"{_settings.ReleaseName}-grpcmockserver-service",
servicePort: _settings.GrpcPort, localPort: _settings.ExposeGrpcPortOnLocalhostPort)
: _settings.GrpcPort;

var stubbingPort = _settings.ExposeStubbingPortOnLocalhost
? await _release.StartPortForwardForService(serviceName: $"{_settings.ReleaseName}-grpcmockserver-service",
servicePort: _settings.StubbingPort, localPort: _settings.ExposeStubbingPortOnLocalhostPort)
: _settings.StubbingPort;

var serviceName = $"{_settings.ReleaseName}-grpcmockserver-service";
var serviceAddress = _settings.Context?.ResolveServiceAddress(serviceName) ?? serviceName;
return this._connectionInfo = new GrpcMockServerConnectionInfo
(
grpcEndpoint: _exposeGrpcPortOnLocalhost ? $"http://127.0.0.1:{_grpcPort}": $"http://{_releaseName}-grpcmockserver-service:{_grpcPort}" ,
stubbingEndpoint: $"http://127.0.0.1:{ _wireMockPort}"
grpcEndpoint: _settings.ExposeGrpcPortOnLocalhost ? $"http://127.0.0.1:{grpcPort}": $"http://{serviceAddress}:{grpcPort}" ,
stubbingEndpoint: _settings.ExposeStubbingPortOnLocalhost? $"http://127.0.0.1:{stubbingPort}": $"http://{serviceAddress}:{stubbingPort}"
);
}

public IGrpcMockClient CreateClient()
{
if (_release == null)
if (_connectionInfo == null)
{
throw new InvalidOperationException("Cannot create client as the connector is not installed yet. Call Install() first.");
}

var adminUrl = $"http://127.0.0.1:{_wireMockPort}";
return new GrpcMockClient(RestClient.For<IWireMockAdminApi>(adminUrl), adminUrl);
return new GrpcMockClient(RestClient.For<IWireMockAdminApi>(_connectionInfo.StubbingEndpoint), _connectionInfo.StubbingEndpoint);
}

public async ValueTask DisposeAsync()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using SmoothSailing;

namespace GrpcTestKit.TestConnectors.Kubernetes;

public class TestChartGrpcMockServerConnectorSettings
{
public string ProtoDirectory { get; set; }

Check warning on line 7 in src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs

View workflow job for this annotation

GitHub Actions / build-extension

Non-nullable property 'ProtoDirectory' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.

Check warning on line 7 in src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs

View workflow job for this annotation

GitHub Actions / build-extension

Non-nullable property 'ProtoDirectory' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.
public string DockerImage { get; set; } = "cezarypiatek/grpc-mock-server";
public string ReleaseName { get; set; } = "grpcmockserverconnector";
public int GrpcPort { get; set; } = 5033;
public int StubbingPort { get; set; } = 9095;
public bool ExposeGrpcPortOnLocalhost { get; set; }
public int ExposeGrpcPortOnLocalhostPort { get; set; }
public bool ExposeStubbingPortOnLocalhost { get; set; }
public int ExposeStubbingPortOnLocalhostPort { get; set; }
public KubernetesContext? Context { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ spec:
targetPort: 5033
protocol: TCP
- name: wiremockport
port: 9095
port: {{ .Values.stubbingPort | default 9095}}
targetPort: 9095
protocol: TCP

0 comments on commit ef2a9aa

Please sign in to comment.