Skip to content

Commit 58ea420

Browse files
authored
Merge pull request #1080 from percona/PBM-1466-2
PBM-1466 - Remove kingpin dependency
2 parents 3dd80f5 + ee54fc8 commit 58ea420

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+205
-9980
lines changed

cmd/pbm-speed-test/main.go

Lines changed: 146 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,76 +7,160 @@ import (
77
"os"
88
"time"
99

10-
"github.com/alecthomas/kingpin"
10+
"github.com/spf13/cobra"
11+
"github.com/spf13/viper"
1112
"go.mongodb.org/mongo-driver/mongo"
1213

1314
"github.com/percona/percona-backup-mongodb/pbm/compress"
1415
"github.com/percona/percona-backup-mongodb/pbm/connect"
16+
"github.com/percona/percona-backup-mongodb/pbm/errors"
1517
"github.com/percona/percona-backup-mongodb/pbm/log"
1618
"github.com/percona/percona-backup-mongodb/pbm/storage/blackhole"
1719
"github.com/percona/percona-backup-mongodb/pbm/util"
1820
"github.com/percona/percona-backup-mongodb/pbm/version"
1921
)
2022

23+
type rootOpts struct {
24+
mURL string
25+
sampleColF string
26+
sampleSizeF float64
27+
compression string
28+
compressLevelArg []int
29+
}
30+
31+
var validCompressions = []string{
32+
string(compress.CompressionTypeNone),
33+
string(compress.CompressionTypeGZIP),
34+
string(compress.CompressionTypeSNAPPY),
35+
string(compress.CompressionTypeLZ4),
36+
string(compress.CompressionTypeS2),
37+
string(compress.CompressionTypePGZIP),
38+
string(compress.CompressionTypeZstandard),
39+
}
40+
2141
func main() {
22-
var (
23-
tCmd = kingpin.New("pbm-speed-test", "Percona Backup for MongoDB compression and upload speed test")
24-
mURL = tCmd.Flag("mongodb-uri", "MongoDB connection string").Envar("PBM_MONGODB_URI").String()
25-
sampleColF = tCmd.Flag("sample-collection", "Set collection as the data source").Short('c').String()
26-
sampleSizeF = tCmd.Flag("size-gb", "Set data size in GB. Default 1").Short('s').Float64()
27-
28-
compressLevelArg []int
29-
compressLevel *int
30-
31-
compressType = tCmd.Flag("compression", "Compression type <none>/<gzip>/<snappy>/<lz4>/<s2>/<pgzip>/<zstd>").
32-
Default(string(compress.CompressionTypeS2)).
33-
Enum(string(compress.CompressionTypeNone), string(compress.CompressionTypeGZIP),
34-
string(compress.CompressionTypeSNAPPY), string(compress.CompressionTypeLZ4),
35-
string(compress.CompressionTypeS2), string(compress.CompressionTypePGZIP),
36-
string(compress.CompressionTypeZstandard),
37-
)
42+
rootOptions := rootOpts{}
43+
rootCmd := &cobra.Command{
44+
Use: "pbm-speed-test",
45+
Short: "Percona Backup for MongoDB compression and upload speed test",
46+
SilenceUsage: true,
47+
}
3848

39-
compressionCmd = tCmd.Command("compression", "Run compression test")
40-
storageCmd = tCmd.Command("storage", "Run storage test")
49+
rootCmd.PersistentFlags().StringVar(&rootOptions.mURL, "mongodb-uri", "", "MongoDB connection string")
50+
_ = viper.BindPFlag("mongodb-uri", rootCmd.PersistentFlags().Lookup("mongodb-uri"))
51+
_ = viper.BindEnv("mongodb-uri", "PBM_MONGODB_URI")
4152

42-
versionCmd = tCmd.Command("version", "PBM version info")
43-
versionShort = versionCmd.Flag("short", "Only version info").Default("false").Bool()
44-
versionCommit = versionCmd.Flag("commit", "Only git commit info").Default("false").Bool()
45-
versionFormat = versionCmd.Flag("format", "Output format <json or \"\">").Default("").String()
53+
rootCmd.PersistentFlags().StringVarP(
54+
&rootOptions.sampleColF, "sample-collection", "c", "",
55+
"Set collection as the data source",
56+
)
57+
rootCmd.PersistentFlags().Float64VarP(
58+
&rootOptions.sampleSizeF, "size-gb", "s", 1,
59+
"Set data size in GB. Default 1",
60+
)
61+
rootCmd.PersistentFlags().StringVar(
62+
&rootOptions.compression, "compression", "",
63+
"Compression type <none>/<gzip>/<snappy>/<lz4>/<s2>/<pgzip>/<zstd>",
64+
)
65+
rootCmd.PersistentFlags().IntSliceVar(
66+
&rootOptions.compressLevelArg, "compression-level", nil, "Compression level (specific to the compression type)",
4667
)
4768

48-
tCmd.Flag("compression-level", "Compression level (specific to the compression type)").IntsVar(&compressLevelArg)
69+
compressionCmd := &cobra.Command{
70+
Use: "compression",
71+
Short: "Run compression test",
72+
RunE: func(cmd *cobra.Command, args []string) error {
73+
if rootOptions.mURL == "" {
74+
rootOptions.mURL = viper.GetString("mongodb-uri")
75+
}
76+
77+
if err := validateEnum("compression", rootOptions.compression, validCompressions); err != nil {
78+
return err
79+
}
80+
81+
var compressLevel *int
82+
83+
if len(rootOptions.compressLevelArg) > 0 {
84+
compressLevel = &rootOptions.compressLevelArg[0]
85+
}
86+
87+
cmd.Print("Test started ")
88+
testCompression(
89+
rootOptions.mURL,
90+
compress.CompressionType(rootOptions.compression),
91+
compressLevel,
92+
rootOptions.sampleSizeF,
93+
rootOptions.sampleColF,
94+
)
4995

50-
if len(compressLevelArg) > 0 {
51-
compressLevel = &compressLevelArg[0]
96+
return nil
97+
},
5298
}
5399

54-
cmd, err := tCmd.DefaultEnvars().Parse(os.Args[1:])
55-
if err != nil && cmd != versionCmd.FullCommand() {
56-
stdlog.Println("Error: Parse command line parameters:", err)
57-
return
100+
rootCmd.AddCommand(compressionCmd)
101+
102+
storageCmd := &cobra.Command{
103+
Use: "storage",
104+
Short: "Run storage test",
105+
RunE: func(cmd *cobra.Command, args []string) error {
106+
if rootOptions.mURL == "" {
107+
rootOptions.mURL = viper.GetString("mongodb-uri")
108+
}
109+
110+
if err := validateEnum("compression", rootOptions.compression, validCompressions); err != nil {
111+
return err
112+
}
113+
114+
var compressLevel *int
115+
116+
if len(rootOptions.compressLevelArg) > 0 {
117+
compressLevel = &rootOptions.compressLevelArg[0]
118+
}
119+
120+
cmd.Print("Test started ")
121+
testStorage(
122+
rootOptions.mURL,
123+
compress.CompressionType(rootOptions.compression),
124+
compressLevel,
125+
rootOptions.sampleSizeF,
126+
rootOptions.sampleColF,
127+
)
128+
129+
return nil
130+
},
58131
}
59132

60-
if *sampleSizeF == 0 {
61-
*sampleSizeF = 1
133+
rootCmd.AddCommand(storageCmd)
134+
135+
var (
136+
versionShort bool
137+
versionCommit bool
138+
versionFormat string
139+
)
140+
141+
versionCmd := &cobra.Command{
142+
Use: "version",
143+
Short: "PBM version info",
144+
Run: func(cmd *cobra.Command, args []string) {
145+
switch {
146+
case versionShort:
147+
cmd.Println(version.Current().Short())
148+
case versionCommit:
149+
cmd.Println(version.Current().GitCommit)
150+
default:
151+
cmd.Println(version.Current().All(versionFormat))
152+
}
153+
},
62154
}
63155

64-
switch cmd {
65-
case compressionCmd.FullCommand():
66-
fmt.Print("Test started ")
67-
testCompression(*mURL, compress.CompressionType(*compressType), compressLevel, *sampleSizeF, *sampleColF)
68-
case storageCmd.FullCommand():
69-
fmt.Print("Test started ")
70-
testStorage(*mURL, compress.CompressionType(*compressType), compressLevel, *sampleSizeF, *sampleColF)
71-
case versionCmd.FullCommand():
72-
switch {
73-
case *versionCommit:
74-
fmt.Println(version.Current().GitCommit)
75-
case *versionShort:
76-
fmt.Println(version.Current().Short())
77-
default:
78-
fmt.Println(version.Current().All(*versionFormat))
79-
}
156+
versionCmd.Flags().BoolVar(&versionShort, "short", false, "Only version info")
157+
versionCmd.Flags().BoolVar(&versionCommit, "commit", false, "Only git commit info")
158+
versionCmd.Flags().StringVar(&versionFormat, "format", "", "Output format <json or \"\">")
159+
160+
rootCmd.AddCommand(versionCmd)
161+
162+
if err := rootCmd.Execute(); err != nil {
163+
os.Exit(1)
80164
}
81165
}
82166

@@ -148,3 +232,17 @@ func printw(done <-chan struct{}) {
148232
}
149233
}
150234
}
235+
236+
func validateEnum(fieldName, value string, valid []string) error {
237+
if value == "" {
238+
return nil
239+
}
240+
241+
for _, validItem := range valid {
242+
if value == validItem {
243+
return nil
244+
}
245+
}
246+
247+
return errors.New(fmt.Sprintf("invalid %s value: %q (must be one of %v)", fieldName, value, valid))
248+
}

e2e-tests/cmd/ensure-oplog/main.go

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
"strings"
1010
"time"
1111

12-
"github.com/alecthomas/kingpin"
12+
"github.com/spf13/cobra"
13+
"github.com/spf13/viper"
1314
"go.mongodb.org/mongo-driver/bson"
1415
"go.mongodb.org/mongo-driver/bson/primitive"
1516
"go.mongodb.org/mongo-driver/mongo"
@@ -29,43 +30,64 @@ import (
2930

3031
var logger = stdlog.New(os.Stdout, "", stdlog.Ltime)
3132

32-
func main() {
33-
ctx := context.Background()
34-
35-
app := kingpin.New("ensure-oplog", "ensure oplog chunks")
36-
cmd := app.Command("run", "").Default().Hidden()
37-
uri := cmd.Flag("mongodb-uri", "mongodb URI").Envar("PBM_MONGODB_URI").String()
38-
fromS := cmd.Flag("from", "first op time").String()
39-
tillS := cmd.Flag("till", "last op time").String()
40-
_, err := app.DefaultEnvars().Parse(os.Args[1:])
41-
if err != nil {
42-
stdlog.Fatal(err)
43-
}
44-
45-
fromTS, err := parseTS(*fromS)
46-
if err != nil {
47-
stdlog.Fatalf("parse from time: %s", err.Error())
48-
}
49-
tillTS, err := parseTS(*tillS)
50-
if err != nil {
51-
stdlog.Fatalf("parse till time: %s", err.Error())
52-
}
53-
54-
t, err := connTopo(ctx, *uri)
55-
if err != nil {
56-
stdlog.Fatalf("getTopo: %s", err.Error())
57-
}
58-
59-
switch t {
60-
case topoMongos:
61-
err = ensureClusterOplog(ctx, *uri, fromTS, tillTS)
62-
case topoReplset:
63-
err = ensureReplsetOplog(ctx, *uri, fromTS, tillTS)
64-
default:
65-
err = errors.New("unsupported connection")
66-
}
33+
type rootOpts struct {
34+
mURL string
35+
fromS string
36+
tillS string
37+
}
6738

68-
if err != nil {
39+
func main() {
40+
rootOptions := rootOpts{}
41+
rootCmd := &cobra.Command{
42+
Use: "ensure-oplog",
43+
Short: "ensure oplog chunks",
44+
SilenceUsage: true,
45+
RunE: func(cmd *cobra.Command, args []string) error {
46+
ctx := context.Background()
47+
48+
if rootOptions.mURL == "" {
49+
rootOptions.mURL = viper.GetString("mongodb-uri")
50+
}
51+
52+
fromTS, err := parseTS(rootOptions.fromS)
53+
if err != nil {
54+
return errors.Wrap(err, "parse from time")
55+
}
56+
tillTS, err := parseTS(rootOptions.tillS)
57+
if err != nil {
58+
return errors.Wrap(err, "parse till time")
59+
}
60+
61+
t, err := connTopo(ctx, rootOptions.mURL)
62+
if err != nil {
63+
return errors.Wrap(err, "getTopo")
64+
}
65+
66+
switch t {
67+
case topoMongos:
68+
err = ensureClusterOplog(ctx, rootOptions.mURL, fromTS, tillTS)
69+
case topoReplset:
70+
err = ensureReplsetOplog(ctx, rootOptions.mURL, fromTS, tillTS)
71+
default:
72+
err = errors.New("unsupported connection")
73+
}
74+
75+
if err != nil {
76+
return err
77+
}
78+
79+
return nil
80+
},
81+
}
82+
83+
rootCmd.PersistentFlags().StringVar(&rootOptions.mURL, "mongodb-uri", "", "MongoDB connection string")
84+
_ = viper.BindPFlag("mongodb-uri", rootCmd.PersistentFlags().Lookup("mongodb-uri"))
85+
_ = viper.BindEnv("mongodb-uri", "PBM_MONGODB_URI")
86+
87+
rootCmd.Flags().StringVar(&rootOptions.fromS, "from", "", "first op time")
88+
rootCmd.Flags().StringVar(&rootOptions.tillS, "till", "", "last op time")
89+
90+
if err := rootCmd.Execute(); err != nil {
6991
stdlog.Fatal(err)
7092
}
7193
}

go.mod

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.22
55
require (
66
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0
77
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.1
8-
github.com/alecthomas/kingpin v2.2.6+incompatible
98
github.com/aws/aws-sdk-go v1.55.5
109
github.com/docker/docker v27.1.1+incompatible
1110
github.com/fsnotify/fsnotify v1.7.0
@@ -31,8 +30,6 @@ require (
3130
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
3231
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
3332
github.com/Microsoft/go-winio v0.6.2 // indirect
34-
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
35-
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect
3633
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
3734
github.com/containerd/containerd v1.7.18 // indirect
3835
github.com/containerd/log v0.1.0 // indirect

go.sum

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,6 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaC
1818
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
1919
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
2020
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
21-
github.com/alecthomas/kingpin v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI=
22-
github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=
23-
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
24-
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
25-
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs=
26-
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
2721
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
2822
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
2923
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
@@ -182,7 +176,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
182176
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
183177
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
184178
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
185-
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
186179
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
187180
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
188181
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -313,7 +306,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
313306
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
314307
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
315308
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
316-
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
317309
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
318310
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
319311
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

vendor/github.com/alecthomas/kingpin/.travis.yml

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)