Skip to content

Commit fe94239

Browse files
author
helen
authored
Merge pull request #54 from jwcesign/main
fix: fix some bugs of node creation
2 parents ff5a414 + 321f701 commit fe94239

File tree

6 files changed

+83
-3
lines changed

6 files changed

+83
-3
lines changed

cmd/controller/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func main() {
6262
op.VSwitchProvider,
6363
op.SecurityGroupProvider,
6464
op.LaunchTemplateProvider,
65+
op.ImageProvider,
6566
)...).
6667
Start(ctx, cloudProvider)
6768
}

pkg/apis/v1alpha1/ecsnodeclass_status.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const (
2525
ConditionTypeVSwitchesReady = "VSwitchesReady"
2626
ConditionTypeSecurityGroupsReady = "SecurityGroupsReady"
2727
ConditionTypeInstanceRAMReady = "InstanceRAMReady"
28+
ConditionTypeImagesReady = "ImagesReady"
2829
)
2930

3031
// VSwitch contains resolved VSwitch selector values utilized for node launch
@@ -84,6 +85,7 @@ func (in *ECSNodeClass) StatusConditions() status.ConditionSet {
8485
ConditionTypeVSwitchesReady,
8586
ConditionTypeSecurityGroupsReady,
8687
ConditionTypeInstanceRAMReady,
88+
ConditionTypeImagesReady,
8789
).For(in)
8890
}
8991

pkg/controllers/controllers.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
nodeclasstermination "github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/controllers/nodeclass/termination"
3434
providersinstancetype "github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/controllers/providers/instancetype"
3535
controllerspricing "github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/controllers/providers/pricing"
36+
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/imagefamily"
3637
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/instance"
3738
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/instancetype"
3839
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/launchtemplate"
@@ -47,11 +48,11 @@ func NewControllers(ctx context.Context, mgr manager.Manager, clk clock.Clock,
4748
instanceProvider instance.Provider, instanceTypeProvider instancetype.Provider,
4849
pricingProvider pricing.Provider,
4950
vSwitchProvider vswitch.Provider, securitygroupProvider securitygroup.Provider,
50-
launchTemplateProvider launchtemplate.Provider) []controller.Controller {
51+
launchTemplateProvider launchtemplate.Provider, imageProvider imagefamily.Provider) []controller.Controller {
5152

5253
controllers := []controller.Controller{
5354
nodeclasshash.NewController(kubeClient),
54-
nodeclaasstatus.NewController(kubeClient, vSwitchProvider, securitygroupProvider),
55+
nodeclaasstatus.NewController(kubeClient, vSwitchProvider, securitygroupProvider, imageProvider),
5556
nodeclasstermination.NewController(kubeClient, recorder, launchTemplateProvider),
5657
controllerspricing.NewController(pricingProvider),
5758
nodeclaimgarbagecollection.NewController(kubeClient, cloudProvider),

pkg/controllers/nodeclass/status/controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"sigs.k8s.io/karpenter/pkg/utils/result"
3434

3535
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/apis/v1alpha1"
36+
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/imagefamily"
3637
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/securitygroup"
3738
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/vswitch"
3839
)
@@ -46,14 +47,17 @@ type Controller struct {
4647

4748
vSwitch *VSwitch
4849
securitygroup *SecurityGroup
50+
image *Image
4951
}
5052

51-
func NewController(kubeClient client.Client, vSwitchProvider vswitch.Provider, securitygroupProvider securitygroup.Provider) *Controller {
53+
func NewController(kubeClient client.Client, vSwitchProvider vswitch.Provider,
54+
securitygroupProvider securitygroup.Provider, imageProvider imagefamily.Provider) *Controller {
5255
return &Controller{
5356
kubeClient: kubeClient,
5457

5558
vSwitch: &VSwitch{vSwitchProvider: vSwitchProvider},
5659
securitygroup: &SecurityGroup{securityGroupProvider: securitygroupProvider},
60+
image: &Image{imageProvider: imageProvider},
5761
}
5862
}
5963

@@ -84,6 +88,7 @@ func (c *Controller) Reconcile(ctx context.Context, nodeClass *v1alpha1.ECSNodeC
8488
for _, reconciler := range []nodeClassStatusReconciler{
8589
c.vSwitch,
8690
c.securitygroup,
91+
c.image,
8792
} {
8893
res, err := reconciler.Reconcile(ctx, nodeClass)
8994
errs = multierr.Append(errs, err)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
Copyright 2024 The CloudPilot AI 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 status
18+
19+
import (
20+
"context"
21+
"sort"
22+
"time"
23+
24+
"github.com/samber/lo"
25+
corev1 "k8s.io/api/core/v1"
26+
"sigs.k8s.io/controller-runtime/pkg/log"
27+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
28+
karpv1 "sigs.k8s.io/karpenter/pkg/apis/v1"
29+
30+
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/apis/v1alpha1"
31+
"github.com/cloudpilot-ai/karpenter-provider-alicloud/pkg/providers/imagefamily"
32+
)
33+
34+
type Image struct {
35+
imageProvider imagefamily.Provider
36+
}
37+
38+
func (i *Image) Reconcile(ctx context.Context, nodeClass *v1alpha1.ECSNodeClass) (reconcile.Result, error) {
39+
images, err := i.imageProvider.List(ctx, nodeClass)
40+
if err != nil {
41+
log.FromContext(ctx).Error(err, "failed to list images")
42+
return reconcile.Result{}, err
43+
}
44+
45+
if len(images) == 0 {
46+
nodeClass.Status.Images = nil
47+
nodeClass.StatusConditions().SetFalse(v1alpha1.ConditionTypeImagesReady, "ImagesNotFound", "ImageSelector did not match any Images")
48+
return reconcile.Result{}, nil
49+
}
50+
51+
nodeClass.Status.Images = lo.Map(images, func(image imagefamily.Image, _ int) v1alpha1.Image {
52+
reqs := lo.Map(image.Requirements.NodeSelectorRequirements(), func(item karpv1.NodeSelectorRequirementWithMinValues, _ int) corev1.NodeSelectorRequirement {
53+
return item.NodeSelectorRequirement
54+
})
55+
56+
sort.Slice(reqs, func(i, j int) bool {
57+
if len(reqs[i].Key) != len(reqs[j].Key) {
58+
return len(reqs[i].Key) < len(reqs[j].Key)
59+
}
60+
return reqs[i].Key < reqs[j].Key
61+
})
62+
return v1alpha1.Image{
63+
Name: image.Name,
64+
ID: image.ImageID,
65+
Requirements: reqs,
66+
}
67+
})
68+
nodeClass.StatusConditions().SetTrue(v1alpha1.ConditionTypeImagesReady)
69+
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil
70+
}

pkg/providers/instance/instance.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ func (p *DefaultProvider) List(ctx context.Context) ([]*Instance, error) {
135135
Value: tea.String(options.FromContext(ctx).ClusterName),
136136
},
137137
},
138+
RegionId: p.ecsClient.RegionId,
138139
}
139140

140141
runtime := &util.RuntimeOptions{}

0 commit comments

Comments
 (0)