Skip to content

Commit

Permalink
configstore: add ability to org members to restart stop cancel a proj…
Browse files Browse the repository at this point in the history
…ect run

update project type add MembersCanPerformRunActions
add ability to all org members to execute run actions
check MembersCanPerformRunActions is false when create/update user projects
  • Loading branch information
alessandro-sorint committed Oct 13, 2023
1 parent 94d3283 commit 06ad852
Show file tree
Hide file tree
Showing 24 changed files with 1,450 additions and 160 deletions.
20 changes: 20 additions & 0 deletions internal/services/configstore/action/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ type CreateUpdateProjectRequest struct {
SkipSSHHostKeyCheck bool
PassVarsToForkedPR bool
DefaultBranch string
// MembersCanPerformRunActions defines if project organization members can restart/stop/cancel a project run
MembersCanPerformRunActions bool
}

func (h *ActionHandler) CreateProject(ctx context.Context, req *CreateUpdateProjectRequest) (*types.Project, error) {
Expand All @@ -112,6 +114,14 @@ func (h *ActionHandler) CreateProject(ctx context.Context, req *CreateUpdateProj
}
req.Parent.ID = group.ID

ownerType, _, err := h.d.GetProjectGroupOwnerID(tx, group)
if err != nil {
return errors.WithStack(err)
}
if ownerType == types.ObjectKindUser && req.MembersCanPerformRunActions {
return util.NewAPIError(util.ErrBadRequest, errors.Errorf("cannot set MembersCanPerformRunActions on an user project."))
}

groupPath, err := h.d.GetProjectGroupPath(tx, group)
if err != nil {
return errors.WithStack(err)
Expand Down Expand Up @@ -163,6 +173,7 @@ func (h *ActionHandler) CreateProject(ctx context.Context, req *CreateUpdateProj
project.SkipSSHHostKeyCheck = req.SkipSSHHostKeyCheck
project.PassVarsToForkedPR = req.PassVarsToForkedPR
project.DefaultBranch = req.DefaultBranch
project.MembersCanPerformRunActions = req.MembersCanPerformRunActions

// generate the Secret and the WebhookSecret
// TODO(sgotti) move this to the gateway?
Expand Down Expand Up @@ -209,6 +220,14 @@ func (h *ActionHandler) UpdateProject(ctx context.Context, curProjectRef string,
}
req.Parent.ID = group.ID

ownerType, _, err := h.d.GetProjectGroupOwnerID(tx, group)
if err != nil {
return errors.WithStack(err)
}
if ownerType == types.ObjectKindUser && req.MembersCanPerformRunActions {
return util.NewAPIError(util.ErrBadRequest, errors.Errorf("cannot set MembersCanPerformRunActions on an user project."))
}

groupPath, err := h.d.GetProjectGroupPath(tx, group)
if err != nil {
return errors.WithStack(err)
Expand Down Expand Up @@ -273,6 +292,7 @@ func (h *ActionHandler) UpdateProject(ctx context.Context, curProjectRef string,
project.SkipSSHHostKeyCheck = req.SkipSSHHostKeyCheck
project.PassVarsToForkedPR = req.PassVarsToForkedPR
project.DefaultBranch = req.DefaultBranch
project.MembersCanPerformRunActions = req.MembersCanPerformRunActions

if err := h.d.UpdateProject(tx, project); err != nil {
return errors.WithStack(err)
Expand Down
50 changes: 26 additions & 24 deletions internal/services/configstore/api/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,18 +171,19 @@ func (h *CreateProjectHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
}

areq := &action.CreateUpdateProjectRequest{
Name: req.Name,
Parent: req.Parent,
Visibility: req.Visibility,
RemoteRepositoryConfigType: req.RemoteRepositoryConfigType,
RemoteSourceID: req.RemoteSourceID,
LinkedAccountID: req.LinkedAccountID,
RepositoryID: req.RepositoryID,
RepositoryPath: req.RepositoryPath,
SSHPrivateKey: req.SSHPrivateKey,
SkipSSHHostKeyCheck: req.SkipSSHHostKeyCheck,
PassVarsToForkedPR: req.PassVarsToForkedPR,
DefaultBranch: req.DefaultBranch,
Name: req.Name,
Parent: req.Parent,
Visibility: req.Visibility,
RemoteRepositoryConfigType: req.RemoteRepositoryConfigType,
RemoteSourceID: req.RemoteSourceID,
LinkedAccountID: req.LinkedAccountID,
RepositoryID: req.RepositoryID,
RepositoryPath: req.RepositoryPath,
SSHPrivateKey: req.SSHPrivateKey,
SkipSSHHostKeyCheck: req.SkipSSHHostKeyCheck,
PassVarsToForkedPR: req.PassVarsToForkedPR,
DefaultBranch: req.DefaultBranch,
MembersCanPerformRunActions: req.MembersCanPerformRunActions,
}

project, err := h.ah.CreateProject(ctx, areq)
Expand Down Expand Up @@ -230,18 +231,19 @@ func (h *UpdateProjectHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
}

areq := &action.CreateUpdateProjectRequest{
Name: req.Name,
Parent: req.Parent,
Visibility: req.Visibility,
RemoteRepositoryConfigType: req.RemoteRepositoryConfigType,
RemoteSourceID: req.RemoteSourceID,
LinkedAccountID: req.LinkedAccountID,
RepositoryID: req.RepositoryID,
RepositoryPath: req.RepositoryPath,
SSHPrivateKey: req.SSHPrivateKey,
SkipSSHHostKeyCheck: req.SkipSSHHostKeyCheck,
PassVarsToForkedPR: req.PassVarsToForkedPR,
DefaultBranch: req.DefaultBranch,
Name: req.Name,
Parent: req.Parent,
Visibility: req.Visibility,
RemoteRepositoryConfigType: req.RemoteRepositoryConfigType,
RemoteSourceID: req.RemoteSourceID,
LinkedAccountID: req.LinkedAccountID,
RepositoryID: req.RepositoryID,
RepositoryPath: req.RepositoryPath,
SSHPrivateKey: req.SSHPrivateKey,
SkipSSHHostKeyCheck: req.SkipSSHHostKeyCheck,
PassVarsToForkedPR: req.PassVarsToForkedPR,
DefaultBranch: req.DefaultBranch,
MembersCanPerformRunActions: req.MembersCanPerformRunActions,
}

project, err := h.ah.UpdateProject(ctx, projectRef, areq)
Expand Down
27 changes: 27 additions & 0 deletions internal/services/configstore/configstore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,33 @@ func TestProjectUpdate(t *testing.T) {
t.Fatalf("unexpected err: %v", err)
}
})
t.Run("test user project MembersCanPerformRunActions parameter", func(t *testing.T) {
expectedErr := util.NewAPIError(util.ErrBadRequest, errors.Errorf("cannot set MembersCanPerformRunActions on an user project."))
_, err := cs.ah.CreateProject(ctx, &action.CreateUpdateProjectRequest{
Name: "project03",
Parent: types.Parent{Kind: types.ObjectKindProjectGroup, ID: path.Join("user", user.Name)},
Visibility: types.VisibilityPublic,
RemoteRepositoryConfigType: types.RemoteRepositoryConfigTypeManual,
MembersCanPerformRunActions: true,
})
if err == nil {
t.Fatalf("expected error %v, got nil err", expectedErr)
}
if err.Error() != expectedErr.Error() {
t.Fatalf("expected err %v, got err: %v", expectedErr, err)
}

// test update user project

p01.MembersCanPerformRunActions = true
_, err = cs.ah.UpdateProject(ctx, path.Join("user", user.Name, "project01"), p01)
if err == nil {
t.Fatalf("expected error %v, got nil err", expectedErr)
}
if err.Error() != expectedErr.Error() {
t.Fatalf("expected err %v, got err: %v", expectedErr, err)
}
})
}

func TestProjectGroupUpdate(t *testing.T) {
Expand Down
4 changes: 2 additions & 2 deletions internal/services/configstore/db/ddl.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion internal/services/configstore/db/dml.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 06ad852

Please # to comment.