// Local extensions to kube.upstream.libsonnet.

local kube = import "kube.upstream.libsonnet";

kube {
    ClusterIssuer(name): kube._Object("certmanager.k8s.io/v1alpha1", "ClusterIssuer", name) {
        spec: error "spec must be defined",
    },
    Issuer(name): kube._Object("certmanager.k8s.io/v1alpha1", "Issuer", name) {
        spec: error "spec must be defined",
    },
    Certificate(name): kube._Object("certmanager.k8s.io/v1alpha1", "Certificate", name) {
        spec: error "spec must be defined",
    },
    # For use in PodSpec.volumes_
    CertificateVolume(certificate): {
        secret: { secretName: certificate.spec.secretName },
    },

    ValidatingWebhookConfiguration(name): kube._Object("admissionregistration.k8s.io/v1", "ValidatingWebhookConfiguration", name) {
        webhooks_:: error "webhooks_ must be defined",
        webhooks: kube.mapToNamedList(self.webhooks_),
    },

    # Add .Contain method to Namespaces, allowing for easy marking of particular
    # kube objects as contained in that namespace.
    Namespace(name): kube.Namespace(name) {
        Contain(o):: o {
            metadata+: {
                namespace: name,
            },
        },
    },

    CephObjectStoreUser(name): kube._Object("ceph.rook.io/v1", "CephObjectStoreUser", name) {
        local user = self,
        spec: error "spec must be defined",

        // Name of the secret that contains the login data for this user.
        // This secret is created in the same namespace as the ceph cluster, so
        // unfortunately you can't really refer to it directly.
        // We should write some automation to copy these secrets over in a
        // secure way.
        secret_name:: "rook-ceph-object-user-%s-%s" % [user.spec.store, user.spec.displayName],
    },

    // Make OpenAPI v3 schema specification less painful.
    OpenAPI:: {
        local openapi = self,
        Validation(obj):: {
            openAPIV3Schema: obj.render,
        },

        Required(inner):: inner {
            required:: true,
        },

        renderable:: {
            required:: false,
            render:: {},
        },
        local renderable = self.renderable,

        lift(f, keys):: {
            [if f[k] != null then k]: f[k]
            for k in keys
        },
        local lift = self.lift,

        parametrized(type, keys=[]):: (
            local keysp = keys + [
                "description",
                "nullable",
                "x-kubernetes-preserve-unknown-fields",
            ];
            renderable {
                render:: lift(self, keysp) {
                    type: type,
                },
            } + {
                [k]: null
                for k in keysp
            }
        ),
        local parametrized = self.parametrized,

        Any:: renderable,
        Boolean:: parametrized("boolean"),
        Integer:: parametrized("integer", ["minimum", "maximum", "format"]),
        Number:: parametrized("number"),
        String:: parametrized("string", ["pattern"]),

        Dict:: renderable {
            local d = self,

            local requiredList = [
                k for k in std.filter(function(k) d[k].required, std.objectFields(d))
            ],

            render+: {
                properties: {
                    [k]: d[k].render
                    for k in std.objectFields(d)
                },
                [if std.length(requiredList) > 0 then 'required']: requiredList,
            },
        },
        Object(props={}):: parametrized("object") {
            local requiredList = [
                k for k in std.filter(function(k) props[k].required, std.objectFields(props))
            ],

            render+: {
                [if std.length(std.objectFields(props)) > 0 then "properties"]: {
                    [k]: props[k].render
                    for k in std.objectFields(props)
                },
                [if std.length(requiredList) > 0 then 'required']: requiredList,
            },
        },

        Array(items):: parametrized("array") {
            render+: {
                items: items.render,
            },
        },

        Enum(items):: parametrized("string") {
            render+: {
                enum: items,
            },
        },

        KubeAny(nullable=false):: self.Object() {
            [if nullable then "nullable"]: true,
            "x-kubernetes-preserve-unknown-fields": true,
        },
    },
}
