/* 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 . */ package cmd import ( "context" "errors" "codeberg.org/scip/esctl/pkg/cfg" "codeberg.org/scip/esctl/pkg/es" "github.com/urfave/cli/v3" ) func Ccr(conf *cfg.Config) *cli.Command { return &cli.Command{ Name: "ccr", Aliases: []string{"replication", "rep"}, Usage: "manage cross cluster replication", Commands: []*cli.Command{ CcrStatus(conf), CcrShardPause(conf), CcrShardResume(conf), CcrFollower(conf), CcrRemoteInfo(conf), }, } } func CcrStatus(conf *cfg.Config) *cli.Command { return &cli.Command{ Name: "status", Aliases: []string{"st"}, Usage: "cross cluster replication status (yaml config with 2 clusters required)", UsageText: "status ", Flags: []cli.Flag{ &cli.StringFlag{ Name: "exclude", Usage: "regexp of indicies to exclude", Destination: &conf.Exclude, Aliases: []string{"e"}, }, }, ShellComplete: func(ctx context.Context, cmd *cli.Command) { complete(conf, cmd, Ccluster) }, Action: func(ctx context.Context, cmd *cli.Command) error { leader := cmd.Args().Get(0) follower := cmd.Args().Get(1) if leader == "" || follower == "" { return errors.New("no leader and follower aliases specified") } _, hasLeader := conf.Clusters[leader] _, hasFollower := conf.Clusters[follower] if !hasLeader || !hasFollower { return errors.New("either leader or follower alias not configured") } if err := es.CcrStatus(conf, leader, follower); err != nil { return err } return nil }, } } func CcrShardPause(conf *cfg.Config) *cli.Command { return &cli.Command{ Name: "pause", Usage: "pause shard allocation", Action: func(ctx context.Context, cmd *cli.Command) error { return es.CcrShardPause(conf) }, } } func CcrShardResume(conf *cfg.Config) *cli.Command { return &cli.Command{ Name: "resume", Usage: "resume shard allocation", Action: func(ctx context.Context, cmd *cli.Command) error { return es.CcrShardResume(conf) }, } } func CcrRemoteInfo(conf *cfg.Config) *cli.Command { return &cli.Command{ Name: "info", Usage: "show ccr remote info", UsageText: "info [options] []", ShellComplete: func(ctx context.Context, cmd *cli.Command) { complete(conf, cmd, Cindex) }, Action: func(ctx context.Context, cmd *cli.Command) error { return es.CcrRemoteInfo(conf, cmd.Args().Get(0)) }, } }