mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Fix flaws in Azure CSI translation
This commit is contained in:
parent
0a7675eddc
commit
3c88bf6b17
@ -2,6 +2,6 @@
|
||||
|
||||
Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes.
|
||||
|
||||
This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/csi-api](https://git.k8s.io/kubernetes/staging/src/k8s.io/csi-api) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot).
|
||||
This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/csi-translation-lib](https://git.k8s.io/kubernetes/staging/src/k8s.io/csi-translation-lib) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot).
|
||||
|
||||
Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/sig-architecture/staging.md) for more information.
|
||||
|
@ -49,5 +49,6 @@ go_test(
|
||||
deps = [
|
||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||
"//staging/src/k8s.io/api/storage/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
],
|
||||
)
|
||||
|
@ -110,22 +110,23 @@ func (t *azureDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume)
|
||||
return nil, fmt.Errorf("pv is nil or Azure Disk source not defined on pv")
|
||||
}
|
||||
|
||||
azureSource := pv.Spec.PersistentVolumeSource.AzureDisk
|
||||
var (
|
||||
azureSource = pv.Spec.PersistentVolumeSource.AzureDisk
|
||||
|
||||
// refer to https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/docs/driver-parameters.md
|
||||
csiSource := &v1.CSIPersistentVolumeSource{
|
||||
Driver: AzureDiskDriverName,
|
||||
VolumeHandle: azureSource.DataDiskURI,
|
||||
ReadOnly: *azureSource.ReadOnly,
|
||||
FSType: *azureSource.FSType,
|
||||
VolumeAttributes: map[string]string{azureDiskKind: "Managed"},
|
||||
}
|
||||
// refer to https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/docs/driver-parameters.md
|
||||
csiSource = &v1.CSIPersistentVolumeSource{
|
||||
Driver: AzureDiskDriverName,
|
||||
VolumeAttributes: map[string]string{azureDiskKind: "Managed"},
|
||||
VolumeHandle: azureSource.DataDiskURI,
|
||||
}
|
||||
)
|
||||
|
||||
if azureSource.CachingMode != nil {
|
||||
csiSource.VolumeAttributes[azureDiskCachingMode] = string(*azureSource.CachingMode)
|
||||
}
|
||||
|
||||
if azureSource.FSType != nil {
|
||||
csiSource.FSType = *azureSource.FSType
|
||||
csiSource.VolumeAttributes[azureDiskFSType] = *azureSource.FSType
|
||||
}
|
||||
|
||||
@ -133,9 +134,12 @@ func (t *azureDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume)
|
||||
csiSource.VolumeAttributes[azureDiskKind] = string(*azureSource.Kind)
|
||||
}
|
||||
|
||||
if azureSource.ReadOnly != nil {
|
||||
csiSource.ReadOnly = *azureSource.ReadOnly
|
||||
}
|
||||
|
||||
pv.Spec.PersistentVolumeSource.AzureDisk = nil
|
||||
pv.Spec.PersistentVolumeSource.CSI = csiSource
|
||||
pv.Spec.AccessModes = backwardCompatibleAccessModes(pv.Spec.AccessModes)
|
||||
|
||||
return pv, nil
|
||||
}
|
||||
|
@ -20,6 +20,9 @@ import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func TestIsManagedDisk(t *testing.T) {
|
||||
@ -91,3 +94,139 @@ func TestGetDiskName(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateAzureDiskInTreeStorageClassToCSI(t *testing.T) {
|
||||
translator := NewAzureDiskCSITranslator()
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
volume *corev1.Volume
|
||||
expVol *corev1.PersistentVolume
|
||||
expErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty volume",
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "no azure disk volume",
|
||||
volume: &corev1.Volume{},
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "azure disk volume",
|
||||
volume: &corev1.Volume{
|
||||
VolumeSource: corev1.VolumeSource{
|
||||
AzureDisk: &corev1.AzureDiskVolumeSource{
|
||||
DiskName: "diskname",
|
||||
DataDiskURI: "datadiskuri",
|
||||
},
|
||||
},
|
||||
},
|
||||
expVol: &corev1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "disk.csi.azure.com-diskname",
|
||||
},
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
CSI: &corev1.CSIPersistentVolumeSource{
|
||||
Driver: "disk.csi.azure.com",
|
||||
VolumeHandle: "datadiskuri",
|
||||
VolumeAttributes: map[string]string{azureDiskKind: "Managed"},
|
||||
},
|
||||
},
|
||||
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Logf("Testing %v", tc.name)
|
||||
got, err := translator.TranslateInTreeInlineVolumeToCSI(tc.volume)
|
||||
if err != nil && !tc.expErr {
|
||||
t.Errorf("Did not expect error but got: %v", err)
|
||||
}
|
||||
|
||||
if err == nil && tc.expErr {
|
||||
t.Errorf("Expected error, but did not get one.")
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got, tc.expVol) {
|
||||
t.Errorf("Got parameters: %v, expected :%v", got, tc.expVol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateAzureDiskInTreePVToCSI(t *testing.T) {
|
||||
translator := NewAzureDiskCSITranslator()
|
||||
|
||||
cachingMode := corev1.AzureDataDiskCachingMode("cachingmode")
|
||||
fsType := "fstype"
|
||||
readOnly := true
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
volume *corev1.PersistentVolume
|
||||
expVol *corev1.PersistentVolume
|
||||
expErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty volume",
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "no azure file volume",
|
||||
volume: &corev1.PersistentVolume{},
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "azure file volume",
|
||||
volume: &corev1.PersistentVolume{
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
AzureDisk: &corev1.AzureDiskVolumeSource{
|
||||
CachingMode: &cachingMode,
|
||||
DataDiskURI: "datadiskuri",
|
||||
FSType: &fsType,
|
||||
ReadOnly: &readOnly,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expVol: &corev1.PersistentVolume{
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
CSI: &corev1.CSIPersistentVolumeSource{
|
||||
Driver: "disk.csi.azure.com",
|
||||
FSType: "fstype",
|
||||
ReadOnly: true,
|
||||
VolumeAttributes: map[string]string{
|
||||
azureDiskCachingMode: "cachingmode",
|
||||
azureDiskFSType: fsType,
|
||||
azureDiskKind: "Managed",
|
||||
},
|
||||
VolumeHandle: "datadiskuri",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Logf("Testing %v", tc.name)
|
||||
got, err := translator.TranslateInTreePVToCSI(tc.volume)
|
||||
if err != nil && !tc.expErr {
|
||||
t.Errorf("Did not expect error but got: %v", err)
|
||||
}
|
||||
|
||||
if err == nil && tc.expErr {
|
||||
t.Errorf("Expected error, but did not get one.")
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got, tc.expVol) {
|
||||
t.Errorf("Got parameters: %v, expected :%v", got, tc.expVol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -58,32 +58,36 @@ func (t *azureFileCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.St
|
||||
// and converts the AzureFile source to a CSIPersistentVolumeSource
|
||||
func (t *azureFileCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||
if volume == nil || volume.AzureFile == nil {
|
||||
return nil, fmt.Errorf("volume is nil or AWS EBS not defined on volume")
|
||||
return nil, fmt.Errorf("volume is nil or Azure File not defined on volume")
|
||||
}
|
||||
|
||||
azureSource := volume.AzureFile
|
||||
var (
|
||||
azureSource = volume.AzureFile
|
||||
|
||||
pv := &v1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
// Must be unique per disk as it is used as the unique part of the
|
||||
// staging path
|
||||
Name: fmt.Sprintf("%s-%s", AzureFileDriverName, azureSource.ShareName),
|
||||
},
|
||||
Spec: v1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||
CSI: &v1.CSIPersistentVolumeSource{
|
||||
VolumeHandle: fmt.Sprintf(volumeIDTemplate, "", azureSource.SecretName, azureSource.ShareName),
|
||||
ReadOnly: azureSource.ReadOnly,
|
||||
VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName},
|
||||
NodePublishSecretRef: &v1.SecretReference{
|
||||
Name: azureSource.ShareName,
|
||||
Namespace: "default",
|
||||
pv = &v1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
// Must be unique per disk as it is used as the unique part of the
|
||||
// staging path
|
||||
Name: fmt.Sprintf("%s-%s", AzureFileDriverName, azureSource.ShareName),
|
||||
},
|
||||
Spec: v1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||
CSI: &v1.CSIPersistentVolumeSource{
|
||||
Driver: AzureFileDriverName,
|
||||
VolumeHandle: fmt.Sprintf(volumeIDTemplate, "", azureSource.SecretName, azureSource.ShareName),
|
||||
ReadOnly: azureSource.ReadOnly,
|
||||
VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName},
|
||||
NodePublishSecretRef: &v1.SecretReference{
|
||||
Name: azureSource.ShareName,
|
||||
Namespace: "default",
|
||||
},
|
||||
},
|
||||
},
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
|
||||
},
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
|
||||
},
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
return pv, nil
|
||||
}
|
||||
|
||||
@ -94,24 +98,28 @@ func (t *azureFileCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume)
|
||||
return nil, fmt.Errorf("pv is nil or Azure File source not defined on pv")
|
||||
}
|
||||
|
||||
azureSource := pv.Spec.PersistentVolumeSource.AzureFile
|
||||
var (
|
||||
azureSource = pv.Spec.PersistentVolumeSource.AzureFile
|
||||
volumeID = fmt.Sprintf(volumeIDTemplate, "", azureSource.SecretName, azureSource.ShareName)
|
||||
|
||||
volumeID := fmt.Sprintf(volumeIDTemplate, "", azureSource.SecretName, azureSource.ShareName)
|
||||
// refer to https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/driver-parameters.md
|
||||
csiSource := &v1.CSIPersistentVolumeSource{
|
||||
VolumeHandle: volumeID,
|
||||
ReadOnly: azureSource.ReadOnly,
|
||||
VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName},
|
||||
}
|
||||
// refer to https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/driver-parameters.md
|
||||
csiSource = &v1.CSIPersistentVolumeSource{
|
||||
Driver: AzureFileDriverName,
|
||||
NodePublishSecretRef: &v1.SecretReference{
|
||||
Name: azureSource.ShareName,
|
||||
},
|
||||
ReadOnly: azureSource.ReadOnly,
|
||||
VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName},
|
||||
VolumeHandle: volumeID,
|
||||
}
|
||||
)
|
||||
|
||||
csiSource.NodePublishSecretRef = &v1.SecretReference{
|
||||
Name: azureSource.ShareName,
|
||||
Namespace: *azureSource.SecretNamespace,
|
||||
if azureSource.SecretNamespace != nil {
|
||||
csiSource.NodePublishSecretRef.Namespace = *azureSource.SecretNamespace
|
||||
}
|
||||
|
||||
pv.Spec.PersistentVolumeSource.AzureFile = nil
|
||||
pv.Spec.PersistentVolumeSource.CSI = csiSource
|
||||
pv.Spec.AccessModes = backwardCompatibleAccessModes(pv.Spec.AccessModes)
|
||||
|
||||
return pv, nil
|
||||
}
|
||||
|
@ -20,6 +20,9 @@ import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func TestGetFileShareInfo(t *testing.T) {
|
||||
@ -69,3 +72,148 @@ func TestGetFileShareInfo(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateAzureFileInTreeStorageClassToCSI(t *testing.T) {
|
||||
translator := NewAzureFileCSITranslator()
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
volume *corev1.Volume
|
||||
expVol *corev1.PersistentVolume
|
||||
expErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty volume",
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "no azure file volume",
|
||||
volume: &corev1.Volume{},
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "azure file volume",
|
||||
volume: &corev1.Volume{
|
||||
VolumeSource: corev1.VolumeSource{
|
||||
AzureFile: &corev1.AzureFileVolumeSource{
|
||||
ReadOnly: true,
|
||||
SecretName: "secretname",
|
||||
ShareName: "sharename",
|
||||
},
|
||||
},
|
||||
},
|
||||
expVol: &corev1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "file.csi.azure.com-sharename",
|
||||
},
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
CSI: &corev1.CSIPersistentVolumeSource{
|
||||
Driver: "file.csi.azure.com",
|
||||
NodePublishSecretRef: &corev1.SecretReference{
|
||||
Name: "sharename",
|
||||
Namespace: "default",
|
||||
},
|
||||
ReadOnly: true,
|
||||
VolumeAttributes: map[string]string{azureFileShareName: "sharename"},
|
||||
VolumeHandle: "#secretname#sharename",
|
||||
},
|
||||
},
|
||||
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Logf("Testing %v", tc.name)
|
||||
got, err := translator.TranslateInTreeInlineVolumeToCSI(tc.volume)
|
||||
if err != nil && !tc.expErr {
|
||||
t.Errorf("Did not expect error but got: %v", err)
|
||||
}
|
||||
|
||||
if err == nil && tc.expErr {
|
||||
t.Errorf("Expected error, but did not get one.")
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got, tc.expVol) {
|
||||
t.Errorf("Got parameters: %v, expected :%v", got, tc.expVol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateAzureFileInTreePVToCSI(t *testing.T) {
|
||||
translator := NewAzureFileCSITranslator()
|
||||
|
||||
secretNamespace := "secretnamespace"
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
volume *corev1.PersistentVolume
|
||||
expVol *corev1.PersistentVolume
|
||||
expErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty volume",
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "no azure file volume",
|
||||
volume: &corev1.PersistentVolume{},
|
||||
expErr: true,
|
||||
},
|
||||
{
|
||||
name: "azure file volume",
|
||||
volume: &corev1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "file.csi.azure.com-sharename",
|
||||
},
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
AzureFile: &corev1.AzureFilePersistentVolumeSource{
|
||||
ShareName: "sharename",
|
||||
SecretName: "secretname",
|
||||
SecretNamespace: &secretNamespace,
|
||||
ReadOnly: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expVol: &corev1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "file.csi.azure.com-sharename",
|
||||
},
|
||||
Spec: corev1.PersistentVolumeSpec{
|
||||
PersistentVolumeSource: corev1.PersistentVolumeSource{
|
||||
CSI: &corev1.CSIPersistentVolumeSource{
|
||||
Driver: "file.csi.azure.com",
|
||||
ReadOnly: true,
|
||||
NodePublishSecretRef: &corev1.SecretReference{
|
||||
Name: "sharename",
|
||||
Namespace: secretNamespace,
|
||||
},
|
||||
VolumeAttributes: map[string]string{azureFileShareName: "sharename"},
|
||||
VolumeHandle: "#secretname#sharename",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Logf("Testing %v", tc.name)
|
||||
got, err := translator.TranslateInTreePVToCSI(tc.volume)
|
||||
if err != nil && !tc.expErr {
|
||||
t.Errorf("Did not expect error but got: %v", err)
|
||||
}
|
||||
|
||||
if err == nil && tc.expErr {
|
||||
t.Errorf("Expected error, but did not get one.")
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got, tc.expVol) {
|
||||
t.Errorf("Got parameters: %v, expected :%v", got, tc.expVol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user