Skip to content

Commit e617a21

Browse files
committed
support job manager in release plan
Signed-off-by: Patrick Zhao <zhaoyu@koderover.com>
1 parent 0f68129 commit e617a21

File tree

5 files changed

+71
-23
lines changed

5 files changed

+71
-23
lines changed

pkg/microservice/aslan/core/common/repository/models/release_plan.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,12 @@ func (ReleasePlan) TableName() string {
8686
}
8787

8888
type ReleaseJob struct {
89-
ID string `bson:"id" yaml:"id" json:"id"`
90-
Name string `bson:"name" yaml:"name" json:"name"`
91-
Type config.ReleasePlanJobType `bson:"type" yaml:"type" json:"type"`
92-
Spec interface{} `bson:"spec" yaml:"spec" json:"spec"`
89+
ID string `bson:"id" yaml:"id" json:"id"`
90+
Name string `bson:"name" yaml:"name" json:"name"`
91+
Manager string `bson:"manager" yaml:"manager" json:"manager"`
92+
ManagerID string `bson:"manager_id" yaml:"manager_id" json:"manager_id"`
93+
Type config.ReleasePlanJobType `bson:"type" yaml:"type" json:"type"`
94+
Spec interface{} `bson:"spec" yaml:"spec" json:"spec"`
9395

9496
ReleaseJobRuntime `bson:",inline" yaml:",inline" json:",inline"`
9597
}

pkg/microservice/aslan/core/release_plan/service/execute.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func NewReleaseJobExecutor(c *ExecuteReleaseJobContext, args *ExecuteReleaseJobA
5555
type TextReleaseJobExecutor struct {
5656
ID string
5757
ExecutedBy string
58+
Ctx *ExecuteReleaseJobContext
5859
Spec TextReleaseJobSpec
5960
}
6061

@@ -69,6 +70,7 @@ func NewTextReleaseJobExecutor(c *ExecuteReleaseJobContext, args *ExecuteRelease
6970
}
7071
executor.ID = args.ID
7172
executor.ExecutedBy = c.UserName
73+
executor.Ctx = c
7274
return &executor, nil
7375
}
7476

@@ -78,9 +80,16 @@ func (e *TextReleaseJobExecutor) Execute(plan *models.ReleasePlan) error {
7880
if job.ID != e.ID {
7981
continue
8082
}
83+
8184
if err := models.IToi(job.Spec, spec); err != nil {
8285
return errors.Wrap(err, "invalid spec")
8386
}
87+
88+
err := jobManagerAuth(plan.Name, plan.ManagerID, job, e.ExecutedBy, e.Ctx.UserID, e.Ctx.AuthResources)
89+
if err != nil {
90+
return err
91+
}
92+
8493
if job.Status != config.ReleasePlanJobStatusTodo {
8594
return errors.Errorf("job %s status is not todo", job.Name)
8695
}
@@ -119,12 +128,19 @@ func (e *WorkflowReleaseJobExecutor) Execute(plan *models.ReleasePlan) error {
119128
if job.ID != e.ID {
120129
continue
121130
}
131+
122132
if err := models.IToi(job.Spec, spec); err != nil {
123133
return errors.Wrap(err, "invalid spec")
124134
}
125135
if spec.Workflow == nil {
126136
return errors.Errorf("workflow is nil")
127137
}
138+
139+
err := jobManagerAuth(plan.Name, plan.ManagerID, job, e.Ctx.UserName, e.Ctx.UserID, e.Ctx.AuthResources)
140+
if err != nil {
141+
return err
142+
}
143+
128144
// workflow support retry after failed
129145
if job.Status != config.ReleasePlanJobStatusTodo && job.Status != config.ReleasePlanJobStatusFailed {
130146
return errors.Errorf("job %s status %s can't execute", job.Name, job.Status)
@@ -156,3 +172,20 @@ func (e *WorkflowReleaseJobExecutor) Execute(plan *models.ReleasePlan) error {
156172
}
157173
return errors.Errorf("job %s not found", e.ID)
158174
}
175+
176+
func jobManagerAuth(planName, planManageID string, job *models.ReleaseJob, userName string, userID string, authResources *user.AuthorizedResources) error {
177+
if job.ManagerID != "" {
178+
if job.ManagerID != userID && planManageID != userID && !authResources.IsSystemAdmin {
179+
return errors.Errorf("user %s is not the manager of the job %s", userName, job.Name)
180+
}
181+
} else {
182+
if planManageID == "" {
183+
return errors.Errorf("plan manager is not set")
184+
}
185+
186+
if planManageID != userID && !authResources.IsSystemAdmin {
187+
return errors.Errorf("user %s is not the manager of the plan %s", userName, planName)
188+
}
189+
}
190+
return nil
191+
}

pkg/microservice/aslan/core/release_plan/service/release_plan.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,6 @@ func ExecuteReleaseJob(c *handler.Context, planID string, args *ExecuteReleaseJo
512512
}
513513
}
514514

515-
if plan.ManagerID != c.UserID && !isSystemAdmin {
516-
return errors.Errorf("only manager can execute")
517-
}
518-
519515
executor, err := NewReleaseJobExecutor(&ExecuteReleaseJobContext{
520516
AuthResources: c.Resources,
521517
UserID: c.UserID,
@@ -757,10 +753,6 @@ func SkipReleaseJob(c *handler.Context, planID string, args *SkipReleaseJobArgs,
757753
}
758754
}
759755

760-
if plan.ManagerID != c.UserID && !isSystemAdmin {
761-
return errors.Errorf("only manager can skip")
762-
}
763-
764756
skipper, err := NewReleaseJobSkipper(&SkipReleaseJobContext{
765757
AuthResources: c.Resources,
766758
UserID: c.UserID,

pkg/microservice/aslan/core/release_plan/service/skip.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ func (e *WorkflowReleaseJobSkipper) Skip(plan *models.ReleasePlan) error {
8080
return errors.Errorf("job %s status %s can't skip", job.Name, job.Status)
8181
}
8282

83+
err := jobManagerAuth(plan.Name, plan.ManagerID, job, e.Ctx.UserName, e.Ctx.UserID, e.Ctx.AuthResources)
84+
if err != nil {
85+
return err
86+
}
87+
8388
job.Status = config.ReleasePlanJobStatusSkipped
8489
job.ExecutedBy = e.Ctx.Account
8590
job.ExecutedTime = time.Now().Unix()
@@ -91,6 +96,7 @@ func (e *WorkflowReleaseJobSkipper) Skip(plan *models.ReleasePlan) error {
9196
type TextReleaseJobSkipper struct {
9297
ID string
9398
SkippedBy string
99+
Ctx *SkipReleaseJobContext
94100
Spec TextReleaseJobSpec
95101
}
96102

@@ -101,6 +107,7 @@ func NewTextReleaseJobSkipper(c *SkipReleaseJobContext, args *SkipReleaseJobArgs
101107
}
102108
executor.ID = args.ID
103109
executor.SkippedBy = c.UserName
110+
executor.Ctx = c
104111
return &executor, nil
105112
}
106113

@@ -116,6 +123,12 @@ func (e *TextReleaseJobSkipper) Skip(plan *models.ReleasePlan) error {
116123
if job.Status != config.ReleasePlanJobStatusTodo {
117124
return errors.Errorf("job %s status is not todo", job.Name)
118125
}
126+
127+
err := jobManagerAuth(plan.Name, plan.ManagerID, job, e.Ctx.UserName, e.Ctx.UserID, e.Ctx.AuthResources)
128+
if err != nil {
129+
return err
130+
}
131+
119132
spec.Remark = e.Spec.Remark
120133
job.Spec = spec
121134
job.Status = config.ReleasePlanJobStatusSkipped

pkg/microservice/aslan/core/release_plan/service/update.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,11 @@ func (u *ManagerUpdater) Verb() string {
289289
}
290290

291291
type CreateReleaseJobUpdater struct {
292-
Name string `json:"name"`
293-
Type config.ReleasePlanJobType `json:"type"`
294-
Spec interface{} `json:"spec"`
292+
Name string `json:"name"`
293+
Type config.ReleasePlanJobType `json:"type"`
294+
Manager string `json:"manager"`
295+
ManagerID string `json:"manager_id"`
296+
Spec interface{} `json:"spec"`
295297
}
296298

297299
func NewCreateReleaseJobUpdater(args *UpdateReleasePlanArgs) (*CreateReleaseJobUpdater, error) {
@@ -305,10 +307,12 @@ func NewCreateReleaseJobUpdater(args *UpdateReleasePlanArgs) (*CreateReleaseJobU
305307
func (u *CreateReleaseJobUpdater) Update(plan *models.ReleasePlan) (before interface{}, after interface{}, err error) {
306308
before, after = nil, u
307309
job := &models.ReleaseJob{
308-
ID: uuid.New().String(),
309-
Name: u.Name,
310-
Type: u.Type,
311-
Spec: u.Spec,
310+
ID: uuid.New().String(),
311+
Name: u.Name,
312+
Manager: u.Manager,
313+
ManagerID: u.ManagerID,
314+
Type: u.Type,
315+
Spec: u.Spec,
312316
}
313317
plan.Jobs = append(plan.Jobs, job)
314318
return
@@ -335,10 +339,12 @@ func (u *CreateReleaseJobUpdater) Verb() string {
335339
}
336340

337341
type UpdateReleaseJobUpdater struct {
338-
ID string `json:"id"`
339-
Name string `json:"name"`
340-
Type config.ReleasePlanJobType `json:"type"`
341-
Spec interface{} `json:"spec"`
342+
ID string `json:"id"`
343+
Name string `json:"name"`
344+
Manager string `json:"manager"`
345+
ManagerID string `json:"manager_id"`
346+
Type config.ReleasePlanJobType `json:"type"`
347+
Spec interface{} `json:"spec"`
342348
}
343349

344350
func NewUpdateReleaseJobUpdater(args *UpdateReleasePlanArgs) (*UpdateReleaseJobUpdater, error) {
@@ -357,6 +363,8 @@ func (u *UpdateReleaseJobUpdater) Update(plan *models.ReleasePlan) (before inter
357363
}
358364
before, after = job, u
359365
job.Name = u.Name
366+
job.Manager = u.Manager
367+
job.ManagerID = u.ManagerID
360368
job.Spec = u.Spec
361369
job.Updated = true
362370
return

0 commit comments

Comments
 (0)