@@ -27,6 +27,8 @@ import (
27
27
"sync"
28
28
"time"
29
29
30
+ "k8s.io/apimachinery/pkg/util/wait"
31
+
30
32
"github.com/container-storage-interface/spec/lib/go/csi"
31
33
"github.com/oracle/oci-go-sdk/v65/core"
32
34
"go.uber.org/zap"
@@ -104,15 +106,19 @@ type FSSVolumeHandler struct {
104
106
FsExportPath string
105
107
}
106
108
107
- type NodeIpFamily struct {
108
- PreferredNodeIpFamily string
109
- Ipv4Enabled bool
110
- Ipv6Enabled bool
109
+ type NodeMetadata struct {
110
+ PreferredNodeIpFamily string
111
+ Ipv4Enabled bool
112
+ Ipv6Enabled bool
113
+ AvailabilityDomain string
114
+ FullAvailabilityDomain string
115
+ IsNodeMetadataLoaded bool
111
116
}
112
117
113
118
// CSIConfig represents the structure of the ConfigMap data.
114
119
type CSIConfig struct {
115
120
Lustre * DriverConfig `yaml:"lustre"`
121
+ IsLoaded bool
116
122
}
117
123
118
124
// DriverConfig represents driver-specific configurations.
@@ -136,25 +142,75 @@ func (u *Util) LookupNodeID(k kubernetes.Interface, nodeName string) (string, er
136
142
return n .Spec .ProviderID , nil
137
143
}
138
144
139
- func (u * Util ) LookupNodeAvailableDomain (k kubernetes.Interface , nodeID string ) (string , string , error ) {
140
- n , err := k .CoreV1 ().Nodes ().Get (context .Background (), nodeID , metav1.GetOptions {})
145
+ func (u * Util ) WaitForKubeApiServerToBeReachableWithContext (ctx context.Context , k kubernetes.Interface , backOffCap time.Duration ) {
146
+
147
+ waitForKubeApiServerCtx , waitForKubeApiServerCtxCancel := context .WithTimeout (ctx , time .Second * 45 )
148
+ defer waitForKubeApiServerCtxCancel ()
149
+
150
+ backoff := wait.Backoff {
151
+ Duration : 1 * time .Second ,
152
+ Factor : 2.0 ,
153
+ Steps : 5 ,
154
+ Cap : backOffCap ,
155
+ }
156
+
157
+ wait .ExponentialBackoffWithContext (
158
+ waitForKubeApiServerCtx ,
159
+ backoff ,
160
+ func (waitForKubeApiServerCtx context.Context ) (bool , error ) {
161
+ attemptCtx , attemptCancel := context .WithTimeout (waitForKubeApiServerCtx , backoff .Step ())
162
+ defer attemptCancel ()
163
+ _ , err := k .CoreV1 ().RESTClient ().Get ().AbsPath ("/version" ).Do (attemptCtx ).Raw ()
164
+ if err != nil {
165
+ u .Logger .With (zap .Error (err )).Errorf ("Waiting for kube api server to be reachable, Retrying.." )
166
+ return false , nil
167
+ }
168
+ u .Logger .Infof ("Kube Api Server is Reachable" )
169
+ return true , nil
170
+ },
171
+ )
172
+ }
173
+
174
+ func (u * Util ) LoadNodeMetadataFromApiServer (ctx context.Context , k kubernetes.Interface , nodeID string , nodeMetadata * NodeMetadata ) (error ) {
175
+
176
+ u .WaitForKubeApiServerToBeReachableWithContext (ctx , k , time .Second * 30 )
177
+
178
+ node , err := k .CoreV1 ().Nodes ().Get (ctx , nodeID , metav1.GetOptions {})
179
+
141
180
if err != nil {
142
- u .Logger .With (zap .Error (err )).With ("nodeId" , nodeID ).Error ("Failed to get Node by name ." )
143
- return "" , "" , fmt .Errorf ("failed to get node %s" , nodeID )
181
+ u .Logger .With (zap .Error (err )).With ("nodeId" , nodeID ).Error ("Failed to get Node information from kube api server, Please check if kube api server is accessible ." )
182
+ return fmt .Errorf ("Failed to get node information from kube api server, please check if kube api server is accessible." )
144
183
}
145
- if n .Labels != nil {
146
- ad , ok := n .Labels [kubeAPI .LabelTopologyZone ]
184
+
185
+ var ok bool
186
+ if node .Labels != nil {
187
+ nodeMetadata .AvailabilityDomain , ok = node .Labels [kubeAPI .LabelTopologyZone ]
147
188
if ! ok {
148
- ad , ok = n .Labels [kubeAPI .LabelZoneFailureDomain ]
189
+ nodeMetadata . AvailabilityDomain , ok = node .Labels [kubeAPI .LabelZoneFailureDomain ]
149
190
}
150
191
if ok {
151
- fullAdName , _ := n .Labels [AvailabilityDomainLabel ]
152
- return ad , fullAdName , nil
192
+ nodeMetadata .FullAvailabilityDomain , _ = node .Labels [AvailabilityDomainLabel ]
193
+ }
194
+
195
+ if preferredIpFamily , ok := node .Labels [LabelIpFamilyPreferred ]; ok {
196
+ nodeMetadata .PreferredNodeIpFamily = FormatValidIpStackInK8SConvention (preferredIpFamily )
197
+ }
198
+ if ipv4Enabled , ok := node .Labels [LabelIpFamilyIpv4 ]; ok && strings .EqualFold (ipv4Enabled , "true" ) {
199
+ nodeMetadata .Ipv4Enabled = true
200
+ }
201
+ if ipv6Enabled , ok := node .Labels [LabelIpFamilyIpv6 ]; ok && strings .EqualFold (ipv6Enabled , "true" ) {
202
+ nodeMetadata .Ipv6Enabled = true
153
203
}
154
204
}
155
- errMsg := fmt .Sprintf ("Did not find the label for the fault domain. Checked Topology Labels: %s, %s" , kubeAPI .LabelTopologyZone , kubeAPI .LabelZoneFailureDomain )
156
- u .Logger .With ("nodeId" , nodeID ).Error (errMsg )
157
- return "" ,"" , fmt .Errorf (errMsg )
205
+ if ! nodeMetadata .Ipv4Enabled && ! nodeMetadata .Ipv6Enabled {
206
+ nodeMetadata .PreferredNodeIpFamily = Ipv4Stack
207
+ nodeMetadata .Ipv4Enabled = true
208
+ u .Logger .With ("nodeId" , nodeID , "nodeMetadata" , nodeMetadata ).Info ("No IP family labels identified on node, defaulting to ipv4." )
209
+ } else {
210
+ u .Logger .With ("nodeId" , nodeID , "nodeMetadata" , nodeMetadata ).Info ("Node IP family identified." )
211
+ }
212
+ nodeMetadata .IsNodeMetadataLoaded = true
213
+ return nil
158
214
}
159
215
160
216
// waitForPathToExist waits for for a given filesystem path to exist.
@@ -524,37 +580,6 @@ func GetIsFeatureEnabledFromEnv(logger *zap.SugaredLogger, featureName string, d
524
580
return enableFeature
525
581
}
526
582
527
- func GetNodeIpFamily (k kubernetes.Interface , nodeID string , logger * zap.SugaredLogger ) (* NodeIpFamily , error ) {
528
- n , err := k .CoreV1 ().Nodes ().Get (context .Background (), nodeID , metav1.GetOptions {})
529
-
530
- if err != nil {
531
- logger .With (zap .Error (err )).With ("nodeId" , nodeID ).Error ("Failed to get Node information from kube api server, Please check if kube api server is accessible." )
532
- return nil , fmt .Errorf ("Failed to get node information from kube api server, please check if kube api server is accessible." )
533
- }
534
-
535
- nodeIpFamily := & NodeIpFamily {}
536
-
537
- if n .Labels != nil {
538
- if preferredIpFamily , ok := n .Labels [LabelIpFamilyPreferred ]; ok {
539
- nodeIpFamily .PreferredNodeIpFamily = FormatValidIpStackInK8SConvention (preferredIpFamily )
540
- }
541
- if ipv4Enabled , ok := n .Labels [LabelIpFamilyIpv4 ]; ok && strings .EqualFold (ipv4Enabled , "true" ) {
542
- nodeIpFamily .Ipv4Enabled = true
543
- }
544
- if ipv6Enabled , ok := n .Labels [LabelIpFamilyIpv6 ]; ok && strings .EqualFold (ipv6Enabled , "true" ) {
545
- nodeIpFamily .Ipv6Enabled = true
546
- }
547
- }
548
- if ! nodeIpFamily .Ipv4Enabled && ! nodeIpFamily .Ipv6Enabled {
549
- nodeIpFamily .PreferredNodeIpFamily = Ipv4Stack
550
- nodeIpFamily .Ipv4Enabled = true
551
- logger .With ("nodeId" , nodeID , "nodeIpFamily" , * nodeIpFamily ).Info ("No IP family labels identified on node, defaulting to ipv4." )
552
- } else {
553
- logger .With ("nodeId" , nodeID , "nodeIpFamily" , * nodeIpFamily ).Info ("Node IP family identified." )
554
- }
555
-
556
- return nodeIpFamily , nil
557
- }
558
583
func ConvertIscsiIpFromIpv4ToIpv6 (ipv4IscsiIp string ) (string , error ) {
559
584
ipv4IscsiIP := net .ParseIP (ipv4IscsiIp ).To4 ()
560
585
if ipv4IscsiIP == nil {
@@ -609,30 +634,27 @@ func IsValidIpFamilyPresentInClusterIpFamily(clusterIpFamily string) bool {
609
634
return len (clusterIpFamily ) > 0 && (strings .Contains (clusterIpFamily , Ipv4Stack ) || strings .Contains (clusterIpFamily , Ipv6Stack ))
610
635
}
611
636
612
- func IsIpv6SingleStackNode (nodeIpFamily * NodeIpFamily ) bool {
613
- if nodeIpFamily == nil {
637
+ func IsIpv6SingleStackNode (nodeMetadata * NodeMetadata ) bool {
638
+ if nodeMetadata == nil {
614
639
return false
615
640
}
616
- return nodeIpFamily .Ipv6Enabled == true && nodeIpFamily .Ipv4Enabled == false
641
+ return nodeMetadata .Ipv6Enabled == true && nodeMetadata .Ipv4Enabled == false
617
642
}
618
643
619
- func LoadCSIConfigFromConfigMap (k kubernetes.Interface , configMapName string , logger * zap.SugaredLogger ) ( * CSIConfig ) {
644
+ func LoadCSIConfigFromConfigMap (csiConfig * CSIConfig , k kubernetes.Interface , configMapName string , logger * zap.SugaredLogger ) {
620
645
// Get the ConfigMap
621
646
// Parse the configuration for each driver
622
- config := & CSIConfig {}
623
647
cm , err := k .CoreV1 ().ConfigMaps ("kube-system" ).Get (context .Background (), configMapName , metav1.GetOptions {})
624
648
if err != nil {
625
649
logger .Debugf ("Failed to load ConfigMap %v due to error %v. Using default configuration." , configMapName , err )
626
- return config
650
+ return
627
651
}
628
652
629
653
if lustreConfig , exists := cm .Data ["lustre" ]; exists {
630
- if err := yaml .Unmarshal ([]byte (lustreConfig ), & config .Lustre ); err != nil {
654
+ if err := yaml .Unmarshal ([]byte (lustreConfig ), & csiConfig .Lustre ); err != nil {
631
655
logger .Debugf ("Failed to parse lustre key in config map %v. Error: %v" ,configMapName , err )
632
- return config
656
+ return
633
657
}
634
658
logger .Infof ("Successfully loaded ConfigMap %v. Using customized configuration for csi driver." , configMapName )
635
659
}
636
-
637
- return config
638
660
}
0 commit comments