Skip to content

Commit 4aeaf2e

Browse files
authored
[cinder-csi]: allow node service to run without openstack client (#2655)
1 parent 84a4732 commit 4aeaf2e

File tree

4 files changed

+206
-17
lines changed

4 files changed

+206
-17
lines changed

cmd/cinder-csi-plugin/main.go

+22-9
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ var (
4040
httpEndpoint string
4141
provideControllerService bool
4242
provideNodeService bool
43+
noClient bool
4344
)
4445

4546
func main() {
@@ -75,6 +76,7 @@ func main() {
7576

7677
cmd.PersistentFlags().BoolVar(&provideControllerService, "provide-controller-service", true, "If set to true then the CSI driver does provide the controller service (default: true)")
7778
cmd.PersistentFlags().BoolVar(&provideNodeService, "provide-node-service", true, "If set to true then the CSI driver does provide the node service (default: true)")
79+
cmd.PersistentFlags().BoolVar(&noClient, "node-service-no-os-client", false, "If set to true then the CSI driver node service will not use the OpenStack client (default: false)")
7880

7981
openstack.AddExtraFlags(pflag.CommandLine)
8082

@@ -87,21 +89,32 @@ func handle() {
8789
d := cinder.NewDriver(&cinder.DriverOpts{Endpoint: endpoint, ClusterID: cluster})
8890

8991
openstack.InitOpenStackProvider(cloudConfig, httpEndpoint)
90-
var err error
91-
clouds := make(map[string]openstack.IOpenStack)
92-
for _, cloudName := range cloudNames {
93-
clouds[cloudName], err = openstack.GetOpenStackProvider(cloudName)
94-
if err != nil {
95-
klog.Warningf("Failed to GetOpenStackProvider %s: %v", cloudName, err)
96-
return
97-
}
98-
}
9992

10093
if provideControllerService {
94+
var err error
95+
clouds := make(map[string]openstack.IOpenStack)
96+
for _, cloudName := range cloudNames {
97+
clouds[cloudName], err = openstack.GetOpenStackProvider(cloudName, false)
98+
if err != nil {
99+
klog.Warningf("Failed to GetOpenStackProvider %s: %v", cloudName, err)
100+
return
101+
}
102+
}
103+
101104
d.SetupControllerService(clouds)
102105
}
103106

104107
if provideNodeService {
108+
var err error
109+
clouds := make(map[string]openstack.IOpenStack)
110+
for _, cloudName := range cloudNames {
111+
clouds[cloudName], err = openstack.GetOpenStackProvider(cloudName, noClient)
112+
if err != nil {
113+
klog.Warningf("Failed to GetOpenStackProvider %s: %v", cloudName, err)
114+
return
115+
}
116+
}
117+
105118
//Initialize mount
106119
mount := mount.GetMountProvider()
107120

docs/cinder-csi-plugin/using-cinder-csi-plugin.md

+7
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ In addition to the standard set of klog flags, `cinder-csi-plugin` accepts the f
111111

112112
The default is to provide the node service.
113113
</dd>
114+
115+
<dt>--node-service-no-os-client &lt;disabled&gt;</dt>
116+
<dd>
117+
If set to true then the CSI driver does not provide the OpenStack client in the node service.
118+
119+
The default is to provide the OpenStack client in the node service.
120+
</dd>
114121
</dl>
115122

116123
## Driver Config
+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
Copyright 2024 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package openstack
18+
19+
import (
20+
"fmt"
21+
22+
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups"
23+
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/snapshots"
24+
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
25+
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
26+
"k8s.io/cloud-provider-openstack/pkg/util/metadata"
27+
)
28+
29+
type NoopOpenStack struct {
30+
bsOpts BlockStorageOpts
31+
metadataOpts metadata.Opts
32+
}
33+
34+
func (os *NoopOpenStack) CreateVolume(name string, size int, vtype, availability string, snapshotID string, sourceVolID string, sourceBackupID string, tags map[string]string) (*volumes.Volume, error) {
35+
return nil, fmt.Errorf("CreateVolume is not implemented for ephemeral storage in this configuration")
36+
}
37+
38+
func (os *NoopOpenStack) ListVolumes(limit int, startingToken string) ([]volumes.Volume, string, error) {
39+
return nil, "", nil
40+
}
41+
42+
func (os *NoopOpenStack) GetVolumesByName(n string) ([]volumes.Volume, error) {
43+
return nil, nil
44+
}
45+
46+
func (os *NoopOpenStack) DeleteVolume(volumeID string) error {
47+
return nil
48+
}
49+
50+
func (os *NoopOpenStack) GetVolume(volumeID string) (*volumes.Volume, error) {
51+
return &volumes.Volume{ID: volumeID}, nil
52+
}
53+
54+
func (os *NoopOpenStack) AttachVolume(instanceID, volumeID string) (string, error) {
55+
return volumeID, nil
56+
}
57+
58+
func (os *NoopOpenStack) WaitDiskAttached(instanceID string, volumeID string) error {
59+
return nil
60+
}
61+
62+
func (os *NoopOpenStack) WaitVolumeTargetStatus(volumeID string, tStatus []string) error {
63+
return nil
64+
}
65+
66+
func (os *NoopOpenStack) DetachVolume(instanceID, volumeID string) error {
67+
return nil
68+
}
69+
70+
func (os *NoopOpenStack) WaitDiskDetached(instanceID string, volumeID string) error {
71+
return nil
72+
}
73+
74+
func (os *NoopOpenStack) GetAttachmentDiskPath(instanceID, volumeID string) (string, error) {
75+
return "", nil
76+
}
77+
78+
func (os *NoopOpenStack) ExpandVolume(volumeID string, status string, newSize int) error {
79+
return nil
80+
}
81+
82+
func (os *NoopOpenStack) GetMaxVolLimit() int64 {
83+
if os.bsOpts.NodeVolumeAttachLimit > 0 && os.bsOpts.NodeVolumeAttachLimit <= 256 {
84+
return os.bsOpts.NodeVolumeAttachLimit
85+
}
86+
87+
return defaultMaxVolAttachLimit
88+
}
89+
90+
func (os *NoopOpenStack) GetBlockStorageOpts() BlockStorageOpts {
91+
return os.bsOpts
92+
}
93+
94+
func (os *NoopOpenStack) GetMetadataOpts() metadata.Opts {
95+
return os.metadataOpts
96+
}
97+
98+
func (os *NoopOpenStack) CreateBackup(name, volID, snapshotID, availabilityZone string, tags map[string]string) (*backups.Backup, error) {
99+
return &backups.Backup{}, nil
100+
}
101+
102+
func (os *NoopOpenStack) BackupsAreEnabled() (bool, error) {
103+
return false, nil
104+
}
105+
106+
func (os *NoopOpenStack) DeleteBackup(backupID string) error {
107+
return nil
108+
}
109+
110+
func (os *NoopOpenStack) CreateSnapshot(name, volID string, tags map[string]string) (*snapshots.Snapshot, error) {
111+
return &snapshots.Snapshot{}, nil
112+
}
113+
114+
func (os *NoopOpenStack) DeleteSnapshot(snapID string) error {
115+
return nil
116+
}
117+
118+
func (os *NoopOpenStack) GetSnapshotByID(snapshotID string) (*snapshots.Snapshot, error) {
119+
return &snapshots.Snapshot{ID: snapshotID}, nil
120+
}
121+
122+
func (os *NoopOpenStack) ListSnapshots(filters map[string]string) ([]snapshots.Snapshot, string, error) {
123+
return nil, "", nil
124+
}
125+
126+
func (os *NoopOpenStack) WaitSnapshotReady(snapshotID string) (string, error) {
127+
return "", nil
128+
}
129+
130+
func (os *NoopOpenStack) GetBackupByID(backupID string) (*backups.Backup, error) {
131+
return &backups.Backup{ID: backupID}, nil
132+
}
133+
134+
func (os *NoopOpenStack) ListBackups(filters map[string]string) ([]backups.Backup, error) {
135+
return nil, nil
136+
}
137+
138+
func (os *NoopOpenStack) WaitBackupReady(backupID string, snapshotSize int, backupMaxDurationSecondsPerGB int) (string, error) {
139+
return "", nil
140+
}
141+
142+
func (os *NoopOpenStack) GetInstanceByID(instanceID string) (*servers.Server, error) {
143+
return &servers.Server{ID: instanceID}, nil
144+
}

pkg/csi/cinder/openstack/openstack.go

+33-8
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,12 @@ func GetConfigFromFiles(configFilePaths []string) (Config, error) {
144144
const defaultMaxVolAttachLimit int64 = 256
145145

146146
var OsInstances map[string]IOpenStack
147+
var NoopInstances map[string]IOpenStack
147148
var configFiles = []string{"/etc/cloud.conf"}
148149

149150
func InitOpenStackProvider(cfgFiles []string, httpEndpoint string) {
150151
OsInstances = make(map[string]IOpenStack)
152+
NoopInstances = make(map[string]IOpenStack)
151153
metrics.RegisterMetrics("cinder-csi")
152154
if httpEndpoint != "" {
153155
mux := http.NewServeMux()
@@ -166,7 +168,7 @@ func InitOpenStackProvider(cfgFiles []string, httpEndpoint string) {
166168
}
167169

168170
// CreateOpenStackProvider creates Openstack Instance with custom Global config param
169-
func CreateOpenStackProvider(cloudName string) (IOpenStack, error) {
171+
func CreateOpenStackProvider(cloudName string, noClient bool) (IOpenStack, error) {
170172
// Get config from file
171173
cfg, err := GetConfigFromFiles(configFiles)
172174
if err != nil {
@@ -179,6 +181,21 @@ func CreateOpenStackProvider(cloudName string) (IOpenStack, error) {
179181
return nil, fmt.Errorf("GetConfigFromFiles cloud name \"%s\" not found in configuration files: %s", cloudName, configFiles)
180182
}
181183

184+
// if no search order given, use default
185+
if len(cfg.Metadata.SearchOrder) == 0 {
186+
cfg.Metadata.SearchOrder = fmt.Sprintf("%s,%s", metadata.ConfigDriveID, metadata.MetadataID)
187+
}
188+
189+
if noClient {
190+
// Init OpenStack
191+
NoopInstances[cloudName] = &NoopOpenStack{
192+
bsOpts: cfg.BlockStorage,
193+
metadataOpts: cfg.Metadata,
194+
}
195+
196+
return NoopInstances[cloudName], nil
197+
}
198+
182199
provider, err := client.NewOpenStackClient(cfg.Global[cloudName], "cinder-csi-plugin", userAgentData...)
183200
if err != nil {
184201
return nil, err
@@ -201,11 +218,6 @@ func CreateOpenStackProvider(cloudName string) (IOpenStack, error) {
201218
return nil, err
202219
}
203220

204-
// if no search order given, use default
205-
if len(cfg.Metadata.SearchOrder) == 0 {
206-
cfg.Metadata.SearchOrder = fmt.Sprintf("%s,%s", metadata.ConfigDriveID, metadata.MetadataID)
207-
}
208-
209221
// Init OpenStack
210222
OsInstances[cloudName] = &OpenStack{
211223
compute: computeclient,
@@ -219,12 +231,25 @@ func CreateOpenStackProvider(cloudName string) (IOpenStack, error) {
219231
}
220232

221233
// GetOpenStackProvider returns Openstack Instance
222-
func GetOpenStackProvider(cloudName string) (IOpenStack, error) {
234+
func GetOpenStackProvider(cloudName string, noClient bool) (IOpenStack, error) {
235+
if noClient {
236+
NoopInstance, NoopInstanceDefined := NoopInstances[cloudName]
237+
if NoopInstanceDefined {
238+
return NoopInstance, nil
239+
}
240+
NoopInstance, err := CreateOpenStackProvider(cloudName, noClient)
241+
if err != nil {
242+
return nil, err
243+
}
244+
245+
return NoopInstance, nil
246+
}
247+
223248
OsInstance, OsInstanceDefined := OsInstances[cloudName]
224249
if OsInstanceDefined {
225250
return OsInstance, nil
226251
}
227-
OsInstance, err := CreateOpenStackProvider(cloudName)
252+
OsInstance, err := CreateOpenStackProvider(cloudName, noClient)
228253
if err != nil {
229254
return nil, err
230255
}

0 commit comments

Comments
 (0)