Commit 1bb78faa authored by Geoff Simmons's avatar Geoff Simmons

Add via and authority fields to the VCL spec and templates.

parent dc9d0dcd
......@@ -154,6 +154,7 @@ type Service struct {
Addresses []Address
Probe *Probe
Director *Director
Authority *string
ExternalName string
ExternalPort string
HostHeader string
......@@ -169,6 +170,7 @@ type Service struct {
MaxDNSQueries uint16
ProxyHeader uint8
FollowDNSRedirects bool
Via bool
}
func (svc Service) hash(hash hash.Hash) {
......@@ -182,6 +184,9 @@ func (svc Service) hash(hash hash.Hash) {
if svc.Director != nil {
svc.Director.hash(hash)
}
if svc.Authority != nil {
hash.Write([]byte(*svc.Authority))
}
hash.Write([]byte(svc.ExternalName))
hash.Write([]byte(svc.ExternalPort))
hash.Write([]byte(svc.HostHeader))
......@@ -201,6 +206,9 @@ func (svc Service) hash(hash hash.Hash) {
if svc.FollowDNSRedirects {
hash.Write([]byte{1})
}
if svc.Via {
hash.Write([]byte{1})
}
}
// interface for sorting []Service
......
vcl 4.1;
import std;
import directors;
import re2;
import dynamic;
include "bogo_backend.vcl";
backend vk8s_via { .path = "/run/offload/onload.sock"; }
backend vk8s_default_coffee-6b9f5c47d7-bdt68_80 {
.host = "192.0.2.4";
.port = "80";
}
backend vk8s_default_coffee-6b9f5c47d7-l5zvl_80 {
.host = "192.0.2.5";
.port = "80";
}
backend vk8s_default_tea-5798f99dc5-5wj8n_80 {
.host = "192.0.2.1";
.port = "80";
.via = vk8s_via;
.authority = "www.tea.org";
}
backend vk8s_default_tea-5798f99dc5-hn27l_80 {
.host = "192.0.2.2";
.port = "80";
.via = vk8s_via;
.authority = "www.tea.org";
}
backend vk8s_default_tea-5798f99dc5-5wj8n_80 {
.host = "192.0.2.3";
.port = "80";
.via = vk8s_via;
.authority = "www.tea.org";
}
sub vcl_init {
new vk8s_hosts = re2.set(anchor=both);
vk8s_hosts.add("\Qcafe.example.com\E(:\d+)?");
vk8s_hosts.compile();
new vk8s_coffee-svc_director = directors.round_robin();
vk8s_coffee-svc_director.add_backend(vk8s_default_coffee-6b9f5c47d7-bdt68_80
);
vk8s_coffee-svc_director.add_backend(vk8s_default_coffee-6b9f5c47d7-l5zvl_80
);
new vk8s_tea-svc_director = directors.round_robin();
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-5wj8n_80
);
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-hn27l_80
);
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-5wj8n_80
);
new vk8s_cafe_example_com_url = re2.set(posix_syntax=true, anchor=start);
vk8s_cafe_example_com_url.add("/coffee",
backend=vk8s_coffee-svc_director.backend());
vk8s_cafe_example_com_url.add("/tea",
backend=vk8s_tea-svc_director.backend());
vk8s_cafe_example_com_url.compile();
}
sub vcl_backend_fetch {
set bereq.backend = vk8s_notfound;
if (vk8s_hosts.match(bereq.http.Host)) {
if (vk8s_hosts.which(select=FIRST) == 1) {
if (vk8s_cafe_example_com_url.match(bereq.url)) {
set bereq.backend = vk8s_cafe_example_com_url.backend(select=FIRST);
}
}
}
if (bereq.backend == vk8s_notfound) {
return (error(404));
}
}
vcl 4.1;
import std;
import directors;
import re2;
import dynamic;
include "bogo_backend.vcl";
backend vk8s_via { .path = "/run/offload/onload.sock"; }
backend vk8s_default_coffee-6b9f5c47d7-bdt68_80 {
.host = "192.0.2.4";
.port = "80";
}
backend vk8s_default_coffee-6b9f5c47d7-l5zvl_80 {
.host = "192.0.2.5";
.port = "80";
}
backend vk8s_default_tea-5798f99dc5-5wj8n_80 {
.host = "192.0.2.1";
.port = "80";
.via = vk8s_via;
}
backend vk8s_default_tea-5798f99dc5-hn27l_80 {
.host = "192.0.2.2";
.port = "80";
.via = vk8s_via;
}
backend vk8s_default_tea-5798f99dc5-5wj8n_80 {
.host = "192.0.2.3";
.port = "80";
.via = vk8s_via;
}
sub vcl_init {
new vk8s_hosts = re2.set(anchor=both);
vk8s_hosts.add("\Qcafe.example.com\E(:\d+)?");
vk8s_hosts.compile();
new vk8s_coffee-svc_director = directors.round_robin();
vk8s_coffee-svc_director.add_backend(vk8s_default_coffee-6b9f5c47d7-bdt68_80
);
vk8s_coffee-svc_director.add_backend(vk8s_default_coffee-6b9f5c47d7-l5zvl_80
);
new vk8s_tea-svc_director = directors.round_robin();
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-5wj8n_80
);
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-hn27l_80
);
vk8s_tea-svc_director.add_backend(vk8s_default_tea-5798f99dc5-5wj8n_80
);
new vk8s_cafe_example_com_url = re2.set(posix_syntax=true, anchor=start);
vk8s_cafe_example_com_url.add("/coffee",
backend=vk8s_coffee-svc_director.backend());
vk8s_cafe_example_com_url.add("/tea",
backend=vk8s_tea-svc_director.backend());
vk8s_cafe_example_com_url.compile();
}
sub vcl_backend_fetch {
set bereq.backend = vk8s_notfound;
if (vk8s_hosts.match(bereq.http.Host)) {
if (vk8s_hosts.which(select=FIRST) == 1) {
if (vk8s_cafe_example_com_url.match(bereq.url)) {
set bereq.backend = vk8s_cafe_example_com_url.backend(select=FIRST);
}
}
}
if (bereq.backend == vk8s_notfound) {
return (error(404));
}
}
......@@ -600,6 +600,19 @@ func TestBackendConfig(t *testing.T) {
templateTest(t, ingressTmpl, cafeProbeDir, "backendcfg.golden")
}
func TestViaBackend(t *testing.T) {
teaSvc.Via = true
cafeSpec.IntSvcs["tea-svc"] = teaSvc
templateTest(t, ingressTmpl, cafeSpec, "via_backend.golden")
teaSvc.Authority = new(string)
*teaSvc.Authority = "www.tea.org"
cafeSpec.IntSvcs["tea-svc"] = teaSvc
templateTest(t, ingressTmpl, cafeSpec, "via_authority_backend.golden")
}
// Code boilerplate for writing the golden file.
// import ioutils
// func TestXXX(t *testing.T) {
......
......@@ -81,6 +81,9 @@ probe {{probeName $name}} {
{{- end}}
{{- template "ProbeDef" .IntSvcs -}}
{{- template "ProbeDef" .ExtSvcs}}
{{- if needsVia .IntSvcs .ExtSvcs }}
backend vk8s_via { .path = "/run/offload/onload.sock"; }
{{- end }}
{{range $name, $svc := .IntSvcs -}}
{{range $addr := $svc.Addresses -}}
......@@ -109,6 +112,12 @@ backend {{backendName $svc $addr}} {
{{- if .Probe}}
.probe = {{probeName $name}};
{{- end}}
{{- if .Via}}
.via = vk8s_via;
{{- end}}
{{- if .Authority}}
.authority = "{{.Authority}}";
{{- end}}
{{- end}}
}
{{end -}}
......@@ -257,11 +266,26 @@ func hostRegex(host string) string {
return `\Q` + host + `\E`
}
func needsVia(intSvcs, extSvcs map[string]Service) bool {
for _, svc := range intSvcs {
if svc.Via {
return true
}
}
for _, svc := range extSvcs {
if svc.Via {
return true
}
}
return false
}
var vclFuncs = template.FuncMap{
"plusOne": func(i int) int { return i + 1 },
"dirType": func(svc Service) string { return dirType(svc) },
"hostRegex": func(host string) string { return hostRegex(host) },
"backendName": backendName,
"needsVia": needsVia,
"probeName": func(name string) string {
return mangle(name + "_probe")
},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment