forked from hswaw/hscloud
This allows for the following: local oa = kube.OpenAPI, vaidation: oa.Validation(oa.Dict { foo: oa.Required(oa.String), bar: oa.Required(oa.Array(oa.Dict { baz: oa.Boolean, })), }), No more `oa.String { required:: true }`! Change-Id: I4ecc5002e83a8a1cfcdf083d425d7decd4cf8871
117 lines
3.3 KiB
Jsonnet
117 lines
3.3 KiB
Jsonnet
// 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 },
|
|
},
|
|
|
|
# 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:: {},
|
|
},
|
|
},
|
|
}
|