// Local extensions to kube.upstream.libsonnet. local kube = import "kube.upstream.libsonnet"; kube { ClusterIssuer(name): kube._Object("cert-manager.io/v1", "ClusterIssuer", name) { spec: error "spec must be defined", }, Issuer(name): kube._Object("cert-manager.io/v1", "Issuer", name) { spec: error "spec must be defined", }, Certificate(name): kube._Object("cert-manager.io/v1", "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, }, }, }