Skip to content

Commit 75b65b5

Browse files
authored
🌱 Expose GetRegexResourceRequirements func (#308)
* Expose GetRegexResourceRequirements func Signed-off-by: zhujian <[email protected]> * Add raw resource requirements Signed-off-by: zhujian <[email protected]> --------- Signed-off-by: zhujian <[email protected]>
1 parent 6b1383f commit 75b65b5

File tree

4 files changed

+71
-45
lines changed

4 files changed

+71
-45
lines changed

‎pkg/addonfactory/addondeploymentconfig.go‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@ type resourceRequirements struct {
2727
Requests map[string]string `json:"requests,omitempty"`
2828
}
2929

30-
// regexResourceRequirements defines a resource requirement rule for containers. A container is eligible for the
30+
// RegexResourceRequirements defines a resource requirement rule for containers. A container is eligible for the
3131
// specified resource requirements if its container ID matches the regular expression.
32-
type regexResourceRequirements struct {
32+
type RegexResourceRequirements struct {
3333
// ContainerIDRegex is the regular expression used to match container IDs.
3434
ContainerIDRegex string `json:"containerIDRegex"`
35-
// Resources defines the resource requirements for matched containers
35+
// Resources defines the resource requirements for matched containers, its resource value is plain string
3636
Resources resourceRequirements `json:"resources"`
37+
38+
// ResourcesRaw defines the resource requirements for matched containers, its resource value is structure
39+
ResourcesRaw corev1.ResourceRequirements `json:"resourcesRaw"`
3740
}
3841

3942
// ToAddOnNodePlacementValues only transform the AddOnDeploymentConfig NodePlacement part into Values object that has
@@ -139,13 +142,13 @@ func ToAddOnResourceRequirementsValues(config addonapiv1alpha1.AddOnDeploymentCo
139142
return nil, nil
140143
}
141144

142-
resourceRequirements, err := getRegexResourceRequirements(config.Spec.ResourceRequirements)
145+
resourceRequirements, err := GetRegexResourceRequirements(config.Spec.ResourceRequirements)
143146
if err != nil {
144147
return nil, err
145148
}
146149

147150
type global struct {
148-
ResourceRequirements []regexResourceRequirements `json:"resourceRequirements"`
151+
ResourceRequirements []RegexResourceRequirements `json:"resourceRequirements"`
149152
}
150153

151154
jsonStruct := struct {
@@ -221,8 +224,8 @@ func GetAddOnDeploymentConfigValues(
221224
}
222225
}
223226

224-
func getRegexResourceRequirements(requirements []addonapiv1alpha1.ContainerResourceRequirements) ([]regexResourceRequirements, error) {
225-
newRequirements := []regexResourceRequirements{}
227+
func GetRegexResourceRequirements(requirements []addonapiv1alpha1.ContainerResourceRequirements) ([]RegexResourceRequirements, error) {
228+
newRequirements := []RegexResourceRequirements{}
226229
for _, item := range requirements {
227230
// convert container ID to regex
228231
parts := strings.Split(item.ContainerID, ":")
@@ -234,12 +237,13 @@ func getRegexResourceRequirements(requirements []addonapiv1alpha1.ContainerResou
234237
parts[index] = ".+"
235238
}
236239
}
237-
newRequirements = append(newRequirements, regexResourceRequirements{
240+
newRequirements = append(newRequirements, RegexResourceRequirements{
238241
ContainerIDRegex: fmt.Sprintf("^%s:%s:%s$", parts[0], parts[1], parts[2]),
239242
Resources: resourceRequirements{
240243
Requests: toStringResourceList(item.Resources.Requests),
241244
Limits: toStringResourceList(item.Resources.Limits),
242245
},
246+
ResourcesRaw: item.Resources,
243247
})
244248
}
245249

@@ -294,7 +298,7 @@ func ToAddOnDeploymentConfigValues(config addonapiv1alpha1.AddOnDeploymentConfig
294298
}
295299

296300
// load ResourceRequirements settings
297-
resourceRequirements, err := getRegexResourceRequirements(config.Spec.ResourceRequirements)
301+
resourceRequirements, err := GetRegexResourceRequirements(config.Spec.ResourceRequirements)
298302
if err != nil {
299303
return nil, err
300304
}

‎pkg/addonfactory/addondeploymentconfig_test.go‎

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,19 @@ func TestGetAddOnDeploymentConfigValues(t *testing.T) {
260260
},
261261
},
262262
expectedValues: Values{
263-
"ResourceRequirements": []regexResourceRequirements{
263+
"ResourceRequirements": []RegexResourceRequirements{
264264
{
265265
ContainerIDRegex: "^a:b:c$",
266266
Resources: resourceRequirements{
267267
Requests: map[string]string{
268268
"memory": "64Mi",
269269
},
270270
},
271+
ResourcesRaw: corev1.ResourceRequirements{
272+
Requests: corev1.ResourceList{
273+
corev1.ResourceMemory: resource.MustParse("64Mi"),
274+
},
275+
},
271276
},
272277
{
273278
ContainerIDRegex: "^.+:b:c$",
@@ -276,6 +281,11 @@ func TestGetAddOnDeploymentConfigValues(t *testing.T) {
276281
"memory": "128Mi",
277282
},
278283
},
284+
ResourcesRaw: corev1.ResourceRequirements{
285+
Requests: corev1.ResourceList{
286+
corev1.ResourceMemory: resource.MustParse("128Mi"),
287+
},
288+
},
279289
},
280290
{
281291
ContainerIDRegex: "^.+:.+:c$",
@@ -284,6 +294,11 @@ func TestGetAddOnDeploymentConfigValues(t *testing.T) {
284294
"memory": "256Mi",
285295
},
286296
},
297+
ResourcesRaw: corev1.ResourceRequirements{
298+
Requests: corev1.ResourceList{
299+
corev1.ResourceMemory: resource.MustParse("256Mi"),
300+
},
301+
},
287302
},
288303
{
289304
ContainerIDRegex: "^.+:.+:.+$",
@@ -292,6 +307,11 @@ func TestGetAddOnDeploymentConfigValues(t *testing.T) {
292307
"memory": "512Mi",
293308
},
294309
},
310+
ResourcesRaw: corev1.ResourceRequirements{
311+
Requests: corev1.ResourceList{
312+
corev1.ResourceMemory: resource.MustParse("512Mi"),
313+
},
314+
},
295315
},
296316
},
297317
},
@@ -736,11 +756,19 @@ func TestGetRegexResourceRequirements(t *testing.T) {
736756
"memory": "256Mi",
737757
},
738758
}
759+
expectedReqirementRaw := corev1.ResourceRequirements{
760+
Requests: corev1.ResourceList{
761+
corev1.ResourceMemory: resource.MustParse("128Mi"),
762+
},
763+
Limits: corev1.ResourceList{
764+
corev1.ResourceMemory: resource.MustParse("256Mi"),
765+
},
766+
}
739767

740768
cases := []struct {
741769
name string
742770
containerResourceRequirements []addonapiv1alpha1.ContainerResourceRequirements
743-
expectedResourceRequirements []regexResourceRequirements
771+
expectedResourceRequirements []RegexResourceRequirements
744772
expectedErr error
745773
}{
746774
{
@@ -764,10 +792,11 @@ func TestGetRegexResourceRequirements(t *testing.T) {
764792
Resources: reqirement,
765793
},
766794
},
767-
expectedResourceRequirements: []regexResourceRequirements{
795+
expectedResourceRequirements: []RegexResourceRequirements{
768796
{
769797
ContainerIDRegex: "^a:b:c$",
770798
Resources: expectedReqirement,
799+
ResourcesRaw: expectedReqirementRaw,
771800
},
772801
},
773802
},
@@ -779,10 +808,11 @@ func TestGetRegexResourceRequirements(t *testing.T) {
779808
Resources: reqirement,
780809
},
781810
},
782-
expectedResourceRequirements: []regexResourceRequirements{
811+
expectedResourceRequirements: []RegexResourceRequirements{
783812
{
784813
ContainerIDRegex: "^.+:b:c$",
785814
Resources: expectedReqirement,
815+
ResourcesRaw: expectedReqirementRaw,
786816
},
787817
},
788818
},
@@ -794,10 +824,11 @@ func TestGetRegexResourceRequirements(t *testing.T) {
794824
Resources: reqirement,
795825
},
796826
},
797-
expectedResourceRequirements: []regexResourceRequirements{
827+
expectedResourceRequirements: []RegexResourceRequirements{
798828
{
799829
ContainerIDRegex: "^.+:.+:c$",
800830
Resources: expectedReqirement,
831+
ResourcesRaw: expectedReqirementRaw,
801832
},
802833
},
803834
},
@@ -809,10 +840,11 @@ func TestGetRegexResourceRequirements(t *testing.T) {
809840
Resources: reqirement,
810841
},
811842
},
812-
expectedResourceRequirements: []regexResourceRequirements{
843+
expectedResourceRequirements: []RegexResourceRequirements{
813844
{
814845
ContainerIDRegex: "^.+:.+:.+$",
815846
Resources: expectedReqirement,
847+
ResourcesRaw: expectedReqirementRaw,
816848
},
817849
},
818850
},
@@ -821,7 +853,7 @@ func TestGetRegexResourceRequirements(t *testing.T) {
821853
for _, c := range cases {
822854
t.Run(c.name, func(t *testing.T) {
823855

824-
requirements, err := getRegexResourceRequirements(c.containerResourceRequirements)
856+
requirements, err := GetRegexResourceRequirements(c.containerResourceRequirements)
825857
if err != nil {
826858
if c.expectedErr == nil || !strings.EqualFold(err.Error(), c.expectedErr.Error()) {
827859
t.Errorf("expected error %v, but got error %s", c.expectedErr, err)

‎pkg/addonfactory/template_agentaddon_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func TestTemplateAddon_Manifests(t *testing.T) {
158158
getValuesFunc: func(cluster *clusterv1.ManagedCluster,
159159
addon *addonapiv1alpha1.ManagedClusterAddOn) (Values, error) {
160160
return Values{
161-
"ResourceRequirements": []regexResourceRequirements{
161+
"ResourceRequirements": []RegexResourceRequirements{
162162
{
163163
ContainerIDRegex: "^.+:.+:.+$",
164164
Resources: resourceRequirements{

‎pkg/utils/probe_helper.go‎

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -229,22 +229,7 @@ func ConvertToDeployment(obj runtime.Object) (*appsv1.Deployment, error) {
229229
return deployment, nil
230230
}
231231

232-
if obj.GetObjectKind().GroupVersionKind().Group != appsv1.GroupName ||
233-
obj.GetObjectKind().GroupVersionKind().Kind != "Deployment" {
234-
return nil, fmt.Errorf("not deployment object, %v", obj.GetObjectKind())
235-
}
236-
237-
deployment := &appsv1.Deployment{}
238-
uobj, ok := obj.(*unstructured.Unstructured)
239-
if !ok {
240-
return deployment, fmt.Errorf("not unstructured object, %v", obj.GetObjectKind())
241-
}
242-
243-
err := runtime.DefaultUnstructuredConverter.FromUnstructured(uobj.Object, deployment)
244-
if err != nil {
245-
return nil, err
246-
}
247-
return deployment, nil
232+
return ConvertTo[appsv1.Deployment](obj, appsv1.GroupName, "Deployment")
248233
}
249234

250235
func DeploymentWellKnowManifestConfig(namespace, name string) workapiv1.ManifestConfigOption {
@@ -284,24 +269,29 @@ func ConvertToDaemonSet(obj runtime.Object) (*appsv1.DaemonSet, error) {
284269
return daemonSet, nil
285270
}
286271

287-
if obj.GetObjectKind().GroupVersionKind().Group != appsv1.GroupName ||
288-
obj.GetObjectKind().GroupVersionKind().Kind != "DaemonSet" {
289-
return nil, fmt.Errorf("not daemonset object, %v", obj.GetObjectKind())
272+
return ConvertTo[appsv1.DaemonSet](obj, appsv1.GroupName, "DaemonSet")
273+
}
274+
275+
func DaemonSetWellKnowManifestConfig(namespace, name string) workapiv1.ManifestConfigOption {
276+
return WellKnowManifestConfig(appsv1.GroupName, "daemonsets", namespace, name)
277+
}
278+
func ConvertTo[T any](obj runtime.Object, group, kind string) (*T, error) {
279+
// Verify GroupVersionKind matches expected values
280+
gvk := obj.GetObjectKind().GroupVersionKind()
281+
if gvk.Group != group || gvk.Kind != kind {
282+
return nil, fmt.Errorf("not %s object, %v", kind, obj.GetObjectKind())
290283
}
291284

292-
daemonSet := &appsv1.DaemonSet{}
285+
// Handle unstructured conversion
293286
uobj, ok := obj.(*unstructured.Unstructured)
294287
if !ok {
295-
return daemonSet, fmt.Errorf("not unstructured object, %v", obj.GetObjectKind())
288+
return nil, fmt.Errorf("not unstructured object, %v", obj.GetObjectKind())
296289
}
297290

298-
err := runtime.DefaultUnstructuredConverter.FromUnstructured(uobj.Object, daemonSet)
299-
if err != nil {
291+
// Create new instance of target type and convert
292+
target := new(T)
293+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(uobj.Object, target); err != nil {
300294
return nil, err
301295
}
302-
return daemonSet, nil
303-
}
304-
305-
func DaemonSetWellKnowManifestConfig(namespace, name string) workapiv1.ManifestConfigOption {
306-
return WellKnowManifestConfig(appsv1.GroupName, "daemonsets", namespace, name)
296+
return target, nil
307297
}

0 commit comments

Comments
 (0)