diff --git a/api/deploy/kubernetes/cephfs/csi-config-map.yaml b/api/deploy/kubernetes/cephfs/csi-config-map.yaml index a6af53a69..c8a48eb4a 100644 --- a/api/deploy/kubernetes/cephfs/csi-config-map.yaml +++ b/api/deploy/kubernetes/cephfs/csi-config-map.yaml @@ -1,3 +1,4 @@ +--- apiVersion: v1 kind: ConfigMap metadata: diff --git a/api/deploy/kubernetes/cephfs/csidriver.go b/api/deploy/kubernetes/cephfs/csidriver.go new file mode 100644 index 000000000..b2d0fb865 --- /dev/null +++ b/api/deploy/kubernetes/cephfs/csidriver.go @@ -0,0 +1,74 @@ +/* +Copyright 2023 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 cephfs + +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: "cephfs.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/cephfs/csidriver.yaml b/api/deploy/kubernetes/cephfs/csidriver.yaml new file mode 100644 index 000000000..20cfd051f --- /dev/null +++ b/api/deploy/kubernetes/cephfs/csidriver.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: "{{ .Name }}" +spec: + attachRequired: false + podInfoOnMount: false + fsGroupPolicy: File diff --git a/api/deploy/kubernetes/cephfs/csidriver_test.go b/api/deploy/kubernetes/cephfs/csidriver_test.go new file mode 100644 index 000000000..5a589b92e --- /dev/null +++ b/api/deploy/kubernetes/cephfs/csidriver_test.go @@ -0,0 +1,38 @@ +/* +Copyright 2023 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 cephfs + +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 3f8162405..34f42c66a 100644 --- a/deploy/Makefile +++ b/deploy/Makefile @@ -25,6 +25,9 @@ all: \ scc.yaml: ../api/deploy/ocp/scc.yaml ../api/deploy/ocp/scc.go $(MAKE) -C ../tools generate-deploy +cephfs/kubernetes/csidriver.yaml: ../api/deploy/kubernetes/cephfs/csidriver.yaml ../api/deploy/kubernetes/cephfs/csidriver.go + $(MAKE) -C ../tools generate-deploy + cephfs/kubernetes/csi-config-map.yaml: ../api/deploy/kubernetes/cephfs/csi-config-map.* $(MAKE) -C ../tools generate-deploy diff --git a/deploy/cephfs/kubernetes/csi-config-map.yaml b/deploy/cephfs/kubernetes/csi-config-map.yaml index d29cdf5d5..44ef712a4 100644 --- a/deploy/cephfs/kubernetes/csi-config-map.yaml +++ b/deploy/cephfs/kubernetes/csi-config-map.yaml @@ -5,6 +5,7 @@ # The source for the contents can be found in the api/deploy directory, make # your modifications there. # +--- apiVersion: v1 kind: ConfigMap metadata: diff --git a/deploy/cephfs/kubernetes/csidriver.yaml b/deploy/cephfs/kubernetes/csidriver.yaml index dcb2b7745..aa1a0b71a 100644 --- a/deploy/cephfs/kubernetes/csidriver.yaml +++ b/deploy/cephfs/kubernetes/csidriver.yaml @@ -1,8 +1,15 @@ +# +# /!\ 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: cephfs.csi.ceph.com + name: "cephfs.csi.ceph.com" spec: attachRequired: false podInfoOnMount: false diff --git a/tools/yamlgen/main.go b/tools/yamlgen/main.go index 85bbbd5ca..9b066c12e 100644 --- a/tools/yamlgen/main.go +++ b/tools/yamlgen/main.go @@ -49,6 +49,11 @@ var yamlArtifacts = []deploymentArtifact{ reflect.ValueOf(ocp.NewSecurityContextConstraintsYAML), reflect.ValueOf(ocp.SecurityContextConstraintsDefaults), }, + { + "../deploy/cephfs/kubernetes/csidriver.yaml", + reflect.ValueOf(cephfs.NewCSIDriverYAML), + reflect.ValueOf(cephfs.CSIDriverDefaults), + }, { "../deploy/cephfs/kubernetes/csi-config-map.yaml", reflect.ValueOf(cephfs.NewCSIConfigMapYAML), diff --git a/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csi-config-map.yaml b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csi-config-map.yaml index a6af53a69..c8a48eb4a 100644 --- a/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csi-config-map.yaml +++ b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csi-config-map.yaml @@ -1,3 +1,4 @@ +--- apiVersion: v1 kind: ConfigMap metadata: diff --git a/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csidriver.go b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csidriver.go new file mode 100644 index 000000000..b2d0fb865 --- /dev/null +++ b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csidriver.go @@ -0,0 +1,74 @@ +/* +Copyright 2023 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 cephfs + +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: "cephfs.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/cephfs/csidriver.yaml b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csidriver.yaml new file mode 100644 index 000000000..20cfd051f --- /dev/null +++ b/vendor/github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs/csidriver.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: "{{ .Name }}" +spec: + attachRequired: false + podInfoOnMount: false + fsGroupPolicy: File diff --git a/vendor/modules.txt b/vendor/modules.txt index edb88c6f1..45905d63f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -119,6 +119,7 @@ github.com/cenkalti/backoff/v3 github.com/cenkalti/backoff/v4 # github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000 => ./api ## explicit; go 1.18 +github.com/ceph/ceph-csi/api/deploy/kubernetes/cephfs 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