From 20f866e85ec9541ce22a9d839d70c9a2799d8dc9 Mon Sep 17 00:00:00 2001 From: Srinivas Pothuraju Date: Fri, 25 Oct 2024 12:00:25 -0500 Subject: [PATCH 1/2] redesign CLI to not take cluster name when not required --- cmd/cluster/cluster.go | 5 ----- cmd/{cluster => }/dr/create_dr.go | 5 ++++- cmd/{cluster => }/dr/delete_dr.go | 9 ++++----- cmd/{cluster => }/dr/describe_dr.go | 3 +-- cmd/{cluster => }/dr/dr.go | 2 -- cmd/{cluster => }/dr/failover_dr.go | 3 +-- cmd/{cluster => }/dr/list_dr.go | 3 +-- cmd/{cluster => }/dr/pause_dr.go | 3 +-- cmd/{cluster => }/dr/restart_dr.go | 3 +-- cmd/{cluster => }/dr/resume_dr.go | 3 +-- cmd/{cluster => }/dr/switchover_dr.go | 3 +-- cmd/{cluster => }/dr/update_dr.go | 3 +-- cmd/root.go | 2 ++ internal/client/client.go | 16 ++++++++-------- 14 files changed, 26 insertions(+), 37 deletions(-) rename cmd/{cluster => }/dr/create_dr.go (93%) rename cmd/{cluster => }/dr/delete_dr.go (88%) rename cmd/{cluster => }/dr/describe_dr.go (95%) rename cmd/{cluster => }/dr/dr.go (97%) rename cmd/{cluster => }/dr/failover_dr.go (97%) rename cmd/{cluster => }/dr/list_dr.go (93%) rename cmd/{cluster => }/dr/pause_dr.go (96%) rename cmd/{cluster => }/dr/restart_dr.go (97%) rename cmd/{cluster => }/dr/resume_dr.go (96%) rename cmd/{cluster => }/dr/switchover_dr.go (96%) rename cmd/{cluster => }/dr/update_dr.go (97%) diff --git a/cmd/cluster/cluster.go b/cmd/cluster/cluster.go index 8dfde391..88b48ab9 100644 --- a/cmd/cluster/cluster.go +++ b/cmd/cluster/cluster.go @@ -19,7 +19,6 @@ import ( "github.com/spf13/cobra" "github.com/yugabyte/ybm-cli/cmd/cluster/cert" connectionpooling "github.com/yugabyte/ybm-cli/cmd/cluster/connection-pooling" - dr "github.com/yugabyte/ybm-cli/cmd/cluster/dr" encryption "github.com/yugabyte/ybm-cli/cmd/cluster/encryption" log_exporter "github.com/yugabyte/ybm-cli/cmd/cluster/log-exporter" "github.com/yugabyte/ybm-cli/cmd/cluster/namespace" @@ -74,8 +73,4 @@ func init() { util.AddCommandIfFeatureFlag(ClusterCmd, connectionpooling.ConnectionPoolingCmd, util.CONNECTION_POOLING) connectionpooling.ConnectionPoolingCmd.PersistentFlags().StringVarP(&connectionpooling.ClusterName, "cluster-name", "c", "", "[REQUIRED] The name of the cluster.") connectionpooling.ConnectionPoolingCmd.MarkPersistentFlagRequired("cluster-name") - - util.AddCommandIfFeatureFlag(ClusterCmd, dr.DrCmd, util.DR) - dr.DrCmd.PersistentFlags().StringVarP(&dr.ClusterName, "cluster-name", "c", "", "[REQUIRED] The name of the cluster.") - dr.DrCmd.MarkPersistentFlagRequired("cluster-name") } diff --git a/cmd/cluster/dr/create_dr.go b/cmd/dr/create_dr.go similarity index 93% rename from cmd/cluster/dr/create_dr.go rename to cmd/dr/create_dr.go index 2fd34f94..94e5d19a 100644 --- a/cmd/cluster/dr/create_dr.go +++ b/cmd/dr/create_dr.go @@ -40,9 +40,10 @@ var createDrCmd = &cobra.Command{ authApi.GetInfo("", "") drName, _ := cmd.Flags().GetString("dr-name") + sourceClusterName, _ := cmd.Flags().GetString("source-cluster-name") targetClusterName, _ := cmd.Flags().GetString("target-cluster-name") databases, _ := cmd.Flags().GetStringArray("databases") - sourceClusterId, err := authApi.GetClusterIdByName(ClusterName) + sourceClusterId, err := authApi.GetClusterIdByName(sourceClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } @@ -113,6 +114,8 @@ func init() { DrCmd.AddCommand(createDrCmd) createDrCmd.Flags().String("dr-name", "", "[REQUIRED] Name of the DR configuration.") createDrCmd.MarkFlagRequired("dr-name") + createDrCmd.Flags().String("source-cluster-name", "", "[REQUIRED] Target cluster in the DR configuration.") + createDrCmd.MarkFlagRequired("source-cluster-name") createDrCmd.Flags().String("target-cluster-name", "", "[REQUIRED] Target cluster in the DR configuration.") createDrCmd.MarkFlagRequired("target-cluster-name") createDrCmd.Flags().StringArray("databases", []string{}, "[REQUIRED] Databases to be replicated.") diff --git a/cmd/cluster/dr/delete_dr.go b/cmd/dr/delete_dr.go similarity index 88% rename from cmd/cluster/dr/delete_dr.go rename to cmd/dr/delete_dr.go index bba934fa..8b3dc3d7 100644 --- a/cmd/cluster/dr/delete_dr.go +++ b/cmd/dr/delete_dr.go @@ -34,7 +34,7 @@ var deleteDrCmd = &cobra.Command{ PreRun: func(cmd *cobra.Command, args []string) { viper.BindPFlag("force", cmd.Flags().Lookup("force")) drName, _ := cmd.Flags().GetString("dr-name") - msg := fmt.Sprintf("Are you sure you want to delete dr-name: %s for cluster: %s", drName, ClusterName) + msg := fmt.Sprintf("Are you sure you want to delete dr: %s", drName) err := util.ConfirmCommand(msg, viper.GetBool("force")) if err != nil { logrus.Fatal(err) @@ -48,16 +48,15 @@ var deleteDrCmd = &cobra.Command{ authApi.GetInfo("", "") drName, _ := cmd.Flags().GetString("dr-name") - clusterID, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatal(err) } - drId, err := authApi.GetDrIdByName(clusterID, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } - r, err := authApi.DeleteXClusterDr(clusterID, drId).Execute() + r, err := authApi.DeleteXClusterDr(clusterId, drId).Execute() if err != nil { logrus.Debugf("Full HTTP response: %v", r) logrus.Fatalf(ybmAuthClient.GetApiErrorDetails(err)) @@ -66,7 +65,7 @@ var deleteDrCmd = &cobra.Command{ msg := fmt.Sprintf("The DR %s is being deleted", formatter.Colorize(drName, formatter.GREEN_COLOR)) if viper.GetBool("wait") { - returnStatus, err := authApi.WaitForTaskCompletion(clusterID, ybmclient.ENTITYTYPEENUM_CLUSTER, ybmclient.TASKTYPEENUM_DELETE_DR, []string{"FAILED", "SUCCEEDED"}, msg) + returnStatus, err := authApi.WaitForTaskCompletion(clusterId, ybmclient.ENTITYTYPEENUM_CLUSTER, ybmclient.TASKTYPEENUM_DELETE_DR, []string{"FAILED", "SUCCEEDED"}, msg) if err != nil { logrus.Fatalf("error when getting task status: %s", err) } diff --git a/cmd/cluster/dr/describe_dr.go b/cmd/dr/describe_dr.go similarity index 95% rename from cmd/cluster/dr/describe_dr.go rename to cmd/dr/describe_dr.go index 3dda88d5..2199458f 100644 --- a/cmd/cluster/dr/describe_dr.go +++ b/cmd/dr/describe_dr.go @@ -38,11 +38,10 @@ var describeDrCmd = &cobra.Command{ authApi.GetInfo("", "") drName, _ := cmd.Flags().GetString("dr-name") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatalf("Could not get DR data: %s", ybmAuthClient.GetApiErrorDetails(err)) } diff --git a/cmd/cluster/dr/dr.go b/cmd/dr/dr.go similarity index 97% rename from cmd/cluster/dr/dr.go rename to cmd/dr/dr.go index f1de3ee5..eb6ac22b 100644 --- a/cmd/cluster/dr/dr.go +++ b/cmd/dr/dr.go @@ -19,8 +19,6 @@ import ( "github.com/spf13/cobra" ) -var ClusterName string - var DrCmd = &cobra.Command{ Use: "dr", Short: "Manage DR for a cluster.", diff --git a/cmd/cluster/dr/failover_dr.go b/cmd/dr/failover_dr.go similarity index 97% rename from cmd/cluster/dr/failover_dr.go rename to cmd/dr/failover_dr.go index 29d89dab..1d7fde07 100644 --- a/cmd/cluster/dr/failover_dr.go +++ b/cmd/dr/failover_dr.go @@ -42,11 +42,10 @@ var failoverDrCmd = &cobra.Command{ drName, _ := cmd.Flags().GetString("dr-name") safetimes, _ := cmd.Flags().GetStringArray("safetimes") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/cluster/dr/list_dr.go b/cmd/dr/list_dr.go similarity index 93% rename from cmd/cluster/dr/list_dr.go rename to cmd/dr/list_dr.go index 35a7b545..7c44eb37 100644 --- a/cmd/cluster/dr/list_dr.go +++ b/cmd/dr/list_dr.go @@ -37,11 +37,10 @@ var listDrCmd = &cobra.Command{ } authApi.GetInfo("", "") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatal(err) } - resp, r, err := authApi.ListXClusterDr(clusterId).Execute() + resp, r, err := authApi.ListXClusterDr().Execute() if err != nil { logrus.Debugf("Full HTTP response: %v", r) logrus.Fatalf(ybmAuthClient.GetApiErrorDetails(err)) diff --git a/cmd/cluster/dr/pause_dr.go b/cmd/dr/pause_dr.go similarity index 96% rename from cmd/cluster/dr/pause_dr.go rename to cmd/dr/pause_dr.go index 8961aa41..8c220ca8 100644 --- a/cmd/cluster/dr/pause_dr.go +++ b/cmd/dr/pause_dr.go @@ -40,11 +40,10 @@ var pauseDrCmd = &cobra.Command{ drName, _ := cmd.Flags().GetString("dr-name") durationInMin, _ := cmd.Flags().GetInt32("duration") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/cluster/dr/restart_dr.go b/cmd/dr/restart_dr.go similarity index 97% rename from cmd/cluster/dr/restart_dr.go rename to cmd/dr/restart_dr.go index feead5de..2e10c1ed 100644 --- a/cmd/cluster/dr/restart_dr.go +++ b/cmd/dr/restart_dr.go @@ -41,11 +41,10 @@ var restartDrCmd = &cobra.Command{ drName, _ := cmd.Flags().GetString("dr-name") databases, _ := cmd.Flags().GetStringArray("databases") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/cluster/dr/resume_dr.go b/cmd/dr/resume_dr.go similarity index 96% rename from cmd/cluster/dr/resume_dr.go rename to cmd/dr/resume_dr.go index eff10196..d7d19e49 100644 --- a/cmd/cluster/dr/resume_dr.go +++ b/cmd/dr/resume_dr.go @@ -39,11 +39,10 @@ var resumeDrCmd = &cobra.Command{ authApi.GetInfo("", "") drName, _ := cmd.Flags().GetString("dr-name") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/cluster/dr/switchover_dr.go b/cmd/dr/switchover_dr.go similarity index 96% rename from cmd/cluster/dr/switchover_dr.go rename to cmd/dr/switchover_dr.go index e55f2231..f2e8eee1 100644 --- a/cmd/cluster/dr/switchover_dr.go +++ b/cmd/dr/switchover_dr.go @@ -39,11 +39,10 @@ var switchoverDrCmd = &cobra.Command{ authApi.GetInfo("", "") drName, _ := cmd.Flags().GetString("dr-name") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/cluster/dr/update_dr.go b/cmd/dr/update_dr.go similarity index 97% rename from cmd/cluster/dr/update_dr.go rename to cmd/dr/update_dr.go index 168f8607..f6e20fe2 100644 --- a/cmd/cluster/dr/update_dr.go +++ b/cmd/dr/update_dr.go @@ -41,11 +41,10 @@ var updateDrCmd = &cobra.Command{ drName, _ := cmd.Flags().GetString("dr-name") databases, _ := cmd.Flags().GetStringArray("databases") - clusterId, err := authApi.GetClusterIdByName(ClusterName) if err != nil { logrus.Fatalf("Could not get cluster data: %s", ybmAuthClient.GetApiErrorDetails(err)) } - drId, err := authApi.GetDrIdByName(clusterId, drName) + drId, clusterId, err := authApi.GetDrDetailsByName(drName) if err != nil { logrus.Fatal(err) } diff --git a/cmd/root.go b/cmd/root.go index 6182ed52..226a37b2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -29,6 +29,7 @@ import ( "github.com/yugabyte/ybm-cli/cmd/cdc" "github.com/yugabyte/ybm-cli/cmd/cluster" "github.com/yugabyte/ybm-cli/cmd/db_audit_logs_exporter" + "github.com/yugabyte/ybm-cli/cmd/dr" "github.com/yugabyte/ybm-cli/cmd/integration" "github.com/yugabyte/ybm-cli/cmd/metrics_exporter" "github.com/yugabyte/ybm-cli/cmd/nal" @@ -138,6 +139,7 @@ func init() { rootCmd.AddCommand(user.UserCmd) rootCmd.AddCommand(metrics_exporter.MetricsExporterCmd) rootCmd.AddCommand(integration.IntegrationCmd) + util.AddCommandIfFeatureFlag(rootCmd, dr.DrCmd, util.DR) util.AddCommandIfFeatureFlag(rootCmd, db_audit_logs_exporter.DbAuditLogsExporterCmd, util.DB_AUDIT_LOGS) util.AddCommandIfFeatureFlag(rootCmd, tools.ToolsCmd, util.TOOLS) util.AddCommandIfFeatureFlag(rootCmd, cdc.CdcCmd, util.CDC) diff --git a/internal/client/client.go b/internal/client/client.go index dd2f2c13..7b4f8db6 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -503,8 +503,8 @@ func (a *AuthApiClient) GetClusterByName(clusterName string) (ybmclient.ClusterD return ybmclient.ClusterData{}, fmt.Errorf("could not get cluster data for cluster name: %s", clusterName) } -func (a *AuthApiClient) GetDrByName(clusterId string, drName string) (ybmclient.XClusterDrData, error) { - drResp, resp, err := a.ListXClusterDr(clusterId).Execute() +func (a *AuthApiClient) GetDrByName(drName string) (ybmclient.XClusterDrData, error) { + drResp, resp, err := a.ListXClusterDr().Execute() if err != nil { b, _ := httputil.DumpResponse(resp, true) logrus.Debug(string(b)) @@ -587,13 +587,13 @@ func (a *AuthApiClient) GetClusterIdByName(clusterName string) (string, error) { return "", fmt.Errorf("could not get cluster data for cluster name: %s", clusterName) } -func (a *AuthApiClient) GetDrIdByName(clusterId string, drName string) (string, error) { - drData, err := a.GetDrByName(clusterId, drName) +func (a *AuthApiClient) GetDrDetailsByName(drName string) (string, string, error) { + drData, err := a.GetDrByName(drName) if err == nil { - return drData.Info.GetId(), nil + return drData.Info.GetId(), drData.Info.GetSourceClusterId(), nil } - return "", fmt.Errorf("could not get dr data for dr name: %s", drName) + return "", "", fmt.Errorf("could not get dr data for dr name: %s", drName) } func (a *AuthApiClient) CreateCluster() ybmclient.ApiCreateClusterRequest { @@ -1718,8 +1718,8 @@ func (a *AuthApiClient) GetXClusterDr(clusterId string, drId string) ybmclient.A return a.ApiClient.XclusterDrApi.GetXClusterDr(a.ctx, a.AccountID, a.ProjectID, clusterId, drId) } -func (a *AuthApiClient) ListXClusterDr(clusterId string) ybmclient.ApiListXClusterDrRequest { - return a.ApiClient.XclusterDrApi.ListXClusterDr(a.ctx, a.AccountID, a.ProjectID, clusterId) +func (a *AuthApiClient) ListXClusterDr() ybmclient.ApiListXClusterDrRequest { + return a.ApiClient.XclusterDrApi.ListAllXClusterDrInAccount(a.ctx, a.AccountID, a.ProjectID) } func (a *AuthApiClient) DeleteXClusterDr(clusterId string, drId string) ybmclient.ApiDeleteXClusterDrRequest { From 6d922b1e0a295882f0fc65652b9ecbe48fc05a71 Mon Sep 17 00:00:00 2001 From: Srinivas Pothuraju Date: Sat, 26 Oct 2024 15:27:34 -0500 Subject: [PATCH 2/2] use latest go library --- go.mod | 2 +- go.sum | 4 ++-- internal/client/client.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 3e621f5a..838c92cc 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 - github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241021102551-c12cda1dda14 + github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241026194158-9358bc3fbd31 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/mod v0.20.0 golang.org/x/term v0.23.0 diff --git a/go.sum b/go.sum index 6c224d65..c34c2395 100644 --- a/go.sum +++ b/go.sum @@ -282,8 +282,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk= github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA= -github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241021102551-c12cda1dda14 h1:6k1ZmB/Wngtwo0SzTGl+Ky0Vpd32L+J9HVxpRY0m1/w= -github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241021102551-c12cda1dda14/go.mod h1:5vW0xIzIZw+1djkiWKx0qqNmqbRBSf4mjc4qw8lIMik= +github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241026194158-9358bc3fbd31 h1:4YdZLlhG8hWPCjb9S7TIZ7THPtaLjgGDEdJnITO8IVU= +github.com/yugabyte/yugabytedb-managed-go-client-internal v0.0.0-20241026194158-9358bc3fbd31/go.mod h1:5vW0xIzIZw+1djkiWKx0qqNmqbRBSf4mjc4qw8lIMik= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/internal/client/client.go b/internal/client/client.go index 7b4f8db6..467bbe0a 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -1718,7 +1718,7 @@ func (a *AuthApiClient) GetXClusterDr(clusterId string, drId string) ybmclient.A return a.ApiClient.XclusterDrApi.GetXClusterDr(a.ctx, a.AccountID, a.ProjectID, clusterId, drId) } -func (a *AuthApiClient) ListXClusterDr() ybmclient.ApiListXClusterDrRequest { +func (a *AuthApiClient) ListXClusterDr() ybmclient.ApiListAllXClusterDrInAccountRequest { return a.ApiClient.XclusterDrApi.ListAllXClusterDrInAccount(a.ctx, a.AccountID, a.ProjectID) }