cmd/ido2icingadb: compute previous progress

This commit is contained in:
Alexander A. Klimov 2021-08-20 18:45:59 +02:00
parent 05c736aa8f
commit 2f5d5ea931
7 changed files with 336 additions and 16 deletions

View file

@ -29,6 +29,8 @@ list_all_deps() {
COMPATIBLE_LINE=$(($LINENO + 2))
COMPATIBLE=(
# public domain
3cee2c43614ad4572d9d594c81b9348cf45ed5ac # vendor/github.com/vbauerster/mpb/v6/UNLICENSE
# MIT
66d504eb2f162b9cbf11b07506eeed90c6edabe1 # vendor/github.com/cespare/xxhash/v2/LICENSE.txt
1513ff663e946fdcadb630bed670d253b8b22e1e # vendor/github.com/davecgh/go-spew/spew/../LICENSE

View file

@ -1,6 +1,7 @@
package main
import (
"bytes"
"context"
"database/sql"
"fmt"
@ -11,9 +12,13 @@ import (
"github.com/jessevdk/go-flags"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
"github.com/vbauerster/mpb/v6"
"github.com/vbauerster/mpb/v6/decor"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
"os"
"strings"
"time"
)
// Flags defines the CLI flags.
@ -26,6 +31,9 @@ type Flags struct {
type Config struct {
IDO config.Database `yaml:"ido"`
IcingaDB config.Database `yaml:"icingadb"`
Icinga2 struct {
Env string `yaml:"env"`
} `yaml:"icinga2"`
}
func main() {
@ -82,16 +90,6 @@ func run() int {
_ = eg.Wait()
}
var types = []struct {
name string
idoTable string
snapshot *sqlx.Tx
}{
{"acknowledgement", "icinga_acknowledgements", nil}, {"comment", "icinga_commenthistory", nil},
{"downtime", "icinga_downtimehistory", nil}, {"flapping", "icinga_flappinghistory", nil},
{"notification", "icinga_notifications", nil}, {"state", "icinga_statehistory", nil},
}
{
eg, _ := errgroup.WithContext(context.Background())
for i := range types {
@ -119,10 +117,8 @@ func run() int {
i := i
eg.Go(func() error {
var count uint64
err := types[i].snapshot.Get(
&count,
&types[i].total,
"SELECT COUNT(*) FROM "+types[i].idoTable+
" xh INNER JOIN icinga_objects o ON o.object_id=xh.object_id",
)
@ -130,7 +126,7 @@ func run() int {
log.Fatalf("%+v", errors.Wrap(err, "can't count query"))
}
log.With("type", types[i].name, "amount", count).Info("Counted total IDO events")
log.With("type", types[i].name, "amount", types[i].total).Info("Counted total IDO events")
return nil
})
}
@ -138,8 +134,141 @@ func run() int {
_ = eg.Wait()
}
// TODO
_ = idb
log.Sync()
{
progress := mpb.New()
for i := range types {
typ := &types[i]
typ.bar = progress.AddBar(
typ.total,
mpb.BarFillerClearOnComplete(),
mpb.PrependDecorators(
decor.Name(typ.name, decor.WC{W: len(typ.name) + 1, C: decor.DidentRight}),
decor.Percentage(decor.WC{W: 5}),
),
mpb.AppendDecorators(decor.EwmaETA(decor.ET_STYLE_GO, 6000000, decor.WC{W: 4})),
)
}
eg, _ := errgroup.WithContext(context.Background())
for i := range types {
typ := &types[i]
if typ.total == 0 {
typ.bar.SetTotal(typ.bar.Current(), true)
} else {
eg.Go(func() error {
query := "SELECT xh." +
strings.Join(append(append([]string(nil), typ.idoColumns...), typ.idoIdColumn), ", xh.") +
" id FROM " + typ.idoTable +
" xh USE INDEX (PRIMARY) INNER JOIN icinga_objects o ON o.object_id=xh.object_id WHERE " +
typ.idoIdColumn + " > ? ORDER BY xh." + typ.idoIdColumn + " LIMIT 10000"
stmt, err := typ.snapshot.Preparex(query)
if err != nil {
log.With("query", query).Fatalf("%+v", errors.Wrap(err, "can't prepare query"))
}
defer stmt.Close()
var lastRowsLen int
var lastQuery string
var lastStmt *sqlx.Stmt
start := time.Now()
defer func() {
if lastStmt != nil {
lastStmt.Close()
}
}()
Queries:
for {
var rows []ProgressRow
if err := stmt.Select(&rows, typ.lastId); err != nil {
log.With("query", query).Fatalf("%+v", errors.Wrap(err, "can't perform query"))
}
if len(rows) < 1 {
break
}
if len(rows) != lastRowsLen {
if lastStmt != nil {
lastStmt.Close()
}
buf := &bytes.Buffer{}
fmt.Fprintf(
buf, "SELECT %s FROM %s WHERE %s IN (?", typ.idbIdColumn, typ.idbTable, typ.idbIdColumn,
)
for i := 1; i < len(rows); i++ {
buf.Write([]byte(",?"))
}
buf.Write([]byte(")"))
lastRowsLen = len(rows)
lastQuery = buf.String()
var err error
lastStmt, err = idb.Preparex(lastQuery)
if err != nil {
log.With("query", lastQuery).Fatalf("%+v", errors.Wrap(err, "can't prepare query"))
}
}
ids := make([]interface{}, 0, len(rows))
converted := make([]convertedId, 0, len(rows))
for _, row := range rows {
conv := typ.convertId(row, c.Icinga2.Env)
ids = append(ids, conv)
converted = append(converted, convertedId{row.Id, conv})
}
var present [][]byte
if err := lastStmt.Select(&present, ids...); err != nil {
log.With("query", lastQuery).Fatalf("%+v", errors.Wrap(err, "can't perform query"))
}
presentSet := map[[20]byte]struct{}{}
for _, row := range present {
var key [20]byte
copy(key[:], row)
presentSet[key] = struct{}{}
}
for _, conv := range converted {
var key [20]byte
copy(key[:], conv.idb)
if _, ok := presentSet[key]; !ok {
break Queries
}
typ.lastId = conv.ido
}
prev := start
now := time.Now()
start = now
typ.bar.IncrBy(len(rows))
typ.bar.DecoratorEwmaUpdate(now.Sub(prev))
}
typ.bar.SetTotal(typ.bar.Current(), true)
return nil
})
}
}
_ = eg.Wait()
progress.Wait()
}
return internal.ExitSuccess
}

149
cmd/ido2icingadb/misc.go Normal file
View file

@ -0,0 +1,149 @@
package main
import (
"bytes"
"crypto/sha1"
"encoding/binary"
"github.com/google/uuid"
"github.com/icinga/icingadb/pkg/icingadb/objectpacker"
"github.com/jmoiron/sqlx"
"github.com/vbauerster/mpb/v6"
)
type ProgressRow struct {
Id uint64
Name string
}
type convertedId struct {
ido uint64
idb []byte
}
// mkDeterministicUuid returns a formally random UUID (v4) as follows: 11111122-3300-4455-4455-555555555555
//
// 0: zeroed
// 1: "IDO" (where the data identified by the new UUID is from)
// 2: the history table the new UUID is for, e.g. "s" for state_history
// 3: "h" (for "history")
// 4: the new UUID's formal version (unused bits zeroed)
// 5: the ID of the row the new UUID is for in the IDO (big endian)
func mkDeterministicUuid(table byte, rowId uint64) []byte {
uid := uuidTemplate
uid[3] = table
buf := &bytes.Buffer{}
if err := binary.Write(buf, binary.BigEndian, rowId); err != nil {
panic(err)
}
bEId := buf.Bytes()
uid[7] = bEId[0]
copy(uid[9:], bEId[1:])
return uid[:]
}
// uuidTemplate is for mkDeterministicUuid.
var uuidTemplate = func() uuid.UUID {
buf := &bytes.Buffer{}
buf.Write(uuid.Nil[:])
uid, err := uuid.NewRandomFromReader(buf)
if err != nil {
panic(err)
}
copy(uid[:], "IDO h")
return uid
}()
// hashAny combines PackAny and SHA1 hashing.
func hashAny(in interface{}) []byte {
hash := sha1.New()
if err := objectpacker.PackAny(in, hash); err != nil {
panic(err)
}
return hash.Sum(nil)
}
// calcObjectId calculates the ID of the config object named name1 for Icinga DB.
func calcObjectId(env, name1 string) []byte {
return hashAny([2]string{env, name1})
}
var types = [6]struct {
name string
idoTable string
idoIdColumn string
idoColumns []string
idbTable string
idbIdColumn string
convertId func(row ProgressRow, env string) []byte
snapshot *sqlx.Tx
total int64
bar *mpb.Bar
lastId uint64
}{
{
"acknowledgement",
"icinga_acknowledgements",
"acknowledgement_id",
nil,
"history",
"id",
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('a', row.Id) },
nil, 0, nil, 0,
},
{
"comment",
"icinga_commenthistory",
"commenthistory_id",
[]string{"name"},
"comment_history",
"comment_id",
func(row ProgressRow, env string) []byte { return calcObjectId(env, row.Name) },
nil, 0, nil, 0,
},
{
"downtime",
"icinga_downtimehistory",
"downtimehistory_id",
[]string{"name"},
"downtime_history",
"downtime_id",
func(row ProgressRow, env string) []byte { return calcObjectId(env, row.Name) },
nil, 0, nil, 0,
},
{
"flapping",
"icinga_flappinghistory",
"flappinghistory_id",
nil,
"history",
"id",
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('f', row.Id) },
nil, 0, nil, 0,
},
{
"notification",
"icinga_notifications",
"notification_id",
nil,
"notification_history",
"id",
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('n', row.Id) },
nil, 0, nil, 0,
},
{
"state",
"icinga_statehistory",
"statehistory_id",
nil,
"state_history",
"id",
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('s', row.Id) },
nil, 0, nil, 0,
},
}

View file

@ -0,0 +1,15 @@
package main
import (
"bytes"
"testing"
)
func TestMkDeterministicUuid(t *testing.T) {
if !bytes.Equal(
mkDeterministicUuid('s', 0x0102030405060708),
[]byte{'I', 'D', 'O', 's', 'h', 0, 0x40, 1, 0x80, 2, 3, 4, 5, 6, 7, 8},
) {
t.Error("got wrong UUID from mkDeterministicUuid(stateHistory, 0x0102030405060708)")
}
}

5
go.mod
View file

@ -15,12 +15,15 @@ require (
github.com/pkg/errors v0.9.1
github.com/ssgreg/journald v1.0.0
github.com/stretchr/testify v1.8.0
github.com/vbauerster/mpb/v6 v6.0.4
go.uber.org/zap v1.21.0
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
)
require (
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/benbjohnson/clock v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
@ -28,7 +31,9 @@ require (
github.com/fatih/color v1.10.0 // indirect
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/mattn/go-runewidth v0.0.12 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect

12
go.sum
View file

@ -1,3 +1,7 @@
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
@ -45,6 +49,8 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow=
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@ -57,6 +63,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/ssgreg/journald v1.0.0 h1:0YmTDPJXxcWDPba12qNMdO6TxvfkFSYpFIJ31CwmLcU=
github.com/ssgreg/journald v1.0.0/go.mod h1:RUckwmTM8ghGWPslq2+ZBZzbb9/2KgjzYZ4JEP+oRt0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@ -67,6 +76,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/vbauerster/mpb/v6 v6.0.4 h1:h6J5zM/2wimP5Hj00unQuV8qbo5EPcj6wbkCqgj7KcY=
github.com/vbauerster/mpb/v6 v6.0.4/go.mod h1:a/+JT57gqh6Du0Ay5jSR+uBMfXGdlR7VQlGP52fJxLM=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@ -100,6 +111,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

View file

@ -66,6 +66,8 @@ github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBK
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@ -465,6 +467,7 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
@ -584,6 +587,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@ -642,6 +647,8 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/vbauerster/mpb/v6 v6.0.4 h1:h6J5zM/2wimP5Hj00unQuV8qbo5EPcj6wbkCqgj7KcY=
github.com/vbauerster/mpb/v6 v6.0.4/go.mod h1:a/+JT57gqh6Du0Ay5jSR+uBMfXGdlR7VQlGP52fJxLM=
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
@ -857,6 +864,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=