@@ -43,6 +43,7 @@ import (
4343
4444 "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/apis"
4545 "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/apis/v1alpha1"
46+ kcache "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/cache"
4647 "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/operator/options"
4748 "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/providers/ack"
4849 "github.com/cloudpilot-ai/karpenter-provider-alibabacloud/pkg/providers/imagefamily"
@@ -66,28 +67,30 @@ type Provider interface {
6667}
6768
6869type DefaultProvider struct {
69- ecsClient * ecsclient.Client
70- region string
71- instanceCache * cache.Cache
70+ ecsClient * ecsclient.Client
71+ region string
72+ instanceCache * cache.Cache
73+ unavailableOfferings * kcache.UnavailableOfferings
7274
7375 imageFamilyResolver imagefamily.Resolver
7476 vSwitchProvider vswitch.Provider
7577 ackProvider ack.Provider
7678 createLimiter * rate.Limiter
7779}
7880
79- func NewDefaultProvider (ctx context.Context , region string , ecsClient * ecsclient.Client ,
81+ func NewDefaultProvider (ctx context.Context , region string , ecsClient * ecsclient.Client , unavailableOfferings * kcache. UnavailableOfferings ,
8082 imageFamilyResolver imagefamily.Resolver , vSwitchProvider vswitch.Provider ,
8183 ackProvider ack.Provider ,
8284) * DefaultProvider {
8385 p := & DefaultProvider {
84- ecsClient : ecsClient ,
85- region : region ,
86- instanceCache : cache .New (instanceCacheExpiration , instanceCacheExpiration ),
87- createLimiter : rate .NewLimiter (rate .Limit (1 ), options .FromContext (ctx ).APGCreationQPS ),
88- imageFamilyResolver : imageFamilyResolver ,
89- vSwitchProvider : vSwitchProvider ,
90- ackProvider : ackProvider ,
86+ ecsClient : ecsClient ,
87+ region : region ,
88+ instanceCache : cache .New (instanceCacheExpiration , instanceCacheExpiration ),
89+ unavailableOfferings : unavailableOfferings ,
90+ createLimiter : rate .NewLimiter (rate .Limit (1 ), options .FromContext (ctx ).APGCreationQPS ),
91+ imageFamilyResolver : imageFamilyResolver ,
92+ vSwitchProvider : vSwitchProvider ,
93+ ackProvider : ackProvider ,
9194 }
9295
9396 return p
@@ -381,9 +384,11 @@ func (p *DefaultProvider) launchInstance(ctx context.Context, nodeClass *v1alpha
381384 return nil , nil , fmt .Errorf ("getting provisioning group, %w" , err )
382385 }
383386
387+ var resp * ecsclient.CreateAutoProvisioningGroupResponse
384388 runtime := & util.RuntimeOptions {}
385389
386- resp , err := p .ecsClient .CreateAutoProvisioningGroupWithOptions (createAutoProvisioningGroupRequest , runtime )
390+ defer p .updateUnavailableOfferingsCache (ctx , resp , capacityType )
391+ resp , err = p .ecsClient .CreateAutoProvisioningGroupWithOptions (createAutoProvisioningGroupRequest , runtime )
387392 if err != nil {
388393 return nil , nil , fmt .Errorf ("creating auto provisioning group, %w" , err )
389394 }
@@ -395,6 +400,29 @@ func (p *DefaultProvider) launchInstance(ctx context.Context, nodeClass *v1alpha
395400 return resp .Body .LaunchResults .LaunchResult [0 ], createAutoProvisioningGroupRequest , nil
396401}
397402
403+ func (p * DefaultProvider ) updateUnavailableOfferingsCache (ctx context.Context , resp * ecsclient.CreateAutoProvisioningGroupResponse , capacityType string ) {
404+ if resp == nil || resp .Body == nil || resp .Body .LaunchResults == nil || len (resp .Body .LaunchResults .LaunchResult ) == 0 {
405+ return
406+ }
407+
408+ for lri := range resp .Body .LaunchResults .LaunchResult {
409+ if resp .Body .LaunchResults .LaunchResult [lri ] == nil {
410+ continue
411+ }
412+
413+ if (tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].ErrorCode ) == "NoInstanceStock" || tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].ErrorCode ) == "OperationDenied.NoStock" ) &&
414+ tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].InstanceType ) != "" &&
415+ tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].ZoneId ) != "" {
416+ p .unavailableOfferings .MarkUnavailable (
417+ ctx ,
418+ tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].ErrorMsg ),
419+ tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].InstanceType ),
420+ tea .StringValue (resp .Body .LaunchResults .LaunchResult [lri ].ZoneId ),
421+ capacityType )
422+ }
423+ }
424+ }
425+
398426func createAutoProvisioningGroupResponseHandler (resp * ecsclient.CreateAutoProvisioningGroupResponse ) error {
399427 if resp == nil || resp .Body == nil || resp .Body .LaunchResults == nil {
400428 return fmt .Errorf ("invalid response when creating auto provision group: %s" , tea .Prettify (resp ))
0 commit comments