Skip to content

Commit e0c6b2a

Browse files
fix: decouple GlobalTopoServer and MultiAdmin CoreTemplate resolution
Previously, the controller logic in `reconcileGlobalComponents` enforced a single `CoreTemplate` for the entire control plane. If a `GlobalTopoServer` template was defined, it would shadow and ignore the `MultiAdmin` template reference, forcing both components to share the same configuration source. This commit refactors the reconciliation logic to resolve the `CoreTemplate` independently for both components, allowing them to reference different templates as implied by the API design. Changes: - Refactor `reconcileGlobalComponents` to resolve `topoTpl` and `adminTpl` separately. - Add test case `Create: Independent Templates (Topo vs Admin)` to verify disjoint template usage. - Add test case `Error: Resolve Admin Template Failed` to ensure full coverage of the new error path.
1 parent 12a54fc commit e0c6b2a

File tree

2 files changed

+84
-8
lines changed

2 files changed

+84
-8
lines changed

pkg/cluster-handler/controller/multigrescluster/multigrescluster_controller.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,22 +127,29 @@ func (r *MultigresClusterReconciler) checkChildrenDeleted(ctx context.Context, c
127127
}
128128

129129
func (r *MultigresClusterReconciler) reconcileGlobalComponents(ctx context.Context, cluster *multigresv1alpha1.MultigresCluster, resolver *TemplateResolver) error {
130-
var coreTpl *multigresv1alpha1.CoreTemplate
131130
var err error
132131

133-
tplName := cluster.Spec.TemplateDefaults.CoreTemplate
132+
topoTplName := cluster.Spec.TemplateDefaults.CoreTemplate
134133
if cluster.Spec.GlobalTopoServer.TemplateRef != "" {
135-
tplName = cluster.Spec.GlobalTopoServer.TemplateRef
136-
} else if cluster.Spec.MultiAdmin.TemplateRef != "" {
137-
tplName = cluster.Spec.MultiAdmin.TemplateRef
134+
topoTplName = cluster.Spec.GlobalTopoServer.TemplateRef
138135
}
139136

140-
coreTpl, err = resolver.ResolveCoreTemplate(ctx, tplName)
137+
topoTpl, err := resolver.ResolveCoreTemplate(ctx, topoTplName)
141138
if err != nil {
142139
return err
143140
}
144141

145-
topoSpec := ResolveGlobalTopo(&cluster.Spec.GlobalTopoServer, coreTpl)
142+
adminTplName := cluster.Spec.TemplateDefaults.CoreTemplate
143+
if cluster.Spec.MultiAdmin.TemplateRef != "" {
144+
adminTplName = cluster.Spec.MultiAdmin.TemplateRef
145+
}
146+
147+
adminTpl, err := resolver.ResolveCoreTemplate(ctx, adminTplName)
148+
if err != nil {
149+
return err
150+
}
151+
152+
topoSpec := ResolveGlobalTopo(&cluster.Spec.GlobalTopoServer, topoTpl)
146153
if topoSpec.Etcd != nil {
147154
ts := &multigresv1alpha1.TopoServer{
148155
ObjectMeta: metav1.ObjectMeta{
@@ -169,7 +176,7 @@ func (r *MultigresClusterReconciler) reconcileGlobalComponents(ctx context.Conte
169176
}
170177
}
171178

172-
multiAdminSpec := ResolveMultiAdmin(&cluster.Spec.MultiAdmin, coreTpl)
179+
multiAdminSpec := ResolveMultiAdmin(&cluster.Spec.MultiAdmin, adminTpl)
173180
if multiAdminSpec != nil {
174181
deploy := &appsv1.Deployment{
175182
ObjectMeta: metav1.ObjectMeta{

pkg/cluster-handler/controller/multigrescluster/multigrescluster_controller_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,55 @@ func TestMultigresClusterReconciler_Reconcile(t *testing.T) {
163163
}
164164
},
165165
},
166+
{
167+
name: "Create: Independent Templates (Topo vs Admin)",
168+
cluster: func() *multigresv1alpha1.MultigresCluster {
169+
c := baseCluster.DeepCopy()
170+
c.Spec.TemplateDefaults.CoreTemplate = "" // clear default
171+
c.Spec.GlobalTopoServer.TemplateRef = "topo-core"
172+
c.Spec.MultiAdmin.TemplateRef = "admin-core"
173+
return c
174+
}(),
175+
existingObjects: []client.Object{
176+
cellTpl, shardTpl,
177+
&multigresv1alpha1.CoreTemplate{
178+
ObjectMeta: metav1.ObjectMeta{Name: "topo-core", Namespace: namespace},
179+
Spec: multigresv1alpha1.CoreTemplateSpec{
180+
GlobalTopoServer: &multigresv1alpha1.TopoServerSpec{
181+
Etcd: &multigresv1alpha1.EtcdSpec{Image: "etcd:topo"},
182+
},
183+
},
184+
},
185+
&multigresv1alpha1.CoreTemplate{
186+
ObjectMeta: metav1.ObjectMeta{Name: "admin-core", Namespace: namespace},
187+
Spec: multigresv1alpha1.CoreTemplateSpec{
188+
MultiAdmin: &multigresv1alpha1.StatelessSpec{Replicas: ptr.To(int32(5))},
189+
},
190+
},
191+
},
192+
expectError: false,
193+
validate: func(t *testing.T, c client.Client) {
194+
ctx := context.Background()
195+
196+
// Check Topo uses topo-core
197+
ts := &multigresv1alpha1.TopoServer{}
198+
if err := c.Get(ctx, types.NamespacedName{Name: clusterName + "-global-topo", Namespace: namespace}, ts); err != nil {
199+
t.Fatal(err)
200+
}
201+
if ts.Spec.Etcd.Image != "etcd:topo" {
202+
t.Errorf("TopoServer did not use topo-core template, got image: %s", ts.Spec.Etcd.Image)
203+
}
204+
205+
// Check Admin uses admin-core
206+
deploy := &appsv1.Deployment{}
207+
if err := c.Get(ctx, types.NamespacedName{Name: clusterName + "-multiadmin", Namespace: namespace}, deploy); err != nil {
208+
t.Fatal(err)
209+
}
210+
if *deploy.Spec.Replicas != 5 {
211+
t.Errorf("MultiAdmin did not use admin-core template, got replicas: %d", *deploy.Spec.Replicas)
212+
}
213+
},
214+
},
166215
{
167216
name: "Create: MultiAdmin TemplateRef Only",
168217
cluster: func() *multigresv1alpha1.MultigresCluster {
@@ -604,6 +653,26 @@ func TestMultigresClusterReconciler_Reconcile(t *testing.T) {
604653
failureConfig: &testutil.FailureConfig{OnGet: testutil.FailOnKeyName("default-core", errBoom)},
605654
expectError: true,
606655
},
656+
{
657+
name: "Error: Resolve Admin Template Failed (Second Call)",
658+
cluster: func() *multigresv1alpha1.MultigresCluster {
659+
c := baseCluster.DeepCopy()
660+
c.Spec.TemplateDefaults.CoreTemplate = ""
661+
c.Spec.GlobalTopoServer.TemplateRef = "topo-core"
662+
c.Spec.MultiAdmin.TemplateRef = "admin-core-fail"
663+
return c
664+
}(),
665+
existingObjects: []client.Object{
666+
cellTpl, shardTpl,
667+
&multigresv1alpha1.CoreTemplate{
668+
ObjectMeta: metav1.ObjectMeta{Name: "topo-core", Namespace: namespace},
669+
// Minimal valid spec
670+
Spec: multigresv1alpha1.CoreTemplateSpec{},
671+
},
672+
},
673+
failureConfig: &testutil.FailureConfig{OnGet: testutil.FailOnKeyName("admin-core-fail", errBoom)},
674+
expectError: true,
675+
},
607676
{
608677
name: "Error: Create GlobalTopo Failed",
609678
cluster: baseCluster.DeepCopy(),

0 commit comments

Comments
 (0)