@@ -20,13 +20,11 @@ import (
20
20
"context"
21
21
"encoding/json"
22
22
"fmt"
23
- "sort"
24
23
"strings"
25
24
"time"
26
25
27
26
"github.com/samber/lo"
28
27
v1 "k8s.io/api/core/v1"
29
- "k8s.io/apimachinery/pkg/runtime/schema"
30
28
"knative.dev/pkg/apis"
31
29
32
30
"sigs.k8s.io/karpenter/pkg/apis/v1beta1"
@@ -40,17 +38,23 @@ func (in *NodePool) ConvertTo(ctx context.Context, to apis.Convertible) error {
40
38
41
39
// Convert v1 status
42
40
v1beta1NP .Status .Resources = in .Status .Resources
43
- return in .Spec .convertTo (ctx , & v1beta1NP .Spec , in .Annotations [KubeletCompatibilityAnnotationKey ])
41
+ if err := in .Spec .convertTo (& v1beta1NP .Spec , in .Annotations [KubeletCompatibilityAnnotationKey ], in .Annotations [NodeClassReferenceAnnotationKey ]); err != nil {
42
+ return err
43
+ }
44
+ // Remove the annotations from the v1beta1 NodeClaim on the convert back
45
+ delete (v1beta1NP .Annotations , KubeletCompatibilityAnnotationKey )
46
+ delete (v1beta1NP .Annotations , NodeClassReferenceAnnotationKey )
47
+ return nil
44
48
}
45
49
46
- func (in * NodePoolSpec ) convertTo (ctx context. Context , v1beta1np * v1beta1.NodePoolSpec , kubeletAnnotation string ) error {
50
+ func (in * NodePoolSpec ) convertTo (v1beta1np * v1beta1.NodePoolSpec , kubeletAnnotation , nodeClassReferenceAnnotation string ) error {
47
51
v1beta1np .Weight = in .Weight
48
52
v1beta1np .Limits = v1beta1 .Limits (in .Limits )
49
53
in .Disruption .convertTo (& v1beta1np .Disruption )
50
54
// Set the expireAfter to the nodeclaim template's expireAfter.
51
55
// Don't convert terminationGracePeriod, as this is only included in v1.
52
56
v1beta1np .Disruption .ExpireAfter = v1beta1 .NillableDuration (in .Template .Spec .ExpireAfter )
53
- return in .Template .convertTo (ctx , & v1beta1np .Template , kubeletAnnotation )
57
+ return in .Template .convertTo (& v1beta1np .Template , kubeletAnnotation , nodeClassReferenceAnnotation )
54
58
}
55
59
56
60
func (in * Disruption ) convertTo (v1beta1np * v1beta1.Disruption ) {
@@ -68,7 +72,7 @@ func (in *Disruption) convertTo(v1beta1np *v1beta1.Disruption) {
68
72
})
69
73
}
70
74
71
- func (in * NodeClaimTemplate ) convertTo (ctx context. Context , v1beta1np * v1beta1.NodeClaimTemplate , kubeletAnnotation string ) error {
75
+ func (in * NodeClaimTemplate ) convertTo (v1beta1np * v1beta1.NodeClaimTemplate , kubeletAnnotation , nodeClassReferenceAnnotation string ) error {
72
76
v1beta1np .ObjectMeta = v1beta1 .ObjectMeta (in .ObjectMeta )
73
77
v1beta1np .Spec .Taints = in .Spec .Taints
74
78
v1beta1np .Spec .StartupTaints = in .Spec .StartupTaints
@@ -82,28 +86,16 @@ func (in *NodeClaimTemplate) convertTo(ctx context.Context, v1beta1np *v1beta1.N
82
86
MinValues : v1Requirements .MinValues ,
83
87
}
84
88
})
85
-
86
- nodeClasses := injection .GetNodeClasses (ctx )
87
- // We are sorting the supported nodeclass, so that we are able to consistently find the same GVK,
88
- // if multiple version of a nodeclass are supported
89
- sort .Slice (nodeClasses , func (i int , j int ) bool {
90
- if nodeClasses [i ].Group != nodeClasses [j ].Group {
91
- return nodeClasses [i ].Group < nodeClasses [j ].Group
89
+ // Convert the NodeClassReference depending on whether the annotation exists
90
+ v1beta1np .Spec .NodeClassRef = & v1beta1.NodeClassReference {}
91
+ if nodeClassReferenceAnnotation != "" {
92
+ if err := json .Unmarshal ([]byte (nodeClassReferenceAnnotation ), v1beta1np .Spec .NodeClassRef ); err != nil {
93
+ return fmt .Errorf ("unmarshaling nodeClassRef annotation, %w" , err )
92
94
}
93
- if nodeClasses [i ].Version != nodeClasses [j ].Version {
94
- return nodeClasses [i ].Version < nodeClasses [j ].Version
95
- }
96
- return nodeClasses [i ].Kind < nodeClasses [j ].Kind
97
- })
98
- matchingNodeClass , found := lo .Find (nodeClasses , func (nc schema.GroupVersionKind ) bool {
99
- return nc .Kind == in .Spec .NodeClassRef .Kind && nc .Group == in .Spec .NodeClassRef .Group
100
- })
101
- v1beta1np .Spec .NodeClassRef = & v1beta1.NodeClassReference {
102
- Kind : in .Spec .NodeClassRef .Kind ,
103
- Name : in .Spec .NodeClassRef .Name ,
104
- APIVersion : lo .Ternary (found , matchingNodeClass .GroupVersion ().String (), "" ),
95
+ } else {
96
+ v1beta1np .Spec .NodeClassRef .Name = in .Spec .NodeClassRef .Name
97
+ v1beta1np .Spec .NodeClassRef .Kind = in .Spec .NodeClassRef .Kind
105
98
}
106
-
107
99
if kubeletAnnotation != "" {
108
100
v1beta1kubelet := & v1beta1.KubeletConfiguration {}
109
101
err := json .Unmarshal ([]byte (kubeletAnnotation ), v1beta1kubelet )
@@ -133,6 +125,13 @@ func (in *NodePool) ConvertFrom(ctx context.Context, v1beta1np apis.Convertible)
133
125
} else {
134
126
in .Annotations = lo .Assign (in .Annotations , map [string ]string {KubeletCompatibilityAnnotationKey : kubeletAnnotation })
135
127
}
128
+ nodeClassRefAnnotation , err := json .Marshal (v1beta1NP .Spec .Template .Spec .NodeClassRef )
129
+ if err != nil {
130
+ return fmt .Errorf ("marshaling nodeClassRef annotation, %w" , err )
131
+ }
132
+ in .Annotations = lo .Assign (in .Annotations , map [string ]string {
133
+ NodeClassReferenceAnnotationKey : string (nodeClassRefAnnotation ),
134
+ })
136
135
return nil
137
136
}
138
137
@@ -174,20 +173,18 @@ func (in *NodeClaimTemplate) convertFrom(ctx context.Context, v1beta1np *v1beta1
174
173
}
175
174
})
176
175
177
- nodeclasses := injection .GetNodeClasses (ctx )
176
+ defaultNodeClassGVK := injection .GetNodeClasses (ctx )[ 0 ]
178
177
in .Spec .NodeClassRef = & NodeClassReference {
179
178
Name : v1beta1np .Spec .NodeClassRef .Name ,
180
- Kind : lo .Ternary (v1beta1np .Spec .NodeClassRef .Kind == "" , nodeclasses [ 0 ] .Kind , v1beta1np .Spec .NodeClassRef .Kind ),
181
- Group : lo .Ternary (v1beta1np .Spec .NodeClassRef .APIVersion == "" , nodeclasses [ 0 ] .Group , strings .Split (v1beta1np .Spec .NodeClassRef .APIVersion , "/" )[0 ]),
179
+ Kind : lo .Ternary (v1beta1np .Spec .NodeClassRef .Kind == "" , defaultNodeClassGVK .Kind , v1beta1np .Spec .NodeClassRef .Kind ),
180
+ Group : lo .Ternary (v1beta1np .Spec .NodeClassRef .APIVersion == "" , defaultNodeClassGVK .Group , strings .Split (v1beta1np .Spec .NodeClassRef .APIVersion , "/" )[0 ]),
182
181
}
183
-
184
182
if v1beta1np .Spec .Kubelet != nil {
185
183
kubelet , err := json .Marshal (v1beta1np .Spec .Kubelet )
186
184
if err != nil {
187
185
return "" , fmt .Errorf ("marshaling kubelet config annotation, %w" , err )
188
186
}
189
187
return string (kubelet ), nil
190
188
}
191
-
192
189
return "" , nil
193
190
}
0 commit comments