From 87f87141be7448a19640fc68bdc50fe0909e2ab9 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Wed, 2 Mar 2022 09:32:01 +0100 Subject: [PATCH] deploy: add CSIDriver for NFS The API is extended for generation of the NFS CSIDriver object. The YAML file under deploy/ was created by `yamlgen`. The contents of the csidriver.yaml file is heavily based on the upstream CSIDriver from the Kubernetes csi-driver-nfs project. Because ./tools/yamlgen uses the API, it gets copied under vendor/ . This causes two copies of the API to be included in the repository, but that can not be prevented, it seems. See-also: https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/deploy/csi-nfs-driverinfo.yaml Signed-off-by: Niels de Vos --- api/deploy/kubernetes/nfs/csidriver.go | 74 +++++++++++++++++++ api/deploy/kubernetes/nfs/csidriver.yaml | 9 +++ api/deploy/kubernetes/nfs/csidriver_test.go | 38 ++++++++++ deploy/Makefile | 4 + deploy/nfs/kubernetes/csidriver.yaml | 16 ++++ tools/yamlgen/main.go | 16 ++++ .../api/deploy/kubernetes/nfs/csidriver.go | 74 +++++++++++++++++++ .../api/deploy/kubernetes/nfs/csidriver.yaml | 9 +++ vendor/modules.txt | 1 + 9 files changed, 241 insertions(+) create mode 100644 api/deploy/kubernetes/nfs/csidriver.go create mode 100644 api/deploy/kubernetes/nfs/csidriver.yaml create mode 100644 api/deploy/kubernetes/nfs/csidriver_test.go create mode 100644 deploy/nfs/kubernetes/csidriver.yaml create mode 100644 vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.go create mode 100644 vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.yaml diff --git a/api/deploy/kubernetes/nfs/csidriver.go b/api/deploy/kubernetes/nfs/csidriver.go new file mode 100644 index 000000000..4aef84787 --- /dev/null +++ b/api/deploy/kubernetes/nfs/csidriver.go @@ -0,0 +1,74 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nfs + +import ( + "bytes" + _ "embed" + "fmt" + "text/template" + + "github.com/ghodss/yaml" + storagev1 "k8s.io/api/storage/v1" +) + +//go:embed csidriver.yaml +var csiDriver string + +type CSIDriverValues struct { + Name string +} + +var CSIDriverDefaults = CSIDriverValues{ + Name: "nfs.csi.ceph.com", +} + +// NewCSIDriver takes a driver name from the CSIDriverValues struct and +// replaces the value in the template. A CSIDriver object is returned which can +// be created in the Kubernetes cluster. +func NewCSIDriver(values CSIDriverValues) (*storagev1.CSIDriver, error) { + data, err := NewCSIDriverYAML(values) + if err != nil { + return nil, err + } + + driver := &storagev1.CSIDriver{} + err = yaml.Unmarshal([]byte(data), driver) + if err != nil { + return nil, fmt.Errorf("failed convert YAML to %T: %w", driver, err) + } + + return driver, nil +} + +// NewCSIDriverYAML takes a driver name from the CSIDriverValues struct and +// replaces the value in the template. A CSIDriver object in YAML is returned +// which can be created in the Kubernetes cluster. +func NewCSIDriverYAML(values CSIDriverValues) (string, error) { + var buf bytes.Buffer + + tmpl, err := template.New("CSIDriver").Parse(csiDriver) + if err != nil { + return "", fmt.Errorf("failed to parse template: %w", err) + } + err = tmpl.Execute(&buf, values) + if err != nil { + return "", fmt.Errorf("failed to replace values in template: %w", err) + } + + return buf.String(), nil +} diff --git a/api/deploy/kubernetes/nfs/csidriver.yaml b/api/deploy/kubernetes/nfs/csidriver.yaml new file mode 100644 index 000000000..97afbc50e --- /dev/null +++ b/api/deploy/kubernetes/nfs/csidriver.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: "{{ .Name }}" +spec: + attachRequired: false + volumeLifecycleModes: + - Persistent diff --git a/api/deploy/kubernetes/nfs/csidriver_test.go b/api/deploy/kubernetes/nfs/csidriver_test.go new file mode 100644 index 000000000..c7239807f --- /dev/null +++ b/api/deploy/kubernetes/nfs/csidriver_test.go @@ -0,0 +1,38 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nfs + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNewCSIDriver(t *testing.T) { + driver, err := NewCSIDriver(CSIDriverDefaults) + + require.NoError(t, err) + require.NotNil(t, driver) + require.Equal(t, driver.Name, CSIDriverDefaults.Name) +} + +func TestNewCSIDriverYAML(t *testing.T) { + yaml, err := NewCSIDriverYAML(CSIDriverDefaults) + + require.NoError(t, err) + require.NotEqual(t, "", yaml) +} diff --git a/deploy/Makefile b/deploy/Makefile index 9d6decc4c..e42d22c32 100644 --- a/deploy/Makefile +++ b/deploy/Makefile @@ -15,12 +15,16 @@ .PHONY: all all: \ scc.yaml \ + nfs/kubernetes/csidriver.yaml \ rbd/kubernetes/csidriver.yaml \ rbd/kubernetes/csi-config-map.yaml scc.yaml: ../api/deploy/ocp/scc.yaml ../api/deploy/ocp/scc.go $(MAKE) -C ../tools generate-deploy +nfs/kubernetes/csidriver.yaml: ../api/deploy/kubernetes/nfs/csidriver.yaml ../api/deploy/kubernetes/nfs/csidriver.go + $(MAKE) -C ../tools generate-deploy + rbd/kubernetes/csidriver.yaml: ../api/deploy/kubernetes/rbd/csidriver.yaml ../api/deploy/kubernetes/rbd/csidriver.go $(MAKE) -C ../tools generate-deploy diff --git a/deploy/nfs/kubernetes/csidriver.yaml b/deploy/nfs/kubernetes/csidriver.yaml new file mode 100644 index 000000000..bfa42f6ae --- /dev/null +++ b/deploy/nfs/kubernetes/csidriver.yaml @@ -0,0 +1,16 @@ +# +# /!\ DO NOT MODIFY THIS FILE +# +# This file has been automatically generated by Ceph-CSI yamlgen. +# The source for the contents can be found in the api/deploy directory, make +# your modifications there. +# +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: "nfs.csi.ceph.com" +spec: + attachRequired: false + volumeLifecycleModes: + - Persistent diff --git a/tools/yamlgen/main.go b/tools/yamlgen/main.go index eb255c2f6..2d6411e35 100644 --- a/tools/yamlgen/main.go +++ b/tools/yamlgen/main.go @@ -19,8 +19,10 @@ package main import ( "fmt" "os" + "path" "reflect" + "github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs" "github.com/ceph/ceph-csi/api/deploy/kubernetes/rbd" "github.com/ceph/ceph-csi/api/deploy/ocp" ) @@ -46,6 +48,11 @@ var yamlArtifacts = []deploymentArtifact{ reflect.ValueOf(ocp.NewSecurityContextConstraintsYAML), reflect.ValueOf(ocp.SecurityContextConstraintsDefaults), }, + { + "../deploy/nfs/kubernetes/csidriver.yaml", + reflect.ValueOf(nfs.NewCSIDriverYAML), + reflect.ValueOf(nfs.CSIDriverDefaults), + }, { "../deploy/rbd/kubernetes/csidriver.yaml", reflect.ValueOf(rbd.NewCSIDriverYAML), @@ -67,6 +74,15 @@ func main() { func writeArtifact(artifact deploymentArtifact) { fmt.Printf("creating %q...", artifact.filename) + dir := path.Dir(artifact.filename) + _, err := os.Stat(dir) + if os.IsNotExist(err) { + err = os.MkdirAll(dir, 0o775) + if err != nil { + panic(fmt.Sprintf("failed to create directory %q: %v", dir, err)) + } + } + f, err := os.Create(artifact.filename) if err != nil { panic(fmt.Sprintf("failed to create file %q: %v", artifact.filename, err)) diff --git a/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.go b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.go new file mode 100644 index 000000000..4aef84787 --- /dev/null +++ b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.go @@ -0,0 +1,74 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nfs + +import ( + "bytes" + _ "embed" + "fmt" + "text/template" + + "github.com/ghodss/yaml" + storagev1 "k8s.io/api/storage/v1" +) + +//go:embed csidriver.yaml +var csiDriver string + +type CSIDriverValues struct { + Name string +} + +var CSIDriverDefaults = CSIDriverValues{ + Name: "nfs.csi.ceph.com", +} + +// NewCSIDriver takes a driver name from the CSIDriverValues struct and +// replaces the value in the template. A CSIDriver object is returned which can +// be created in the Kubernetes cluster. +func NewCSIDriver(values CSIDriverValues) (*storagev1.CSIDriver, error) { + data, err := NewCSIDriverYAML(values) + if err != nil { + return nil, err + } + + driver := &storagev1.CSIDriver{} + err = yaml.Unmarshal([]byte(data), driver) + if err != nil { + return nil, fmt.Errorf("failed convert YAML to %T: %w", driver, err) + } + + return driver, nil +} + +// NewCSIDriverYAML takes a driver name from the CSIDriverValues struct and +// replaces the value in the template. A CSIDriver object in YAML is returned +// which can be created in the Kubernetes cluster. +func NewCSIDriverYAML(values CSIDriverValues) (string, error) { + var buf bytes.Buffer + + tmpl, err := template.New("CSIDriver").Parse(csiDriver) + if err != nil { + return "", fmt.Errorf("failed to parse template: %w", err) + } + err = tmpl.Execute(&buf, values) + if err != nil { + return "", fmt.Errorf("failed to replace values in template: %w", err) + } + + return buf.String(), nil +} diff --git a/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.yaml b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.yaml new file mode 100644 index 000000000..97afbc50e --- /dev/null +++ b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs/csidriver.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: "{{ .Name }}" +spec: + attachRequired: false + volumeLifecycleModes: + - Persistent diff --git a/vendor/modules.txt b/vendor/modules.txt index b4511947a..f127b7956 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -113,6 +113,7 @@ github.com/blang/semver github.com/cenkalti/backoff/v3 # github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000 => ./api ## explicit; go 1.16 +github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs github.com/ceph/ceph-csi/api/deploy/kubernetes/rbd github.com/ceph/ceph-csi/api/deploy/ocp # github.com/ceph/go-ceph v0.14.0