[HARNESS] Delete Space on Harness Account/Org/Project deletion (#83)

This commit is contained in:
Atefeh Mohseni-Ejiyeh 2023-06-08 00:09:34 +00:00 committed by Harness
parent c51cc4e2c4
commit 0df1335855
14 changed files with 48 additions and 35 deletions

View File

@ -157,7 +157,13 @@ proto:
--go-grpc_opt=paths=source_relative \ --go-grpc_opt=paths=source_relative \
./gitrpc/proto/*.proto ./gitrpc/proto/*.proto
harness-proto:
@protoc --proto_path=./harness/proto \
--go_out=./harness/rpc \
--go_opt=paths=source_relative \
--go-grpc_out=./harness/rpc \
--go-grpc_opt=paths=source_relative \
./harness/proto/*.proto
########################################### ###########################################
# Install Tools and deps # Install Tools and deps
# #

View File

@ -19,6 +19,8 @@ import (
"github.com/harness/gitness/harness/bootstrap" "github.com/harness/gitness/harness/bootstrap"
"github.com/harness/gitness/harness/client" "github.com/harness/gitness/harness/client"
"github.com/harness/gitness/harness/router" "github.com/harness/gitness/harness/router"
harnessservices "github.com/harness/gitness/harness/services"
harnessevents "github.com/harness/gitness/harness/services/events"
"github.com/harness/gitness/harness/store" "github.com/harness/gitness/harness/store"
"github.com/harness/gitness/harness/types/check" "github.com/harness/gitness/harness/types/check"
"github.com/harness/gitness/internal/api/controller/githook" "github.com/harness/gitness/internal/api/controller/githook"
@ -33,7 +35,6 @@ import (
gitevents "github.com/harness/gitness/internal/events/git" gitevents "github.com/harness/gitness/internal/events/git"
pullreqevents "github.com/harness/gitness/internal/events/pullreq" pullreqevents "github.com/harness/gitness/internal/events/pullreq"
"github.com/harness/gitness/internal/server" "github.com/harness/gitness/internal/server"
"github.com/harness/gitness/internal/services"
"github.com/harness/gitness/internal/services/codecomments" "github.com/harness/gitness/internal/services/codecomments"
pullreqservice "github.com/harness/gitness/internal/services/pullreq" pullreqservice "github.com/harness/gitness/internal/services/pullreq"
"github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/internal/services/webhook"
@ -51,11 +52,12 @@ func initSystem(ctx context.Context, config *gitnesstypes.Config) (*system, erro
wire.Build( wire.Build(
newSystem, newSystem,
ProvideHarnessConfig, ProvideHarnessConfig,
harnessevents.WireSet,
ProvideRedis, ProvideRedis,
bootstrap.WireSet, bootstrap.WireSet,
database.WireSet, database.WireSet,
pullreqservice.WireSet, pullreqservice.WireSet,
services.WireSet, harnessservices.WireSet,
cache.WireSet, cache.WireSet,
server.WireSet, server.WireSet,
url.WireSet, url.WireSet,

View File

@ -7,7 +7,6 @@ package server
import ( import (
"context" "context"
"github.com/harness/gitness/events" "github.com/harness/gitness/events"
"github.com/harness/gitness/gitrpc" "github.com/harness/gitness/gitrpc"
server2 "github.com/harness/gitness/gitrpc/server" server2 "github.com/harness/gitness/gitrpc/server"
@ -17,6 +16,8 @@ import (
"github.com/harness/gitness/harness/bootstrap" "github.com/harness/gitness/harness/bootstrap"
"github.com/harness/gitness/harness/client" "github.com/harness/gitness/harness/client"
"github.com/harness/gitness/harness/router" "github.com/harness/gitness/harness/router"
"github.com/harness/gitness/harness/services"
events4 "github.com/harness/gitness/harness/services/events"
"github.com/harness/gitness/harness/store" "github.com/harness/gitness/harness/store"
"github.com/harness/gitness/harness/types/check" "github.com/harness/gitness/harness/types/check"
"github.com/harness/gitness/internal/api/controller/githook" "github.com/harness/gitness/internal/api/controller/githook"
@ -32,7 +33,6 @@ import (
events2 "github.com/harness/gitness/internal/events/pullreq" events2 "github.com/harness/gitness/internal/events/pullreq"
router2 "github.com/harness/gitness/internal/router" router2 "github.com/harness/gitness/internal/router"
"github.com/harness/gitness/internal/server" "github.com/harness/gitness/internal/server"
"github.com/harness/gitness/internal/services"
"github.com/harness/gitness/internal/services/codecomments" "github.com/harness/gitness/internal/services/codecomments"
pullreq2 "github.com/harness/gitness/internal/services/pullreq" pullreq2 "github.com/harness/gitness/internal/services/pullreq"
"github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/internal/services/webhook"
@ -186,7 +186,14 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
servicesServices := services.ProvideServices(webhookService, pullreqService) eventsService, err := events4.ProvideEventService(ctx, typesConfig, spaceController, config)
if err != nil {
return nil, err
}
servicesServices, err := services.ProvideServices(ctx, webhookService, pullreqService, eventsService)
if err != nil {
return nil, err
}
serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, manager, servicesServices) serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, manager, servicesServices)
return serverSystem, nil return serverSystem, nil
} }

View File

@ -7,7 +7,6 @@ package server
import ( import (
"context" "context"
"github.com/harness/gitness/events" "github.com/harness/gitness/events"
"github.com/harness/gitness/gitrpc" "github.com/harness/gitness/gitrpc"
server2 "github.com/harness/gitness/gitrpc/server" server2 "github.com/harness/gitness/gitrpc/server"

View File

@ -219,8 +219,7 @@ func (s RepositoryService) DeleteRepository(
} }
repoPath := getFullPathForRepo(s.reposRoot, base.RepoUid) repoPath := getFullPathForRepo(s.reposRoot, base.RepoUid)
// check if directory exists
// if dir does not exist already fail silently
if _, err := os.Stat(repoPath); err != nil && os.IsNotExist(err) { if _, err := os.Stat(repoPath); err != nil && os.IsNotExist(err) {
return nil, ErrNotFound(err) return nil, ErrNotFound(err)
} else if err != nil { } else if err != nil {

View File

@ -122,7 +122,6 @@ func (c *Client) DeleteRepository(ctx context.Context, params *DeleteRepositoryP
if params == nil { if params == nil {
return ErrNoParamsProvided return ErrNoParamsProvided
} }
_, err := c.repoService.DeleteRepository(ctx, &rpc.DeleteRepositoryRequest{ _, err := c.repoService.DeleteRepository(ctx, &rpc.DeleteRepositoryRequest{
Base: mapToRPCWriteRequest(params.WriteParams), Base: mapToRPCWriteRequest(params.WriteParams),
}) })

View File

@ -87,8 +87,7 @@ func (c *Controller) Create(ctx context.Context, session *auth.Session, in *Crea
// cleanup git repo if we fail to create repo in db (best effort deletion) // cleanup git repo if we fail to create repo in db (best effort deletion)
defer func() { defer func() {
if dberr != nil { if dberr != nil {
err := c.DeleteRepositoryRPC(ctx, session, repo) if err := c.DeleteRepositoryRPC(ctx, session, repo); err != nil {
if err != nil {
log.Ctx(ctx).Warn().Err(err).Msg("gitrpc failed to delete repo for cleanup") log.Ctx(ctx).Warn().Err(err).Msg("gitrpc failed to delete repo for cleanup")
} }
} }

View File

@ -24,30 +24,25 @@ func (c *Controller) Delete(ctx context.Context, session *auth.Session, spaceRef
if err = apiauth.CheckSpace(ctx, c.authorizer, session, space, enum.PermissionSpaceDelete, false); err != nil { if err = apiauth.CheckSpace(ctx, c.authorizer, session, space, enum.PermissionSpaceDelete, false); err != nil {
return err return err
} }
sfilter := &types.SpaceFilter{
return c.DeleteNoAuth(ctx, session, space.ID)
}
// DeleteNoAuth bypasses PermissionSpaceDelete, PermissionSpaceView, PermissionRepoView, and PermissionRepoDelete.
func (c *Controller) DeleteNoAuth(ctx context.Context, session *auth.Session, spaceID int64) error {
filter := &types.SpaceFilter{
Page: 1, Page: 1,
Size: int(math.MaxInt), Size: int(math.MaxInt),
Query: "", Query: "",
Order: enum.OrderAsc, Order: enum.OrderAsc,
Sort: enum.SpaceAttrNone, Sort: enum.SpaceAttrNone,
} }
return c.DeleteNoAuth(ctx, session, space.ID, sfilter)
}
// DeleteNoAuth bypasses these permission
// PermissionSpaceDelete, PermissionSpaceView, PermissionRepoView, PermissionRepoDelete.
func (c *Controller) DeleteNoAuth(
ctx context.Context,
session *auth.Session,
spaceID int64,
filter *types.SpaceFilter,
) error {
subSpaces, _, err := c.ListSpacesNoAuth(ctx, spaceID, filter) subSpaces, _, err := c.ListSpacesNoAuth(ctx, spaceID, filter)
if err != nil { if err != nil {
return fmt.Errorf("failed to list space %d sub spaces: %w", spaceID, err) return fmt.Errorf("failed to list space %d sub spaces: %w", spaceID, err)
} }
for _, space := range subSpaces { for _, space := range subSpaces {
err = c.DeleteNoAuth(ctx, session, space.ID, filter) err = c.DeleteNoAuth(ctx, session, space.ID)
if err != nil { if err != nil {
return fmt.Errorf("failed to delete space %d: %w", space.ID, err) return fmt.Errorf("failed to delete space %d: %w", space.ID, err)
} }
@ -62,3 +57,11 @@ func (c *Controller) DeleteNoAuth(
} }
return nil return nil
} }
func (c *Controller) DeleteWithPathNoAuth(ctx context.Context, session *auth.Session, spacePath string) error {
space, err := c.spaceStore.FindByRef(ctx, spacePath)
if err != nil {
return err
}
return c.DeleteNoAuth(ctx, session, space.ID)
}

View File

@ -14,7 +14,7 @@ import (
"github.com/harness/gitness/types/enum" "github.com/harness/gitness/types/enum"
) )
// deleteRepositoriesNoAuth does not check PermissionRepoView, and PermissionRepoDelete permissions // deleteRepositoriesNoAuth does not check PermissionRepoView, and PermissionRepoDelete permissions.
// Call this through Delete(Space) api to make sure the caller has DeleteSpace permission. // Call this through Delete(Space) api to make sure the caller has DeleteSpace permission.
func (c *Controller) deleteRepositoriesNoAuth(ctx context.Context, session *auth.Session, spaceID int64) error { func (c *Controller) deleteRepositoriesNoAuth(ctx context.Context, session *auth.Session, spaceID int64) error {
filter := &types.RepoFilter{ filter := &types.RepoFilter{

View File

@ -7,6 +7,7 @@ package space
import ( import (
"net/http" "net/http"
"github.com/harness/gitness/internal/api/controller/repo"
"github.com/harness/gitness/internal/api/controller/space" "github.com/harness/gitness/internal/api/controller/space"
"github.com/harness/gitness/internal/api/render" "github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request" "github.com/harness/gitness/internal/api/request"
@ -15,7 +16,7 @@ import (
/* /*
* Deletes a space. * Deletes a space.
*/ */
func HandleDelete(spaceCtrl *space.Controller) http.HandlerFunc { func HandleDelete(spaceCtrl *space.Controller, repoCtrl *repo.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx) session, _ := request.AuthSessionFrom(ctx)

View File

@ -13,8 +13,8 @@ import (
"github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/internal/services/webhook"
"github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/store"
"github.com/harness/gitness/types/check" "github.com/harness/gitness/types/check"
"github.com/harness/go-rbac"
"github.com/harness/go-rbac"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -109,7 +109,7 @@ func setupRoutesV1(r chi.Router,
repoCtrl *repo.Controller, spaceCtrl *space.Controller, repoCtrl *repo.Controller, spaceCtrl *space.Controller,
pullreqCtrl *pullreq.Controller, webhookCtrl *webhook.Controller, githookCtrl *githook.Controller, pullreqCtrl *pullreq.Controller, webhookCtrl *webhook.Controller, githookCtrl *githook.Controller,
saCtrl *serviceaccount.Controller, userCtrl *user.Controller, principalCtrl *principal.Controller) { saCtrl *serviceaccount.Controller, userCtrl *user.Controller, principalCtrl *principal.Controller) {
setupSpaces(r, spaceCtrl) setupSpaces(r, spaceCtrl, repoCtrl)
setupRepos(r, repoCtrl, pullreqCtrl, webhookCtrl) setupRepos(r, repoCtrl, pullreqCtrl, webhookCtrl)
setupUser(r, userCtrl) setupUser(r, userCtrl)
setupServiceAccounts(r, saCtrl) setupServiceAccounts(r, saCtrl)
@ -121,7 +121,7 @@ func setupRoutesV1(r chi.Router,
setupResources(r) setupResources(r)
} }
func setupSpaces(r chi.Router, spaceCtrl *space.Controller) { func setupSpaces(r chi.Router, spaceCtrl *space.Controller, repoCtrl *repo.Controller) {
r.Route("/spaces", func(r chi.Router) { r.Route("/spaces", func(r chi.Router) {
// Create takes path and parentId via body, not uri // Create takes path and parentId via body, not uri
r.Post("/", handlerspace.HandleCreate(spaceCtrl)) r.Post("/", handlerspace.HandleCreate(spaceCtrl))
@ -130,7 +130,7 @@ func setupSpaces(r chi.Router, spaceCtrl *space.Controller) {
// space operations // space operations
r.Get("/", handlerspace.HandleFind(spaceCtrl)) r.Get("/", handlerspace.HandleFind(spaceCtrl))
r.Patch("/", handlerspace.HandleUpdate(spaceCtrl)) r.Patch("/", handlerspace.HandleUpdate(spaceCtrl))
r.Delete("/", handlerspace.HandleDelete(spaceCtrl)) r.Delete("/", handlerspace.HandleDelete(spaceCtrl, repoCtrl))
r.Post("/move", handlerspace.HandleMove(spaceCtrl)) r.Post("/move", handlerspace.HandleMove(spaceCtrl))
r.Get("/spaces", handlerspace.HandleListSpaces(spaceCtrl)) r.Get("/spaces", handlerspace.HandleListSpaces(spaceCtrl))

View File

@ -8,10 +8,9 @@ import (
context "context" context "context"
reflect "reflect" reflect "reflect"
gomock "github.com/golang/mock/gomock"
user "github.com/harness/gitness/internal/api/controller/user" user "github.com/harness/gitness/internal/api/controller/user"
types "github.com/harness/gitness/types" types "github.com/harness/gitness/types"
gomock "github.com/golang/mock/gomock"
) )
// MockClient is a mock of Client interface. // MockClient is a mock of Client interface.

View File

@ -8,10 +8,9 @@ import (
context "context" context "context"
reflect "reflect" reflect "reflect"
gomock "github.com/golang/mock/gomock"
types "github.com/harness/gitness/types" types "github.com/harness/gitness/types"
enum "github.com/harness/gitness/types/enum" enum "github.com/harness/gitness/types/enum"
gomock "github.com/golang/mock/gomock"
) )
// MockPrincipalStore is a mock of PrincipalStore interface. // MockPrincipalStore is a mock of PrincipalStore interface.