@@ -18,6 +18,8 @@ package service
1818
1919import (
2020 "context"
21+ "crypto/sha256"
22+ "encoding/hex"
2123 "encoding/json"
2224 "fmt"
2325 "strconv"
@@ -29,6 +31,7 @@ import (
2931 "github.com/koderover/zadig/v2/pkg/types"
3032 "github.com/pkg/errors"
3133 "github.com/samber/lo"
34+ "go.mongodb.org/mongo-driver/bson"
3235 "go.mongodb.org/mongo-driver/bson/primitive"
3336 "go.mongodb.org/mongo-driver/mongo"
3437
@@ -402,6 +405,14 @@ func UpdateReleasePlan(c *handler.Context, planID string, args *UpdateReleasePla
402405 }
403406 plan .HookSettings = hookSetting .ToHookSettings ()
404407
408+ instanceCode , err := generateInstanceCode (plan )
409+ if err != nil {
410+ fmtErr := fmt .Errorf ("failed generate instance code, err: %v" , err )
411+ log .Error (fmtErr )
412+ return fmtErr
413+ }
414+ plan .InstanceCode = instanceCode
415+
405416 if err = mongodb .NewReleasePlanColl ().UpdateByID (ctx , planID , plan ); err != nil {
406417 return errors .Wrap (err , "update plan" )
407418 }
@@ -883,6 +894,12 @@ func UpdateReleasePlanStatus(c *handler.Context, planID, targetStatus string, is
883894 plan .WaitForExecuteExternalCheckTime = 0
884895 plan .WaitForAllDoneExternalCheckTime = 0
885896 plan .ExternalCheckFailedReason = ""
897+ plan .InstanceCode , err = generateInstanceCode (plan )
898+ if err != nil {
899+ fmtErr := fmt .Errorf ("failed generate instance code, err: %v" , err )
900+ log .Error (fmtErr )
901+ return fmtErr
902+ }
886903
887904 cancelReleasePlanApproval (c , plan )
888905 case config .ReleasePlanStatusExecuting :
@@ -1297,13 +1314,14 @@ func UpdateReleasePlanHookSetting(c *handler.Context, req *models.ReleasePlanHoo
12971314
12981315type ReleasePlanCallBackBody struct {
12991316 ReleasePlanID string `json:"release_plan_id"`
1317+ InstanceCode string `json:"instance_code"`
13001318 HookEvent models.ReleasePlanHookEvent `json:"hook_event"`
13011319 Result setting.ReleasePlanCallBackResultType `json:"result"`
13021320 FailedReason string `json:"failed_reason"`
13031321}
13041322
13051323func ReleasePlanHookCallback (c * handler.Context , callback * ReleasePlanCallBackBody ) error {
1306- log .Infof ("release plan hook callback, id: %s, hook event: %s, result: %s, failed reason: %s" , callback .ReleasePlanID , callback .HookEvent , callback .Result , callback .FailedReason )
1324+ log .Infof ("release plan hook callback, id: %s, instance code: %s, hook event: %s, result: %s, failed reason: %s" , callback .ReleasePlanID , callback . InstanceCode , callback .HookEvent , callback .Result , callback .FailedReason )
13071325
13081326 hookSetting , err := mongodb .NewSystemSettingColl ().GetReleasePlanHookSetting ()
13091327 if err != nil {
@@ -1339,6 +1357,12 @@ func ReleasePlanHookCallback(c *handler.Context, callback *ReleasePlanCallBackBo
13391357 return fmtErr
13401358 }
13411359
1360+ if releasePlan .InstanceCode != callback .InstanceCode {
1361+ fmtErr := fmt .Errorf ("release plan instance code is not correct, name: %s, instance code: %s, expected: %s" , releasePlan .Name , callback .InstanceCode , releasePlan .InstanceCode )
1362+ log .Error (fmtErr )
1363+ return fmtErr
1364+ }
1365+
13421366 if ! hookEventStatusMap [releasePlan .Status ] {
13431367 fmtErr := fmt .Errorf ("release plan's status is not correct, status: %s" , releasePlan .Status )
13441368 log .Error (fmtErr )
@@ -1516,6 +1540,7 @@ func convertReleasePlanToHookBody(plan *models.ReleasePlan, hookEvent commonmode
15161540 Name : plan .Name ,
15171541 Manager : plan .Manager ,
15181542 ManagerID : plan .ManagerID ,
1543+ InstanceCode : plan .InstanceCode ,
15191544 StartTime : plan .StartTime ,
15201545 EndTime : plan .EndTime ,
15211546 ScheduleExecuteTime : plan .ScheduleExecuteTime ,
@@ -2061,6 +2086,38 @@ func waitForExternalCheck(plan *models.ReleasePlan, systemHookSetting *commonmod
20612086 return & nextStatus , shouldWait
20622087}
20632088
2089+ func generateInstanceCode (plan * models.ReleasePlan ) (string , error ) {
2090+ newPlan := new (models.ReleasePlan )
2091+ err := util .DeepCopy (newPlan , plan )
2092+ if err != nil {
2093+ err := fmt .Errorf ("failed deep copy plan, err: %v" , err )
2094+ log .Error (err )
2095+ return "" , err
2096+ }
2097+ newPlan .UpdateTime = 0
2098+ newPlan .UpdatedBy = ""
2099+ newPlan .InstanceCode = ""
2100+ newPlan .Status = ""
2101+ newPlan .PlanningTime = 0
2102+ newPlan .ApprovalTime = 0
2103+ newPlan .ExecutingTime = 0
2104+ newPlan .SuccessTime = 0
2105+ newPlan .WaitForApproveExternalCheckTime = 0
2106+ newPlan .WaitForExecuteExternalCheckTime = 0
2107+ newPlan .WaitForAllDoneExternalCheckTime = 0
2108+ newPlan .ExternalCheckFailedReason = ""
2109+
2110+ newPlanBytes , err := bson .Marshal (newPlan )
2111+ if err != nil {
2112+ err := fmt .Errorf ("failed marshal plan, err: %v" , err )
2113+ log .Error (err )
2114+ return "" , err
2115+ }
2116+
2117+ sum := sha256 .Sum256 ([]byte (newPlanBytes ))
2118+ return hex .EncodeToString (sum [:])[:16 ], nil
2119+ }
2120+
20642121func cancelReleasePlanApproval (ctx * handler.Context , plan * models.ReleasePlan ) error {
20652122 if plan == nil {
20662123 log .Warnf ("cancelReleasePlanApproval: release plan is nil" )
0 commit comments