# Common cluster configuration.
# This defines what Kubernetes resources are required to turn a bare k8s
# deployment into a fully working cluster.
# These assume that you're running on bare metal, and using the corresponding
# NixOS deployment that we do.

local kube = import "../../kube/kube.libsonnet";
local policies = import "../../kube/policies.libsonnet";

local calico = import "lib/calico.libsonnet";
local certmanager = import "lib/cert-manager.libsonnet";
local coredns = import "lib/coredns.libsonnet";
local identd = import "lib/identd.libsonnet";
local metallb = import "lib/metallb.libsonnet";
local metrics = import "lib/metrics.libsonnet";
local nginx = import "lib/nginx.libsonnet";
local prodvider = import "lib/prodvider.libsonnet";
local rook = import "lib/rook.libsonnet";
local pki = import "lib/pki.libsonnet";

{
    Cluster(short, realm):: {
        local cluster = self,
        local cfg = cluster.cfg,

        short:: short,
        realm:: realm,
        fqdn:: "%s.%s" % [cluster.short, cluster.realm],

        cfg:: {
            // Storage class used for internal services (like registry). This must
            // be set to a valid storage class. This can either be a cloud provider class
            // (when running on GKE &co) or a storage class created using rook.
            storageClassNameRedundant: error "storageClassNameRedundant must be set",
        },

        // These are required to let the API Server contact kubelets.
        crAPIServerToKubelet: kube.ClusterRole("system:kube-apiserver-to-kubelet") {
            metadata+: {
                annotations+: {
                    "rbac.authorization.kubernetes.io/autoupdate": "true",
                },
                labels+: {
                    "kubernetes.io/bootstrapping": "rbac-defaults",
                },
            },
            rules: [
                {
                    apiGroups: [""],
                    resources: ["nodes/%s" % r for r in [ "proxy", "stats", "log", "spec", "metrics" ]],
                    verbs: ["*"],
                },
            ],
        },
        crbAPIServer: kube.ClusterRoleBinding("system:kube-apiserver") {
            roleRef: {
                apiGroup: "rbac.authorization.k8s.io",
                kind: "ClusterRole",
                name: cluster.crAPIServerToKubelet.metadata.name,
            },
            subjects: [
                {
                    apiGroup: "rbac.authorization.k8s.io",
                    kind: "User",
                    # A cluster API Server authenticates with a certificate whose CN is == to the FQDN of the cluster.
                    name: cluster.fqdn,
                },
            ],
        },

        // This ClusterRole is bound to all humans that log in via prodaccess/prodvider/SSO.
        // It should allow viewing of non-sensitive data for debugability and openness.
        crViewer: kube.ClusterRole("system:viewer") {
            rules: [
                {
                    apiGroups: [""],
                    resources: [
                        "nodes",
                        "namespaces",
                        "pods",
                        "configmaps",
                        "services",
                    ],
                    verbs: ["list"],
                },
                {
                    apiGroups: ["metrics.k8s.io"],
                    resources: [
                        "nodes",
                        "pods",
                    ],
                    verbs: ["list"],
                },
                {
                    apiGroups: ["apps"],
                    resources: [
                        "statefulsets",
                    ],
                    verbs: ["list"],
                },
                {
                    apiGroups: ["extensions"],
                    resources: [
                        "deployments",
                        "ingresses",
                    ],
                    verbs: ["list"],
                }
            ],
        },
        // This ClusterRole is applied (scoped to personal namespace) to all humans.
        crFullInNamespace: kube.ClusterRole("system:admin-namespace") {
            rules: [
                {
                    apiGroups: ["", "extensions", "apps"],
                    resources: ["*"],
                    verbs: ["*"],
                },
                {
                    apiGroups: ["batch"],
                    resources: ["jobs", "cronjobs"],
                    verbs: ["*"],
                },
                {
                    apiGroups: ["networking.k8s.io"],
                    resources: ["ingresses"],
                    verbs: ["*"],
                },
            ],
        },
        // This ClusterRoleBindings allows root access to cluster admins.
        crbAdmins: kube.ClusterRoleBinding("system:admins") {
            roleRef: {
                apiGroup: "rbac.authorization.k8s.io",
                kind: "ClusterRole",
                name: "cluster-admin",
            },
            subjects: [
                {
                    apiGroup: "rbac.authorization.k8s.io",
                    kind: "User",
                    name: user + "@hackerspace.pl",
                } for user in [
                    "q3k",
                    "implr",
                    "informatic",
                ]
            ],
        },

        podSecurityPolicies: policies.Cluster {},

        allowInsecureNamespaces: [
            policies.AllowNamespaceInsecure("kube-system"),
            policies.AllowNamespaceInsecure("metallb-system"),
        ],

        // Allow all service accounts (thus all controllers) to create secure pods.
        crbAllowServiceAccountsSecure: kube.ClusterRoleBinding("policy:allow-all-secure") {
            roleRef_: cluster.podSecurityPolicies.secureRole,
            subjects: [
                {
                    kind: "Group",
                    apiGroup: "rbac.authorization.k8s.io",
                    name: "system:serviceaccounts",
                }
            ],
        },

        // Calico network fabric
        calico: calico.Environment {},

        // CoreDNS for this cluster.
        dns: coredns.Environment {
            cfg+: {
                cluster_domains: [
                    "cluster.local",
                    cluster.fqdn,
                ],
            },
        },

        // Metrics Server
        metrics: metrics.Environment {},

        // Metal Load Balancer
        metallb: metallb.Environment {},

        // Main nginx Ingress Controller
        nginx: nginx.Environment {},

        // Cert-manager (Let's Encrypt, CA, ...)
        certmanager: certmanager.Environment {},

        issuer: kube.ClusterIssuer("letsencrypt-prod") {
            spec: {
                acme: {
                    server: "https://acme-v02.api.letsencrypt.org/directory",
                    email: "bofh@hackerspace.pl",
                    privateKeySecretRef: {
                        name: "letsencrypt-prod"
                    },
                    http01: {},
                },
            },
        },

        // Ident service
        identd: identd.Environment {},

        // Rook Ceph storage operator.
        rook: rook.Operator {
            operator+: {
                spec+: {
                    // Downscaled because of b.hswaw.net/6.
                    replicas: 0,
                },
            },
        },

        // TLS PKI machinery (compatibility with mirko)
        pki: pki.Environment(cluster.short, cluster.realm),

        // Prodvider
        prodvider: prodvider.Environment {
            cfg+: {
                apiEndpoint: "kubernetes.default.svc.%s" % [cluster.fqdn],
            },
        },
    },
}
