Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace GrpcTestKit.TestConnectors.Kubernetes;
public class TestChartGrpcMockServerConnector : IGrpcMockServerConnector
{
private readonly TestChartGrpcMockServerConnectorSettings _settings;
private readonly string _protoDirectory;
private readonly string? _protoDirectory;
private readonly ChartInstaller _chartInstaller;
private readonly ChartFromLocalPath _chart;
private Release? _release;
Expand All @@ -17,14 +17,52 @@ public class TestChartGrpcMockServerConnector : IGrpcMockServerConnector
public TestChartGrpcMockServerConnector(TestChartGrpcMockServerConnectorSettings settings)
{
_settings = settings;
_protoDirectory = Path.GetFullPath(settings.ProtoDirectory);
_protoDirectory = settings.ProtoDirectory;
_chartInstaller = new ChartInstaller();
_chart = new ChartFromLocalPath("./charts/grpcmockserver");
}

public async Task<GrpcMockServerConnectionInfo> Install()
{
var allProtoFile = Directory.EnumerateFiles(_protoDirectory, "*.proto", SearchOption.AllDirectories);
var overrides = new
{
dockerImage = _settings.DockerImage,
grpcPort = _settings.GrpcPort,
stubbingPort = _settings.StubbingPort,
configMaps = CreateConfigMapsWithProto().ToArray(),
envVariables = _settings.EnvVariables
};

_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: _settings.ExposeGrpcPortOnLocalhost ? $"http://127.0.0.1:{grpcPort}": $"http://{serviceAddress}:{grpcPort}" ,
stubbingEndpoint: _settings.ExposeStubbingPortOnLocalhost? $"http://127.0.0.1:{stubbingPort}": $"http://{serviceAddress}:{stubbingPort}"
);
}

private List<object> CreateConfigMapsWithProto()
{
if (_protoDirectory == null || string.IsNullOrWhiteSpace(_protoDirectory))
{
return new List<object>();
}

var fullProtoPath = Path.GetFullPath(_protoDirectory);
var allProtoFile = Directory.EnumerateFiles(fullProtoPath, "*.proto", SearchOption.AllDirectories);

const int maxConfigMapSizeBytes = 512 * 1024; // 0.5 MB
var configMaps = new List<object>();
Expand All @@ -35,7 +73,7 @@ public async Task<GrpcMockServerConnectionInfo> Install()
foreach (var protoFile in allProtoFile)
{
var content = File.ReadAllText(protoFile);
var path = protoFile.Remove(0, _protoDirectory.Length).Replace("\\", "/").Trim('/');
var path = protoFile.Remove(0, fullProtoPath.Length).Replace("\\", "/").Trim('/');
var key = Guid.NewGuid().ToString("N");

// Estimate size (content + some overhead for YAML structure)
Expand Down Expand Up @@ -74,33 +112,7 @@ public async Task<GrpcMockServerConnectionInfo> Install()
});
}

var overrides = new
{
dockerImage = _settings.DockerImage,
grpcPort = _settings.GrpcPort,
stubbingPort = _settings.StubbingPort,
configMaps = configMaps.ToArray()
};

_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: _settings.ExposeGrpcPortOnLocalhost ? $"http://127.0.0.1:{grpcPort}": $"http://{serviceAddress}:{grpcPort}" ,
stubbingEndpoint: _settings.ExposeStubbingPortOnLocalhost? $"http://127.0.0.1:{stubbingPort}": $"http://{serviceAddress}:{stubbingPort}"
);
return configMaps;
}

public IGrpcMockClient CreateClient()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace GrpcTestKit.TestConnectors.Kubernetes;

public class TestChartGrpcMockServerConnectorSettings
{
public string ProtoDirectory { get; set; }
public string? ProtoDirectory { get; set; }
public string DockerImage { get; set; } = "cezarypiatek/grpc-mock-server";
public string ReleaseName { get; set; } = "grpcmockserverconnector";
public int GrpcPort { get; set; } = 5033;
Expand All @@ -14,4 +14,5 @@ public class TestChartGrpcMockServerConnectorSettings
public bool ExposeStubbingPortOnLocalhost { get; set; }
public int ExposeStubbingPortOnLocalhostPort { get; set; }
public KubernetesContext? Context { get; set; }
public Dictionary<string, string> EnvVariables { get; set; } = new Dictionary<string, string>();
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{{- if .Values.configMaps }}
{{- range .Values.configMaps }}
---
apiVersion: v1
Expand All @@ -10,3 +11,4 @@ data:
{{ .content | indent 4 }}
{{ end }}
{{- end }}
{{- end }}
9 changes: 9 additions & 0 deletions src/GrpcTestKit/charts/grpcmockserver/templates/Pod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ spec:
- name: grpcmockserver
image: {{ .Values.dockerImage | default "cezarypiatek/grpc-mock-server" }}
imagePullPolicy: IfNotPresent
{{- if .Values.envVariables}}
env:
{{- range $key, $value := .Values.envVariables }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
{{- end }}
ports:
- name: wiremockport
containerPort: 9095
Expand All @@ -21,6 +28,7 @@ spec:
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 10
{{if .Values.configMaps}}
volumeMounts:
{{- range $configMap := .Values.configMaps }}
{{- range $configMap.files }}
Expand All @@ -35,3 +43,4 @@ spec:
configMap:
name: {{$.Release.Name}}-protodrive-{{ .index }}
{{- end }}
{{- end }}
8 changes: 4 additions & 4 deletions src/GrpcToRestGenerator/GrpcMockServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,22 +125,22 @@ public class InfoBinder : ServiceBinderBase
{
public HashSet<string> Services { get; } = new HashSet<string>();

public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, UnaryServerMethod<TRequest, TResponse> handler)
public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, UnaryServerMethod<TRequest, TResponse>? handler)
{
Services.Add(method.ServiceName);
}

public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, ClientStreamingServerMethod<TRequest, TResponse> handler)
public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, ClientStreamingServerMethod<TRequest, TResponse>? handler)
{
Services.Add(method.ServiceName);
}

public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, ServerStreamingServerMethod<TRequest, TResponse> handler)
public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, ServerStreamingServerMethod<TRequest, TResponse>? handler)
{
Services.Add(method.ServiceName);
}

public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, DuplexStreamingServerMethod<TRequest, TResponse> handler)
public override void AddMethod<TRequest, TResponse>(Method<TRequest, TResponse> method, DuplexStreamingServerMethod<TRequest, TResponse>? handler)
{
Services.Add(method.ServiceName);
}
Expand Down
12 changes: 9 additions & 3 deletions src/GrpcToRestGenerator/GrpcToRestProxyGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,29 @@ public class GrpcToRestProxyGenerator:IIncrementalGenerator
using System;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class GrpcMockHelperForAttribute:Attribute
internal class GrpcMockHelperForAttribute : Attribute
{
public Type ServiceType { get; }

public GrpcMockHelperForAttribute(Type serviceType)
{
ServiceType = serviceType;
}
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class GrpcMockServerForAttribute:Attribute
internal class GrpcMockServerForAttribute : Attribute
{
public Type ServiceType { get; }

public GrpcMockServerForAttribute(Type serviceType)
{
ServiceType = serviceType;
}
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class GrpcMockServerForAutoDiscoveredSourceServicesAttribute:Attribute
internal class GrpcMockServerForAutoDiscoveredSourceServicesAttribute : Attribute
{
}
";
Expand Down
Loading