Skip to content

Commit 4f786b7

Browse files
Build resolvers from shared repos (#436)
Refactors `pkg/resolve` to hook into our dependency injection system. This eliminates the need for callers to instantiate clients, and let's us re-use existing repository instances. This is supporting work for `render pg create`. I realized while implementing that that I had handled dependencies wrong in kv. We have a nice DI system set up so that the command layer should really only care about Service structs and not repos / clients. I can go back and refactor kv later, but for now I just want to make sure I get `pg` on the right path. GitOrigin-RevId: 9cd87d1b98ed32ae960b8405ccae986f30af36af
1 parent 827fb9e commit 4f786b7

11 files changed

Lines changed: 30 additions & 13 deletions

File tree

cmd/kvdelete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func init() {
6767
if err != nil {
6868
return nil, err
6969
}
70-
env, err = resolve.New(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
70+
env, err = resolve.NewFromClient(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
7171
if err != nil {
7272
return nil, err
7373
}

cmd/kvget.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func init() {
7070
if err != nil {
7171
return nil, err
7272
}
73-
scope, err := resolve.New(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
73+
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
7474
ProjectIDOrName: input.ProjectIDOrName,
7575
EnvironmentIDOrName: input.EnvironmentIDOrName,
7676
})

cmd/kvlist.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func resolveListEnvIDs(cmd *cobra.Command, input kvtypes.KeyValueListInput) ([]s
8787
if err != nil {
8888
return nil, false, err
8989
}
90-
scope, err := resolve.New(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
90+
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
9191
ProjectIDOrName: input.ProjectIDOrName,
9292
EnvironmentIDOrName: input.EnvironmentIDOrName,
9393
})

cmd/kvresume.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func init() {
5959
if err != nil {
6060
return nil, err
6161
}
62-
scope, err := resolve.New(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
62+
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
6363
EnvironmentIDOrName: input.EnvironmentIDOrName,
6464
})
6565
if err != nil {

cmd/kvsuspend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func init() {
6666
if err != nil {
6767
return nil, err
6868
}
69-
scope, err := resolve.New(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
69+
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
7070
EnvironmentIDOrName: input.EnvironmentIDOrName,
7171
})
7272
if err != nil {

cmd/kvupdate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ Example: --ip-allow-list "cidr=203.0.113.5/32,description=office"`
103103
if err != nil {
104104
return nil, err
105105
}
106-
env, err = resolve.New(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
106+
env, err = resolve.NewFromClient(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
107107
if err != nil {
108108
return nil, err
109109
}

pkg/dependencies/dependencies.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/render-oss/cli/pkg/postgres"
1515
"github.com/render-oss/cli/pkg/project"
1616
"github.com/render-oss/cli/pkg/registry"
17+
"github.com/render-oss/cli/pkg/resolve"
1718
"github.com/render-oss/cli/pkg/resource"
1819
"github.com/render-oss/cli/pkg/service"
1920
"github.com/render-oss/cli/pkg/tasks"
@@ -53,6 +54,7 @@ type cachedDependencies struct {
5354
userRepo cache[*user.Repo]
5455
ownerRepo cache[*owner.Repo]
5556
deployRepo cache[*deploy.Repo]
57+
resolver cache[*resolve.Resolver]
5658
serviceService cache[*service.Service]
5759
postgresService cache[*postgres.Service]
5860
keyValueService cache[*keyvalue.Service]
@@ -158,6 +160,12 @@ func (d *Dependencies) OwnerRepo() *owner.Repo {
158160
})
159161
}
160162

163+
func (d *Dependencies) Resolver() *resolve.Resolver {
164+
return d.cache.resolver.Get(func() *resolve.Resolver {
165+
return resolve.New(d.OwnerRepo(), d.ProjectRepo(), d.EnvironmentRepo())
166+
})
167+
}
168+
161169
func (d *Dependencies) DeployRepo() *deploy.Repo {
162170
return d.cache.deployRepo.Get(func() *deploy.Repo {
163171
return deploy.NewRepo(d.client)

pkg/keyvalue/create.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func Create(ctx context.Context, input kvtypes.KeyValueCreateInput) (*client.Key
2323
if err != nil {
2424
return nil, err
2525
}
26-
resolver := resolve.New(c)
26+
resolver := resolve.NewFromClient(c)
2727

2828
if input.Name == "" {
2929
input.Name = petname.Generate(2, "-")

pkg/resolve/resolve.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,23 @@ func (s *Scope) EnvironmentID() *string {
5959
return &s.Environment.Id
6060
}
6161

62-
func New(c *client.ClientWithResponses) *Resolver {
62+
// New builds a Resolver from existing repos. Prefer this so callers can share
63+
// cached repo instances from a dependency container instead of constructing a
64+
// parallel set of repos for the same HTTP client.
65+
func New(ownerRepo *owner.Repo, projectRepo *project.Repo, environmentRepo *environment.Repo) *Resolver {
6366
return &Resolver{
64-
ownerRepo: owner.NewRepo(c),
65-
projectRepo: project.NewRepo(c),
66-
environmentRepo: environment.NewRepo(c),
67+
ownerRepo: ownerRepo,
68+
projectRepo: projectRepo,
69+
environmentRepo: environmentRepo,
6770
}
6871
}
6972

73+
// NewFromClient builds a Resolver with repos backed by the given HTTP client.
74+
// Prefer New when a dependency container or shared repos are already available.
75+
func NewFromClient(c *client.ClientWithResponses) *Resolver {
76+
return New(owner.NewRepo(c), project.NewRepo(c), environment.NewRepo(c))
77+
}
78+
7079
// ResolveScope resolves explicitly supplied resources and their ancestors.
7180
// Project input resolves workspace and project; environment input resolves
7281
// workspace, project, and environment. It does not infer descendant resources

pkg/resolve/resolve_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func newTestResolver(t *testing.T, server *renderapi.Server) *Resolver {
2020

2121
c, err := client.NewClientWithResponses(server.URL())
2222
require.NoError(t, err)
23-
return New(c)
23+
return NewFromClient(c)
2424
}
2525

2626
func seedOwner(server *renderapi.Server, id string) {

0 commit comments

Comments
 (0)