Skip to content

Commit 6156d06

Browse files
Commands that return a single KV now return proj and env details as well (#471)
- Introduces `KeyValueSerivce.Resolve` method. Similar to `PostgresService.Resolve`, except that it returns the project and environment (if applicable) as well. - For commands that deal with a single, existing Key Value, swap to this new Resolve method, and move any other service code into KeyValue service instead of the one-off methods that were not correctly using our dependency system. I need to clamp down the desired JSON output shape for all KV commands, instead of just blindly returning what the API gives us. The desired shape includes environment ID and project ID, which we don't always have on the KV Detail we get back from API. In order to set us up for this, everywhere I "resolve" a single Key Value today, I need to make sure it's enriched with project and environment. This way, text output can show "name (ID)" and JSON output can have environmnt_id and project_id Note, these fields will of course be empty for ungrouped Key Values. PR 2 of X for https://linear.app/render-com/issue/GROW-2587/slim-down-kv-json-output-to-resource-only GitOrigin-RevId: 35992c65c6df57b450045103e5f4c823cfc69f91
1 parent f898871 commit 6156d06

18 files changed

Lines changed: 264 additions & 205 deletions

cmd/kvdelete.go

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@ package cmd
33
import (
44
"github.com/spf13/cobra"
55

6-
"github.com/render-oss/cli/pkg/client"
76
"github.com/render-oss/cli/pkg/command"
87
"github.com/render-oss/cli/pkg/dependencies"
98
"github.com/render-oss/cli/pkg/keyvalue"
10-
"github.com/render-oss/cli/pkg/resolve"
119
"github.com/render-oss/cli/pkg/text"
1210
kvtypes "github.com/render-oss/cli/pkg/types/keyvalue"
1311
)
1412

15-
func newKVDeleteCmd(_ *dependencies.Dependencies) *cobra.Command {
13+
func newKVDeleteCmd(deps *dependencies.Dependencies) *cobra.Command {
1614
cmd := &cobra.Command{
1715
Use: "delete <keyValueID|keyValueName>",
1816
Short: "Delete a Key Value store instance",
@@ -62,23 +60,16 @@ Key Value ID instead (which works across workspaces).`,
6260
confirm := command.GetConfirmFromContext(cmd.Context())
6361

6462
loadData := func() (*keyvalue.DeleteResult, error) {
65-
var env *client.Environment
66-
if input.EnvironmentIDOrName != nil {
67-
c, err := client.NewDefaultClient()
68-
if err != nil {
69-
return nil, err
70-
}
71-
env, err = resolve.NewFromClient(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
72-
if err != nil {
73-
return nil, err
74-
}
75-
}
76-
kv, err := keyvalue.Resolve(cmd.Context(), input.IDOrName, nil, env)
63+
resolved, err := deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
64+
IDOrName: input.IDOrName,
65+
EnvironmentIDOrName: input.EnvironmentIDOrName,
66+
})
7767
if err != nil {
7868
return nil, err
7969
}
70+
kv := resolved.KeyValue
8071
if confirm {
81-
if err := keyvalue.Delete(cmd.Context(), kv.Id); err != nil {
72+
if err := deps.KeyValueService().Delete(cmd.Context(), kv.Id); err != nil {
8273
return nil, err
8374
}
8475
}

cmd/kvget.go

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@ package cmd
33
import (
44
"github.com/spf13/cobra"
55

6-
"github.com/render-oss/cli/pkg/client"
76
"github.com/render-oss/cli/pkg/command"
87
"github.com/render-oss/cli/pkg/dependencies"
98
"github.com/render-oss/cli/pkg/keyvalue"
10-
"github.com/render-oss/cli/pkg/resolve"
119
"github.com/render-oss/cli/pkg/text"
1210
kvtypes "github.com/render-oss/cli/pkg/types/keyvalue"
1311
)
1412

15-
func newKVGetCmd(_ *dependencies.Dependencies) *cobra.Command {
13+
func newKVGetCmd(deps *dependencies.Dependencies) *cobra.Command {
1614
cmd := &cobra.Command{
1715
Use: "get <keyValueID|keyValueName>",
1816
Short: "Get details of a Key Value store instance",
@@ -64,35 +62,23 @@ Key Value ID instead (which works across workspaces).`,
6462
input = kvtypes.NormalizeGetInput(input)
6563

6664
loadData := func() (*keyvalue.GetResult, error) {
67-
var project *client.Project
68-
var env *client.Environment
69-
if input.ProjectIDOrName != nil || input.EnvironmentIDOrName != nil {
70-
c, err := client.NewDefaultClient()
71-
if err != nil {
72-
return nil, err
73-
}
74-
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
75-
ProjectIDOrName: input.ProjectIDOrName,
76-
EnvironmentIDOrName: input.EnvironmentIDOrName,
77-
})
78-
if err != nil {
79-
return nil, err
80-
}
81-
project = scope.Project
82-
env = scope.Environment
83-
}
84-
kv, err := keyvalue.Resolve(cmd.Context(), input.IDOrName, project, env)
65+
resolved, err := deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
66+
IDOrName: input.IDOrName,
67+
ProjectIDOrName: input.ProjectIDOrName,
68+
EnvironmentIDOrName: input.EnvironmentIDOrName,
69+
})
8570
if err != nil {
8671
return nil, err
8772
}
88-
var conn *client.KeyValueConnectionInfo
73+
kv := resolved.KeyValue
8974
if input.IncludeSensitiveConnectionInfo {
90-
conn, err = keyvalue.GetConnectionInfo(cmd.Context(), kv.Id)
75+
conn, err := deps.KeyValueService().GetConnectionInfo(cmd.Context(), kv.Id)
9176
if err != nil {
9277
return nil, err
9378
}
79+
return &keyvalue.GetResult{KeyValue: kv, ConnectionInfo: conn}, nil
9480
}
95-
return &keyvalue.GetResult{KeyValue: kv, ConnectionInfo: conn}, nil
81+
return &keyvalue.GetResult{KeyValue: kv}, nil
9682
}
9783

9884
_, err := command.NonInteractive(cmd, loadData, func(r *keyvalue.GetResult) string {

cmd/kvresume.go

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ import (
77
"github.com/render-oss/cli/pkg/command"
88
"github.com/render-oss/cli/pkg/dependencies"
99
"github.com/render-oss/cli/pkg/keyvalue"
10-
"github.com/render-oss/cli/pkg/resolve"
1110
"github.com/render-oss/cli/pkg/text"
1211
kvtypes "github.com/render-oss/cli/pkg/types/keyvalue"
1312
)
1413

15-
func newKVResumeCmd(_ *dependencies.Dependencies) *cobra.Command {
14+
func newKVResumeCmd(deps *dependencies.Dependencies) *cobra.Command {
1615
cmd := &cobra.Command{
1716
Use: "resume <keyValueID|keyValueName>",
1817
Short: "Resume a suspended Key Value store instance",
@@ -53,30 +52,23 @@ Key Value ID instead (which works across workspaces).`,
5352
input = kvtypes.NormalizeResumeInput(input)
5453

5554
loadData := func() (*client.KeyValueDetail, error) {
56-
var project *client.Project
57-
var env *client.Environment
58-
if input.EnvironmentIDOrName != nil {
59-
c, err := client.NewDefaultClient()
60-
if err != nil {
61-
return nil, err
62-
}
63-
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
64-
EnvironmentIDOrName: input.EnvironmentIDOrName,
65-
})
66-
if err != nil {
67-
return nil, err
68-
}
69-
project = scope.Project
70-
env = scope.Environment
71-
}
72-
kv, err := keyvalue.Resolve(cmd.Context(), input.IDOrName, project, env)
55+
kv, err := deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
56+
IDOrName: input.IDOrName,
57+
EnvironmentIDOrName: input.EnvironmentIDOrName,
58+
})
7359
if err != nil {
7460
return nil, err
7561
}
76-
if err := keyvalue.Resume(cmd.Context(), kv.Id); err != nil {
62+
if err := deps.KeyValueService().Resume(cmd.Context(), kv.KeyValue.Id); err != nil {
63+
return nil, err
64+
}
65+
kv, err = deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
66+
IDOrName: kv.KeyValue.Id,
67+
})
68+
if err != nil {
7769
return nil, err
7870
}
79-
return keyvalue.Resolve(cmd.Context(), kv.Id, project, env)
71+
return kv.KeyValue, nil
8072
}
8173

8274
_, err := command.NonInteractive(cmd, loadData, formatResumeTextOutput)

cmd/kvsuspend.go

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@ package cmd
33
import (
44
"github.com/spf13/cobra"
55

6-
"github.com/render-oss/cli/pkg/client"
76
"github.com/render-oss/cli/pkg/command"
87
"github.com/render-oss/cli/pkg/dependencies"
98
"github.com/render-oss/cli/pkg/keyvalue"
10-
"github.com/render-oss/cli/pkg/resolve"
119
"github.com/render-oss/cli/pkg/text"
1210
kvtypes "github.com/render-oss/cli/pkg/types/keyvalue"
1311
)
1412

15-
func newKVSuspendCmd(_ *dependencies.Dependencies) *cobra.Command {
13+
func newKVSuspendCmd(deps *dependencies.Dependencies) *cobra.Command {
1614
cmd := &cobra.Command{
1715
Use: "suspend <keyValueID|keyValueName>",
1816
Short: "Suspend a Key Value store instance",
@@ -60,37 +58,27 @@ Key Value ID instead (which works across workspaces).`,
6058
confirm := command.GetConfirmFromContext(cmd.Context())
6159

6260
loadData := func() (*keyvalue.SuspendResult, error) {
63-
var project *client.Project
64-
var env *client.Environment
65-
if input.EnvironmentIDOrName != nil {
66-
c, err := client.NewDefaultClient()
67-
if err != nil {
68-
return nil, err
69-
}
70-
scope, err := resolve.NewFromClient(c).ResolveScopeInActiveWorkspace(cmd.Context(), resolve.ActiveWorkspaceScopeInput{
71-
EnvironmentIDOrName: input.EnvironmentIDOrName,
72-
})
73-
if err != nil {
74-
return nil, err
75-
}
76-
project = scope.Project
77-
env = scope.Environment
78-
}
79-
kv, err := keyvalue.Resolve(cmd.Context(), input.IDOrName, project, env)
61+
before, err := deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
62+
IDOrName: input.IDOrName,
63+
EnvironmentIDOrName: input.EnvironmentIDOrName,
64+
})
8065
if err != nil {
8166
return nil, err
8267
}
68+
kv := before.KeyValue
8369
if !confirm {
8470
return &keyvalue.SuspendResult{KeyValue: kv, Suspended: false}, nil
8571
}
86-
if err := keyvalue.Suspend(cmd.Context(), kv.Id); err != nil {
72+
if err := deps.KeyValueService().Suspend(cmd.Context(), kv.Id); err != nil {
8773
return nil, err
8874
}
89-
post, err := keyvalue.Resolve(cmd.Context(), kv.Id, project, env)
75+
after, err := deps.KeyValueService().Resolve(cmd.Context(), keyvalue.ResolveInput{
76+
IDOrName: kv.Id,
77+
})
9078
if err != nil {
9179
return nil, err
9280
}
93-
return &keyvalue.SuspendResult{KeyValue: post, Suspended: true}, nil
81+
return &keyvalue.SuspendResult{KeyValue: after.KeyValue, Suspended: true}, nil
9482
}
9583

9684
_, err := command.NonInteractive(cmd, loadData, formatSuspendTextOutput)

cmd/kvupdate.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ import (
99
"github.com/render-oss/cli/pkg/client"
1010
"github.com/render-oss/cli/pkg/command"
1111
"github.com/render-oss/cli/pkg/dependencies"
12-
"github.com/render-oss/cli/pkg/keyvalue"
13-
"github.com/render-oss/cli/pkg/resolve"
1412
"github.com/render-oss/cli/pkg/text"
1513
kvtypes "github.com/render-oss/cli/pkg/types/keyvalue"
1614
)
1715

18-
func newKVUpdateCmd(_ *dependencies.Dependencies) *cobra.Command {
16+
func newKVUpdateCmd(deps *dependencies.Dependencies) *cobra.Command {
1917
cmd := &cobra.Command{
2018
Use: "update <keyValueID|keyValueName>",
2119
Short: "Update a Key Value store instance",
@@ -98,18 +96,7 @@ Example: --ip-allow-list "cidr=203.0.113.5/32,description=office"`
9896

9997
_, err := command.NonInteractive(cmd,
10098
func() (*client.KeyValueDetail, error) {
101-
var env *client.Environment
102-
if input.EnvironmentIDOrName != nil {
103-
c, err := client.NewDefaultClient()
104-
if err != nil {
105-
return nil, err
106-
}
107-
env, err = resolve.NewFromClient(c).ResolveEnvironment(cmd.Context(), *input.EnvironmentIDOrName)
108-
if err != nil {
109-
return nil, err
110-
}
111-
}
112-
result, err := keyvalue.Update(cmd.Context(), input.IDOrName, env, input)
99+
result, err := deps.KeyValueService().Update(cmd.Context(), input)
113100
if err != nil {
114101
return nil, err
115102
}

pkg/dependencies/dependencies.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func (d *Dependencies) PostgresService() *postgres.Service {
186186

187187
func (d *Dependencies) KeyValueService() *keyvalue.Service {
188188
return d.cache.keyValueService.Get(func() *keyvalue.Service {
189-
return keyvalue.NewService(d.KeyValueRepo(), d.EnvironmentRepo(), d.ProjectRepo())
189+
return keyvalue.NewService(d.KeyValueRepo(), d.EnvironmentRepo(), d.ProjectRepo(), d.Resolver())
190190
})
191191
}
192192

pkg/keyvalue/delete.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package keyvalue
22

3-
import (
4-
"context"
5-
6-
"github.com/render-oss/cli/pkg/client"
7-
)
3+
import "github.com/render-oss/cli/pkg/client"
84

95
// DeleteResult is the shape returned to callers (and serialized to JSON/YAML)
106
// describing the outcome of a delete attempt. Deleted is false when the caller
@@ -14,12 +10,3 @@ type DeleteResult struct {
1410
KeyValue *client.KeyValueDetail `json:"keyValue"`
1511
Deleted bool `json:"deleted"`
1612
}
17-
18-
// Delete removes the Key Value instance with the given ID via the Render API.
19-
func Delete(ctx context.Context, id string) error {
20-
c, err := client.NewDefaultClient()
21-
if err != nil {
22-
return err
23-
}
24-
return NewRepo(c).DeleteKeyValue(ctx, id)
25-
}

pkg/keyvalue/get.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,10 @@
11
package keyvalue
22

3-
import (
4-
"context"
5-
6-
"github.com/render-oss/cli/pkg/client"
7-
)
3+
import "github.com/render-oss/cli/pkg/client"
84

95
// GetResult is the shape returned to callers (and serialized to JSON/YAML)
106
// describing a fetched Key Value instance together with its connection info.
117
type GetResult struct {
128
KeyValue *client.KeyValueDetail `json:"keyValue"`
139
ConnectionInfo *client.KeyValueConnectionInfo `json:"connectionInfo"`
1410
}
15-
16-
// GetConnectionInfo fetches connection info for the given Key Value ID.
17-
func GetConnectionInfo(ctx context.Context, id string) (*client.KeyValueConnectionInfo, error) {
18-
c, err := client.NewDefaultClient()
19-
if err != nil {
20-
return nil, err
21-
}
22-
return NewRepo(c).GetKeyValueConnectionInfo(ctx, id)
23-
}

pkg/keyvalue/list.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/render-oss/cli/pkg/client"
77
"github.com/render-oss/cli/pkg/environment"
88
"github.com/render-oss/cli/pkg/project"
9+
"github.com/render-oss/cli/pkg/resolve"
910
)
1011

1112
// List fetches Key Value instances for the active workspace, optionally
@@ -15,6 +16,6 @@ func List(ctx context.Context, params *client.ListKeyValueParams) ([]*Model, err
1516
if err != nil {
1617
return nil, err
1718
}
18-
svc := NewService(NewRepo(c), environment.NewRepo(c), project.NewRepo(c))
19+
svc := NewService(NewRepo(c), environment.NewRepo(c), project.NewRepo(c), resolve.NewFromClient(c))
1920
return svc.ListKeyValue(ctx, params)
2021
}

0 commit comments

Comments
 (0)