mirror of
https://github.com/harness/drone.git
synced 2025-05-08 03:20:35 +08:00
feat: [CDE-599]: Auto-creating infra resources at the root level. (#3383)
* feat: [CDE-599]: Auto-creating infra resources at the root level.
This commit is contained in:
parent
1c30053bd6
commit
e42e24cdfe
@ -30,6 +30,7 @@ type Controller struct {
|
|||||||
authorizer authz.Authorizer
|
authorizer authz.Authorizer
|
||||||
infraProviderSvc *infraprovider.Service
|
infraProviderSvc *infraprovider.Service
|
||||||
spaceCache refcache.SpaceCache
|
spaceCache refcache.SpaceCache
|
||||||
|
spaceStore store.SpaceStore
|
||||||
gitspaceEventStore store.GitspaceEventStore
|
gitspaceEventStore store.GitspaceEventStore
|
||||||
tx dbtx.Transactor
|
tx dbtx.Transactor
|
||||||
statefulLogger *logutil.StatefulLogger
|
statefulLogger *logutil.StatefulLogger
|
||||||
@ -44,6 +45,7 @@ func NewController(
|
|||||||
authorizer authz.Authorizer,
|
authorizer authz.Authorizer,
|
||||||
infraProviderSvc *infraprovider.Service,
|
infraProviderSvc *infraprovider.Service,
|
||||||
spaceCache refcache.SpaceCache,
|
spaceCache refcache.SpaceCache,
|
||||||
|
spaceStore store.SpaceStore,
|
||||||
gitspaceEventStore store.GitspaceEventStore,
|
gitspaceEventStore store.GitspaceEventStore,
|
||||||
statefulLogger *logutil.StatefulLogger,
|
statefulLogger *logutil.StatefulLogger,
|
||||||
scm *scm.SCM,
|
scm *scm.SCM,
|
||||||
@ -56,6 +58,7 @@ func NewController(
|
|||||||
authorizer: authorizer,
|
authorizer: authorizer,
|
||||||
infraProviderSvc: infraProviderSvc,
|
infraProviderSvc: infraProviderSvc,
|
||||||
spaceCache: spaceCache,
|
spaceCache: spaceCache,
|
||||||
|
spaceStore: spaceStore,
|
||||||
gitspaceEventStore: gitspaceEventStore,
|
gitspaceEventStore: gitspaceEventStore,
|
||||||
statefulLogger: statefulLogger,
|
statefulLogger: statefulLogger,
|
||||||
scm: scm,
|
scm: scm,
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
apiauth "github.com/harness/gitness/app/api/auth"
|
apiauth "github.com/harness/gitness/app/api/auth"
|
||||||
"github.com/harness/gitness/app/api/usererror"
|
"github.com/harness/gitness/app/api/usererror"
|
||||||
"github.com/harness/gitness/app/auth"
|
"github.com/harness/gitness/app/auth"
|
||||||
|
"github.com/harness/gitness/app/paths"
|
||||||
"github.com/harness/gitness/app/services/gitspace"
|
"github.com/harness/gitness/app/services/gitspace"
|
||||||
"github.com/harness/gitness/errors"
|
"github.com/harness/gitness/errors"
|
||||||
"github.com/harness/gitness/store"
|
"github.com/harness/gitness/store"
|
||||||
@ -111,7 +112,11 @@ func (c *Controller) Create(
|
|||||||
var gitspaceConfig *types.GitspaceConfig
|
var gitspaceConfig *types.GitspaceConfig
|
||||||
// assume resource to be in same space if it's not explicitly specified.
|
// assume resource to be in same space if it's not explicitly specified.
|
||||||
if in.ResourceSpaceRef == "" {
|
if in.ResourceSpaceRef == "" {
|
||||||
in.ResourceSpaceRef = in.SpaceRef
|
rootSpaceRef, _, err := paths.DisectRoot(in.SpaceRef)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to find root space path for %s: %w", in.SpaceRef, err)
|
||||||
|
}
|
||||||
|
in.ResourceSpaceRef = rootSpaceRef
|
||||||
}
|
}
|
||||||
resourceIdentifier := in.ResourceIdentifier
|
resourceIdentifier := in.ResourceIdentifier
|
||||||
resourceSpace, err := c.spaceCache.Get(ctx, in.ResourceSpaceRef)
|
resourceSpace, err := c.spaceCache.Get(ctx, in.ResourceSpaceRef)
|
||||||
@ -127,18 +132,11 @@ func (c *Controller) Create(
|
|||||||
enum.PermissionInfraProviderAccess); err != nil {
|
enum.PermissionInfraProviderAccess); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = c.createOrFindInfraProviderResource(ctx, resourceSpace, resourceIdentifier, now)
|
infraProviderResource, err := c.createOrFindInfraProviderResource(ctx, resourceSpace, resourceIdentifier, now)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = c.tx.WithTx(ctx, func(ctx context.Context) error {
|
err = c.tx.WithTx(ctx, func(ctx context.Context) error {
|
||||||
infraProviderResource, err := c.infraProviderSvc.FindResourceByIdentifier(
|
|
||||||
ctx,
|
|
||||||
resourceSpace.ID,
|
|
||||||
resourceIdentifier)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not find infra provider resource : %q %w", resourceIdentifier, err)
|
|
||||||
}
|
|
||||||
codeRepo := types.CodeRepo{
|
codeRepo := types.CodeRepo{
|
||||||
URL: in.CodeRepoURL,
|
URL: in.CodeRepoURL,
|
||||||
Ref: in.CodeRepoRef,
|
Ref: in.CodeRepoRef,
|
||||||
@ -183,34 +181,43 @@ func (c *Controller) Create(
|
|||||||
|
|
||||||
func (c *Controller) createOrFindInfraProviderResource(
|
func (c *Controller) createOrFindInfraProviderResource(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
parentSpace *types.Space,
|
resourceSpace *types.Space,
|
||||||
resourceIdentifier string,
|
resourceIdentifier string,
|
||||||
now int64,
|
now int64,
|
||||||
) error {
|
) (*types.InfraProviderResource, error) {
|
||||||
_, err := c.infraProviderSvc.FindResourceByIdentifier(
|
var resource *types.InfraProviderResource
|
||||||
ctx,
|
var err error
|
||||||
parentSpace.ID,
|
|
||||||
resourceIdentifier)
|
resource, err = c.infraProviderSvc.FindResourceByIdentifier(ctx, resourceSpace.ID, resourceIdentifier)
|
||||||
if err != nil &&
|
if err != nil && errors.Is(err, store.ErrResourceNotFound) && resourceIdentifier == defaultResourceIdentifier {
|
||||||
errors.Is(err, store.ErrResourceNotFound) &&
|
resource, err = c.autoCreateDefaultResource(ctx, resourceSpace, now)
|
||||||
resourceIdentifier == defaultResourceIdentifier {
|
|
||||||
err = c.autoCreateDefaultResource(ctx, parentSpace, now)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return fmt.Errorf("could not find infra provider resource : %q %w", resourceIdentifier, err)
|
return nil, fmt.Errorf("could not find infra provider resource : %q %w", resourceIdentifier, err)
|
||||||
}
|
}
|
||||||
return err
|
|
||||||
|
return resource, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) autoCreateDefaultResource(ctx context.Context, parentSpace *types.Space, now int64) error {
|
func (c *Controller) autoCreateDefaultResource(
|
||||||
|
ctx context.Context,
|
||||||
|
currentSpace *types.Space,
|
||||||
|
now int64,
|
||||||
|
) (*types.InfraProviderResource, error) {
|
||||||
|
rootSpace, err := c.spaceStore.GetRootSpace(ctx, currentSpace.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not get root space for space %s while autocreating default docker "+
|
||||||
|
"resource: %w", currentSpace.Path, err)
|
||||||
|
}
|
||||||
|
|
||||||
defaultDockerConfig := &types.InfraProviderConfig{
|
defaultDockerConfig := &types.InfraProviderConfig{
|
||||||
Identifier: defaultResourceIdentifier,
|
Identifier: defaultResourceIdentifier,
|
||||||
Name: "default docker infrastructure",
|
Name: "default docker infrastructure",
|
||||||
Type: enum.InfraProviderTypeDocker,
|
Type: enum.InfraProviderTypeDocker,
|
||||||
SpaceID: parentSpace.ID,
|
SpaceID: rootSpace.ID,
|
||||||
SpacePath: parentSpace.Path,
|
SpacePath: rootSpace.Path,
|
||||||
Created: now,
|
Created: now,
|
||||||
Updated: now,
|
Updated: now,
|
||||||
}
|
}
|
||||||
@ -223,17 +230,24 @@ func (c *Controller) autoCreateDefaultResource(ctx context.Context, parentSpace
|
|||||||
Memory: wrapString("any"),
|
Memory: wrapString("any"),
|
||||||
Disk: wrapString("any"),
|
Disk: wrapString("any"),
|
||||||
Network: wrapString("standard"),
|
Network: wrapString("standard"),
|
||||||
SpaceID: parentSpace.ID,
|
SpaceID: rootSpace.ID,
|
||||||
SpacePath: parentSpace.Path,
|
SpacePath: rootSpace.Path,
|
||||||
Created: now,
|
Created: now,
|
||||||
Updated: now,
|
Updated: now,
|
||||||
}
|
}
|
||||||
defaultDockerConfig.Resources = []types.InfraProviderResource{defaultResource}
|
defaultDockerConfig.Resources = []types.InfraProviderResource{defaultResource}
|
||||||
err := c.infraProviderSvc.CreateInfraProvider(ctx, defaultDockerConfig)
|
|
||||||
|
err = c.infraProviderSvc.CreateInfraProvider(ctx, defaultDockerConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not auto-create the infra provider: %w", err)
|
return nil, fmt.Errorf("could not auto-create the infra provider: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
resource, err := c.infraProviderSvc.FindResourceByIdentifier(ctx, rootSpace.ID, defaultResourceIdentifier)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not find infra provider resource : %q %w", defaultResourceIdentifier, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resource, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func wrapString(str string) *string {
|
func wrapString(str string) *string {
|
||||||
|
@ -38,6 +38,7 @@ func ProvideController(
|
|||||||
authorizer authz.Authorizer,
|
authorizer authz.Authorizer,
|
||||||
infraProviderSvc *infraprovider.Service,
|
infraProviderSvc *infraprovider.Service,
|
||||||
spaceCache refcache.SpaceCache,
|
spaceCache refcache.SpaceCache,
|
||||||
|
spaceStore store.SpaceStore,
|
||||||
eventStore store.GitspaceEventStore,
|
eventStore store.GitspaceEventStore,
|
||||||
statefulLogger *logutil.StatefulLogger,
|
statefulLogger *logutil.StatefulLogger,
|
||||||
scm *scm.SCM,
|
scm *scm.SCM,
|
||||||
@ -50,6 +51,7 @@ func ProvideController(
|
|||||||
authorizer,
|
authorizer,
|
||||||
infraProviderSvc,
|
infraProviderSvc,
|
||||||
spaceCache,
|
spaceCache,
|
||||||
|
spaceStore,
|
||||||
eventStore,
|
eventStore,
|
||||||
statefulLogger,
|
statefulLogger,
|
||||||
scm,
|
scm,
|
||||||
|
@ -427,7 +427,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
|
|||||||
keywordsearchController := keywordsearch2.ProvideController(authorizer, searcher, repoController, spaceController)
|
keywordsearchController := keywordsearch2.ProvideController(authorizer, searcher, repoController, spaceController)
|
||||||
infraproviderController := infraprovider3.ProvideController(authorizer, spaceCache, infraproviderService)
|
infraproviderController := infraprovider3.ProvideController(authorizer, spaceCache, infraproviderService)
|
||||||
limiterGitspace := limiter.ProvideGitspaceLimiter()
|
limiterGitspace := limiter.ProvideGitspaceLimiter()
|
||||||
gitspaceController := gitspace2.ProvideController(transactor, authorizer, infraproviderService, spaceCache, gitspaceEventStore, statefulLogger, scmSCM, gitspaceService, limiterGitspace, repoFinder)
|
gitspaceController := gitspace2.ProvideController(transactor, authorizer, infraproviderService, spaceCache, spaceStore, gitspaceEventStore, statefulLogger, scmSCM, gitspaceService, limiterGitspace, repoFinder)
|
||||||
rule := migrate.ProvideRuleImporter(ruleStore, transactor, principalStore)
|
rule := migrate.ProvideRuleImporter(ruleStore, transactor, principalStore)
|
||||||
migrateWebhook := migrate.ProvideWebhookImporter(webhookConfig, transactor, webhookStore)
|
migrateWebhook := migrate.ProvideWebhookImporter(webhookConfig, transactor, webhookStore)
|
||||||
migrateLabel := migrate.ProvideLabelImporter(transactor, labelStore, labelValueStore, spaceStore)
|
migrateLabel := migrate.ProvideLabelImporter(transactor, labelStore, labelValueStore, spaceStore)
|
||||||
|
Loading…
Reference in New Issue
Block a user