Skip to content

Commit 183a3e5

Browse files
authored
Merge pull request kubernetes#86385 from andyzhangx/azuredisk-port-code
chore: port azure disk csi code to azure cloud provider
2 parents 18cc21e + b898c79 commit 183a3e5

File tree

3 files changed

+187
-1
lines changed

3 files changed

+187
-1
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"context"
2323
"fmt"
2424
"path"
25+
"regexp"
2526
"strings"
2627
"sync"
2728
"time"
@@ -46,6 +47,14 @@ const (
4647
errLeaseIDMissing = "LeaseIdMissing"
4748
errContainerNotFound = "ContainerNotFound"
4849
errDiskBlobNotFound = "DiskBlobNotFound"
50+
sourceSnapshot = "snapshot"
51+
sourceVolume = "volume"
52+
53+
// see https://docs.microsoft.com/en-us/rest/api/compute/disks/createorupdate#create-a-managed-disk-by-copying-a-snapshot.
54+
diskSnapshotPath = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/snapshots/%s"
55+
56+
// see https://docs.microsoft.com/en-us/rest/api/compute/disks/createorupdate#create-a-managed-disk-from-an-existing-managed-disk-in-the-same-or-different-subscription.
57+
managedDiskPath = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/disks/%s"
4958
)
5059

5160
var defaultBackOff = kwait.Backoff{
@@ -55,6 +64,11 @@ var defaultBackOff = kwait.Backoff{
5564
Jitter: 0.0,
5665
}
5766

67+
var (
68+
managedDiskPathRE = regexp.MustCompile(`.*/subscriptions/(?:.*)/resourceGroups/(?:.*)/providers/Microsoft.Compute/disks/(.+)`)
69+
diskSnapshotPathRE = regexp.MustCompile(`.*/subscriptions/(?:.*)/resourceGroups/(?:.*)/providers/Microsoft.Compute/snapshots/(.+)`)
70+
)
71+
5872
type controllerCommon struct {
5973
subscriptionID string
6074
location string
@@ -312,3 +326,39 @@ func filterDetachingDisks(unfilteredDisks []compute.DataDisk) []compute.DataDisk
312326
}
313327
return filteredDisks
314328
}
329+
330+
func getValidCreationData(subscriptionID, resourceGroup, sourceResourceID, sourceType string) (compute.CreationData, error) {
331+
if sourceResourceID == "" {
332+
return compute.CreationData{
333+
CreateOption: compute.Empty,
334+
}, nil
335+
}
336+
337+
switch sourceType {
338+
case sourceSnapshot:
339+
if match := diskSnapshotPathRE.FindString(sourceResourceID); match == "" {
340+
sourceResourceID = fmt.Sprintf(diskSnapshotPath, subscriptionID, resourceGroup, sourceResourceID)
341+
}
342+
343+
case sourceVolume:
344+
if match := managedDiskPathRE.FindString(sourceResourceID); match == "" {
345+
sourceResourceID = fmt.Sprintf(managedDiskPath, subscriptionID, resourceGroup, sourceResourceID)
346+
}
347+
default:
348+
return compute.CreationData{
349+
CreateOption: compute.Empty,
350+
}, nil
351+
}
352+
353+
splits := strings.Split(sourceResourceID, "/")
354+
if len(splits) > 9 {
355+
if sourceType == sourceSnapshot {
356+
return compute.CreationData{}, fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", sourceResourceID, diskSnapshotPathRE)
357+
}
358+
return compute.CreationData{}, fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", sourceResourceID, managedDiskPathRE)
359+
}
360+
return compute.CreationData{
361+
CreateOption: compute.Copy,
362+
SourceResourceID: &sourceResourceID,
363+
}, nil
364+
}

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package azure
2020

2121
import (
2222
"fmt"
23+
"reflect"
2324
"testing"
2425

2526
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
@@ -284,3 +285,129 @@ func TestFilteredDetatchingDisks(t *testing.T) {
284285
filteredDisks = filterDetachingDisks(disks)
285286
assert.Equal(t, 0, len(filteredDisks))
286287
}
288+
289+
func TestGetValidCreationData(t *testing.T) {
290+
sourceResourceSnapshotID := "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx"
291+
sourceResourceVolumeID := "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/disks/xxx"
292+
293+
tests := []struct {
294+
subscriptionID string
295+
resourceGroup string
296+
sourceResourceID string
297+
sourceType string
298+
expected1 compute.CreationData
299+
expected2 error
300+
}{
301+
{
302+
subscriptionID: "",
303+
resourceGroup: "",
304+
sourceResourceID: "",
305+
sourceType: "",
306+
expected1: compute.CreationData{
307+
CreateOption: compute.Empty,
308+
},
309+
expected2: nil,
310+
},
311+
{
312+
subscriptionID: "",
313+
resourceGroup: "",
314+
sourceResourceID: "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx",
315+
sourceType: sourceSnapshot,
316+
expected1: compute.CreationData{
317+
CreateOption: compute.Copy,
318+
SourceResourceID: &sourceResourceSnapshotID,
319+
},
320+
expected2: nil,
321+
},
322+
{
323+
subscriptionID: "xxx",
324+
resourceGroup: "xxx",
325+
sourceResourceID: "xxx",
326+
sourceType: sourceSnapshot,
327+
expected1: compute.CreationData{
328+
CreateOption: compute.Copy,
329+
SourceResourceID: &sourceResourceSnapshotID,
330+
},
331+
expected2: nil,
332+
},
333+
{
334+
subscriptionID: "",
335+
resourceGroup: "",
336+
sourceResourceID: "/subscriptions/23/providers/Microsoft.Compute/disks/name",
337+
sourceType: sourceSnapshot,
338+
expected1: compute.CreationData{},
339+
expected2: fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", "/subscriptions//resourceGroups//providers/Microsoft.Compute/snapshots//subscriptions/23/providers/Microsoft.Compute/disks/name", diskSnapshotPathRE),
340+
},
341+
{
342+
subscriptionID: "",
343+
resourceGroup: "",
344+
sourceResourceID: "http://test.com/vhds/name",
345+
sourceType: sourceSnapshot,
346+
expected1: compute.CreationData{},
347+
expected2: fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", "/subscriptions//resourceGroups//providers/Microsoft.Compute/snapshots/http://test.com/vhds/name", diskSnapshotPathRE),
348+
},
349+
{
350+
subscriptionID: "",
351+
resourceGroup: "",
352+
sourceResourceID: "/subscriptions/xxx/snapshots/xxx",
353+
sourceType: sourceSnapshot,
354+
expected1: compute.CreationData{},
355+
expected2: fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", "/subscriptions//resourceGroups//providers/Microsoft.Compute/snapshots//subscriptions/xxx/snapshots/xxx", diskSnapshotPathRE),
356+
},
357+
{
358+
subscriptionID: "",
359+
resourceGroup: "",
360+
sourceResourceID: "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx/snapshots/xxx/snapshots/xxx",
361+
sourceType: sourceSnapshot,
362+
expected1: compute.CreationData{},
363+
expected2: fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx/snapshots/xxx/snapshots/xxx", diskSnapshotPathRE),
364+
},
365+
{
366+
subscriptionID: "",
367+
resourceGroup: "",
368+
sourceResourceID: "xxx",
369+
sourceType: "",
370+
expected1: compute.CreationData{
371+
CreateOption: compute.Empty,
372+
},
373+
expected2: nil,
374+
},
375+
{
376+
subscriptionID: "",
377+
resourceGroup: "",
378+
sourceResourceID: "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/disks/xxx",
379+
sourceType: sourceVolume,
380+
expected1: compute.CreationData{
381+
CreateOption: compute.Copy,
382+
SourceResourceID: &sourceResourceVolumeID,
383+
},
384+
expected2: nil,
385+
},
386+
{
387+
subscriptionID: "xxx",
388+
resourceGroup: "xxx",
389+
sourceResourceID: "xxx",
390+
sourceType: sourceVolume,
391+
expected1: compute.CreationData{
392+
CreateOption: compute.Copy,
393+
SourceResourceID: &sourceResourceVolumeID,
394+
},
395+
expected2: nil,
396+
},
397+
{
398+
subscriptionID: "",
399+
resourceGroup: "",
400+
sourceResourceID: "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx",
401+
sourceType: sourceVolume,
402+
expected1: compute.CreationData{},
403+
expected2: fmt.Errorf("sourceResourceID(%s) is invalid, correct format: %s", "/subscriptions//resourceGroups//providers/Microsoft.Compute/disks//subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/snapshots/xxx", managedDiskPathRE),
404+
},
405+
}
406+
407+
for _, test := range tests {
408+
result, err := getValidCreationData(test.subscriptionID, test.resourceGroup, test.sourceResourceID, test.sourceType)
409+
if !reflect.DeepEqual(result, test.expected1) || !reflect.DeepEqual(err, test.expected2) {
410+
t.Errorf("input sourceResourceID: %v, sourceType: %v, getValidCreationData result: %v, expected1 : %v, err: %v, expected2: %v", test.sourceResourceID, test.sourceType, result, test.expected1, err, test.expected2)
411+
}
412+
}
413+
}

staging/src/k8s.io/legacy-cloud-providers/azure/azure_managedDiskController.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ type ManagedDiskOptions struct {
6969
DiskIOPSReadWrite string
7070
// Throughput Cap (MBps) for UltraSSD disk
7171
DiskMBpsReadWrite string
72+
// if SourceResourceID is not empty, then it's a disk copy operation(for snapshot)
73+
SourceResourceID string
74+
// The type of source
75+
SourceType string
7276
// ResourceId of the disk encryption set to use for enabling encryption at rest.
7377
DiskEncryptionSetID string
7478
}
@@ -99,9 +103,14 @@ func (c *ManagedDiskController) CreateManagedDisk(options *ManagedDiskOptions) (
99103

100104
diskSizeGB := int32(options.SizeGB)
101105
diskSku := compute.DiskStorageAccountTypes(options.StorageAccountType)
106+
107+
creationData, err := getValidCreationData(c.common.subscriptionID, options.ResourceGroup, options.SourceResourceID, options.SourceType)
108+
if err != nil {
109+
return "", err
110+
}
102111
diskProperties := compute.DiskProperties{
103112
DiskSizeGB: &diskSizeGB,
104-
CreationData: &compute.CreationData{CreateOption: compute.Empty},
113+
CreationData: &creationData,
105114
}
106115

107116
if diskSku == compute.UltraSSDLRS {

0 commit comments

Comments
 (0)