Skip to content

Commit aba339c

Browse files
authored
Merge pull request kubernetes#91196 from andyzhangx/azuredisk-migration-topology
fix: topology translation issue in azure disk storage class migration
2 parents 03cd30b + e7696d4 commit aba339c

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import (
2929
const (
3030
// AzureDiskDriverName is the name of the CSI driver for Azure Disk
3131
AzureDiskDriverName = "disk.csi.azure.com"
32+
// AzureDiskTopologyKey is the topology key of Azure Disk CSI driver
33+
AzureDiskTopologyKey = "topology.disk.csi.azure.com/zone"
3234
// AzureDiskInTreePluginName is the name of the intree plugin for Azure Disk
3335
AzureDiskInTreePluginName = "kubernetes.io/azure-disk"
3436

@@ -57,6 +59,35 @@ func NewAzureDiskCSITranslator() InTreePlugin {
5759

5860
// TranslateInTreeStorageClassParametersToCSI translates InTree Azure Disk storage class parameters to CSI storage class
5961
func (t *azureDiskCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.StorageClass) (*storage.StorageClass, error) {
62+
var (
63+
generatedTopologies []v1.TopologySelectorTerm
64+
params = map[string]string{}
65+
)
66+
for k, v := range sc.Parameters {
67+
switch strings.ToLower(k) {
68+
case zoneKey:
69+
generatedTopologies = generateToplogySelectors(AzureDiskTopologyKey, []string{v})
70+
case zonesKey:
71+
generatedTopologies = generateToplogySelectors(AzureDiskTopologyKey, strings.Split(v, ","))
72+
default:
73+
params[k] = v
74+
}
75+
}
76+
77+
if len(generatedTopologies) > 0 && len(sc.AllowedTopologies) > 0 {
78+
return nil, fmt.Errorf("cannot simultaneously set allowed topologies and zone/zones parameters")
79+
} else if len(generatedTopologies) > 0 {
80+
sc.AllowedTopologies = generatedTopologies
81+
} else if len(sc.AllowedTopologies) > 0 {
82+
newTopologies, err := translateAllowedTopologies(sc.AllowedTopologies, AzureDiskTopologyKey)
83+
if err != nil {
84+
return nil, fmt.Errorf("failed translating allowed topologies: %v", err)
85+
}
86+
sc.AllowedTopologies = newTopologies
87+
}
88+
89+
sc.Parameters = params
90+
6091
return sc, nil
6192
}
6293

staging/src/k8s.io/csi-translation-lib/plugins/azure_disk_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"testing"
2323

2424
corev1 "k8s.io/api/core/v1"
25+
v1 "k8s.io/api/core/v1"
26+
storage "k8s.io/api/storage/v1"
2527
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2628
)
2729

@@ -230,3 +232,64 @@ func TestTranslateAzureDiskInTreePVToCSI(t *testing.T) {
230232
}
231233
}
232234
}
235+
236+
func TestTranslateInTreeStorageClassToCSI(t *testing.T) {
237+
translator := NewAzureDiskCSITranslator()
238+
239+
tcs := []struct {
240+
name string
241+
options *storage.StorageClass
242+
expOptions *storage.StorageClass
243+
expErr bool
244+
}{
245+
{
246+
name: "nothing special",
247+
options: NewStorageClass(map[string]string{"foo": "bar"}, nil),
248+
expOptions: NewStorageClass(map[string]string{"foo": "bar"}, nil),
249+
},
250+
{
251+
name: "empty params",
252+
options: NewStorageClass(map[string]string{}, nil),
253+
expOptions: NewStorageClass(map[string]string{}, nil),
254+
},
255+
{
256+
name: "zone",
257+
options: NewStorageClass(map[string]string{"zone": "foo"}, nil),
258+
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
259+
},
260+
{
261+
name: "zones",
262+
options: NewStorageClass(map[string]string{"zones": "foo,bar,baz"}, nil),
263+
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo", "bar", "baz"})),
264+
},
265+
{
266+
name: "some normal topology",
267+
options: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
268+
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
269+
},
270+
{
271+
name: "some translated topology",
272+
options: NewStorageClass(map[string]string{}, generateToplogySelectors(v1.LabelZoneFailureDomain, []string{"foo"})),
273+
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
274+
},
275+
{
276+
name: "zone and topology",
277+
options: NewStorageClass(map[string]string{"zone": "foo"}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
278+
expErr: true,
279+
},
280+
}
281+
282+
for _, tc := range tcs {
283+
t.Logf("Testing %v", tc.name)
284+
gotOptions, err := translator.TranslateInTreeStorageClassToCSI(tc.options)
285+
if err != nil && !tc.expErr {
286+
t.Errorf("Did not expect error but got: %v", err)
287+
}
288+
if err == nil && tc.expErr {
289+
t.Errorf("Expected error, but did not get one.")
290+
}
291+
if !reflect.DeepEqual(gotOptions, tc.expOptions) {
292+
t.Errorf("Got parameters: %v, expected :%v", gotOptions, tc.expOptions)
293+
}
294+
}
295+
}

0 commit comments

Comments
 (0)