// 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:: {
        Validation(obj):: {
            openAPIV3Schema: obj.render,
        },

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

        Dict:: {
            local dict = self,
            required:: false,

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

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

        Array(items):: {
            required:: false,
            render:: {
                type: "array",
                items: items.render,
            },
        },

        Integer:: {
            local integer = self,
            required:: false,
            render:: {
                type: "integer",
            } + (if integer.minimum != null then {
                minimum: integer.minimum,
            } else {}) + (if integer.maximum != null then {
                maximum: integer.maximum,
            } else {}),

            minimum:: null,
            maximum:: null,
        },

        String:: {
            local string = self,
            required:: false,
            render:: {
                type: "string",
            } + (if string.pattern != null then {
                pattern: string.pattern,
            } else {}),

            pattern:: null,
        },

        Boolean:: {
            required:: false,
            render:: {
                type: "boolean",
            },
        },

        Any:: {
            required:: false,
            render:: {},
        },
    },
}
