diff --git a/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs b/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs index 869aaf6..50b16a6 100644 --- a/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs +++ b/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs @@ -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; @@ -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 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 CreateConfigMapsWithProto() + { + if (_protoDirectory == null || string.IsNullOrWhiteSpace(_protoDirectory)) + { + return new List(); + } + + 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(); @@ -35,7 +73,7 @@ public async Task 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) @@ -74,33 +112,7 @@ public async Task 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() diff --git a/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs b/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs index 116c570..6ddc751 100644 --- a/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs +++ b/src/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnectorSettings.cs @@ -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; @@ -14,4 +14,5 @@ public class TestChartGrpcMockServerConnectorSettings public bool ExposeStubbingPortOnLocalhost { get; set; } public int ExposeStubbingPortOnLocalhostPort { get; set; } public KubernetesContext? Context { get; set; } + public Dictionary EnvVariables { get; set; } = new Dictionary(); } \ No newline at end of file diff --git a/src/GrpcTestKit/charts/grpcmockserver/templates/ConfigMap.yaml b/src/GrpcTestKit/charts/grpcmockserver/templates/ConfigMap.yaml index 046a22a..7c5a1ae 100644 --- a/src/GrpcTestKit/charts/grpcmockserver/templates/ConfigMap.yaml +++ b/src/GrpcTestKit/charts/grpcmockserver/templates/ConfigMap.yaml @@ -1,3 +1,4 @@ +{{- if .Values.configMaps }} {{- range .Values.configMaps }} --- apiVersion: v1 @@ -10,3 +11,4 @@ data: {{ .content | indent 4 }} {{ end }} {{- end }} +{{- end }} diff --git a/src/GrpcTestKit/charts/grpcmockserver/templates/Pod.yaml b/src/GrpcTestKit/charts/grpcmockserver/templates/Pod.yaml index b7f8411..c3065ca 100644 --- a/src/GrpcTestKit/charts/grpcmockserver/templates/Pod.yaml +++ b/src/GrpcTestKit/charts/grpcmockserver/templates/Pod.yaml @@ -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 @@ -21,6 +28,7 @@ spec: initialDelaySeconds: 15 periodSeconds: 10 timeoutSeconds: 10 +{{if .Values.configMaps}} volumeMounts: {{- range $configMap := .Values.configMaps }} {{- range $configMap.files }} @@ -35,3 +43,4 @@ spec: configMap: name: {{$.Release.Name}}-protodrive-{{ .index }} {{- end }} +{{- end }} \ No newline at end of file diff --git a/src/GrpcToRestGenerator/GrpcMockServer.cs b/src/GrpcToRestGenerator/GrpcMockServer.cs index 628a966..665f9c8 100644 --- a/src/GrpcToRestGenerator/GrpcMockServer.cs +++ b/src/GrpcToRestGenerator/GrpcMockServer.cs @@ -125,22 +125,22 @@ public class InfoBinder : ServiceBinderBase { public HashSet Services { get; } = new HashSet(); - public override void AddMethod(Method method, UnaryServerMethod handler) + public override void AddMethod(Method method, UnaryServerMethod? handler) { Services.Add(method.ServiceName); } - public override void AddMethod(Method method, ClientStreamingServerMethod handler) + public override void AddMethod(Method method, ClientStreamingServerMethod? handler) { Services.Add(method.ServiceName); } - public override void AddMethod(Method method, ServerStreamingServerMethod handler) + public override void AddMethod(Method method, ServerStreamingServerMethod? handler) { Services.Add(method.ServiceName); } - public override void AddMethod(Method method, DuplexStreamingServerMethod handler) + public override void AddMethod(Method method, DuplexStreamingServerMethod? handler) { Services.Add(method.ServiceName); } diff --git a/src/GrpcToRestGenerator/GrpcToRestProxyGenerator.cs b/src/GrpcToRestGenerator/GrpcToRestProxyGenerator.cs index 897407e..3a24a8e 100644 --- a/src/GrpcToRestGenerator/GrpcToRestProxyGenerator.cs +++ b/src/GrpcToRestGenerator/GrpcToRestProxyGenerator.cs @@ -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 { } ";