Description
This is the general, and tracking, issue for VEP-4, phase 3, in which flags currently defined on the global flag.CommandLine
in packages throughout vitess are moved simultaneously to a pflag.FlagSet
and out of the global namespace (and therefore, out of the usage text for commands that don't consume those flags at all).
Table of Contents
Packages to move #
This issue is considered done when each of these is complete
(I am slowly filing issues for each of these packages, please bear with me!)
N.B. this list was generated with the following command git grep -E "\bflag\.[A-Z]" -- go/ | cut -d':' -f1 | xargs -I{} dirname {} | uniq
and then applying some light filtering (e.g. I know that vtadmin
is fine, and I don't care about wrangler/testlib
). If you disagree or have questions about a package, please don't hesitate to ask!!
Full command with filtering I used
git grep -E "\bflag\.[A-Z]" -- go/ | cut -d':' -f1 | xargs -I{} dirname {} | sort | uniq | grep -Ev '(testlib|vtadmin|endtoend)' | xargs -I{} echo "- [ ] \`{}\`"
-
go/acl
(Switch flag definitions to be on pflag instead of flag inpackage go/acl
#10731) -
go/cmd/mysqlctl
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/mysqlctl
#11266) -
go/cmd/mysqlctld
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/mysqlctld
#11267) -
go/cmd/query_analyzer
(nothing to do now) -
go/cmd/rulesctl/cmd
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/rulesctl/cmd
#11276) -
go/cmd/topo2topo
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/topo2topo
#11277) -
go/cmd/vtaclcheck
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtaclcheck
#11278) -
go/cmd/vtbackup
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtbackup
#11279) -
go/cmd/vtbench
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtbench
#11287) -
go/cmd/vtclient
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtclient
#11288) -
go/cmd/vtcombo
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtcombo
#10993) -
go/cmd/vtctl
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtctl
#11280) -
go/cmd/vtctlclient
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtctlclient
#11281) -
go/cmd/vtctld
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtctld
#11282) -
go/cmd/vtctldclient
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtctldclient
#11283) -
go/cmd/vtctldclient/cli
(nothing to do now) -
go/cmd/vtctldclient/command
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtctldclient/command
#11284) -
go/cmd/vtexplain
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtexplain
#11285) -
go/cmd/vtgate
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vtgate
#11286) -
go/cmd/vtgr
(Migratego/cmd/vtgr
to use pflag for parsing #10962) -
go/cmd/vtorc
(Migratevtorc
to usepflag
for parsing #10913) -
go/cmd/vttablet
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vttablet
#11289) -
go/cmd/vttestserver
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vttestserver
#11290) -
go/cmd/vttlstest
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/vttlstest
#11291) -
go/cmd/zk
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/zk
#11292) -
go/cmd/zkctl
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/zkctl
#11293) -
go/cmd/zkctld
(Switch flag definitions to be on pflag instead of flag inpackage go/cmd/zkctld
#11294) -
go/flagutil
(Switch flag definitions to be on pflag instead of flag inpackage go/flagutil
#11296) -
go/internal/flag
(Switch flag definitions to be on pflag instead of flag inpackage go/internal/flag
#11297) -
go/mysql
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql
#10740) -
go/mysql/collations
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql/collations
#10963) -
go/mysql/collations/integration
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql/collations/integration
#10964) -
go/mysql/collations/tools/makecolldata
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql/collations/tools/makecolldata
#10965) -
go/mysql/ldapauthserver
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql/ldapauthserver
#10742) -
go/mysql/vault
(Switch flag definitions to be on pflag instead of flag inpackage go/mysql/vault
#10743) -
go/stats
(Switch flag definitions to be on pflag instead of flag inpackage go/stats
#10741) -
go/stats/opentsdb
(Switch flag definitions to be on pflag instead of flag inpackage go/stats/opentsdb
#10744) -
go/stats/statsd
(Switch flag definitions to be on pflag instead of flag inpackage go/stats/statsd
#10745) -
go/streamlog
(Switch flag definitions to be on pflag instead of flag inpackage go/streamlog
#10746) -
go/tools/asthelpergen/main
(Switch flag definitions to be on pflag instead of flag inpackage go/tools/asthelpergen/main
#11298) -
go/tools/release-notes
(Switch flag definitions to be on pflag instead of flag inpackage go/tools/release-notes
#11299) -
go/tools/sizegen
(Switch flag definitions to be on pflag instead of flag inpackage go/tools/sizegen
#11300) -
go/trace
(Switch flag definitions to be on pflag instead of flag inpackage go/trace
#10747) -
go/vt/binlog/binlogplayer
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/binlog/binlogplayer
#10748) -
go/vt/binlog/grpcbinlogplayer
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/binlog/grpcbinlogplayer
#10749) -
go/vt/dbconfigs
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/dbconfigs
#10750) -
go/vt/discovery
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/discovery
#10751) -
go/vt/grpcclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/grpcclient
#10806) -
go/vt/grpccommon
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/grpccommon
#10807) -
go/vt/log
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/log
#10808) -
go/vt/logutil
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/logutil
#10809) -
go/vt/mysqlctl
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl
#10810) -
go/vt/mysqlctl/azblobbackupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/azblobbackupstorage
#10811) -
go/vt/mysqlctl/backupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/backupstorage
#10812) -
go/vt/mysqlctl/cephbackupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/cephbackupstorage
#10813) -
go/vt/mysqlctl/filebackupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/filebackupstorage
#10814) -
go/vt/mysqlctl/gcsbackupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/gcsbackupstorage
#10815) -
go/vt/mysqlctl/mysqlctlclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/mysqlctlclient
#10817) -
go/vt/mysqlctl/s3backupstorage
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/mysqlctl/s3backupstorage
#10816) -
go/vt/vtorc/app
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtorc/app
#11301) -
go/vt/vtorc/logic
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtorc/logic
#11302) -
go/vt/servenv
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/servenv
#11144) -
go/vt/sqlparser
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/sqlparser
#10824) -
go/vt/sqlparser/goyacc
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/sqlparser/goyacc
#10825) -
go/vt/srvtopo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/srvtopo
#10853) -
go/vt/status
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/status
#10854) -
go/vt/throttler/demo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/throttler/demo
#11303) -
go/vt/throttler/grpcthrottlerclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/throttler/grpcthrottlerclient
#10855) -
go/vt/throttler/throttlerclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/throttler/throttlerclient
#10856) -
go/vt/topo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo
#10857) -
go/vt/topo/consultopo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo/consultopo
#10858) -
go/vt/topo/etcd2topo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo/etcd2topo
#10859) -
go/vt/topo/k8stopo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo/k8stopo
#10860) -
go/vt/topo/topoproto
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo/topoproto
#10861) -
go/vt/topo/zk2topo
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/topo/zk2topo
#10862) -
go/vt/vtcombo
(Remove outdatedflag.Set
frompackage go/vt/vtcombo
#10888) -
go/vt/vtctl
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctl
#11304) -
go/vt/vtctl/grpcclientcommon
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctl/grpcclientcommon
#10890) -
go/vt/vtctl/grpcvtctlclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctl/grpcvtctlclient
#10891) -
go/vt/vtctl/vtctlclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctl/vtctlclient
#10892) -
go/vt/vtctl/vtctldclient/codegen
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctl/vtctldclient/codegen
#11305) -
go/vt/vtctld
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtctld
#10893) -
go/vt/vterrors
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vterrors
#10894) -
go/vt/vtexplain
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtexplain
#10930) -
go/vt/vtgate
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate
#10931) -
go/vt/vtgate/buffer
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/buffer
#10932) -
go/vt/vtgate/evalengine/integration
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/evalengine/integration
#10933) -
go/vt/vtgate/grpcvtgateconn
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/grpcvtgateconn
#10934) -
go/vt/vtgate/grpcvtgateservice
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/grpcvtgateservice
#10935) -
go/vt/vtgate/vschemaacl
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/vschemaacl
#10936) -
go/vt/vtgate/vtgateconn
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgate/vtgateconn
#10937) -
go/vt/vtgr
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgr
#10948) -
go/vt/vtgr/controller
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgr/controller
#10949) -
go/vt/vtgr/db
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vtgr/db
#10950) -
go/vt/vttablet/customrule/filecustomrule
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/customrule/filecustomrule
#10971) -
go/vt/vttablet/customrule/topocustomrule
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/customrule/topocustomrule
#10972) -
go/vt/vttablet/filelogger
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/filelogger
#10973) -
go/vt/vttablet/grpctabletconn
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/grpctabletconn
#10974) -
go/vt/vttablet/grpctmclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/grpctmclient
#10975) -
go/vt/vttablet/onlineddl
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/onlineddl
#10976) -
go/vt/vttablet/sysloglogger
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/sysloglogger
#10977) -
go/vt/vttablet/tabletconn
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletconn
#10978) -
go/vt/vttablet/tabletconntest
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletconntest
#10979) -
go/vt/vttablet/tabletmanager
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletmanager
#10980) -
go/vt/vttablet/tabletmanager/vreplication
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletmanager/vreplication
#10981) -
go/vt/vttablet/tabletserver
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletserver
#10982) -
go/vt/vttablet/tabletserver/gc
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletserver/gc
#10983) -
go/vt/vttablet/tabletserver/tabletenv
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletserver/tabletenv
#10984) -
go/vt/vttablet/tabletserver/throttle
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletserver/throttle
#10985) -
go/vt/vttablet/tabletserver/vstreamer
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tabletserver/vstreamer
#10986) -
go/vt/vttablet/tmclient
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttablet/tmclient
#10987) -
go/vt/vttest
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttest
#10988) -
go/vt/vttime
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/vttime
#10990) -
go/vt/withddl
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/withddl
#10989) -
go/vt/workflow
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/workflow
#10991) -
go/vt/wrangler
(Switch flag definitions to be on pflag instead of flag inpackage go/vt/wrangler
#10992) -
tool/rowlog
(Switch flag definitions to be on pflag instead of flag in packagetool/rowlog
#11408)
How to move a package's flags out of the global flagset — The Guide #
For each flag in the package you are tackling, you are going to want to determine if it truly should be global and available to every binary (probably flags that control logging and tracing behavior are good candidates), or if they only make sense for a particular binary or particular subset of binaries.
To see which cmd
entrypoints actually import your package at all (which doesn't actually tell you if the value that flag is set to has any impact on that binary), you can run:
go list -f '{{ .ImportPath }}| {{ join .Deps " " }} ' ./go/cmd/... | awk -F"|" '$2 ~ " <full import path of your package here> " {print $1}'
The spacing in the -f
argument to go list
might seem arbitrary, but it's specific and important here, as it lets us do an exact match in the awk
(e.g. you want to know if vitess.io/vitess/go/vt/vtgate
is imported, but not get false positives if someone imports vitess.io/vitess/go/vt/vtgate/buffer
, or anything else underneath the go/vt/vtgate/*
tree).
As an example, here are the cmd
s that import grpcvtgateservice
:
$ go list -f '{{ .ImportPath }}| {{ join .Deps " " }} ' ./go/cmd/... | awk -F"|" '$2 ~ " vitess.io/vitess/go/vt/vtgate/grpcvtgateservice " {print $1}'
vitess.io/vitess/go/cmd/vtcombo
vitess.io/vitess/go/cmd/vtgate
vitess.io/vitess/go/cmd/vtgateclienttest
Armed with this list, you need to make a judgement call as to whether each of these commands actually needs the flags defined in your package. I don't have much to say in the way of guidance here, except to ask the domain experts of the package and the cmd
entrypoint. This is also why we have endtoend tests, and release candidates :)
Once you've decided, you can move your flags to a function (RegisterFlags
is a good name, as is InstallFlags
, which takes a *pflag.FlagSet
as input), for example:
var myCoolFlag int
- flag.IntVar(&myCoolFlag, "my-cool-flag", 0, "this is my cool flag, but it's in the global flagset")
+ func RegisterFlags(fs *pflag.FlagSet) {
+ fs.IntVar(&myCoolFlag, "my-cool-flag", 0, "this is my cool flag, and now it's only installed on this one flagset")
+ }
Now that you've done that, you'll hook into servenv
's new hook points to ensure your flag gets installed in the right places. If you decided your flag should truly be global, you will do:
func init() {
servenv.OnParse(RegisterFlags)
}
If you've decided your flag belongs only on one or two commands, you'll do:
func init() {
servenv.OnParseFor("vttablet", RegisterFlags)
servenv.OnParseFor("vtgate", RegisterFlags) // this is also why I suggest writing a function rather than inlining
}