From ef590b3af58b94071a598dfec5127d3a49c40c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20R=C3=BCegg?= Date: Wed, 8 Jul 2020 10:25:52 +0200 Subject: [PATCH] Initial implementation --- CHANGELOG.md | 5 +- Makefile | 10 +++- class/defaults.yml | 4 ++ component/main.jsonnet | 8 +-- .../ROOT/pages/references/parameters.adoc | 53 +++++++++++++++++++ docs/modules/ROOT/partials/nav.adoc | 1 + lib/storage-class.libjsonnet | 10 ---- lib/storage-class.libsonnet | 31 +++++++++++ 8 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 docs/modules/ROOT/pages/references/parameters.adoc delete mode 100644 lib/storage-class.libjsonnet create mode 100644 lib/storage-class.libsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fe1108..4b99055 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- … +- Initial implementation ([#1]) -[Unreleased]: https://github.com/projectsyn/component-storage-class/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/projectsyn/component-storage-class/compare/76db758a57b9dc33b95abf0a1bd7a21ce1ac185a...HEAD +[#1]: https://github.com/projectsyn/component-storage-class/pull/1 diff --git a/Makefile b/Makefile index d12337e..b98bd2f 100644 --- a/Makefile +++ b/Makefile @@ -19,11 +19,15 @@ YAMLLINT_CONFIG ?= .yamllint.yml YAMLLINT_IMAGE ?= docker.io/cytopia/yamllint:latest YAMLLINT_DOCKER ?= $(DOCKER_CMD) $(DOCKER_ARGS) $(YAMLLINT_IMAGE) +VALE_CMD ?= $(DOCKER_CMD) $(DOCKER_ARGS) --volume "$${PWD}"/docs/modules:/pages vshn/vale:2.1.1 +VALE_ARGS ?= --minAlertLevel=error --config=/pages/ROOT/pages/.vale.ini /pages + + .PHONY: all all: lint .PHONY: lint -lint: lint_jsonnet lint_yaml +lint: lint_jsonnet lint_yaml lint_adoc .PHONY: lint_jsonnet lint_jsonnet: $(JSONNET_FILES) @@ -33,6 +37,10 @@ lint_jsonnet: $(JSONNET_FILES) lint_yaml: $(YAML_FILES) $(YAMLLINT_DOCKER) -f parsable -c $(YAMLLINT_CONFIG) $(YAMLLINT_ARGS) -- $? +.PHONY: lint_adoc +lint_adoc: + $(VALE_CMD) $(VALE_ARGS) + .PHONY: format format: format_jsonnet diff --git a/class/defaults.yml b/class/defaults.yml index 3f4abbf..024e02d 100644 --- a/class/defaults.yml +++ b/class/defaults.yml @@ -1,2 +1,6 @@ parameters: storage_class: + defaults: + volumeBindingMode: WaitForFirstConsumer + reclaimPolicy: Delete + storageClasses: {} diff --git a/component/main.jsonnet b/component/main.jsonnet index 0d6cc0e..8666ed6 100644 --- a/component/main.jsonnet +++ b/component/main.jsonnet @@ -1,10 +1,12 @@ -// main template for storage-class local kap = import 'lib/kapitan.libjsonnet'; local kube = import 'lib/kube.libjsonnet'; local inv = kap.inventory(); -// The hiera parameters for the component +local sc = import 'lib/storage-class.libsonnet'; + local params = inv.parameters.storage_class; -// Define outputs below { + [name]: + sc.storageClass(name) + params.storageClasses[name] + for name in std.objectFields(params.storageClasses) } diff --git a/docs/modules/ROOT/pages/references/parameters.adoc b/docs/modules/ROOT/pages/references/parameters.adoc new file mode 100644 index 0000000..85cfdd9 --- /dev/null +++ b/docs/modules/ROOT/pages/references/parameters.adoc @@ -0,0 +1,53 @@ += Parameters + +The parent key for all of the following parameters is `storage_class`. + + +== `defaultClass` + +[horizontal] +type:: string +default:: undefined + +The name of the StorageClass which should be annotated as the https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class[default StorageClass]. +The provided helper library makes sure that the StorageClass with this name is annotated with `storageclass.kubernetes.io/is-default-class=true`. + + +== `defaults` + +[horizontal] +type:: dictionary +default:: +[source,yaml] +---- +volumeBindingMode: WaitForFirstConsumer +reclaimPolicy: Delete +---- + +Defaults to be set on StorageClass objects. +This dictionary can contain any valid https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#storageclass-v1-storage-k8s-io[StorageClass fields]. + + +== `storageClasses` + +[horizontal] +type:: dictionary +default:: undefined + +A dictionary holding the https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#storageclass-v1-storage-k8s-io[StorageClass fields]. +The keys of the dict are used as names for the StorageClass objects. + + +== Example + +[source,yaml] +---- +defaults: + allowVolumeExpansion: true +storageClasses: + standard: + parameters: + replication-type: none + type: pd-standard + provisioner: kubernetes.io/gce-pd +---- diff --git a/docs/modules/ROOT/partials/nav.adoc b/docs/modules/ROOT/partials/nav.adoc index 5d67faa..08f9283 100644 --- a/docs/modules/ROOT/partials/nav.adoc +++ b/docs/modules/ROOT/partials/nav.adoc @@ -1 +1,2 @@ * xref:index.adoc[Home] +* xref:references/parameters.adoc[Parameters] diff --git a/lib/storage-class.libjsonnet b/lib/storage-class.libjsonnet deleted file mode 100644 index e6dbfbf..0000000 --- a/lib/storage-class.libjsonnet +++ /dev/null @@ -1,10 +0,0 @@ -/** - * \file Library helpers to create StorageClass objects. - */ - -local kap = import 'lib/kapitan.libjsonnet'; -local kube = import 'lib/kube.libjsonnet'; - -// Export library functions here -{ -} diff --git a/lib/storage-class.libsonnet b/lib/storage-class.libsonnet new file mode 100644 index 0000000..ad55f28 --- /dev/null +++ b/lib/storage-class.libsonnet @@ -0,0 +1,31 @@ +/** + * \file Helper to create StorageClass objects. + */ + +local com = import 'lib/commodore.libjsonnet'; +local kap = import 'lib/kapitan.libjsonnet'; +local kube = import 'lib/kube.libjsonnet'; +local inv = kap.inventory(); +local storage_class_params = inv.parameters.storage_class; + + +/** + * \brief Helper to create StorageClass objects. + The `storageclass.kubernetes.io/is-default-class` annotation is automatically set based on `parameters.storage_class.defaultClass`. + Defaults are used from `parameters.storage_class.defaults`. + * + * \arg The name of the StorageClass. + * \return A StorageClass object. + */ +local storageClass(name) = kube._Object('storage.k8s.io/v1', 'StorageClass', name) { + metadata+: { + annotations+: { + [if storage_class_params.defaultClass == name then 'storageclass.kubernetes.io/is-default-class']: 'true', + }, + }, +} + storage_class_params.defaults; + + +{ + storageClass: storageClass, +}