@@ -24,6 +24,7 @@ import (
24
24
"k8s.io/apimachinery/pkg/api/resource"
25
25
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
26
26
"k8s.io/autoscaler/cluster-autoscaler/config"
27
+ "k8s.io/autoscaler/cluster-autoscaler/config/dynamic"
27
28
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
28
29
klog "k8s.io/klog/v2"
29
30
)
@@ -54,6 +55,11 @@ type huaweicloudCloudProvider struct {
54
55
}
55
56
56
57
func newCloudProvider (opts config.AutoscalingOptions , do cloudprovider.NodeGroupDiscoveryOptions , rl * cloudprovider.ResourceLimiter ) * huaweicloudCloudProvider {
58
+ if do .AutoDiscoverySpecified () {
59
+ klog .Errorf ("only support static discovery scaling group in huaweicloud for now" )
60
+ return nil
61
+ }
62
+
57
63
cloudConfig , err := readConf (opts .CloudConfig )
58
64
if err != nil {
59
65
klog .Errorf ("failed to read cloud configuration. error: %v" , err )
@@ -65,17 +71,24 @@ func newCloudProvider(opts config.AutoscalingOptions, do cloudprovider.NodeGroup
65
71
}
66
72
67
73
csm := newCloudServiceManager (cloudConfig )
68
- sgs , err := csm .ListScalingGroups ()
69
- if err != nil {
70
- klog .Errorf ("failed to list scaling groups. error: %v" , err )
71
- return nil
72
- }
73
74
74
- return & huaweicloudCloudProvider {
75
+ hcp := & huaweicloudCloudProvider {
75
76
cloudServiceManager : csm ,
76
77
resourceLimiter : rl ,
77
- autoScalingGroup : sgs ,
78
+ autoScalingGroup : make ([]AutoScalingGroup , 0 ),
79
+ }
80
+
81
+ if len (do .NodeGroupSpecs ) <= 0 {
82
+ klog .Error ("no auto scaling group specified" )
83
+ return nil
84
+ }
85
+ err = hcp .buildAsgs (do .NodeGroupSpecs )
86
+ if err != nil {
87
+ klog .Errorf ("failed to build auto scaling groups. error: %v" , err )
88
+ return nil
78
89
}
90
+
91
+ return hcp
79
92
}
80
93
81
94
// Name returns the name of the cloud provider.
@@ -111,25 +124,7 @@ func (hcp *huaweicloudCloudProvider) NodeGroupForNode(node *apiv1.Node) (cloudpr
111
124
return nil , fmt .Errorf ("provider id missing from node: %s" , node .Name )
112
125
}
113
126
114
- hcp .lock .RLock ()
115
- defer hcp .lock .RUnlock ()
116
-
117
- for i := range hcp .autoScalingGroup {
118
- instances , err := hcp .autoScalingGroup [i ].Nodes ()
119
- if err != nil {
120
- klog .Warningf ("failed to list instances from scaling group: %s, error: %v" , hcp .autoScalingGroup [i ].groupName , err )
121
- return nil , err
122
- }
123
-
124
- for j := range instances {
125
- if instanceID == instances [j ].Id {
126
- pinnedGroup := hcp .autoScalingGroup [i ]
127
- return & pinnedGroup , nil
128
- }
129
- }
130
- }
131
-
132
- return nil , fmt .Errorf ("no node group found" )
127
+ return hcp .cloudServiceManager .GetAsgForInstance (instanceID )
133
128
}
134
129
135
130
// Pricing returns pricing model for this cloud provider or error if not available. Not implemented.
@@ -176,6 +171,38 @@ func (hcp *huaweicloudCloudProvider) Refresh() error {
176
171
return nil
177
172
}
178
173
174
+ func (hcp * huaweicloudCloudProvider ) buildAsgs (specs []string ) error {
175
+ asgs , err := hcp .cloudServiceManager .ListScalingGroups ()
176
+ if err != nil {
177
+ klog .Errorf ("failed to list scaling groups, because of %s" , err .Error ())
178
+ return err
179
+ }
180
+
181
+ for _ , spec := range specs {
182
+ if err := hcp .addNodeGroup (spec , asgs ); err != nil {
183
+ klog .Warningf ("failed to add node group to huaweicloud provider with spec: %s" , spec )
184
+ return err
185
+ }
186
+ }
187
+
188
+ return nil
189
+ }
190
+
191
+ func (hcp * huaweicloudCloudProvider ) addNodeGroup (spec string , asgs []AutoScalingGroup ) error {
192
+ asg , err := buildAsgFromSpec (spec , asgs , hcp .cloudServiceManager )
193
+ if err != nil {
194
+ klog .Errorf ("failed to build ASG from spec, because of %s" , err .Error ())
195
+ return err
196
+ }
197
+ hcp .addAsg (asg )
198
+ return nil
199
+ }
200
+
201
+ func (hcp * huaweicloudCloudProvider ) addAsg (asg * AutoScalingGroup ) {
202
+ hcp .autoScalingGroup = append (hcp .autoScalingGroup , * asg )
203
+ hcp .cloudServiceManager .RegisterAsg (asg )
204
+ }
205
+
179
206
// BuildHuaweiCloud is called by the autoscaler/cluster-autoscaler/builder to build a huaweicloud cloud provider.
180
207
func BuildHuaweiCloud (opts config.AutoscalingOptions , do cloudprovider.NodeGroupDiscoveryOptions , rl * cloudprovider.ResourceLimiter ) cloudprovider.CloudProvider {
181
208
if len (opts .CloudConfig ) == 0 {
@@ -184,3 +211,23 @@ func BuildHuaweiCloud(opts config.AutoscalingOptions, do cloudprovider.NodeGroup
184
211
185
212
return newCloudProvider (opts , do , rl )
186
213
}
214
+
215
+ func buildAsgFromSpec (specStr string , asgs []AutoScalingGroup , manager CloudServiceManager ) (* AutoScalingGroup , error ) {
216
+ spec , err := dynamic .SpecFromString (specStr , true )
217
+ if err != nil {
218
+ return nil , fmt .Errorf ("failed to parse node group spec: %v" , err )
219
+ }
220
+
221
+ for _ , asg := range asgs {
222
+ if asg .groupName == spec .Name {
223
+ return & AutoScalingGroup {
224
+ cloudServiceManager : manager ,
225
+ groupName : asg .groupName ,
226
+ groupID : asg .groupID ,
227
+ minInstanceNumber : asg .minInstanceNumber ,
228
+ maxInstanceNumber : asg .maxInstanceNumber ,
229
+ }, nil
230
+ }
231
+ }
232
+ return nil , fmt .Errorf ("no auto scaling group found, spec: %s" , spec .Name )
233
+ }
0 commit comments