[master] c7ac52663 vtc: Add varnish macros for all listen addresses

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Wed Oct 28 08:03:10 UTC 2020


commit c7ac5266377ed6171548fcd61cbf5f095f98fa41
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Wed Oct 28 08:31:30 2020 +0100

    vtc: Add varnish macros for all listen addresses
    
    When a test case successfully runs this:
    
        varnish v1 -start
    
    The following macros are created:
    
    - ${v1_addr}
    - ${v1_port}
    - ${v1_sock}
    
    When v1 listens to a UNIX domain socket, those macros become useless and
    we generally have to repeat the socket path wherever we need it.
    
    From now on, varnish listen address macros for unix domain sockets match
    their server counterparts:
    
    - ${v1_addr} expands to "0.0.0.0"
    - ${v1_port} expands to "0"
    - ${v1_sock} expands to the socket path
    
    It is now possible to use the following construct regardless of the
    socket type:
    
        client c1 -connect "${v1_sock}"
    
    In addition, the debug.listen_address command now outputs the listen
    address name in addition to its endpoint. For example, in a test case
    with the following command:
    
        varnish v1 -arg "-a :0 -a :0 -b '${bad_backend}'" -start
    
    The output for debug.listen_address could look like this:
    
        a0 127.0.0.1 34567
        a0 ::1 34567
        a1 127.0.0.1 45678
        a1 ::1 45678
    
    The resulting macros would be:
    
    - ${v1_addr}
    - ${v1_port}
    - ${v1_sock}
    - ${v1_a0_addr}
    - ${v1_a0_port}
    - ${v1_a0_sock}
    - ${v1_a1_addr}
    - ${v1_a1_port}
    - ${v1_a1_sock}
    
    It becomes possible to reliably listen to multiple endpoints and use
    either in a test case. On a dual-stack system where we might end up
    with multiple endpoints sharing the same name, only the first one is
    used for a given name. In the example above all macros would expand
    to IPv4 addresses.

diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 77dbfaa43..0caabb819 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -673,10 +673,10 @@ ccf_listen_address(struct cli *cli, const char * const *av, void *priv)
 	VTAILQ_FOREACH(ls, &heritage.socks, list) {
 		if (!ls->uds) {
 			VTCP_myname(ls->sock, h, sizeof h, p, sizeof p);
-			VCLI_Out(cli, "%s %s\n", h, p);
+			VCLI_Out(cli, "%s %s %s\n", ls->name, h, p);
 		}
 		else
-			VCLI_Out(cli, "%s -\n", ls->endpoint);
+			VCLI_Out(cli, "%s %s -\n", ls->name, ls->endpoint);
 	}
 	AZ(pthread_mutex_unlock(&shut_mtx));
 }
diff --git a/bin/varnishtest/tests/b00053.vtc b/bin/varnishtest/tests/b00053.vtc
index e8cc9ab99..ea33a284a 100644
--- a/bin/varnishtest/tests/b00053.vtc
+++ b/bin/varnishtest/tests/b00053.vtc
@@ -5,7 +5,7 @@ server s1 -listen "${tmpdir}/s1.sock" {
 	txresp -body "012345\n"
 } -start
 
-varnish v1 -arg "-a ${tmpdir}/v1.sock" -vcl+backend {
+varnish v1 -arg "-a ${tmpdir}/v1.sock -a ${localhost}:0" -vcl+backend {
 	sub vcl_backend_response {
 		set beresp.do_stream = false;
 	}
@@ -19,7 +19,7 @@ varnish v1 -expect sess_conn == 0
 varnish v1 -expect client_req == 0
 varnish v1 -expect cache_miss == 0
 
-client c1 -connect "${tmpdir}/v1.sock" {
+client c1 -connect "${v1_sock}" {
 	txreq -url "/"
 	rxresp
 	expect resp.status == 200
@@ -56,13 +56,25 @@ varnish v3 -vcl {
 		set resp.http.addr = "${v1_addr}";
 		set resp.http.port = "${v1_port}";
 		set resp.http.sock = "${v1_sock}";
+		set resp.http.a0_addr = "${v1_a0_addr}";
+		set resp.http.a0_port = "${v1_a0_port}";
+		set resp.http.a0_sock = "${v1_a0_sock}";
+		set resp.http.a1_addr = "${v1_a1_addr}";
+		set resp.http.a1_port = "${v1_a1_port}";
+		set resp.http.a1_sock = "${v1_a1_sock}";
 	}
 } -start
 
 client c1 -connect ${v3_sock} {
 	txreq
 	rxresp
-	expect resp.http.addr == "${tmpdir}/v1.sock"
-	expect resp.http.port == "-"
-	expect resp.http.sock == "${tmpdir}/v1.sock -"
+	expect resp.http.addr == "0.0.0.0"
+	expect resp.http.port == "0"
+	expect resp.http.sock == "${tmpdir}/v1.sock"
+	expect resp.http.a0_addr == "0.0.0.0"
+	expect resp.http.a0_port == "0"
+	expect resp.http.a0_sock == "${tmpdir}/v1.sock"
+	expect resp.http.a1_addr != "0.0.0.0"
+	expect resp.http.a1_port != "0"
+	expect resp.http.a1_sock ~ "[^ ]+ [^ ]+"
 } -run
diff --git a/bin/varnishtest/tests/m00046.vtc b/bin/varnishtest/tests/m00046.vtc
index 8d2e2fd61..8c276ce35 100644
--- a/bin/varnishtest/tests/m00046.vtc
+++ b/bin/varnishtest/tests/m00046.vtc
@@ -11,21 +11,21 @@ varnish v2 -arg "-a ${tmpdir}/v2.sock" -vcl {
 	}
 
 	sub vcl_synth {
-		set resp.http.v1_addr = std.ip("${v1_addr}", client.ip);
+		set resp.http.v1_addr = std.ip("${v1_sock}", client.ip);
 	}
 } -start
 
-client c1 -connect "${tmpdir}/v2.sock" {
+client c1 -connect "${v2_sock}" {
 	txreq
 	rxresp
 	expect resp.http.v1_addr == "0.0.0.0"
 } -run
 
-varnish v2 -errvcl {Cannot convert to an IP address: '"${v1_addr}"'} {
+varnish v2 -errvcl {Cannot convert to an IP address: '"${v1_sock}"'} {
 	import std;
 
 	sub vcl_recv {
-		set resp.http.v1_port = std.port("${v1_addr}");
+		set resp.http.v1_port = std.port("${v1_sock}");
 	}
 }
 
@@ -40,7 +40,7 @@ varnish v2 -vcl {
 	}
 }
 
-client c1 -connect "${tmpdir}/v2.sock" {
+client c1 -connect "${v2_sock}" {
 	txreq
 	rxresp
 	expect resp.status == 200
diff --git a/bin/varnishtest/tests/m00047.vtc b/bin/varnishtest/tests/m00047.vtc
index e9c05b032..9298f9d7a 100644
--- a/bin/varnishtest/tests/m00047.vtc
+++ b/bin/varnishtest/tests/m00047.vtc
@@ -123,7 +123,7 @@ varnish v2 -arg "-a ${tmpdir}/v2.sock" -vcl+backend {
 # Check the log output for the response header values to see how this
 # worked on your platform.
 
-client c2 -connect "${v2_addr}" {
+client c2 -connect "${v2_sock}" {
 	txreq
 	rxresp
 	expect resp.status ~ "^(200|503)$"
diff --git a/bin/varnishtest/tests/r02702.vtc b/bin/varnishtest/tests/r02702.vtc
index a68c9acb3..438efeaef 100644
--- a/bin/varnishtest/tests/r02702.vtc
+++ b/bin/varnishtest/tests/r02702.vtc
@@ -47,7 +47,7 @@ varnish v2 -arg "-a ${tmpdir}/v2.sock,PROXY,mode=0777" -vcl {
 
 varnish v3 -vcl {
 	backend bp {
-		.path = "${v2_addr}";
+		.path = "${v2_sock}";
 		.host_header = "v2";
 		.proxy_header = 2;
 
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 1df5dd93d..52447b11b 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -544,11 +544,69 @@ varnish_launch(struct varnish *v)
  * Start a Varnish
  */
 
+static void
+varnish_listen(struct varnish *v, char *la)
+{
+	const char *a, *p, *n, *n2;
+	char m[64], s[256];
+	unsigned first;
+
+	n2 = "";
+	first = 1;
+
+	while (*la != '\0') {
+		n = la;
+		la = strchr(n, ' ');
+		AN(la);
+		*la = '\0';
+		a = la + 1;
+		la = strchr(a, ' ');
+		AN(la);
+		*la = '\0';
+		p = la + 1;
+		la = strchr(p, '\n');
+		AN(la);
+		*la = '\0';
+		la++;
+
+		AN(*n);
+		AN(*a);
+		AN(*p);
+
+		if (*p != '-') {
+			bprintf(s, "%s %s", a, p);
+		} else {
+			bprintf(s, "%s", a);
+			a = "0.0.0.0";
+			p = "0";
+		}
+
+		if (first) {
+			vtc_log(v->vl, 2, "Listen on %s %s", a, p);
+			macro_def(v->vl, v->name, "addr", "%s", a);
+			macro_def(v->vl, v->name, "port", "%s", p);
+			macro_def(v->vl, v->name, "sock", "%s", s);
+			first = 0;
+		}
+
+		if (!strcmp(n, n2))
+			continue;
+
+		bprintf(m, "%s_addr", n);
+		macro_def(v->vl, v->name, m, "%s", a);
+		bprintf(m, "%s_port", n);
+		macro_def(v->vl, v->name, m, "%s", p);
+		bprintf(m, "%s_sock", n);
+		macro_def(v->vl, v->name, m, "%s", s);
+		n2 = n;
+	}
+}
+
 static void
 varnish_start(struct varnish *v)
 {
 	enum VCLI_status_e u;
-	char *resp = NULL, *h, *p;
+	char *resp = NULL;
 
 	if (v->cli_fd < 0)
 		varnish_launch(v);
@@ -577,17 +635,7 @@ varnish_start(struct varnish *v)
 	if (u != CLIS_OK)
 		vtc_fatal(v->vl,
 		    "CLI debug.listen_address command failed: %u %s", u, resp);
-	h = resp;
-	p = strchr(h, '\n');
-	if (p != NULL)
-		*p = '\0';
-	p = strchr(h, ' ');
-	AN(p);
-	*p++ = '\0';
-	vtc_log(v->vl, 2, "Listen on %s %s", h, p);
-	macro_def(v->vl, v->name, "addr", "%s", h);
-	macro_def(v->vl, v->name, "port", "%s", p);
-	macro_def(v->vl, v->name, "sock", "%s %s", h, p);
+	varnish_listen(v, resp);
 	free(resp);
 	/* Wait for vsl logging to get underway */
 	while (v->vsl_rec == 0)
@@ -1018,6 +1066,12 @@ varnish_expect(const struct varnish *v, char * const *av)
  * \-start
  *         Start the child process.
  *
+ *         Once successfully started, the following macros are available for
+ *         the default listen address: ``${vNAME_addr}``, ``${vNAME_port}``
+ *         and ``${vNAME_sock}``. Additional macros are available, including
+ *         the listen address name for each address vNAME listens to, like for
+ *         example: ``${vNAME_a0_addr}``.
+ *
  * \-stop
  *         Stop the child process.
  *


More information about the varnish-commit mailing list