Wire catalog policy, v2 manifests, stage access, activation metadata fixes, and coordinator instance advance around frozen workflow snapshots. Co-authored-by: Cursor <cursoragent@cursor.com>
44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package projectinstance
|
|
|
|
import "context"
|
|
|
|
// TerminateInput 受控终止输入。
|
|
type TerminateInput struct {
|
|
Reason string `json:"reason"`
|
|
Confirm bool `json:"confirm"`
|
|
ExpectedConfigRevision int `json:"expected_config_revision"`
|
|
}
|
|
|
|
// TerminateResult 终止结果。
|
|
type TerminateResult struct {
|
|
Instance WorkflowInstance `json:"instance"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
func (s *Service) TerminateInstance(ctx context.Context, instanceID int64, projectID int64, userID int64, isCreator bool, in TerminateInput) (*TerminateResult, error) {
|
|
if !isCreator {
|
|
return nil, ErrForbiddenNotCreator
|
|
}
|
|
if !in.Confirm {
|
|
return nil, ErrTerminationNotAllowed
|
|
}
|
|
if in.Reason == "" {
|
|
return nil, ErrValidationFailed
|
|
}
|
|
if !s.Available() {
|
|
return nil, ErrNotAvailable
|
|
}
|
|
live, err := s.store.GetLiveInstance(ctx, projectID)
|
|
if err != nil || live == nil || live.ID != instanceID {
|
|
return nil, ErrInstanceNotFound
|
|
}
|
|
if in.ExpectedConfigRevision > 0 && live.ConfigRevision != in.ExpectedConfigRevision {
|
|
return nil, ErrInstanceRevisionConflict
|
|
}
|
|
inst, err := s.store.TerminateInstance(ctx, instanceID, projectID, userID, in.Reason)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &TerminateResult{Instance: *inst, Reason: in.Reason}, nil
|
|
}
|