Skip to content

Commit ab6d97a

Browse files
Handle logging arguments in provider's getEngineAddress (#536)
Passing a --logflow argument to the CLI will make it pass all its arguments to providers. This PR ports this [Node.js implementation](https://github.com/pulumi/pulumi/blob/05970ff66567eeed7723d7b6ee2c37d3b464f580/sdk/nodejs/provider/internals.ts#L30-L53) and [Java implementation](pulumi/pulumi-java#1708) that discards known logging parameters from engine address calculation. ~This change now requires an address while previously it was optional. I believe this is a correct change, again in line with other SDKs, but let me know if there are legit cases when address is not passed.~
1 parent 8500c20 commit ab6d97a

File tree

3 files changed

+129
-2
lines changed

3 files changed

+129
-2
lines changed
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
component: sdk/provider
2+
kind: bug-fixes
3+
body: Handle logging arguments in provider's getEngineAddress
4+
time: 2025-03-10T11:10:52.170215+01:00
5+
custom:
6+
PR: "536"

sdk/Pulumi.Tests/Provider/ProviderTests.cs

+84
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,88 @@ public async Task NotImplementedErrorIncludesName()
8686
Assert.Contains("GetSchema", exc.Message);
8787
}
8888
}
89+
90+
public class ProviderEngineAddressTests
91+
{
92+
private static string? GetEngineAddress(string[] args)
93+
{
94+
// Helper method to access the private static method for testing
95+
var method = typeof(Pulumi.Experimental.Provider.Provider).GetMethod(
96+
"GetEngineAddress",
97+
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
98+
99+
try
100+
{
101+
return (string?)method?.Invoke(null, new object[] { args });
102+
}
103+
catch (System.Reflection.TargetInvocationException ex)
104+
{
105+
if (ex.InnerException != null)
106+
throw ex.InnerException;
107+
throw;
108+
}
109+
}
110+
111+
[Fact]
112+
public void GetEngineAddress_WithValidAddress_ReturnsAddress()
113+
{
114+
var args = new[] { "127.0.0.1:51776" };
115+
var address = GetEngineAddress(args);
116+
Assert.Equal("127.0.0.1:51776", address);
117+
}
118+
119+
[Fact]
120+
public void GetEngineAddress_WithLoggingArgs_ReturnsAddress()
121+
{
122+
var args = new[] {
123+
"--logtostderr",
124+
"-v=3",
125+
"127.0.0.1:51776",
126+
"--logflow"
127+
};
128+
var address = GetEngineAddress(args);
129+
Assert.Equal("127.0.0.1:51776", address);
130+
}
131+
132+
[Fact]
133+
public void GetEngineAddress_WithTracingArg_ReturnsAddress()
134+
{
135+
var args = new[] {
136+
"--tracing",
137+
"1",
138+
"127.0.0.1:51776"
139+
};
140+
var address = GetEngineAddress(args);
141+
Assert.Equal("127.0.0.1:51776", address);
142+
}
143+
144+
[Fact]
145+
public void GetEngineAddress_WithNoArgs_ReturnsNull()
146+
{
147+
var args = Array.Empty<string>();
148+
var address = GetEngineAddress(args);
149+
Assert.Null(address);
150+
}
151+
152+
[Fact]
153+
public void GetEngineAddress_WithOnlyLoggingArgs_ReturnsNull()
154+
{
155+
var args = new[] { "--logtostderr", "-v10", "--logflow" };
156+
var address = GetEngineAddress(args);
157+
Assert.Null(address);
158+
}
159+
160+
[Fact]
161+
public void GetEngineAddress_WithMultipleAddresses_ThrowsException()
162+
{
163+
var args = new[] {
164+
"127.0.0.1:51776",
165+
"127.0.0.1:51777"
166+
};
167+
var ex = Assert.Throws<ArgumentException>(() => GetEngineAddress(args));
168+
Assert.Equal(
169+
"Expected at most one engine address argument, but got 2 non-logging arguments",
170+
ex.Message);
171+
}
172+
}
89173
}

sdk/Pulumi/Provider/Provider.cs

+39-2
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,8 @@ internal static Microsoft.Extensions.Hosting.IHost BuildHost(
542542
// maxRpcMessageSize raises the gRPC Max message size from `4194304` (4mb) to `419430400` (400mb)
543543
var maxRpcMessageSize = 400 * 1024 * 1024;
544544

545+
var engineAddress = GetEngineAddress(args);
546+
545547
return Host.CreateDefaultBuilder()
546548
.ConfigureWebHostDefaults(webBuilder =>
547549
{
@@ -560,9 +562,9 @@ internal static Microsoft.Extensions.Hosting.IHost BuildHost(
560562
config.Sources.Clear();
561563

562564
var memConfig = new Dictionary<string, string?>();
563-
if (args.Length > 0)
565+
if (engineAddress != null)
564566
{
565-
memConfig.Add("Host", args[0]);
567+
memConfig.Add("Host", engineAddress);
566568
}
567569
if (version != null)
568570
{
@@ -600,6 +602,41 @@ internal static Microsoft.Extensions.Hosting.IHost BuildHost(
600602
})
601603
.Build();
602604
}
605+
606+
private static string? GetEngineAddress(string[] args)
607+
{
608+
var cleanArgs = new List<string>();
609+
610+
for (int i = 0; i < args.Length; i++)
611+
{
612+
var arg = args[i];
613+
614+
// Skip logging-related arguments
615+
if (arg == "--logtostderr") continue;
616+
if (arg.StartsWith("-v")) continue;
617+
if (arg == "--logflow") continue;
618+
if (arg == "--tracing")
619+
{
620+
i++; // Skip the tracing value
621+
continue;
622+
}
623+
624+
cleanArgs.Add(arg);
625+
}
626+
627+
if (cleanArgs.Count == 0)
628+
{
629+
return null;
630+
}
631+
632+
if (cleanArgs.Count > 1)
633+
{
634+
throw new ArgumentException(
635+
$"Expected at most one engine address argument, but got {cleanArgs.Count} non-logging arguments");
636+
}
637+
638+
return cleanArgs[0];
639+
}
603640
}
604641

605642
class ResourceProviderService : ResourceProvider.ResourceProviderBase, IDisposable

0 commit comments

Comments
 (0)