diff --git a/internal/namespaces/redis/v1/custom.go b/internal/namespaces/redis/v1/custom.go index 8611972ac5..f045336dc8 100644 --- a/internal/namespaces/redis/v1/custom.go +++ b/internal/namespaces/redis/v1/custom.go @@ -16,6 +16,7 @@ func GetCommands() *core.Commands { cmds.MustFind("redis", "cluster", "create").Override(clusterCreateBuilder) cmds.MustFind("redis", "cluster", "delete").Override(clusterDeleteBuilder) cmds.MustFind("redis", "acl", "add").Override(ACLAddListBuilder) + cmds.MustFind("redis", "setting", "add").Override(redisSettingAddBuilder) cmds.MustFind("redis", "cluster", "migrate").Override(redisClusterMigrateBuilder) return cmds diff --git a/internal/namespaces/redis/v1/custom_cluster.go b/internal/namespaces/redis/v1/custom_cluster.go index 2a20b07a4e..5e0cbabedd 100644 --- a/internal/namespaces/redis/v1/custom_cluster.go +++ b/internal/namespaces/redis/v1/custom_cluster.go @@ -165,6 +165,11 @@ func ACLAddListBuilder(c *core.Command) *core.Command { return c } +func redisSettingAddBuilder(c *core.Command) *core.Command { + c.ArgSpecs.GetByName("settings.{index}.name").AutoCompleteFunc = autoCompleteSettingsName + return c +} + func redisEndpointsClusterGetMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) { type tmp []*redis.Endpoint redisEndpointsClusterResponse := tmp(i.([]*redis.Endpoint)) @@ -211,6 +216,47 @@ func redisClusterGetMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, return str, nil } +var completeClusterCache *redis.Cluster + +var completeClusterVersionCache *redis.ListClusterVersionsResponse + +func autoCompleteSettingsName(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions { + suggestions := core.AutocompleteSuggestions(nil) + req := request.(*redis.AddClusterSettingsRequest) + client := core.ExtractClient(ctx) + api := redis.NewAPI(client) + if req.ClusterID != "" { + if completeClusterCache == nil { + res, err := api.GetCluster(&redis.GetClusterRequest{ + ClusterID: req.ClusterID, + }) + if err != nil { + return nil + } + completeClusterCache = res + } + if completeClusterVersionCache == nil { + res, err := api.ListClusterVersions(&redis.ListClusterVersionsRequest{ + Zone: completeClusterCache.Zone, + Version: &completeClusterCache.Version, + }) + if err != nil { + return nil + } + completeClusterVersionCache = res + } + + for _, version := range completeClusterVersionCache.Versions { + for _, settingName := range version.AvailableSettings { + if strings.HasPrefix(settingName.Name, prefix) { + suggestions = append(suggestions, settingName.Name) + } + } + } + } + return suggestions +} + var completeRedisNoteTypeCache *redis.ListNodeTypesResponse func autoCompleteNodeType(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {