Skip to content

Commit adcfad6

Browse files
authored
Merge pull request #308 from ZeroMagic/decouple
feat: remove dependency of azure.json in node server
2 parents 45e7787 + 1c6bb49 commit adcfad6

File tree

6 files changed

+65
-39
lines changed

6 files changed

+65
-39
lines changed

pkg/blob/azure.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,24 @@ func IsAzureStackCloud(cloud *azureprovider.Cloud) bool {
4646
return strings.EqualFold(cloud.Config.Cloud, "AZURESTACKCLOUD")
4747
}
4848

49-
// GetCloudProvider get Azure Cloud Provider
50-
func GetCloudProvider(kubeconfig string) (*azureprovider.Cloud, error) {
49+
// getCloudProvider get Azure Cloud Provider
50+
func getCloudProvider(kubeconfig, nodeID string) (*azureprovider.Cloud, error) {
51+
isController := (nodeID == "")
52+
5153
kubeClient, err := getKubeClient(kubeconfig)
5254
if err != nil && !os.IsNotExist(err) && err != rest.ErrNotInCluster {
5355
return nil, fmt.Errorf("failed to get KubeClient: %v", err)
5456
}
5557

5658
az := &azureprovider.Cloud{}
59+
5760
if kubeClient != nil {
5861
klog.V(2).Infof("reading cloud config from secret")
5962
az.KubeClient = kubeClient
6063
az.InitializeCloudFromSecret()
6164
}
6265

63-
if az.TenantID == "" || az.SubscriptionID == "" {
66+
if az.TenantID == "" || az.SubscriptionID == "" || az.ResourceGroup == "" {
6467
klog.V(2).Infof("could not read cloud config from secret")
6568
credFile, ok := os.LookupEnv(DefaultAzureCredentialFileEnv)
6669
if ok {
@@ -70,22 +73,39 @@ func GetCloudProvider(kubeconfig string) (*azureprovider.Cloud, error) {
7073
klog.V(2).Infof("use default %s env var: %v", DefaultAzureCredentialFileEnv, credFile)
7174
}
7275

73-
f, err := os.Open(credFile)
76+
var f *os.File
77+
f, err = os.Open(credFile)
78+
if f != nil {
79+
defer f.Close()
80+
}
7481
if err != nil {
7582
klog.Errorf("Failed to load config from file: %s", credFile)
76-
return nil, fmt.Errorf("Failed to load config from file: %s, cloud not get azure cloud provider", credFile)
77-
}
78-
defer f.Close()
79-
80-
klog.V(2).Infof("read cloud config from file: %s successfully", credFile)
81-
if az, err = azureprovider.NewCloudWithoutFeatureGates(f); err != nil {
82-
return az, err
83+
err = fmt.Errorf("Failed to load config from file: %s, cloud not get azure cloud provider", credFile)
84+
} else {
85+
klog.V(2).Infof("read cloud config from file: %s successfully", credFile)
86+
az, err = azureprovider.NewCloudWithoutFeatureGates(f)
8387
}
8488
}
8589

8690
if kubeClient != nil {
8791
az.KubeClient = kubeClient
8892
}
93+
if isController {
94+
if err != nil {
95+
return az, err
96+
}
97+
// Disable UseInstanceMetadata for controller to mitigate a timeout issue using IMDS
98+
// https://github.com/kubernetes-sigs/azuredisk-csi-driver/issues/168
99+
klog.Infoln("disable UseInstanceMetadata for controller")
100+
az.Config.UseInstanceMetadata = false
101+
klog.Infoln("Starting the controller server...")
102+
} else {
103+
if err != nil {
104+
klog.V(2).Infof("there is no azure.json provided for node server, error: %v", err)
105+
}
106+
klog.V(2).Infof("Starting the node server, nodeID is(%s)", nodeID)
107+
}
108+
89109
return az, nil
90110
}
91111

pkg/blob/azure_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ import (
3030
azure2 "sigs.k8s.io/cloud-provider-azure/pkg/provider"
3131
)
3232

33-
// TestGetCloudProvider tests the func GetCloudProvider().
33+
// TestGetCloudProvider tests the func getCloudProvider().
3434
// To run this unit test successfully, need to ensure /etc/kubernetes/azure.json nonexistent.
3535
func TestGetCloudProvider(t *testing.T) {
36+
3637
fakeCredFile := "fake-cred-file.json"
3738
fakeKubeConfig := "fake-kube-config"
3839
emptyKubeConfig := "empty-kube-config"
@@ -74,31 +75,37 @@ users:
7475
tests := []struct {
7576
desc string
7677
kubeconfig string
78+
nodeID string
7779
expectedErr error
7880
}{
7981
{
8082
desc: "[failure] out of cluster, no kubeconfig, no credential file",
8183
kubeconfig: "",
84+
nodeID: "",
8285
expectedErr: fmt.Errorf("Failed to load config from file: %s, cloud not get azure cloud provider", DefaultCredFilePath),
8386
},
8487
{
8588
desc: "[failure] out of cluster & in cluster, specify a non-exist kubeconfig, no credential file",
8689
kubeconfig: "/tmp/non-exist.json",
90+
nodeID: "",
8791
expectedErr: fmt.Errorf("Failed to load config from file: %s, cloud not get azure cloud provider", DefaultCredFilePath),
8892
},
8993
{
9094
desc: "[failure] out of cluster & in cluster, specify a empty kubeconfig, no credential file",
9195
kubeconfig: emptyKubeConfig,
96+
nodeID: "",
9297
expectedErr: fmt.Errorf("failed to get KubeClient: invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable"),
9398
},
9499
{
95100
desc: "[failure] out of cluster & in cluster, specify a fake kubeconfig, no credential file",
96101
kubeconfig: fakeKubeConfig,
102+
nodeID: "",
97103
expectedErr: fmt.Errorf("Failed to load config from file: %s, cloud not get azure cloud provider", DefaultCredFilePath),
98104
},
99105
{
100106
desc: "[success] out of cluster & in cluster, no kubeconfig, a fake credential file",
101107
kubeconfig: "",
108+
nodeID: "",
102109
expectedErr: nil,
103110
},
104111
}
@@ -138,7 +145,7 @@ users:
138145
}
139146
os.Setenv(DefaultAzureCredentialFileEnv, fakeCredFile)
140147
}
141-
_, err := GetCloudProvider(test.kubeconfig)
148+
_, err := getCloudProvider(test.kubeconfig, test.nodeID)
142149
if !reflect.DeepEqual(err, test.expectedErr) {
143150
t.Errorf("desc: %s,\n input: %q, GetCloudProvider err: %v, expectedErr: %v", test.desc, test.kubeconfig, err, test.expectedErr)
144151
}
@@ -226,6 +233,7 @@ func TestGetKeyVaultSecretContent(t *testing.T) {
226233
t.Errorf("actualErr: (%v), expectedErr: (%v)", err, expectedErr)
227234
}
228235
}
236+
229237
func createTestFile(path string) error {
230238
f, err := os.Create(path)
231239
if err != nil {

pkg/blob/blob.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const (
4747
volumeIDTemplate = "%s#%s#%s"
4848
secretNameTemplate = "azure-storage-account-%s-secret"
4949
serverNameField = "server"
50+
storageEndpointSuffixField = "storageendpointsuffix"
5051
tagsField = "tags"
5152
protocolField = "protocol"
5253
accountNameField = "accountname"
@@ -120,18 +121,10 @@ func (d *Driver) Run(endpoint, kubeconfig string, testBool bool) {
120121
}
121122
klog.Infof("\nDRIVER INFORMATION:\n-------------------\n%s\n\nStreaming logs below:", versionMeta)
122123

123-
cloud, err := GetCloudProvider(kubeconfig)
124-
if err != nil || cloud.TenantID == "" || cloud.SubscriptionID == "" {
124+
d.cloud, err = getCloudProvider(kubeconfig, d.NodeID)
125+
if err != nil {
125126
klog.Fatalf("failed to get Azure Cloud Provider, error: %v", err)
126127
}
127-
d.cloud = cloud
128-
129-
if d.NodeID == "" {
130-
// Disable UseInstanceMetadata for controller to mitigate a timeout issue using IMDS
131-
// https://github.com/kubernetes-sigs/azuredisk-csi-driver/issues/168
132-
klog.Infoln("disable UseInstanceMetadata for controller")
133-
d.cloud.Config.UseInstanceMetadata = false
134-
}
135128

136129
d.mounter = &mount.SafeFormatAndMount{
137130
Interface: mount.New(""),

pkg/blob/nodeserver.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe
150150
attrib := req.GetVolumeContext()
151151
secrets := req.GetSecrets()
152152

153-
var blobStorageEndPoint, protocol string
153+
var serverAddress, storageEndpointSuffix, protocol string
154154
for k, v := range attrib {
155155
switch strings.ToLower(k) {
156156
case serverNameField:
157-
blobStorageEndPoint = v
157+
serverAddress = v
158158
case protocolField:
159159
protocol = v
160+
case storageEndpointSuffixField:
161+
storageEndpointSuffix = v
160162
}
161163
}
162164

@@ -165,16 +167,20 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe
165167
return nil, err
166168
}
167169

168-
if strings.TrimSpace(blobStorageEndPoint) == "" {
170+
if strings.TrimSpace(storageEndpointSuffix) == "" {
171+
storageEndpointSuffix = "core.windows.net"
172+
}
173+
174+
if strings.TrimSpace(serverAddress) == "" {
169175
// server address is "accountname.blob.core.windows.net" by default
170-
blobStorageEndPoint = fmt.Sprintf("%s.blob.%s", accountName, d.cloud.Environment.StorageEndpointSuffix)
176+
serverAddress = fmt.Sprintf("%s.blob.%s", accountName, storageEndpointSuffix)
171177
}
172178

173179
if protocol == nfs {
174-
klog.V(2).Infof("target %v\nprotocol %v\n\nvolumeId %v\ncontext %v\nmountflags %v\nblobStorageEndPoint %v",
175-
targetPath, protocol, volumeID, attrib, mountFlags, blobStorageEndPoint)
180+
klog.V(2).Infof("target %v\nprotocol %v\n\nvolumeId %v\ncontext %v\nmountflags %v\nserverAddress %v",
181+
targetPath, protocol, volumeID, attrib, mountFlags, serverAddress)
176182

177-
source := fmt.Sprintf("%s:/%s/%s", blobStorageEndPoint, accountName, containerName)
183+
source := fmt.Sprintf("%s:/%s/%s", serverAddress, accountName, containerName)
178184
mountOptions := util.JoinMountOptions(mountFlags, []string{"sec=sys,vers=3,nolock"})
179185
if err := wait.PollImmediate(1*time.Second, 2*time.Minute, func() (bool, error) {
180186
return true, d.mounter.MountSensitive(source, targetPath, nfs, mountOptions, []string{})
@@ -201,12 +207,12 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe
201207
args = args + " " + opt
202208
}
203209

204-
klog.V(2).Infof("target %v\nprotocol %v\n\nvolumeId %v\ncontext %v\nmountflags %v\nmountOptions %v\nargs %v\nblobStorageEndPoint %v",
205-
targetPath, protocol, volumeID, attrib, mountFlags, mountOptions, args, blobStorageEndPoint)
210+
klog.V(2).Infof("target %v\nprotocol %v\n\nvolumeId %v\ncontext %v\nmountflags %v\nmountOptions %v\nargs %v\nserverAddress %v",
211+
targetPath, protocol, volumeID, attrib, mountFlags, mountOptions, args, serverAddress)
206212
cmd := exec.Command("blobfuse", strings.Split(args, " ")...)
207213

208214
cmd.Env = append(os.Environ(), "AZURE_STORAGE_ACCOUNT="+accountName)
209-
cmd.Env = append(cmd.Env, "AZURE_STORAGE_BLOB_ENDPOINT="+blobStorageEndPoint)
215+
cmd.Env = append(cmd.Env, "AZURE_STORAGE_BLOB_ENDPOINT="+serverAddress)
210216
cmd.Env = append(cmd.Env, authEnv...)
211217

212218
output, err := cmd.CombinedOutput()

pkg/blobplugin/main.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ func main() {
5454
fmt.Println(info)
5555
os.Exit(0)
5656
}
57-
if *nodeID == "" {
58-
klog.Warning("nodeid is empty")
59-
}
6057

6158
exportMetrics()
6259
handle()

test/sanity/run-test.sh

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ function cleanup {
2525

2626
trap cleanup EXIT
2727

28-
readonly endpoint="unix:///tmp/csi.sock"
28+
readonly controllerendpoint="unix:///tmp/csi-controller.sock"
29+
readonly nodeendpoint="unix:///tmp/csi-node.sock"
2930
nodeid="CSINode"
3031
if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then
3132
nodeid="$1"
3233
fi
3334

34-
_output/blobplugin --endpoint "$endpoint" --nodeid "$nodeid" -v=5 &
35+
_output/blobplugin --endpoint "$controllerendpoint" -v=5 &
36+
_output/blobplugin --endpoint "$nodeendpoint" --nodeid "$nodeid" -v=5 &
3537

3638
echo "Begin to run sanity test..."
3739
readonly CSI_SANITY_BIN='csi-sanity'
38-
"$CSI_SANITY_BIN" --ginkgo.v --csi.endpoint=$endpoint -ginkgo.skip="should fail when requesting to create a volume with already existing name and different capacity|should be idempotent"
40+
"$CSI_SANITY_BIN" --ginkgo.v --csi.endpoint=$nodeendpoint --csi.controllerendpoint=$controllerendpoint -ginkgo.skip="should fail when requesting to create a volume with already existing name and different capacity|should be idempotent"

0 commit comments

Comments
 (0)