@@ -18,6 +18,8 @@ package service
1818
1919import (
2020 "context"
21+ "crypto/sha256"
22+ "encoding/hex"
2123 "encoding/json"
2224 "fmt"
2325 "strconv"
@@ -31,6 +33,7 @@ import (
3133 "github.com/koderover/zadig/v2/pkg/types"
3234 "github.com/pkg/errors"
3335 "github.com/samber/lo"
36+ "go.mongodb.org/mongo-driver/bson"
3437 "go.mongodb.org/mongo-driver/bson/primitive"
3538 "go.mongodb.org/mongo-driver/mongo"
3639
@@ -400,6 +403,14 @@ func UpdateReleasePlan(c *handler.Context, planID string, args *UpdateReleasePla
400403 }
401404 plan .HookSettings = hookSetting .ToHookSettings ()
402405
406+ instanceCode , err := generateInstanceCode (plan )
407+ if err != nil {
408+ fmtErr := fmt .Errorf ("failed generate instance code, err: %v" , err )
409+ log .Error (fmtErr )
410+ return fmtErr
411+ }
412+ plan .InstanceCode = instanceCode
413+
403414 if err = mongodb .NewReleasePlanColl ().UpdateByID (ctx , planID , plan ); err != nil {
404415 return errors .Wrap (err , "update plan" )
405416 }
@@ -881,6 +892,12 @@ func UpdateReleasePlanStatus(c *handler.Context, planID, targetStatus string, is
881892 plan .WaitForExecuteExternalCheckTime = 0
882893 plan .WaitForAllDoneExternalCheckTime = 0
883894 plan .ExternalCheckFailedReason = ""
895+ plan .InstanceCode , err = generateInstanceCode (plan )
896+ if err != nil {
897+ fmtErr := fmt .Errorf ("failed generate instance code, err: %v" , err )
898+ log .Error (fmtErr )
899+ return fmtErr
900+ }
884901 case config .ReleasePlanStatusExecuting :
885902 if plan .Approval != nil && plan .Approval .Enabled == true && plan .Approval .Status != config .StatusPassed {
886903 return errors .Errorf ("approval status is %s, can not execute" , plan .Approval .Status )
@@ -1293,13 +1310,14 @@ func UpdateReleasePlanHookSetting(c *handler.Context, req *models.ReleasePlanHoo
12931310
12941311type ReleasePlanCallBackBody struct {
12951312 ReleasePlanID string `json:"release_plan_id"`
1313+ InstanceCode string `json:"instance_code"`
12961314 HookEvent models.ReleasePlanHookEvent `json:"hook_event"`
12971315 Result setting.ReleasePlanCallBackResultType `json:"result"`
12981316 FailedReason string `json:"failed_reason"`
12991317}
13001318
13011319func ReleasePlanHookCallback (c * handler.Context , callback * ReleasePlanCallBackBody ) error {
1302- log .Infof ("release plan hook callback, id: %s, hook event: %s, result: %s, failed reason: %s" , callback .ReleasePlanID , callback .HookEvent , callback .Result , callback .FailedReason )
1320+ 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 )
13031321
13041322 hookSetting , err := mongodb .NewSystemSettingColl ().GetReleasePlanHookSetting ()
13051323 if err != nil {
@@ -1335,6 +1353,12 @@ func ReleasePlanHookCallback(c *handler.Context, callback *ReleasePlanCallBackBo
13351353 return fmtErr
13361354 }
13371355
1356+ if releasePlan .InstanceCode != callback .InstanceCode {
1357+ fmtErr := fmt .Errorf ("release plan instance code is not correct, name: %s, instance code: %s, expected: %s" , releasePlan .Name , callback .InstanceCode , releasePlan .InstanceCode )
1358+ log .Error (fmtErr )
1359+ return fmtErr
1360+ }
1361+
13381362 if ! hookEventStatusMap [releasePlan .Status ] {
13391363 fmtErr := fmt .Errorf ("release plan's status is not correct, status: %s" , releasePlan .Status )
13401364 log .Error (fmtErr )
@@ -1512,6 +1536,7 @@ func convertReleasePlanToHookBody(plan *models.ReleasePlan, hookEvent commonmode
15121536 Name : plan .Name ,
15131537 Manager : plan .Manager ,
15141538 ManagerID : plan .ManagerID ,
1539+ InstanceCode : plan .InstanceCode ,
15151540 StartTime : plan .StartTime ,
15161541 EndTime : plan .EndTime ,
15171542 ScheduleExecuteTime : plan .ScheduleExecuteTime ,
@@ -2056,3 +2081,37 @@ func waitForExternalCheck(plan *models.ReleasePlan, systemHookSetting *commonmod
20562081
20572082 return & nextStatus , shouldWait
20582083}
2084+
2085+ func generateInstanceCode (plan * models.ReleasePlan ) (string , error ) {
2086+ newPlan := new (models.ReleasePlan )
2087+ err := util .DeepCopy (newPlan , plan )
2088+ if err != nil {
2089+ err := fmt .Errorf ("failed deep copy plan, err: %v" , err )
2090+ log .Error (err )
2091+ return "" , err
2092+ }
2093+ newPlan .UpdateTime = 0
2094+ newPlan .UpdatedBy = ""
2095+ newPlan .InstanceCode = ""
2096+ newPlan .Status = ""
2097+ newPlan .PlanningTime = 0
2098+ newPlan .ApprovalTime = 0
2099+ newPlan .ExecutingTime = 0
2100+ newPlan .SuccessTime = 0
2101+ newPlan .WaitForApproveExternalCheckTime = 0
2102+ newPlan .WaitForExecuteExternalCheckTime = 0
2103+ newPlan .WaitForAllDoneExternalCheckTime = 0
2104+ newPlan .ExternalCheckFailedReason = ""
2105+
2106+ newPlanBytes , err := bson .Marshal (newPlan )
2107+ if err != nil {
2108+ err := fmt .Errorf ("failed marshal plan, err: %v" , err )
2109+ log .Error (err )
2110+ return "" , err
2111+ }
2112+
2113+ log .Debugf ("new plan bytes: %s" , string (newPlanBytes ))
2114+
2115+ sum := sha256 .Sum256 ([]byte (newPlanBytes ))
2116+ return hex .EncodeToString (sum [:])[:16 ], nil
2117+ }
0 commit comments