blob: 5e33478fe7ee5f1a37b0baff5d58abc27cbb6390 [file] [log] [blame]
// merge_envoy takes two Envoy config files, adds all the Virtual Hosts and
// Clusters from the second file to the first file and then serializes the
// results of the merge as JSON to stdout.
package main
import (
"fmt"
"os"
"strings"
"github.com/Jeffail/gabs/v2"
"go.skia.org/infra/go/sklog"
)
const tls = `{
"name": "envoy.transport_sockets.tls",
"typed_config": {
"@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext",
"common_tls_context": {
"tls_certificates": [
{
"certificate_chain": {
"filename": "/etc/envoy/front-proxy-crt.pem"
},
"private_key": {
"filename": "/etc/envoy/front-proxy-key.pem"
}
}
],
"alpn_protocols": [
"h2,http/1.1"
]
}
}
}`
func main() {
filenames := os.Args[1:]
if len(filenames) != 2 {
sklog.Fatalf("Usage: merge_envoy file1 file2")
}
file1, err := gabs.ParseJSONFile(filenames[0])
if err != nil {
sklog.Fatal(err)
}
file2, err := gabs.ParseJSONFile(filenames[1])
if err != nil {
sklog.Fatal(err)
}
// Merge Clusters.
clusterPath := []string{"static_resources", "clusters"}
for _, cluster := range file2.Search(clusterPath...).Children() {
if err := file1.ArrayAppend(cluster.Data(), clusterPath...); err != nil {
sklog.Fatal(err)
}
}
// Merge Virtual Hosts.
hostsPath := []string{"static_resources", "listeners", "0", "filter_chains", "filters", "0", "typed_config", "route_config", "virtual_hosts"}
for _, cluster := range file2.Search(hostsPath...).Children() {
if err := file1.ArrayAppend(cluster.Data(), hostsPath...); err != nil {
sklog.Fatal(err)
}
}
// Duplicate the one listener so we can add it again, but at a different
// port and with TLS.
// Only do this for `skia-infra-public` for now, until we know this won't
// break serving.
if strings.HasSuffix(filenames[1], "skia-infra-public.json") {
// Dulicate the first listener to create secondListener.
firstListener := file1.Search("static_resources", "listeners", "0")
copyAsString := firstListener.String()
secondListener, err := gabs.ParseJSON([]byte(copyAsString))
if err != nil {
sklog.Fatal(err)
}
// Change port for secondListener.
_, err = secondListener.Search("address", "socket_address").Set(8443, "port_value")
if err != nil {
sklog.Fatal(err)
}
// Add TLS config to secondListener.
tlsConfig, err := gabs.ParseJSON([]byte(tls))
if err != nil {
sklog.Fatal(err)
}
_, err = secondListener.Set(tlsConfig, "filter_chains", "transport_socket")
if err != nil {
sklog.Fatal(err)
}
// Add secondListener back into the file.
err = file1.ArrayAppend(secondListener, "static_resources", "listeners")
if err != nil {
sklog.Fatal(err)
}
}
fmt.Print(file1.StringIndent("", " "))
}