Skip to content

Commit 45e774f

Browse files
authored
feat(redis): add autocompletion for setting name (#3707)
1 parent 9ee1caf commit 45e774f

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

internal/namespaces/redis/v1/custom.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ func GetCommands() *core.Commands {
1616
cmds.MustFind("redis", "cluster", "create").Override(clusterCreateBuilder)
1717
cmds.MustFind("redis", "cluster", "delete").Override(clusterDeleteBuilder)
1818
cmds.MustFind("redis", "acl", "add").Override(ACLAddListBuilder)
19+
cmds.MustFind("redis", "setting", "add").Override(redisSettingAddBuilder)
1920
cmds.MustFind("redis", "cluster", "migrate").Override(redisClusterMigrateBuilder)
2021

2122
return cmds

internal/namespaces/redis/v1/custom_cluster.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ func ACLAddListBuilder(c *core.Command) *core.Command {
165165
return c
166166
}
167167

168+
func redisSettingAddBuilder(c *core.Command) *core.Command {
169+
c.ArgSpecs.GetByName("settings.{index}.name").AutoCompleteFunc = autoCompleteSettingsName
170+
return c
171+
}
172+
168173
func redisEndpointsClusterGetMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) {
169174
type tmp []*redis.Endpoint
170175
redisEndpointsClusterResponse := tmp(i.([]*redis.Endpoint))
@@ -211,6 +216,47 @@ func redisClusterGetMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string,
211216
return str, nil
212217
}
213218

219+
var completeClusterCache *redis.Cluster
220+
221+
var completeClusterVersionCache *redis.ListClusterVersionsResponse
222+
223+
func autoCompleteSettingsName(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
224+
suggestions := core.AutocompleteSuggestions(nil)
225+
req := request.(*redis.AddClusterSettingsRequest)
226+
client := core.ExtractClient(ctx)
227+
api := redis.NewAPI(client)
228+
if req.ClusterID != "" {
229+
if completeClusterCache == nil {
230+
res, err := api.GetCluster(&redis.GetClusterRequest{
231+
ClusterID: req.ClusterID,
232+
})
233+
if err != nil {
234+
return nil
235+
}
236+
completeClusterCache = res
237+
}
238+
if completeClusterVersionCache == nil {
239+
res, err := api.ListClusterVersions(&redis.ListClusterVersionsRequest{
240+
Zone: completeClusterCache.Zone,
241+
Version: &completeClusterCache.Version,
242+
})
243+
if err != nil {
244+
return nil
245+
}
246+
completeClusterVersionCache = res
247+
}
248+
249+
for _, version := range completeClusterVersionCache.Versions {
250+
for _, settingName := range version.AvailableSettings {
251+
if strings.HasPrefix(settingName.Name, prefix) {
252+
suggestions = append(suggestions, settingName.Name)
253+
}
254+
}
255+
}
256+
}
257+
return suggestions
258+
}
259+
214260
var completeRedisNoteTypeCache *redis.ListNodeTypesResponse
215261

216262
func autoCompleteNodeType(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {

0 commit comments

Comments
 (0)