Skip to content

Commit 76c9cb1

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

File tree

4 files changed

+59
-19
lines changed

4 files changed

+59
-19
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: 34 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,25 @@ 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+
if job.ManagerID != "" {
89+
if job.ManagerID != e.Ctx.UserID && plan.ManagerID != e.Ctx.UserID && !e.Ctx.AuthResources.IsSystemAdmin {
90+
return errors.Errorf("user %s is not the manager of the job %s", e.Ctx.UserName, job.Name)
91+
}
92+
} else {
93+
if plan.ManagerID == "" {
94+
return errors.Errorf("plan manager is not set")
95+
}
96+
97+
if job.ManagerID != plan.ManagerID && !e.Ctx.AuthResources.IsSystemAdmin {
98+
return errors.Errorf("user %s is not the manager of the plan %s", e.Ctx.UserName, plan.Name)
99+
}
100+
}
101+
84102
if job.Status != config.ReleasePlanJobStatusTodo {
85103
return errors.Errorf("job %s status is not todo", job.Name)
86104
}
@@ -119,12 +137,28 @@ func (e *WorkflowReleaseJobExecutor) Execute(plan *models.ReleasePlan) error {
119137
if job.ID != e.ID {
120138
continue
121139
}
140+
122141
if err := models.IToi(job.Spec, spec); err != nil {
123142
return errors.Wrap(err, "invalid spec")
124143
}
125144
if spec.Workflow == nil {
126145
return errors.Errorf("workflow is nil")
127146
}
147+
148+
if job.ManagerID != "" {
149+
if job.ManagerID != e.Ctx.UserID && plan.ManagerID != e.Ctx.UserID && !e.Ctx.AuthResources.IsSystemAdmin {
150+
return errors.Errorf("user %s is not the manager of the job %s", e.Ctx.UserName, job.Name)
151+
}
152+
} else {
153+
if plan.ManagerID == "" {
154+
return errors.Errorf("plan manager is not set")
155+
}
156+
157+
if job.ManagerID != plan.ManagerID && !e.Ctx.AuthResources.IsSystemAdmin {
158+
return errors.Errorf("user %s is not the manager of the plan %s", e.Ctx.UserName, plan.Name)
159+
}
160+
}
161+
128162
// workflow support retry after failed
129163
if job.Status != config.ReleasePlanJobStatusTodo && job.Status != config.ReleasePlanJobStatusFailed {
130164
return errors.Errorf("job %s status %s can't execute", job.Name, job.Status)

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

Lines changed: 0 additions & 4 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,

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)