Skip to content

Commit

Permalink
Get rid of tdbg.cFactory global variable
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelSnowden committed Sep 25, 2023
1 parent f44307c commit 03321ac
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 187 deletions.
2 changes: 1 addition & 1 deletion cmd/tools/tdbg/main.go
Expand Up @@ -31,6 +31,6 @@ import (
)

func main() {
app := tdbg.NewCliApp()
app := tdbg.NewCliApp(tdbg.NewClientFactory())
_ = app.Run(os.Args)
}
14 changes: 2 additions & 12 deletions tools/tdbg/app.go
Expand Up @@ -35,13 +35,8 @@ import (
"github.com/temporalio/tctl-kit/pkg/color"
)

// SetFactory is used to set the ClientFactory global
func SetFactory(factory ClientFactory) {
cFactory = factory
}

// NewCliApp instantiates a new instance of the CLI application.
func NewCliApp() *cli.App {
func NewCliApp(clientFactory ClientFactory) *cli.App {
app := cli.NewApp()
app.Name = "tdbg"
app.Usage = "A command-line tool for Temporal server debugging"
Expand Down Expand Up @@ -106,14 +101,9 @@ func NewCliApp() *cli.App {
Value: string(color.Auto),
},
}
app.Commands = commands
app.Commands = getCommands(clientFactory)
app.ExitErrHandler = handleError

// set builder if not customized
if cFactory == nil {
SetFactory(NewClientFactory())
}

return app
}

Expand Down
2 changes: 1 addition & 1 deletion tools/tdbg/app_test.go
Expand Up @@ -22,7 +22,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package tdbg
package tdbg_test

import (
"encoding/json"
Expand Down
66 changes: 33 additions & 33 deletions tools/tdbg/commands.go
Expand Up @@ -56,7 +56,7 @@ const (
)

// AdminShowWorkflow shows history
func AdminShowWorkflow(c *cli.Context) error {
func AdminShowWorkflow(c *cli.Context, clientFactory ClientFactory) error {
nsName, err := getRequiredOption(c, FlagNamespace)
if err != nil {
return err
Expand All @@ -72,14 +72,14 @@ func AdminShowWorkflow(c *cli.Context) error {
endEventVersion := int64(c.Int(FlagMaxEventVersion))
outputFileName := c.String(FlagOutputFilename)

client := cFactory.AdminClient(c)
client := clientFactory.AdminClient(c)

serializer := serialization.NewSerializer()

ctx, cancel := newContext(c)
defer cancel()

nsID, err := getNamespaceID(c, namespace.Name(nsName))
nsID, err := getNamespaceID(c, clientFactory, namespace.Name(nsName))
if err != nil {
return err
}
Expand Down Expand Up @@ -140,7 +140,7 @@ func AdminShowWorkflow(c *cli.Context) error {
}

// AdminImportWorkflow imports history
func AdminImportWorkflow(c *cli.Context) error {
func AdminImportWorkflow(c *cli.Context, clientFactory ClientFactory) error {
nsName, err := getRequiredOption(c, FlagNamespace)
if err != nil {
return err
Expand All @@ -155,7 +155,7 @@ func AdminImportWorkflow(c *cli.Context) error {
}
inputFileName := c.String(FlagInputFilename)

client := cFactory.AdminClient(c)
client := clientFactory.AdminClient(c)

serializer := serialization.NewSerializer()

Expand Down Expand Up @@ -242,8 +242,8 @@ func AdminImportWorkflow(c *cli.Context) error {
}

// AdminDescribeWorkflow describe a new workflow execution for admin
func AdminDescribeWorkflow(c *cli.Context) error {
resp, err := describeMutableState(c)
func AdminDescribeWorkflow(c *cli.Context, clientFactory ClientFactory) error {
resp, err := describeMutableState(c, clientFactory)
if err != nil {
return err
}
Expand Down Expand Up @@ -278,8 +278,8 @@ func AdminDescribeWorkflow(c *cli.Context) error {
return nil
}

func describeMutableState(c *cli.Context) (*adminservice.DescribeMutableStateResponse, error) {
adminClient := cFactory.AdminClient(c)
func describeMutableState(c *cli.Context, clientFactory ClientFactory) (*adminservice.DescribeMutableStateResponse, error) {
adminClient := clientFactory.AdminClient(c)

namespace, err := getRequiredOption(c, FlagNamespace)
if err != nil {
Expand Down Expand Up @@ -312,8 +312,8 @@ func describeMutableState(c *cli.Context) (*adminservice.DescribeMutableStateRes
// It should only be used as a troubleshooting tool since no additional check will be done before the deletion.
// (e.g. if a child workflow has recorded its result in the parent workflow)
// Please use normal workflow delete command to gracefully delete a workflow execution.
func AdminDeleteWorkflow(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminDeleteWorkflow(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)

namespace, err := getRequiredOption(c, FlagNamespace)
if err != nil {
Expand Down Expand Up @@ -373,10 +373,10 @@ func AdminGetShardID(c *cli.Context) error {
}

// AdminListShardTasks outputs a list of a tasks for given Shard and Task Category
func AdminListShardTasks(c *cli.Context) error {
func AdminListShardTasks(c *cli.Context, clientFactory ClientFactory) error {
sid := int32(c.Int(FlagShardID))
categoryStr := c.String(FlagTaskType)
categoryValue, err := stringToEnum(categoryStr, enumsspb.TaskCategory_value)
categoryValue, err := StringToEnum(categoryStr, enumsspb.TaskCategory_value)
if err != nil {
categoryInt, err := strconv.Atoi(categoryStr)
if err != nil {
Expand All @@ -389,7 +389,7 @@ func AdminListShardTasks(c *cli.Context) error {
return fmt.Errorf("missing required parameter Task type: %s", err)
}

client := cFactory.AdminClient(c)
client := clientFactory.AdminClient(c)
pageSize := defaultPageSize
if c.IsSet(FlagPageSize) {
pageSize = c.Int(FlagPageSize)
Expand Down Expand Up @@ -442,11 +442,11 @@ func AdminListShardTasks(c *cli.Context) error {
}

// AdminRemoveTask describes history host
func AdminRemoveTask(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminRemoveTask(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)
shardID := c.Int(FlagShardID)
taskID := c.Int64(FlagTaskID)
categoryInt, err := stringToEnum(c.String(FlagTaskType), enumsspb.TaskCategory_value)
categoryInt, err := StringToEnum(c.String(FlagTaskType), enumsspb.TaskCategory_value)
if err != nil {
return fmt.Errorf("unable to parse Task Type: %s", err)
}
Expand Down Expand Up @@ -477,9 +477,9 @@ func AdminRemoveTask(c *cli.Context) error {
}

// AdminDescribeShard describes shard by shard id
func AdminDescribeShard(c *cli.Context) error {
func AdminDescribeShard(c *cli.Context, clientFactory ClientFactory) error {
sid := c.Int(FlagShardID)
adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)
ctx, cancel := newContext(c)
defer cancel()
response, err := adminClient.GetShard(ctx, &adminservice.GetShardRequest{ShardId: int32(sid)})
Expand All @@ -493,8 +493,8 @@ func AdminDescribeShard(c *cli.Context) error {
}

// AdminShardManagement describes history host
func AdminShardManagement(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminShardManagement(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)
sid := c.Int(FlagShardID)

ctx, cancel := newContext(c)
Expand All @@ -511,10 +511,10 @@ func AdminShardManagement(c *cli.Context) error {
}

// AdminListGossipMembers outputs a list of gossip members
func AdminListGossipMembers(c *cli.Context) error {
func AdminListGossipMembers(c *cli.Context, clientFactory ClientFactory) error {
roleFlag := c.String(FlagClusterMembershipRole)

adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)
ctx, cancel := newContext(c)
defer cancel()
response, err := adminClient.DescribeCluster(ctx, &adminservice.DescribeClusterRequest{})
Expand All @@ -539,16 +539,16 @@ func AdminListGossipMembers(c *cli.Context) error {
}

// AdminListClusterMembers outputs a list of cluster members
func AdminListClusterMembers(c *cli.Context) error {
role, _ := stringToEnum(c.String(FlagClusterMembershipRole), enumsspb.ClusterMemberRole_value)
func AdminListClusterMembers(c *cli.Context, clientFactory ClientFactory) error {
role, _ := StringToEnum(c.String(FlagClusterMembershipRole), enumsspb.ClusterMemberRole_value)
// TODO: refactor this: parseTime shouldn't be used for duration.
heartbeatFlag, err := parseTime(c.String(FlagFrom), time.Time{}, time.Now().UTC())
if err != nil {
return fmt.Errorf("unable to parse Heartbeat time: %s", err)
}
heartbeat := time.Duration(heartbeatFlag.UnixNano())

adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)
ctx, cancel := newContext(c)
defer cancel()

Expand All @@ -569,8 +569,8 @@ func AdminListClusterMembers(c *cli.Context) error {
}

// AdminDescribeHistoryHost describes history host
func AdminDescribeHistoryHost(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminDescribeHistoryHost(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)

namespace := c.String(FlagNamespace)
workflowID := c.String(FlagWorkflowID)
Expand Down Expand Up @@ -618,8 +618,8 @@ func AdminDescribeHistoryHost(c *cli.Context) error {
}

// AdminRefreshWorkflowTasks refreshes all the tasks of a workflow
func AdminRefreshWorkflowTasks(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminRefreshWorkflowTasks(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)

nsName, err := getRequiredOption(c, FlagNamespace)
if err != nil {
Expand All @@ -635,7 +635,7 @@ func AdminRefreshWorkflowTasks(c *cli.Context) error {
ctx, cancel := newContext(c)
defer cancel()

nsID, err := getNamespaceID(c, namespace.Name(nsName))
nsID, err := getNamespaceID(c, clientFactory, namespace.Name(nsName))
if err != nil {
return err
}
Expand All @@ -656,8 +656,8 @@ func AdminRefreshWorkflowTasks(c *cli.Context) error {
}

// AdminRebuildMutableState rebuild a workflow mutable state using persisted history events
func AdminRebuildMutableState(c *cli.Context) error {
adminClient := cFactory.AdminClient(c)
func AdminRebuildMutableState(c *cli.Context, clientFactory ClientFactory) error {
adminClient := clientFactory.AdminClient(c)

namespace, err := getRequiredOption(c, FlagNamespace)
if err != nil {
Expand Down
4 changes: 0 additions & 4 deletions tools/tdbg/defs.go
Expand Up @@ -49,7 +49,3 @@ const (

showErrorStackEnv = `TEMPORAL_CLI_SHOW_STACKS`
)

var (
cFactory ClientFactory
)
12 changes: 6 additions & 6 deletions tools/tdbg/dlq_commands.go
Expand Up @@ -45,11 +45,11 @@ const (
)

// AdminGetDLQMessages gets DLQ metadata
func AdminGetDLQMessages(c *cli.Context) (err error) {
func AdminGetDLQMessages(c *cli.Context, clientFactory ClientFactory) (err error) {
ctx, cancel := newContext(c)
defer cancel()

adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)
dlqType := c.String(FlagDLQType)
sourceCluster := c.String(FlagCluster)
shardID := c.Int(FlagShardID)
Expand Down Expand Up @@ -120,7 +120,7 @@ func AdminGetDLQMessages(c *cli.Context) (err error) {
}

// AdminPurgeDLQMessages deletes messages from DLQ
func AdminPurgeDLQMessages(c *cli.Context) error {
func AdminPurgeDLQMessages(c *cli.Context, clientFactory ClientFactory) error {
ctx, cancel := newContext(c)
defer cancel()

Expand All @@ -135,7 +135,7 @@ func AdminPurgeDLQMessages(c *cli.Context) error {
prompt("Are you sure to purge all DLQ messages without a upper boundary?", c.Bool(FlagYes))
}

adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)
t, err := toQueueType(dlqType)
if err != nil {
return err
Expand All @@ -153,7 +153,7 @@ func AdminPurgeDLQMessages(c *cli.Context) error {
}

// AdminMergeDLQMessages merges message from DLQ
func AdminMergeDLQMessages(c *cli.Context) error {
func AdminMergeDLQMessages(c *cli.Context, clientFactory ClientFactory) error {
ctx, cancel := newContext(c)
defer cancel()

Expand All @@ -168,7 +168,7 @@ func AdminMergeDLQMessages(c *cli.Context) error {
prompt("Are you sure to merge all DLQ messages without a upper boundary?", c.Bool(FlagYes))
}

adminClient := cFactory.AdminClient(c)
adminClient := clientFactory.AdminClient(c)

t, err := toQueueType(dlqType)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion tools/tdbg/factory.go
Expand Up @@ -113,7 +113,7 @@ func (b *clientFactory) createGRPCConnection(c *cli.Context) (*grpc.ClientConn,
grpcSecurityOptions,
}

connection, err := grpc.Dial(hostPort, dialOpts...)
connection, err := grpc.Dial("membership://frontend", dialOpts...)
if err != nil {
b.logger.Fatal("Failed to create connection", tag.Error(err))
return nil, err
Expand Down
6 changes: 3 additions & 3 deletions tools/tdbg/task_queue_commands.go
Expand Up @@ -33,13 +33,13 @@ import (
)

// AdminListTaskQueueTasks displays task information
func AdminListTaskQueueTasks(c *cli.Context) error {
func AdminListTaskQueueTasks(c *cli.Context, clientFactory ClientFactory) error {
namespace, err := getRequiredOption(c, FlagNamespace)
if err != nil {
return err
}
tqName := c.String(FlagTaskQueue)
tlTypeInt, err := stringToEnum(c.String(FlagTaskQueueType), enumspb.TaskQueueType_value)
tlTypeInt, err := StringToEnum(c.String(FlagTaskQueueType), enumspb.TaskQueueType_value)
if err != nil {
return fmt.Errorf("invalid task queue type: %v", err)
}
Expand All @@ -56,7 +56,7 @@ func AdminListTaskQueueTasks(c *cli.Context) error {
workflowID := c.String(FlagWorkflowID)
runID := c.String(FlagRunID)

client := cFactory.AdminClient(c)
client := clientFactory.AdminClient(c)

req := &adminservice.GetTaskQueueTasksRequest{
Namespace: namespace,
Expand Down

0 comments on commit 03321ac

Please sign in to comment.