#!/bin/bash

# This script uses jq to create the envoy JSON config file `simple.json`
# from kubernetes services data. Then it uses merge_envoy to merge
# `simple.json` with 'envoy-starter.json' to create `computed.json`.


# jq is available via apt get.
#
# The jq part of the script strips out all Services that don't have a
# skia.org.domain annotation.
#
# Selects all Services that have a port named "http"
#
# And then removes all Service ports that aren't named "http".
kubectl get services -o json | jq '{
  static_resources: {
    listeners: [
        {
            filter_chains: {
                filters: [
                    {
                        typed_config: {
                            route_config: {
                                virtual_hosts: [
                                    .items[]
                                    | select(.metadata.annotations["skia.org.domain"] != null)
                                    | select(.spec.ports[].name == "http")
                                    | del(.spec.ports[] | select(.name != "http"))
                                    | {
                                        name: .metadata.annotations["skia.org.domain"],
                                        domains: .metadata.annotations["skia.org.domain"],
                                        routes: [
                                            {
                                                match: { prefix: "/" },
                                                route: {
                                                    cluster: .metadata.name,
                                                    timeout: {
                                                        seconds: 600
                                                    }
                                                }
                                            }
                                        ]
                                    }

                                ]
                            }
                        }
                    }
                ]
            }
        }
    ],
    clusters: [
    .items[]
    | select(.metadata.annotations["skia.org.domain"] != null)
    | select(.spec.ports[].name == "http")
    | del(.spec.ports[] | select(.name != "http"))
    | {
        name: .metadata.name,
        type: "STRICT_DNS",
        connect_timeout: {
           seconds: 1
        },
        load_assignment: {
            cluster_name: .metadata.name,
            endpoints: [
                {
                    lb_endpoints: [
                        {
                            endpoint: {
                                address: {
                                    socket_address: {
                                        address: .metadata.name,
                                        port_value: .spec.ports[0].port
                                    }
                                }
                            }
                        }
                    ]
                }
            ]
        }
      }
    ]}}' > simple.json

merge_envoy envoy-starter.json simple.json > computed.json
update_probers