Skip to content

Commit 4f26512

Browse files
committed
chore: support image replacement of parameters based on the serviceVersion
1 parent 804edc4 commit 4f26512

File tree

7 files changed

+150
-3
lines changed

7 files changed

+150
-3
lines changed

apis/parameters/v1alpha1/parametersdefinition_types.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,26 @@ type ToolConfig struct {
355355
// +optional
356356
Image string `json:"image,omitempty"`
357357

358+
// Defines image mapping for different service versions.
359+
// +optional
360+
ImageMappings []ImageMapping `json:"imageMappings,omitempty"`
361+
358362
// Specifies the command to be executed by the init container.
359363
//
360364
// +optional
361365
Command []string `json:"command,omitempty"`
362366
}
363367

368+
type ImageMapping struct {
369+
// ServiceVersions is a list of service versions that this mapping applies to.
370+
// +kubebuilder:validation:Required
371+
ServiceVersions []string `json:"serviceVersions"`
372+
373+
// Image is the container image addresses to use for the matched service versions.
374+
// +kubebuilder:validation:Required
375+
Image string `json:"image"`
376+
}
377+
364378
// DownwardAPIChangeTriggeredAction defines an action that triggers specific commands in response to changes in Pod labels.
365379
// For example, a command might be executed when the 'role' label of the Pod is updated.
366380
type DownwardAPIChangeTriggeredAction struct {

apis/parameters/v1alpha1/zz_generated.deepcopy.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/parameters.kubeblocks.io_parametersdefinitions.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,28 @@ spec:
449449
image:
450450
description: Specifies the tool container image.
451451
type: string
452+
imageMappings:
453+
description: Defines image mapping for different
454+
service versions.
455+
items:
456+
properties:
457+
image:
458+
description: Image is the container image
459+
addresses to use for the matched service
460+
versions.
461+
type: string
462+
serviceVersions:
463+
description: ServiceVersions is a list of
464+
service versions that this mapping applies
465+
to.
466+
items:
467+
type: string
468+
type: array
469+
required:
470+
- image
471+
- serviceVersions
472+
type: object
473+
type: array
452474
name:
453475
description: Specifies the name of the init container.
454476
maxLength: 63

deploy/helm/crds/parameters.kubeblocks.io_parametersdefinitions.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,28 @@ spec:
449449
image:
450450
description: Specifies the tool container image.
451451
type: string
452+
imageMappings:
453+
description: Defines image mapping for different
454+
service versions.
455+
items:
456+
properties:
457+
image:
458+
description: Image is the container image
459+
addresses to use for the matched service
460+
versions.
461+
type: string
462+
serviceVersions:
463+
description: ServiceVersions is a list of
464+
service versions that this mapping applies
465+
to.
466+
items:
467+
type: string
468+
type: array
469+
required:
470+
- image
471+
- serviceVersions
472+
type: object
473+
type: array
452474
name:
453475
description: Specifies the name of the init container.
454476
maxLength: 63

pkg/parameters/config_util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ func buildConfigManagerParams(cli client.Client, ctx context.Context, cluster *a
490490
if err := cfgcm.BuildConfigManagerContainerParams(cli, ctx, cfgManagerParams); err != nil {
491491
return nil, err
492492
}
493-
if err := buildReloadToolsContainer(cfgManagerParams, podSpec); err != nil {
493+
if err := buildReloadToolsContainer(cfgManagerParams, podSpec, comp.ServiceVersion); err != nil {
494494
return nil, err
495495
}
496496
return cfgManagerParams, nil

pkg/parameters/tool_image_builder.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package parameters
2121

2222
import (
2323
"path/filepath"
24+
"slices"
2425

2526
corev1 "k8s.io/api/core/v1"
2627

@@ -39,7 +40,7 @@ const (
3940
kbToolsImagePlaceHolder = "$(KUBEBLOCKS_TOOLS_IMAGE)"
4041
)
4142

42-
func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, podSpec *corev1.PodSpec) error {
43+
func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, podSpec *corev1.PodSpec, serviceVersion string) error {
4344
if len(cfgManagerParams.ConfigSpecsBuildParams) == 0 {
4445
return nil
4546
}
@@ -58,6 +59,15 @@ func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, po
5859
if _, ok := toolsImageMap[toolImage.Name]; ok {
5960
continue
6061
}
62+
if len(toolImage.ImageMappings) > 0 {
63+
for _, mapping := range toolImage.ImageMappings {
64+
if !slices.Contains(mapping.ServiceVersions, serviceVersion) {
65+
continue
66+
}
67+
toolImage.Image = mapping.Image
68+
break
69+
}
70+
}
6171
toolsImageMap[toolImage.Name] = buildParam
6272
replaceToolsImageHolder(&toolImage, podSpec, buildParam.ConfigSpec.VolumeName)
6373
if AsSidecarContainerImage(toolImage) && sidecarImage == "" {

pkg/parameters/tool_image_builder_test.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,64 @@ var _ = Describe("ToolsImageBuilderTest", func() {
9393
}},
9494
}
9595
cfgManagerParams.ConfigSpecsBuildParams[0].ConfigSpec.VolumeName = "data"
96-
Expect(buildReloadToolsContainer(cfgManagerParams, &its.Spec.Template.Spec)).Should(Succeed())
96+
Expect(buildReloadToolsContainer(cfgManagerParams, &its.Spec.Template.Spec, "1.0.1")).Should(Succeed())
9797
Expect(3).Should(BeEquivalentTo(len(cfgManagerParams.ToolsContainers)))
9898
Expect("test_images").Should(BeEquivalentTo(cfgManagerParams.ToolsContainers[0].Image))
9999
Expect(its.Spec.Template.Spec.Containers[0].Image).Should(BeEquivalentTo(cfgManagerParams.ToolsContainers[1].Image))
100100
Expect(kbToolsImage).Should(BeEquivalentTo(cfgManagerParams.ToolsContainers[2].Image))
101101
})
102102
})
103103

104+
It("TesImageMappings", func() {
105+
its, err := factory.BuildInstanceSet(clusterComponent, nil)
106+
Expect(err).Should(Succeed())
107+
108+
cfgManagerParams := &cfgcm.CfgManagerBuildParams{
109+
ManagerName: constant.ConfigSidecarName,
110+
ComponentName: clusterComponent.Name,
111+
Image: viper.GetString(constant.KBToolsImage),
112+
Volumes: make([]corev1.VolumeMount, 0),
113+
Cluster: clusterObj,
114+
ConfigSpecsBuildParams: []cfgcm.ConfigSpecMeta{{
115+
ConfigSpecInfo: cfgcm.ConfigSpecInfo{
116+
ConfigSpec: component.ConfigTemplates(clusterComponent)[0],
117+
ReloadType: parametersv1alpha1.ShellType,
118+
},
119+
ToolsImageSpec: &parametersv1alpha1.ToolsSetup{
120+
MountPoint: "/opt/tools",
121+
ToolConfigs: []parametersv1alpha1.ToolConfig{
122+
{
123+
Name: "test",
124+
Image: "test_images",
125+
Command: noneCommand,
126+
ImageMappings: []parametersv1alpha1.ImageMapping{
127+
{
128+
ServiceVersions: []string{
129+
"1.0.1",
130+
},
131+
Image: "test_images_v1.0.1",
132+
},
133+
},
134+
},
135+
{
136+
Name: "test2",
137+
Image: "",
138+
Command: noneCommand,
139+
// AsContainerImage: cfgutil.ToPointer(true),
140+
},
141+
{
142+
Name: "test3",
143+
Image: "$(KUBEBLOCKS_TOOLS_IMAGE)",
144+
Command: noneCommand,
145+
},
146+
},
147+
},
148+
}},
149+
}
150+
cfgManagerParams.ConfigSpecsBuildParams[0].ConfigSpec.VolumeName = "data"
151+
Expect(buildReloadToolsContainer(cfgManagerParams, &its.Spec.Template.Spec, "1.0.1")).Should(Succeed())
152+
Expect(3).Should(BeEquivalentTo(len(cfgManagerParams.ToolsContainers)))
153+
Expect("test_images_v1.0.1").Should(BeEquivalentTo(cfgManagerParams.ToolsContainers[0].Image))
154+
})
155+
104156
})

0 commit comments

Comments
 (0)