diff --git a/cmd/run-cli/cmd/repository.go b/cmd/run-cli/cmd/repository.go index d6b6838e..c0f3e6ec 100644 --- a/cmd/run-cli/cmd/repository.go +++ b/cmd/run-cli/cmd/repository.go @@ -159,6 +159,7 @@ func formatRepositories(repos []params.Repository) { func formatOneRepository(repo params.Repository) { t := table.NewWriter() + rowConfigAutoMerge := table.RowConfig{AutoMerge: true} header := table.Row{"Field", "Value"} t.AppendHeader(header) t.AppendRow(table.Row{"ID", repo.ID}) @@ -168,8 +169,13 @@ func formatOneRepository(repo params.Repository) { if len(repo.Pools) > 0 { for _, pool := range repo.Pools { - t.AppendRow(table.Row{"Pools", pool.ID}) + t.AppendRow(table.Row{"Pools", pool.ID}, rowConfigAutoMerge) } } + t.SetColumnConfigs([]table.ColumnConfig{ + {Number: 1, AutoMerge: true}, + {Number: 2, AutoMerge: true}, + }) + fmt.Println(t.Render()) } diff --git a/database/sql/sql.go b/database/sql/sql.go index 95533cac..ba9237e5 100644 --- a/database/sql/sql.go +++ b/database/sql/sql.go @@ -446,6 +446,15 @@ func (s *sqlDatabase) CreateRepositoryPool(ctx context.Context, repoId string, p Enabled: param.Enabled, } + _, err = s.getRepoPoolByUniqueFields(ctx, repoId, newPool.ProviderName, newPool.Image, newPool.Flavor) + if err != nil { + if !errors.Is(err, runnerErrors.ErrNotFound) { + return params.Pool{}, errors.Wrap(err, "creating pool") + } + } else { + return params.Pool{}, runnerErrors.NewConflictError("pool with the same image and flavor already exists on this provider") + } + tags := []Tag{} for _, val := range param.Tags { t, err := s.getOrCreateTag(val) @@ -578,6 +587,25 @@ func (s *sqlDatabase) ListOrgPools(ctx context.Context, orgID string) ([]params. return ret, nil } +func (s *sqlDatabase) getRepoPoolByUniqueFields(ctx context.Context, repoID string, provider, image, flavor string) (Pool, error) { + repo, err := s.getRepoByID(ctx, repoID) + if err != nil { + return Pool{}, errors.Wrap(err, "fetching repo") + } + + q := s.conn + var pool []Pool + err = q.Model(&repo).Association("Pools").Find(&pool, "provider_name = ? and image = ? and flavor = ?", provider, image, flavor) + if err != nil { + return Pool{}, errors.Wrap(err, "fetching pool") + } + if len(pool) == 0 { + return Pool{}, runnerErrors.ErrNotFound + } + + return pool[0], nil +} + func (s *sqlDatabase) getRepoPool(ctx context.Context, repoID, poolID string, preload ...string) (Pool, error) { repo, err := s.getRepoByID(ctx, repoID) if err != nil {