Skip to content

Commit d5f034f

Browse files
committed
fix(versioning): add intent repair and abandon flows
1 parent ee7e603 commit d5f034f

19 files changed

Lines changed: 1767 additions & 326 deletions

pkg/console/handler/rule_version.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func RollbackRuleVersion(cs consolectx.Context, kind coremodel.ResourceKind) gin
9191
c.JSON(http.StatusOK, model.NewBizErrorResp(bizerror.New(bizerror.InvalidArgument, err.Error())))
9292
return
9393
}
94-
resp, err := service.RollbackRuleVersion(c.Request.Context(), cs, service.RuleKindName{Kind: kind, Mesh: c.Query("mesh"), Name: c.Param("ruleName")}, id, req.Reason, req.ExpectedVersionID, currentUser(c))
94+
resp, err := service.RollbackRuleVersion(cs, service.RuleKindName{Kind: kind, Mesh: c.Query("mesh"), Name: c.Param("ruleName")}, id, req.Reason, req.ExpectedVersionID, currentUser(c))
9595
writeVersioningResp(c, resp, err)
9696
}
9797
}
@@ -159,11 +159,16 @@ func writeVersioningResp(c *gin.Context, data any, err error) {
159159
"message": versioning.ErrVersionConflict.Error(),
160160
"currentVersionId": conflict.CurrentVersionID,
161161
})
162+
case errors.Is(err, versioning.ErrVersionIntentPending):
163+
c.JSON(http.StatusConflict, gin.H{
164+
"code": "VERSION_LEDGER_PENDING",
165+
"message": versioning.ErrVersionIntentPending.Error(),
166+
})
162167
case errors.Is(err, versioning.ErrFeatureDisabled):
163168
c.JSON(http.StatusServiceUnavailable, gin.H{"code": "FEATURE_DISABLED", "message": err.Error()})
164169
case errors.Is(err, versioning.ErrVersionNotFound):
165170
c.JSON(http.StatusOK, model.NewBizErrorResp(bizerror.New(bizerror.NotFoundError, err.Error())))
166-
case errors.Is(err, versioning.ErrRollbackToDelete):
171+
case errors.Is(err, versioning.ErrRollbackToDelete), errors.Is(err, versioning.ErrRollbackToCurrent):
167172
c.JSON(http.StatusOK, model.NewBizErrorResp(bizerror.New(bizerror.InvalidArgument, err.Error())))
168173
case errors.As(err, &bizErr) && bizErr.Code() == bizerror.InvalidArgument:
169174
c.JSON(http.StatusBadRequest, model.NewBizErrorResp(bizErr))

pkg/console/service/condition_rule.go

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,17 @@ func UpdateConditionRuleWithOptions(ctx context.Context, res *meshresource.Condi
124124
}
125125

126126
func updateConditionRuleUnsafe(ctx context.Context, res *meshresource.ConditionRouteResource, opts RuleMutationOptions) error {
127-
if err := checkExpectedVersion(ctx, RuleKindName{Kind: meshresource.ConditionRouteKind, Mesh: res.Mesh, Name: res.Name}, opts); err != nil {
127+
kindName := RuleKindName{Kind: meshresource.ConditionRouteKind, Mesh: res.Mesh, Name: res.Name}
128+
if err := prepareRuleMutation(ctx, kindName, opts); err != nil {
128129
return err
129130
}
130-
if err := putAdminHint(ctx, res, versioning.OperationUpdate, opts); err != nil {
131-
return err
132-
}
133-
if err := ctx.ResourceManager().Update(res); err != nil {
134-
logger.Warnf("update %s condition failed with error: %s", res.Name, err.Error())
135-
return err
136-
}
137-
return nil
131+
return applyAdminMutation(ctx, res, versioning.OperationUpdate, opts, func() error {
132+
if err := ctx.ResourceManager().Update(res); err != nil {
133+
logger.Warnf("update %s condition failed with error: %s", res.Name, err.Error())
134+
return err
135+
}
136+
return nil
137+
})
138138
}
139139

140140
func CreateConditionRule(ctx context.Context, res *meshresource.ConditionRouteResource) error {
@@ -153,17 +153,17 @@ func CreateConditionRuleWithOptions(ctx context.Context, res *meshresource.Condi
153153
}
154154

155155
func createConditionRuleUnsafe(ctx context.Context, res *meshresource.ConditionRouteResource, opts RuleMutationOptions) error {
156-
if err := checkExpectedVersion(ctx, RuleKindName{Kind: meshresource.ConditionRouteKind, Mesh: res.Mesh, Name: res.Name}, opts); err != nil {
157-
return err
158-
}
159-
if err := putAdminHint(ctx, res, versioning.OperationCreate, opts); err != nil {
160-
return err
161-
}
162-
if err := ctx.ResourceManager().Add(res); err != nil {
163-
logger.Warnf("create %s condition failed with error: %s", res.Name, err.Error())
156+
kindName := RuleKindName{Kind: meshresource.ConditionRouteKind, Mesh: res.Mesh, Name: res.Name}
157+
if err := prepareRuleMutation(ctx, kindName, opts); err != nil {
164158
return err
165159
}
166-
return nil
160+
return applyAdminMutation(ctx, res, versioning.OperationCreate, opts, func() error {
161+
if err := ctx.ResourceManager().Add(res); err != nil {
162+
logger.Warnf("create %s condition failed with error: %s", res.Name, err.Error())
163+
return err
164+
}
165+
return nil
166+
})
167167
}
168168

169169
func DeleteConditionRule(ctx context.Context, name string, mesh string) error {
@@ -183,18 +183,20 @@ func DeleteConditionRuleWithOptions(ctx context.Context, name string, mesh strin
183183

184184
func deleteConditionRuleUnsafe(ctx context.Context, name string, mesh string, opts RuleMutationOptions) error {
185185
kindName := RuleKindName{Kind: meshresource.ConditionRouteKind, Mesh: mesh, Name: name}
186+
if err := repairPendingIntent(ctx, kindName); err != nil {
187+
return err
188+
}
186189
res, err := getExistingRule(ctx, kindName)
187190
if err != nil {
188191
return err
189192
}
190193
if err := checkExpectedVersion(ctx, kindName, opts); err != nil {
191194
return err
192195
}
193-
if err := putAdminHint(ctx, res, versioning.OperationDelete, opts); err != nil {
194-
return err
195-
}
196-
if err := ctx.ResourceManager().DeleteByKey(meshresource.ConditionRouteKind, mesh, coremodel.BuildResourceKey(mesh, name)); err != nil {
197-
return err
198-
}
199-
return nil
196+
return applyAdminMutation(ctx, res, versioning.OperationDelete, opts, func() error {
197+
if err := ctx.ResourceManager().DeleteByKey(meshresource.ConditionRouteKind, mesh, coremodel.BuildResourceKey(mesh, name)); err != nil {
198+
return err
199+
}
200+
return nil
201+
})
200202
}

pkg/console/service/configurator_rule.go

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,17 @@ func UpdateConfiguratorWithOptions(ctx consolectx.Context, res *meshresource.Dyn
132132
}
133133

134134
func updateConfiguratorUnsafe(ctx consolectx.Context, res *meshresource.DynamicConfigResource, opts RuleMutationOptions) error {
135-
if err := checkExpectedVersion(ctx, RuleKindName{Kind: meshresource.DynamicConfigKind, Mesh: res.Mesh, Name: res.Name}, opts); err != nil {
135+
kindName := RuleKindName{Kind: meshresource.DynamicConfigKind, Mesh: res.Mesh, Name: res.Name}
136+
if err := prepareRuleMutation(ctx, kindName, opts); err != nil {
136137
return err
137138
}
138-
if err := putAdminHint(ctx, res, versioning.OperationUpdate, opts); err != nil {
139-
return err
140-
}
141-
if err := ctx.ResourceManager().Update(res); err != nil {
142-
logger.Warnf("update %s configurator failed with error: %s", res.Name, err.Error())
143-
return err
144-
}
145-
return nil
139+
return applyAdminMutation(ctx, res, versioning.OperationUpdate, opts, func() error {
140+
if err := ctx.ResourceManager().Update(res); err != nil {
141+
logger.Warnf("update %s configurator failed with error: %s", res.Name, err.Error())
142+
return err
143+
}
144+
return nil
145+
})
146146
}
147147

148148
func CreateConfigurator(ctx consolectx.Context, res *meshresource.DynamicConfigResource) error {
@@ -161,17 +161,17 @@ func CreateConfiguratorWithOptions(ctx consolectx.Context, res *meshresource.Dyn
161161
}
162162

163163
func createConfiguratorUnsafe(ctx consolectx.Context, res *meshresource.DynamicConfigResource, opts RuleMutationOptions) error {
164-
if err := checkExpectedVersion(ctx, RuleKindName{Kind: meshresource.DynamicConfigKind, Mesh: res.Mesh, Name: res.Name}, opts); err != nil {
165-
return err
166-
}
167-
if err := putAdminHint(ctx, res, versioning.OperationCreate, opts); err != nil {
168-
return err
169-
}
170-
if err := ctx.ResourceManager().Add(res); err != nil {
171-
logger.Warnf("create %s configurator failed with error: %s", res.Name, err.Error())
164+
kindName := RuleKindName{Kind: meshresource.DynamicConfigKind, Mesh: res.Mesh, Name: res.Name}
165+
if err := prepareRuleMutation(ctx, kindName, opts); err != nil {
172166
return err
173167
}
174-
return nil
168+
return applyAdminMutation(ctx, res, versioning.OperationCreate, opts, func() error {
169+
if err := ctx.ResourceManager().Add(res); err != nil {
170+
logger.Warnf("create %s configurator failed with error: %s", res.Name, err.Error())
171+
return err
172+
}
173+
return nil
174+
})
175175
}
176176

177177
func DeleteConfigurator(ctx consolectx.Context, name string, mesh string) error {
@@ -191,19 +191,21 @@ func DeleteConfiguratorWithOptions(ctx consolectx.Context, name string, mesh str
191191

192192
func deleteConfiguratorUnsafe(ctx consolectx.Context, name string, mesh string, opts RuleMutationOptions) error {
193193
kindName := RuleKindName{Kind: meshresource.DynamicConfigKind, Mesh: mesh, Name: name}
194+
if err := repairPendingIntent(ctx, kindName); err != nil {
195+
return err
196+
}
194197
res, err := getExistingRule(ctx, kindName)
195198
if err != nil {
196199
return err
197200
}
198201
if err := checkExpectedVersion(ctx, kindName, opts); err != nil {
199202
return err
200203
}
201-
if err := putAdminHint(ctx, res, versioning.OperationDelete, opts); err != nil {
202-
return err
203-
}
204-
if err := ctx.ResourceManager().DeleteByKey(meshresource.DynamicConfigKind, mesh, coremodel.BuildResourceKey(mesh, name)); err != nil {
205-
logger.Warnf("delete %s configurator failed with error: %s", name, err.Error())
206-
return err
207-
}
208-
return nil
204+
return applyAdminMutation(ctx, res, versioning.OperationDelete, opts, func() error {
205+
if err := ctx.ResourceManager().DeleteByKey(meshresource.DynamicConfigKind, mesh, coremodel.BuildResourceKey(mesh, name)); err != nil {
206+
logger.Warnf("delete %s configurator failed with error: %s", name, err.Error())
207+
return err
208+
}
209+
return nil
210+
})
209211
}

0 commit comments

Comments
 (0)