Skip to content

Commit 302573f

Browse files
committed
feat(instance): update unavailableOfferings when adding a launchInstance with no available resources
Signed-off-by: helen frank <helenfrank@protonmail.com>
1 parent d5310c7 commit 302573f

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

pkg/operator/operator.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,22 +97,23 @@ func NewOperator(ctx context.Context, operator *operator.Operator) (context.Cont
9797
imageResolver := imagefamily.NewDefaultResolver(region, ecsClient, cache.New(alicache.InstanceTypeAvailableDiskTTL, alicache.DefaultCleanupInterval))
9898
ackProvider := ack.NewDefaultProvider(clusterID, ackClient, cache.New(alicache.ClusterAttachScriptTTL, alicache.DefaultCleanupInterval))
9999

100+
unavailableOfferingsCache := alicache.NewUnavailableOfferings()
101+
instanceTypeProvider := instancetype.NewDefaultProvider(
102+
*ecsClient.RegionId, operator.GetClient(), ecsClient,
103+
cache.New(alicache.InstanceTypesAndZonesTTL, alicache.DefaultCleanupInterval),
104+
unavailableOfferingsCache,
105+
pricingProvider, ackProvider)
106+
100107
instanceProvider := instance.NewDefaultProvider(
101108
ctx,
102109
region,
103110
ecsClient,
111+
unavailableOfferingsCache,
104112
imageResolver,
105113
vSwitchProvider,
106114
ackProvider,
107115
)
108116

109-
unavailableOfferingsCache := alicache.NewUnavailableOfferings()
110-
instanceTypeProvider := instancetype.NewDefaultProvider(
111-
*ecsClient.RegionId, operator.GetClient(), ecsClient,
112-
cache.New(alicache.InstanceTypesAndZonesTTL, alicache.DefaultCleanupInterval),
113-
unavailableOfferingsCache,
114-
pricingProvider, ackProvider)
115-
116117
return ctx, &Operator{
117118
Operator: operator,
118119

pkg/providers/instance/instance.go

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6869
type 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+
398426
func 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

Comments
 (0)