From 08a69a91ec4f59d1900ffc06b52c13df0975a8ae Mon Sep 17 00:00:00 2001 From: juliankatz Date: Tue, 1 Jul 2025 15:59:19 -0700 Subject: [PATCH 1/2] Use metadata golang package instead of raw HTTP --- pkg/mount-manager/safe-mounter-v1_windows.go | 43 +++---------------- .../safe-mounter-v1beta_windows.go | 33 +++----------- pkg/mount-manager/safe-mounter_windows.go | 30 +++++++++++++ 3 files changed, 40 insertions(+), 66 deletions(-) diff --git a/pkg/mount-manager/safe-mounter-v1_windows.go b/pkg/mount-manager/safe-mounter-v1_windows.go index 65f6642b4..1642f2a17 100644 --- a/pkg/mount-manager/safe-mounter-v1_windows.go +++ b/pkg/mount-manager/safe-mounter-v1_windows.go @@ -21,13 +21,10 @@ import ( "encoding/json" "errors" "fmt" - "io" - "net/http" "os" "path/filepath" "strconv" "strings" - "time" diskapi "github.com/kubernetes-csi/csi-proxy/client/api/disk/v1" diskclient "github.com/kubernetes-csi/csi-proxy/client/groups/disk/v1" @@ -38,20 +35,11 @@ import ( volumeapi "github.com/kubernetes-csi/csi-proxy/client/api/volume/v1" volumeclient "github.com/kubernetes-csi/csi-proxy/client/groups/volume/v1" + "cloud.google.com/go/compute/metadata" "k8s.io/klog/v2" mount "k8s.io/mount-utils" ) -// GoogleCloudDisk represents a disk from Google Cloud metadata -type GoogleCloudDisk struct { - DeviceName string `json:"deviceName"` - Index int `json:"index"` - Interface string `json:"interface"` - Mode string `json:"mode"` - NvmeNamespaceIdentifier uint64 `json:"nvmeNamespaceIdentifier"` - Type string `json:"type"` -} - // CSIProxyMounterV1 is the mounter implementation that uses the v1 API type CSIProxyMounterV1 struct { FsClient *fsclient.Client @@ -197,7 +185,7 @@ func (mounter *CSIProxyMounterV1) Unmount(target string) error { func (mounter *CSIProxyMounterV1) GetDiskNumber(deviceName string, partition string, volumeKey string) (string, error) { // First, get Google Cloud metadata to find the nvmeNamespaceIdentifier for this device - googleDisks, err := mounter.getGoogleCloudDisks() + googleDisks, err := AttachedDisks() if err != nil { klog.V(4).Infof("Failed to get Google Cloud metadata, falling back to legacy method: %v", err) return mounter.getDiskNumberLegacy(deviceName) @@ -350,34 +338,13 @@ func (mounter *CSIProxyMounterV1) convertEUIToDecimal(euiValue string) (uint64, // Helper function to get Google Cloud metadata func (mounter *CSIProxyMounterV1) getGoogleCloudDisks() ([]GoogleCloudDisk, error) { - client := &http.Client{ - Timeout: 10 * time.Second, - } - - req, err := http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true", nil) - if err != nil { - return nil, fmt.Errorf("failed to create request: %v", err) - } - - req.Header.Set("Metadata-Flavor", "Google") - - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("failed to call metadata service: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("metadata service returned status %d", resp.StatusCode) - } - - body, err := io.ReadAll(resp.Body) + disksResp, err := metadata.GetWithContext(context.Background(), "instance/disks/?recursive=true") if err != nil { - return nil, fmt.Errorf("failed to read response body: %v", err) + return nil, fmt.Errorf("failed to get disks using metadata package: %v", err) } var disks []GoogleCloudDisk - if err := json.Unmarshal(body, &disks); err != nil { + if err := json.Unmarshal([]byte(disksResp), &disks); err != nil { return nil, fmt.Errorf("failed to parse JSON response: %v", err) } diff --git a/pkg/mount-manager/safe-mounter-v1beta_windows.go b/pkg/mount-manager/safe-mounter-v1beta_windows.go index dbb82c649..5e1ec22c0 100644 --- a/pkg/mount-manager/safe-mounter-v1beta_windows.go +++ b/pkg/mount-manager/safe-mounter-v1beta_windows.go @@ -21,14 +21,12 @@ import ( "encoding/json" "errors" "fmt" - "io" - "net/http" "os" "path/filepath" "strconv" "strings" - "time" + "cloud.google.com/go/compute/metadata" diskapi "github.com/kubernetes-csi/csi-proxy/client/api/disk/v1beta2" diskclient "github.com/kubernetes-csi/csi-proxy/client/groups/disk/v1beta2" @@ -202,7 +200,7 @@ func (mounter *CSIProxyMounterV1Beta) Unmount(target string) error { func (mounter *CSIProxyMounterV1Beta) GetDiskNumber(deviceName string, partition string, volumeKey string) (string, error) { // First, get Google Cloud metadata to find the nvmeNamespaceIdentifier for this device - googleDisks, err := mounter.getGoogleCloudDisks() + googleDisks, err := AttachedDisks() if err != nil { klog.V(4).Infof("Failed to get Google Cloud metadata, falling back to legacy method: %v", err) return mounter.getDiskNumberLegacy(deviceName) @@ -358,34 +356,13 @@ func (mounter *CSIProxyMounterV1Beta) convertEUIToDecimal(euiValue string) (uint // Helper function to get Google Cloud metadata func (mounter *CSIProxyMounterV1Beta) getGoogleCloudDisks() ([]GoogleCloudDiskBeta, error) { - client := &http.Client{ - Timeout: 10 * time.Second, - } - - req, err := http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true", nil) - if err != nil { - return nil, fmt.Errorf("failed to create request: %v", err) - } - - req.Header.Set("Metadata-Flavor", "Google") - - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("failed to call metadata service: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("metadata service returned status %d", resp.StatusCode) - } - - body, err := io.ReadAll(resp.Body) + disksResponse, err := metadata.GetWithContext(context.Background(), "instance/disks/?recursive=true") if err != nil { - return nil, fmt.Errorf("failed to read response body: %v", err) + return nil, fmt.Errorf("failed to get disks using metadata package: %v", err) } var disks []GoogleCloudDiskBeta - if err := json.Unmarshal(body, &disks); err != nil { + if err := json.Unmarshal([]byte(disksResponse), &disks); err != nil { return nil, fmt.Errorf("failed to parse JSON response: %v", err) } diff --git a/pkg/mount-manager/safe-mounter_windows.go b/pkg/mount-manager/safe-mounter_windows.go index b37a4009b..c381bc58b 100644 --- a/pkg/mount-manager/safe-mounter_windows.go +++ b/pkg/mount-manager/safe-mounter_windows.go @@ -17,8 +17,12 @@ limitations under the License. package mountmanager import ( + "context" + "encoding/json" + "fmt" "time" + "cloud.google.com/go/compute/metadata" "k8s.io/klog/v2" "k8s.io/mount-utils" utilexec "k8s.io/utils/exec" @@ -82,3 +86,29 @@ func NewSafeMounter(int, time.Duration) (*mount.SafeFormatAndMount, error) { klog.V(4).Infof("failed to connect to csi-proxy v1beta with error=%v", err.Error()) return nil, err } + +type GoogleCloudDisk struct { + DeviceName string `json:"deviceName"` + Index int `json:"index"` + Interface string `json:"interface"` + Mode string `json:"mode"` + NvmeNamespaceIdentifier uint64 `json:"nvmeNamespaceIdentifier"` + Type string `json:"type"` +} + +// AttachedDisks returns the list of disks attached to the instance from which +// the metadata server is called. +func AttachedDisks() ([]GoogleCloudDisk, error) { + disksResp, err := metadata.GetWithContext(context.Background(), "instance/disks/?recursive=true") + if err != nil { + return nil, fmt.Errorf("failed to get disks using metadata package: %v", err) + } + + var disks []GoogleCloudDisk + if err := json.Unmarshal([]byte(disksResp), &disks); err != nil { + return nil, fmt.Errorf("failed to parse JSON response: %v", err) + } + + klog.V(4).Infof("Retrieved %d disks from Google Cloud metadata", len(disks)) + return disks, nil +} From 6ce338cd72fcc3cff461ed93115416d9de17b8a2 Mon Sep 17 00:00:00 2001 From: juliankatz Date: Tue, 1 Jul 2025 16:45:23 -0700 Subject: [PATCH 2/2] Make attached disk logic package private --- pkg/mount-manager/safe-mounter-v1_windows.go | 6 +++--- pkg/mount-manager/safe-mounter-v1beta_windows.go | 2 +- pkg/mount-manager/safe-mounter_windows.go | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/mount-manager/safe-mounter-v1_windows.go b/pkg/mount-manager/safe-mounter-v1_windows.go index 1642f2a17..ad3593caa 100644 --- a/pkg/mount-manager/safe-mounter-v1_windows.go +++ b/pkg/mount-manager/safe-mounter-v1_windows.go @@ -185,7 +185,7 @@ func (mounter *CSIProxyMounterV1) Unmount(target string) error { func (mounter *CSIProxyMounterV1) GetDiskNumber(deviceName string, partition string, volumeKey string) (string, error) { // First, get Google Cloud metadata to find the nvmeNamespaceIdentifier for this device - googleDisks, err := AttachedDisks() + googleDisks, err := attachedDisks() if err != nil { klog.V(4).Infof("Failed to get Google Cloud metadata, falling back to legacy method: %v", err) return mounter.getDiskNumberLegacy(deviceName) @@ -337,13 +337,13 @@ func (mounter *CSIProxyMounterV1) convertEUIToDecimal(euiValue string) (uint64, } // Helper function to get Google Cloud metadata -func (mounter *CSIProxyMounterV1) getGoogleCloudDisks() ([]GoogleCloudDisk, error) { +func (mounter *CSIProxyMounterV1) getGoogleCloudDisks() ([]googleCloudDisk, error) { disksResp, err := metadata.GetWithContext(context.Background(), "instance/disks/?recursive=true") if err != nil { return nil, fmt.Errorf("failed to get disks using metadata package: %v", err) } - var disks []GoogleCloudDisk + var disks []googleCloudDisk if err := json.Unmarshal([]byte(disksResp), &disks); err != nil { return nil, fmt.Errorf("failed to parse JSON response: %v", err) } diff --git a/pkg/mount-manager/safe-mounter-v1beta_windows.go b/pkg/mount-manager/safe-mounter-v1beta_windows.go index 5e1ec22c0..fe711305e 100644 --- a/pkg/mount-manager/safe-mounter-v1beta_windows.go +++ b/pkg/mount-manager/safe-mounter-v1beta_windows.go @@ -200,7 +200,7 @@ func (mounter *CSIProxyMounterV1Beta) Unmount(target string) error { func (mounter *CSIProxyMounterV1Beta) GetDiskNumber(deviceName string, partition string, volumeKey string) (string, error) { // First, get Google Cloud metadata to find the nvmeNamespaceIdentifier for this device - googleDisks, err := AttachedDisks() + googleDisks, err := attachedDisks() if err != nil { klog.V(4).Infof("Failed to get Google Cloud metadata, falling back to legacy method: %v", err) return mounter.getDiskNumberLegacy(deviceName) diff --git a/pkg/mount-manager/safe-mounter_windows.go b/pkg/mount-manager/safe-mounter_windows.go index c381bc58b..79467a3c5 100644 --- a/pkg/mount-manager/safe-mounter_windows.go +++ b/pkg/mount-manager/safe-mounter_windows.go @@ -87,7 +87,7 @@ func NewSafeMounter(int, time.Duration) (*mount.SafeFormatAndMount, error) { return nil, err } -type GoogleCloudDisk struct { +type googleCloudDisk struct { DeviceName string `json:"deviceName"` Index int `json:"index"` Interface string `json:"interface"` @@ -96,15 +96,15 @@ type GoogleCloudDisk struct { Type string `json:"type"` } -// AttachedDisks returns the list of disks attached to the instance from which +// attachedDisks returns the list of disks attached to the instance from which // the metadata server is called. -func AttachedDisks() ([]GoogleCloudDisk, error) { +func attachedDisks() ([]googleCloudDisk, error) { disksResp, err := metadata.GetWithContext(context.Background(), "instance/disks/?recursive=true") if err != nil { return nil, fmt.Errorf("failed to get disks using metadata package: %v", err) } - var disks []GoogleCloudDisk + var disks []googleCloudDisk if err := json.Unmarshal([]byte(disksResp), &disks); err != nil { return nil, fmt.Errorf("failed to parse JSON response: %v", err) }