temporalio / cli

Command-line interface for running Temporal Server and interacting with Workflows, Activities, Namespaces, and other parts of Temporal
https://docs.temporal.io/cli
MIT License
241 stars 32 forks source link

dev-server: Properly deal with IPv6 #611

Closed mjameswh closed 5 days ago

mjameswh commented 6 days ago

What was changed

How this was tested

I added a few integration tests.

However, most cases fixed in this PR relates to specific network configuration, which can't easily be reproduced in CI or on developer machines. These changes were therefore only validated by manual testing.

For future reference, this is the gist of what I did on my Mac.

# Add two more loopback IPs
sudo ifconfig lo0 alias 127.0.0.2 up
sudo ifconfig lo0 alias 127.0.0.3 up

# Make sure that loopback has IPv6
ifconfig lo0 | grep ::1

# Test various cases
./temporal server start-dev --port 7235 --ui-port 7236 --http-port 7237 --metrics-port 7238 --ip :: --ui-ip ::1
./temporal server start-dev --port 7235 --ui-port 7236 --http-port 7237 --metrics-port 7238 --ip 127.0.0.2 --ui-ip 127.0.0.3
./temporal server start-dev --port 7235 --ui-port 7236 --http-port 7237 --metrics-port 7238 --ip 0.0.0.0 --ui-ip 127.0.0.1

# For each of the preceeding commands, assert:

# 1. That ports were bounded correctly
lsof -n -p $( ps | grep "temporal[ ]server" | cut -f 1 -d " " ) | grep LISTEN

# 2. That UI interface opens without issue
# 3. The prometheus metrics page opens  without issue
# 4. No error in server logs

To test in Docker, I had to use Rancher Desktop, with Kubernetes support enabled. The important thing for testing #595 is that the kernel of the virtual machine used by Docker must be compiled with IPv6 support (e.g. /proc/sys/net/ipv6 exists), but the container image must not be configured for IPv6 (e.g. ip addr show dev lo doesn't show any IPv6 address, and ping6 ::1 fails). The VM used by Docker Desktop won't work, apparently because it configures container's IPv6 correctly.

cretz commented 6 days ago

How this was tested

Feel free to add those tests explicitly if it would help (though I only mean the tests for properly enabled IPv4/IPv6, obviously won't work for use cases where you want to test no-IPv6 loopback)