Additions and enhancements (#14)

- add interactive API repl
- enhance cluster status output (use -v)
- add more ccr commands
- refactoring
This commit is contained in:
T. von Dein
2026-05-13 13:51:09 +02:00
parent dd619ab815
commit 15e0f9dc90
16 changed files with 557 additions and 13 deletions

View File

@@ -37,6 +37,7 @@ func Ccr(conf *cfg.Config) *cli.Command {
CcrShardPause(conf),
CcrShardResume(conf),
CcrFollower(conf),
CcrRemoteInfo(conf),
},
}
}
@@ -101,3 +102,15 @@ func CcrShardResume(conf *cfg.Config) *cli.Command {
},
}
}
func CcrRemoteInfo(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "info",
Usage: "show ccr remote info",
UsageText: "info [options] [<index>]",
Action: func(ctx context.Context, cmd *cli.Command) error {
return es.CcrRemoteInfo(conf, cmd.Args().Get(0))
},
}
}

View File

@@ -36,6 +36,91 @@ func CcrFollower(conf *cfg.Config) *cli.Command {
CcrFollowerShow(conf),
CcrFollowerAdd(conf),
CcrFollowerDelete(conf),
CcrFollowerUnfollow(conf),
CcrFollowerPause(conf),
CcrFollowerResume(conf),
CcrFollowerRenew(conf),
},
}
}
func CcrFollowerRenew(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "renew",
Usage: "renew ccr follower index",
UsageText: "renew [options] <index>",
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "force",
Usage: "force even if unfollow fails (e.g. because following is red anyway)",
Destination: &conf.Force,
Aliases: []string{"f"},
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
args := cmd.Args()
if args.Len() != 1 {
return errors.New("missing arguments: <index>")
}
return es.CcrFollowerRenew(conf, cmd.Args().Get(0))
},
}
}
func CcrFollowerResume(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "resume",
Usage: "resume ccr index to follow",
UsageText: "resume [options] <index>",
Action: func(ctx context.Context, cmd *cli.Command) error {
args := cmd.Args()
if args.Len() != 1 {
return errors.New("missing arguments: <index>")
}
return es.CcrFollowerResume(conf, cmd.Args().Get(0))
},
}
}
func CcrFollowerPause(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "pause",
Usage: "pause ccr index to follow",
UsageText: "pause [options] <index>",
Action: func(ctx context.Context, cmd *cli.Command) error {
args := cmd.Args()
if args.Len() != 1 {
return errors.New("missing arguments: <index>")
}
return es.CcrFollowerPause(conf, cmd.Args().Get(0))
},
}
}
func CcrFollowerUnfollow(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "unfollow",
Usage: "unfollow ccr follower index",
UsageText: "unfollow [options] <index>",
Action: func(ctx context.Context, cmd *cli.Command) error {
args := cmd.Args()
if args.Len() != 1 {
return errors.New("missing arguments: <index>")
}
return es.CcrFollowerUnfollow(conf, cmd.Args().Get(0))
},
}
}
@@ -71,7 +156,7 @@ func CcrFollowerAdd(conf *cfg.Config) *cli.Command {
func CcrFollowerDelete(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "delete",
Aliases: []string{"-"},
Aliases: []string{"rm"},
Usage: "delete ccr follower index",
UsageText: "delete <index>",

View File

@@ -64,6 +64,12 @@ func ClusterStatus(conf *cfg.Config) *cli.Command {
Destination: &conf.All,
Aliases: []string{"a"},
},
&cli.BoolFlag{
Name: "verbose",
Usage: "include verbose statistics",
Destination: &conf.Verbose,
Aliases: []string{"v"},
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {

View File

@@ -37,6 +37,7 @@ func Index(conf *cfg.Config) *cli.Command {
IndexShow(conf),
IndexCreate(conf),
IndexDelete(conf),
IndexClose(conf),
},
}
}
@@ -156,3 +157,14 @@ func IndexDelete(conf *cfg.Config) *cli.Command {
},
}
}
func IndexClose(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "close",
Usage: "close an index",
Action: func(ctx context.Context, cmd *cli.Command) error {
return es.IndexClose(conf, cmd.Args().Get(0))
},
}
}

38
cmd/repl.go Normal file
View File

@@ -0,0 +1,38 @@
/*
Copyright © 2026 Thomas von Dein
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cmd
import (
"context"
"codeberg.org/scip/esctl/pkg/cfg"
"codeberg.org/scip/esctl/pkg/es"
"github.com/urfave/cli/v3"
)
func Repl(conf *cfg.Config) *cli.Command {
return &cli.Command{
Name: "repl",
Aliases: []string{"shell"},
Usage: "interactive API repl",
Action: func(ctx context.Context, cmd *cli.Command) error {
return es.Repl(conf)
},
}
}

View File

@@ -79,6 +79,7 @@ func Main() int {
Ccr(conf),
Node(conf),
Doc(conf),
Repl(conf),
},
Before: func(ctx context.Context, cmd *cli.Command) (context.Context, error) {