diff --git a/go/cmd/vtctldclient/command/vreplication/common/show.go b/go/cmd/vtctldclient/command/vreplication/common/show.go index 11f1b91bfa9..829894dc3a0 100644 --- a/go/cmd/vtctldclient/command/vreplication/common/show.go +++ b/go/cmd/vtctldclient/command/vreplication/common/show.go @@ -65,10 +65,6 @@ func commandShow(cmd *cobra.Command, args []string) error { // We always use compact format with SHOW to reduce the overall // size and noise. cli.DefaultMarshalOptions.EmitUnpopulated = false - if len(resp.Workflows) == 0 { - return fmt.Errorf("workflow %s not found in the %s keyspace", - BaseOptions.Workflow, BaseOptions.TargetKeyspace) - } data, err := cli.MarshalJSONPretty(resp) if err != nil { return err diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/get.go b/go/cmd/vtctldclient/command/vreplication/workflow/get.go index 69acc535158..67eb7bcaa47 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/get.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/get.go @@ -47,9 +47,10 @@ func commandGetWorkflows(cmd *cobra.Command, args []string) error { ks := cmd.Flags().Arg(0) resp, err := common.GetClient().GetWorkflows(common.GetCommandCtx(), &vtctldatapb.GetWorkflowsRequest{ - Keyspace: ks, - ActiveOnly: !getWorkflowsOptions.ShowAll, - IncludeLogs: workflowShowOptions.IncludeLogs, + Keyspace: ks, + ActiveOnly: !getWorkflowsOptions.ShowAll, + IncludeLogs: workflowShowOptions.IncludeLogs, + VerbosityLevel: workflowShowOptions.VerbosityLevel, }) if err != nil { diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/show.go b/go/cmd/vtctldclient/command/vreplication/workflow/show.go index cbb1d01ba10..da667ad8a49 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/show.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/show.go @@ -56,10 +56,11 @@ func commandShow(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) req := &vtctldatapb.GetWorkflowsRequest{ - Keyspace: baseOptions.Keyspace, - Workflow: baseOptions.Workflow, - IncludeLogs: workflowShowOptions.IncludeLogs, - Shards: baseOptions.Shards, + Keyspace: baseOptions.Keyspace, + Workflow: baseOptions.Workflow, + IncludeLogs: workflowShowOptions.IncludeLogs, + Shards: baseOptions.Shards, + VerbosityLevel: workflowShowOptions.VerbosityLevel, } resp, err := common.GetClient().GetWorkflows(common.GetCommandCtx(), req) if err != nil { diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go b/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go index 63de3b70cee..076b73a52ec 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go @@ -44,7 +44,8 @@ var ( }{} workflowShowOptions = struct { - IncludeLogs bool + IncludeLogs bool + VerbosityLevel uint32 }{} ) @@ -55,6 +56,7 @@ func registerCommands(root *cobra.Command) { getWorkflows.Flags().BoolVar(&workflowShowOptions.IncludeLogs, "include-logs", true, "Include recent logs for the workflows.") getWorkflows.Flags().BoolVarP(&getWorkflowsOptions.ShowAll, "show-all", "a", false, "Show all workflows instead of just active workflows.") + getWorkflows.Flags().Uint32Var(&workflowShowOptions.VerbosityLevel, "verbosity-level", 0, "How much detail to include in the results.") root.AddCommand(getWorkflows) // Yes this is supposed to be root as GetWorkflows is a top-level command. delete.Flags().StringVarP(&baseOptions.Workflow, "workflow", "w", "", "The workflow you want to delete.") @@ -71,6 +73,7 @@ func registerCommands(root *cobra.Command) { show.Flags().StringVarP(&baseOptions.Workflow, "workflow", "w", "", "The workflow you want the details for.") show.MarkFlagRequired("workflow") show.Flags().BoolVar(&workflowShowOptions.IncludeLogs, "include-logs", true, "Include recent logs for the workflow.") + show.Flags().Uint32Var(&workflowShowOptions.VerbosityLevel, "verbosity-level", 0, "How much detail to include in the results.") common.AddShardSubsetFlag(show, &baseOptions.Shards) base.AddCommand(show) diff --git a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go index 6cce3fe9fa6..bf63f404492 100644 --- a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go +++ b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go @@ -28,6 +28,7 @@ import ( "github.com/tidwall/gjson" "golang.org/x/exp/maps" "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" "vitess.io/vitess/go/json2" "vitess.io/vitess/go/test/endtoend/cluster" @@ -152,7 +153,8 @@ func testMoveTablesFlags1(t *testing.T, mt *iMoveTables, sourceKeyspace, targetK workflowResponse := getWorkflow(targetKeyspace, workflowName) // also validates that MoveTables Show and Workflow Show return the same output. - require.EqualValues(t, moveTablesResponse.CloneVT(), workflowResponse) + //require.EqualValues(t, moveTablesResponse.CloneVT(), workflowResponse) + require.True(t, proto.Equal(moveTablesResponse.CloneVT(), workflowResponse)) // Validate that the flags are set correctly in the database. validateMoveTablesWorkflow(t, workflowResponse.Workflows) @@ -485,7 +487,7 @@ func splitShard(t *testing.T, keyspace, workflowName, sourceShards, targetShards validateOverrides(t, targetTabs, overrides) workflowResponse := getWorkflow(keyspace, workflowName) reshardShowResponse := getReshardShowResponse(&rs) - require.EqualValues(t, reshardShowResponse, workflowResponse) + require.True(t, proto.Equal(reshardShowResponse, workflowResponse)) validateReshardWorkflow(t, workflowResponse.Workflows) waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", keyspace, workflowName), binlogdatapb.VReplicationWorkflowState_Stopped.String()) rs.Start() @@ -709,8 +711,8 @@ func getReshardResponse(rs iReshard) *vtctldatapb.WorkflowStatusResponse { // helper functions func getWorkflow(targetKeyspace, workflow string) *vtctldatapb.GetWorkflowsResponse { - workflowOutput, err := vc.VtctldClient.ExecuteCommandWithOutput("Workflow", "--keyspace", targetKeyspace, "show", "--workflow", workflow) - require.NoError(vc.t, err) + workflowOutput, err := vc.VtctldClient.ExecuteCommandWithOutput("Workflow", "--keyspace", targetKeyspace, "show", "--workflow", workflow, verbosityFlag) + require.NoError(vc.t, err, workflowOutput) var workflowResponse vtctldatapb.GetWorkflowsResponse err = protojson.Unmarshal([]byte(workflowOutput), &workflowResponse) require.NoError(vc.t, err) @@ -720,8 +722,8 @@ func getWorkflow(targetKeyspace, workflow string) *vtctldatapb.GetWorkflowsRespo } func getWorkflows(targetKeyspace string) *vtctldatapb.GetWorkflowsResponse { - getWorkflowsOutput, err := vc.VtctldClient.ExecuteCommandWithOutput("GetWorkflows", targetKeyspace, "--show-all", "--compact", "--include-logs=false") - require.NoError(vc.t, err) + getWorkflowsOutput, err := vc.VtctldClient.ExecuteCommandWithOutput("GetWorkflows", targetKeyspace, "--show-all", "--compact", "--include-logs=false", verbosityFlag) + require.NoError(vc.t, err, getWorkflowsOutput) var getWorkflowsResponse vtctldatapb.GetWorkflowsResponse err = protojson.Unmarshal([]byte(getWorkflowsOutput), &getWorkflowsResponse) require.NoError(vc.t, err) diff --git a/go/test/endtoend/vreplication/wrappers_test.go b/go/test/endtoend/vreplication/wrappers_test.go index 2ca1b3bb724..8a86fffa982 100644 --- a/go/test/endtoend/vreplication/wrappers_test.go +++ b/go/test/endtoend/vreplication/wrappers_test.go @@ -17,6 +17,8 @@ limitations under the License. package vreplication import ( + "fmt" + "math" "math/rand/v2" "strconv" "strings" @@ -26,6 +28,8 @@ import ( "vitess.io/vitess/go/vt/log" ) +var verbosityFlag = fmt.Sprintf("--verbosity-level=%d", math.MaxUint32) + type iWorkflow interface { Create() Show() @@ -163,6 +167,7 @@ func (v VtctldMoveTables) ReverseReadsAndWrites() { func (v VtctldMoveTables) Show() { args := []string{"Show"} + args = append(args, verbosityFlag) args = append(args, v.showFlags...) v.exec(args...) } @@ -308,7 +313,7 @@ func (v VtctldReshard) ReverseReadsAndWrites() { } func (v VtctldReshard) Show() { - v.exec("Show") + v.exec("Show", verbosityFlag) } func (v *VtctldReshard) Status() { diff --git a/go/vt/vtctl/workflow/workflows.go b/go/vt/vtctl/workflow/workflows.go index a864ef764e8..424749b605b 100644 --- a/go/vt/vtctl/workflow/workflows.go +++ b/go/vt/vtctl/workflow/workflows.go @@ -356,6 +356,7 @@ func (wf *workflowFetcher) scanWorkflow( workflow.ShardStreams[shardStreamKey] = shardStream } + workflow.WorkflowType = res.WorkflowType.String() for _, rstream := range res.Streams { // The value in the pos column can be compressed and thus not @@ -428,7 +429,6 @@ func (wf *workflowFetcher) scanWorkflow( if vreplicationLag.Seconds() > meta.maxVReplicationLag { meta.maxVReplicationLag = vreplicationLag.Seconds() } - workflow.WorkflowType = res.WorkflowType.String() workflow.WorkflowSubType = res.WorkflowSubType.String() workflow.DeferSecondaryKeys = res.DeferSecondaryKeys }