-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Richfr/ Add windowsAddress support to WslcCreateContainer() API #40037
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
fe043b9
04a4541
cf34fb8
954d1a0
31e28b4
7ca8e51
7f1eca4
eff50d2
41a39eb
895a604
a788da8
644ebab
47c28f2
9ed0f18
fb9c466
13ba738
e482e48
1e7656a
f4fd0ba
45b6841
75fa4ac
fdf802d
573786f
5a8a0ae
7f2e047
6b5ffdd
dd50413
86eb5b7
15c2e67
b9a3176
9618aad
759f2f7
3e6f691
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -67,4 +67,5 @@ doc/site/ | |
| directory.build.targets | ||
| test-storage/ | ||
| *.vhdx | ||
| *.tar | ||
| *.tar | ||
| *.etl | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -775,18 +775,18 @@ class WslcSdkTests | |
|
|
||
| // Negative: port mappings with NONE networking must fail at container creation. | ||
| { | ||
| WslcContainerSettings containerSettings; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("debian:latest", &containerSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings, WSLC_CONTAINER_NETWORKING_MODE_NONE)); | ||
| WslcContainerSettings containerSettings1; | ||
|
1wizkid marked this conversation as resolved.
|
||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("debian:latest", &containerSettings1)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings1, WSLC_CONTAINER_NETWORKING_MODE_NONE)); | ||
|
Comment on lines
+778
to
+780
|
||
|
|
||
| WslcContainerPortMapping mapping{}; | ||
| mapping.windowsPort = 12342; | ||
| mapping.containerPort = 8000; | ||
| mapping.protocol = WSLC_PORT_PROTOCOL_TCP; | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings, &mapping, 1)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings1, &mapping, 1)); | ||
|
|
||
| WslcContainer rawContainer = nullptr; | ||
| VERIFY_ARE_EQUAL(WslcCreateContainer(m_defaultSession, &containerSettings, &rawContainer, nullptr), E_INVALIDARG); | ||
| VERIFY_ARE_EQUAL(WslcCreateContainer(m_defaultSession, &containerSettings1, &rawContainer, nullptr), E_INVALIDARG); | ||
| VERIFY_IS_NULL(rawContainer); | ||
| } | ||
|
|
||
|
|
@@ -800,19 +800,19 @@ class WslcSdkTests | |
| const char* env[] = {"PYTHONUNBUFFERED=1"}; | ||
| VERIFY_SUCCEEDED(WslcSetProcessSettingsEnvVariables(&procSettings, env, ARRAYSIZE(env))); | ||
|
|
||
| WslcContainerSettings containerSettings; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("python:3.12-alpine", &containerSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsInitProcess(&containerSettings, &procSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED)); | ||
| WslcContainerSettings containerSettings2; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("python:3.12-alpine", &containerSettings2)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsInitProcess(&containerSettings2, &procSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings2, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED)); | ||
|
Comment on lines
+803
to
+806
|
||
|
|
||
| WslcContainerPortMapping mapping{}; | ||
| mapping.windowsPort = 12341; | ||
| mapping.containerPort = 8000; | ||
| mapping.protocol = WSLC_PORT_PROTOCOL_TCP; | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings, &mapping, 1)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings2, &mapping, 1)); | ||
|
|
||
| UniqueContainer container; | ||
| VERIFY_SUCCEEDED(WslcCreateContainer(m_defaultSession, &containerSettings, &container, nullptr)); | ||
| VERIFY_SUCCEEDED(WslcCreateContainer(m_defaultSession, &containerSettings2, &container, nullptr)); | ||
| VERIFY_SUCCEEDED(WslcStartContainer(container.get(), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr)); | ||
|
|
||
| UniqueProcess process; | ||
|
|
@@ -825,6 +825,105 @@ class WslcSdkTests | |
|
|
||
| ExpectHttpResponse(L"http://127.0.0.1:12341", 200); | ||
| } | ||
|
|
||
| // Functional: port mapping with explicit IPv4 windowsAddress (127.0.0.1). | ||
| { | ||
| WslcProcessSettings procSettings; | ||
| VERIFY_SUCCEEDED(WslcInitProcessSettings(&procSettings)); | ||
| const char* argv[] = {"python3", "-m", "http.server", "8000"}; | ||
| VERIFY_SUCCEEDED(WslcSetProcessSettingsCmdLine(&procSettings, argv, ARRAYSIZE(argv))); | ||
| const char* env[] = {"PYTHONUNBUFFERED=1"}; | ||
| VERIFY_SUCCEEDED(WslcSetProcessSettingsEnvVariables(&procSettings, env, ARRAYSIZE(env))); | ||
|
|
||
| WslcContainerSettings containerSettings3; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("python:3.12-alpine", &containerSettings3)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsInitProcess(&containerSettings3, &procSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings3, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED)); | ||
|
Comment on lines
+838
to
+841
|
||
|
|
||
| sockaddr_storage addr4{}; | ||
| auto* sin4 = reinterpret_cast<sockaddr_in*>(&addr4); | ||
| sin4->sin_family = AF_INET; | ||
| VERIFY_ARE_EQUAL(inet_pton(AF_INET, "127.0.0.1", &sin4->sin_addr), 1); | ||
|
|
||
| WslcContainerPortMapping mapping{}; | ||
| mapping.windowsPort = 12343; | ||
| mapping.containerPort = 8000; | ||
| mapping.protocol = WSLC_PORT_PROTOCOL_TCP; | ||
| mapping.windowsAddress = &addr4; | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings3, &mapping, 1)); | ||
|
|
||
| UniqueContainer container; | ||
| VERIFY_SUCCEEDED(WslcCreateContainer(m_defaultSession, &containerSettings3, &container, nullptr)); | ||
| VERIFY_SUCCEEDED(WslcStartContainer(container.get(), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr)); | ||
|
|
||
| UniqueProcess process; | ||
| VERIFY_SUCCEEDED(WslcGetContainerInitProcess(container.get(), &process)); | ||
|
|
||
| wil::unique_handle ownedStdout; | ||
| VERIFY_SUCCEEDED(WslcGetProcessIOHandle(process.get(), WSLC_PROCESS_IO_HANDLE_STDOUT, &ownedStdout)); | ||
|
|
||
| WaitForOutput(std::move(ownedStdout), "Serving HTTP on", 30s); | ||
|
|
||
| ExpectHttpResponse(L"http://127.0.0.1:12343", 200); | ||
| } | ||
|
|
||
| // Functional: port mapping with explicit IPv6 windowsAddress (::1). | ||
| { | ||
| WslcProcessSettings procSettings; | ||
| VERIFY_SUCCEEDED(WslcInitProcessSettings(&procSettings)); | ||
| const char* argv[] = {"python3", "-m", "http.server", "8000", "--bind", "::"}; | ||
| VERIFY_SUCCEEDED(WslcSetProcessSettingsCmdLine(&procSettings, argv, ARRAYSIZE(argv))); | ||
| const char* env[] = {"PYTHONUNBUFFERED=1"}; | ||
| VERIFY_SUCCEEDED(WslcSetProcessSettingsEnvVariables(&procSettings, env, ARRAYSIZE(env))); | ||
|
|
||
| WslcContainerSettings containerSettings4; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("python:3.12-alpine", &containerSettings4)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsInitProcess(&containerSettings4, &procSettings)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings4, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED)); | ||
|
Comment on lines
+879
to
+882
|
||
|
|
||
| sockaddr_storage addr6{}; | ||
| auto* sin6 = reinterpret_cast<sockaddr_in6*>(&addr6); | ||
| sin6->sin6_family = AF_INET6; | ||
| VERIFY_ARE_EQUAL(inet_pton(AF_INET6, "::1", &sin6->sin6_addr), 1); | ||
|
|
||
| WslcContainerPortMapping mapping{}; | ||
| mapping.windowsPort = 12344; | ||
| mapping.containerPort = 8000; | ||
| mapping.protocol = WSLC_PORT_PROTOCOL_TCP; | ||
| mapping.windowsAddress = &addr6; | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(&containerSettings4, &mapping, 1)); | ||
|
|
||
| UniqueContainer container; | ||
| VERIFY_SUCCEEDED(WslcCreateContainer(m_defaultSession, &containerSettings4, &container, nullptr)); | ||
| VERIFY_SUCCEEDED(WslcStartContainer(container.get(), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr)); | ||
|
|
||
| UniqueProcess process; | ||
| VERIFY_SUCCEEDED(WslcGetContainerInitProcess(container.get(), &process)); | ||
|
|
||
| wil::unique_handle ownedStdout; | ||
| VERIFY_SUCCEEDED(WslcGetProcessIOHandle(process.get(), WSLC_PROCESS_IO_HANDLE_STDOUT, &ownedStdout)); | ||
|
|
||
| WaitForOutput(std::move(ownedStdout), "Serving HTTP on", 30s); | ||
|
|
||
| ExpectHttpResponse(L"http://[::1]:12344", 200); | ||
| } | ||
|
|
||
| // Negative: unsupported address family must fail when setting container portmapping values. | ||
| { | ||
| WslcContainerSettings containerSettings5; | ||
| VERIFY_SUCCEEDED(WslcInitContainerSettings("debian:latest", &containerSettings5)); | ||
| VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(&containerSettings5, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED)); | ||
|
Comment on lines
+913
to
+915
|
||
|
|
||
| sockaddr_storage badAddr{}; | ||
| badAddr.ss_family = AF_UNIX; // unsupported for port mapping | ||
|
|
||
| WslcContainerPortMapping mapping{}; | ||
| mapping.windowsPort = 12345; | ||
| mapping.containerPort = 8000; | ||
| mapping.protocol = WSLC_PORT_PROTOCOL_TCP; | ||
| mapping.windowsAddress = &badAddr; | ||
| VERIFY_ARE_EQUAL(WslcSetContainerSettingsPortMappings(&containerSettings5, &mapping, 1), E_INVALIDARG); | ||
| } | ||
| } | ||
|
|
||
| WSLC_TEST_METHOD(ContainerVolumeUnit) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If
inet_ntop()returns null butWSAGetLastError()happens to be 0 (e.g., stale last-error state),HRESULT_FROM_WIN32(0)will incorrectly returnS_OK. Consider capturing the error immediately and returning a non-success fallback when the error code is 0 (e.g.,E_FAIL), or proactively setting/clearing last error before callinginet_ntop().