From 2695d7743e1a631fbc7d76ddbe916618182a4e51 Mon Sep 17 00:00:00 2001 From: Ian Bolton Date: Fri, 5 Apr 2024 16:21:34 -0400 Subject: [PATCH 1/4] :sparkles: Add unassessed risk type and exit early for app risk status calculation (#623) https://issues.redhat.com/browse/MTA-2308 Signed-off-by: Ian Bolton --- api/application.go | 2 +- api/archetype.go | 2 +- assessment/pkg.go | 42 ++++++++++++++++++++---------------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/api/application.go b/api/application.go index c8a1bb653..48bd7b275 100644 --- a/api/application.go +++ b/api/application.go @@ -1143,7 +1143,7 @@ func (r *Application) With(m *model.Application, tags []model.ApplicationTag) { }) r.Effort = m.Analyses[len(m.Analyses)-1].Effort } - r.Risk = assessment.RiskUnknown + r.Risk = assessment.RiskUnassessed } // diff --git a/api/archetype.go b/api/archetype.go index f647395ec..431976839 100644 --- a/api/archetype.go +++ b/api/archetype.go @@ -390,7 +390,7 @@ func (r *Archetype) With(m *model.Archetype) { ref.With(m.Review.ID, "") r.Review = ref } - r.Risk = assessment.RiskUnknown + r.Risk = assessment.RiskUnassessed } // diff --git a/assessment/pkg.go b/assessment/pkg.go index 0f9951780..8c17c44e5 100644 --- a/assessment/pkg.go +++ b/assessment/pkg.go @@ -8,10 +8,11 @@ import ( // // Assessment risk const ( - RiskUnknown = "unknown" - RiskRed = "red" - RiskYellow = "yellow" - RiskGreen = "green" + RiskUnassessed = "unassessed" + RiskUnknown = "unknown" + RiskRed = "red" + RiskYellow = "yellow" + RiskGreen = "green" ) // @@ -48,26 +49,23 @@ const ( // // Risk returns the single highest risk score for a group of assessments. func Risk(assessments []Assessment) (risk string) { - risk = RiskUnknown + // Return "unassessed" immediately if there are no assessments if len(assessments) == 0 { - return + return RiskUnassessed } - red := 0 - yellow := 0 - unknown := 0 - green := 0 - if len(assessments) > 0 { - for _, a := range assessments { - switch a.Risk() { - case RiskRed: - red++ - case RiskYellow: - yellow++ - case RiskGreen: - green++ - default: - unknown++ - } + + red, yellow, unknown, green := 0, 0, 0, 0 + + for _, a := range assessments { + switch a.Risk() { + case RiskRed: + red++ + case RiskYellow: + yellow++ + case RiskGreen: + green++ + default: + unknown++ } } From fff6e9f66aa2689eca3949943d85d17e1089ffa4 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 25 Apr 2024 12:53:32 -0500 Subject: [PATCH 2/4] :bug: Fix Fail when Resource Quota exceeded. (#627) Detect resource quota exceeded and leave the task.State=Ready. closes #625 --------- Signed-off-by: Jeff Ortel --- task/manager.go | 88 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 20 deletions(-) diff --git a/task/manager.go b/task/manager.go index 172fc0f8b..1644b245a 100644 --- a/task/manager.go +++ b/task/manager.go @@ -4,6 +4,11 @@ import ( "context" "errors" "fmt" + "path" + "strconv" + "strings" + "time" + "github.com/golang-jwt/jwt/v4" liberr "github.com/jortel/go-utils/error" "github.com/jortel/go-utils/logr" @@ -16,13 +21,9 @@ import ( core "k8s.io/api/core/v1" k8serr "k8s.io/apimachinery/pkg/api/errors" meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "path" k8s "sigs.k8s.io/controller-runtime/pkg/client" - "strconv" - "time" ) -// // States const ( Created = "Created" @@ -66,6 +67,36 @@ func (e *AddonNotFound) Is(err error) (matched bool) { return } +// QuotaExceeded report quota exceeded. +type QuotaExceeded struct { + Reason string +} + +// Match returns true when the error is Forbidden due to quota exceeded. +func (e *QuotaExceeded) Match(err error) (matched bool) { + if k8serr.IsForbidden(err) { + matched = true + e.Reason = err.Error() + for _, s := range []string{"quota", "exceeded"} { + matched = strings.Contains(e.Reason, s) + if !matched { + break + } + } + } + return +} + +func (e *QuotaExceeded) Error() (s string) { + return e.Reason +} + +func (e *QuotaExceeded) Is(err error) (matched bool) { + var inst *QuotaExceeded + matched = errors.As(err, &inst) + return +} + // // Manager provides task management. type Manager struct { @@ -148,28 +179,28 @@ func (m *Manager) startReady() { if m.postpone(ready, list) { ready.State = Postponed Log.Info("Task postponed.", "id", ready.ID) - sErr := m.DB.Save(ready).Error - Log.Error(sErr, "") + err := m.DB.Save(ready).Error + Log.Error(err, "") continue } - if ready.Retries == 0 { - metrics.TasksInitiated.Inc() - } rt := Task{ready} - err := rt.Run(m.Client) + started, err := rt.Run(m.Client) if err != nil { - if errors.Is(err, &AddonNotFound{}) { - ready.Error("Error", err.Error()) - ready.State = Failed - sErr := m.DB.Save(ready).Error - Log.Error(sErr, "") - } + Log.Error(err, "") + ready.Error("Error", err.Error()) + ready.State = Failed + err = m.DB.Save(ready).Error Log.Error(err, "") continue } - Log.Info("Task started.", "id", ready.ID) err = m.DB.Save(ready).Error Log.Error(err, "") + if started { + Log.Info("Task started.", "id", ready.ID) + if ready.Retries == 0 { + metrics.TasksInitiated.Inc() + } + } default: // Ignored. // Other states included to support @@ -267,13 +298,23 @@ type Task struct { // // Run the specified task. -func (r *Task) Run(client k8s.Client) (err error) { +func (r *Task) Run(client k8s.Client) (started bool, err error) { mark := time.Now() defer func() { - if err != nil { + if err == nil { + return + } + if errors.Is(err, &QuotaExceeded{}) { + Log.V(1).Info(err.Error()) + err = nil + return + } + if errors.Is(err, &AddonNotFound{}) { r.Error("Error", err.Error()) r.Terminated = &mark r.State = Failed + err = nil + return } }() addon, err := r.findAddon(client, r.Addon) @@ -299,6 +340,10 @@ func (r *Task) Run(client k8s.Client) (err error) { pod := r.pod(addon, owner, &secret) err = client.Create(context.TODO(), &pod) if err != nil { + qe := &QuotaExceeded{err.Error()} + if qe.Match(err) { + err = qe + } err = liberr.Wrap(err) return } @@ -320,6 +365,7 @@ func (r *Task) Run(client k8s.Client) (err error) { err = liberr.Wrap(err) return } + started = true r.Started = &mark r.State = Pending r.Pod = path.Join( @@ -341,7 +387,9 @@ func (r *Task) Reflect(client k8s.Client) (err error) { pod) if err != nil { if k8serr.IsNotFound(err) { - err = r.Run(client) + r.Pod = "" + r.State = Ready + err = nil } else { err = liberr.Wrap(err) } From 5c6cbd34e503a3c0c189729c77db3f7fd729f276 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 25 Apr 2024 13:09:48 -0500 Subject: [PATCH 3/4] :bug: Fix concurrent tag/category Ensure(). (#629) _Look-and-See_ logic replaced to support concurrent operations. --------- Signed-off-by: Jeff Ortel --- binding/tag.go | 22 +++++++++++++++------- binding/tagcategory.go | 22 +++++++++++++++------- test/api/tag/api_test.go | 24 ++++++++++++++++++++++-- test/api/tagcategory/api_test.go | 25 +++++++++++++++++++++++-- 4 files changed, 75 insertions(+), 18 deletions(-) diff --git a/binding/tag.go b/binding/tag.go index cf1243fd4..693f5eaad 100644 --- a/binding/tag.go +++ b/binding/tag.go @@ -1,6 +1,8 @@ package binding import ( + "errors" + "github.com/konveyor/tackle2-hub/api" ) @@ -74,14 +76,20 @@ func (h *Tag) Find(name string, category uint) (r *api.Tag, found bool, err erro // // Ensure a tag exists. func (h *Tag) Ensure(wanted *api.Tag) (err error) { - tag, found, err := h.Find(wanted.Name, wanted.Category.ID) - if err != nil { - return - } - if !found { + for i := 0; i < 10; i++ { err = h.Create(wanted) - } else { - *wanted = *tag + if err == nil { + return + } + found := false + if errors.Is(err, &Conflict{}) { + var tag *api.Tag + tag, found, err = h.Find(wanted.Name, wanted.Category.ID) + if found { + *wanted = *tag + break + } + } } return } diff --git a/binding/tagcategory.go b/binding/tagcategory.go index 1aaac65e3..16859fa48 100644 --- a/binding/tagcategory.go +++ b/binding/tagcategory.go @@ -1,6 +1,8 @@ package binding import ( + "errors" + "github.com/konveyor/tackle2-hub/api" ) @@ -73,14 +75,20 @@ func (h *TagCategory) Find(name string) (r *api.TagCategory, found bool, err err // // Ensure a tag-type exists. func (h *TagCategory) Ensure(wanted *api.TagCategory) (err error) { - tp, found, err := h.Find(wanted.Name) - if err != nil { - return - } - if !found { + for i := 0; i < 10; i++ { err = h.Create(wanted) - } else { - *wanted = *tp + if err == nil { + return + } + found := false + if errors.Is(err, &Conflict{}) { + var cat *api.TagCategory + cat, found, err = h.Find(wanted.Name) + if found { + *wanted = *cat + break + } + } } return } diff --git a/test/api/tag/api_test.go b/test/api/tag/api_test.go index 5e28b1de7..ef5491de1 100644 --- a/test/api/tag/api_test.go +++ b/test/api/tag/api_test.go @@ -9,8 +9,9 @@ import ( func TestTagCRUD(t *testing.T) { for _, r := range Samples { t.Run(r.Name, func(t *testing.T) { + var err error // Create. - err := Tag.Create(&r) + err = Tag.Create(&r) if err != nil { t.Errorf(err.Error()) } @@ -44,11 +45,30 @@ func TestTagCRUD(t *testing.T) { if err != nil { t.Errorf(err.Error()) } - _, err = Tag.Get(r.ID) if err == nil { t.Errorf("Resource exits, but should be deleted: %v", r) } + // Ensure. + r.ID = 0 + err = Tag.Ensure(&r) + if err != nil { + t.Errorf(err.Error()) + } + got, err = Tag.Get(r.ID) + if err != nil { + t.Errorf(err.Error()) + } + if got.ID == 0 { + t.Errorf("Ensured resource has no id.") + } + if got.Name != r.Name { + t.Errorf("Different response error. Got %s, expected %s", got.Name, r.Name) + } + err = Tag.Delete(r.ID) + if err != nil { + t.Errorf(err.Error()) + } }) } } diff --git a/test/api/tagcategory/api_test.go b/test/api/tagcategory/api_test.go index fa0ca44e9..1c32720f8 100644 --- a/test/api/tagcategory/api_test.go +++ b/test/api/tagcategory/api_test.go @@ -9,8 +9,9 @@ import ( func TestTagCategoryCRUD(t *testing.T) { for _, r := range Samples { t.Run(r.Name, func(t *testing.T) { + var err error // Create. - err := TagCategory.Create(&r) + err = TagCategory.Create(&r) if err != nil { t.Errorf(err.Error()) } @@ -44,11 +45,31 @@ func TestTagCategoryCRUD(t *testing.T) { if err != nil { t.Errorf(err.Error()) } - _, err = TagCategory.Get(r.ID) if err == nil { t.Errorf("Resource exits, but should be deleted: %v", r) } + + // Ensure. + r.ID = 0 + err = TagCategory.Ensure(&r) + if err != nil { + t.Errorf(err.Error()) + } + got, err = TagCategory.Get(r.ID) + if err != nil { + t.Errorf(err.Error()) + } + if got.ID == 0 { + t.Errorf("Ensured resource has no id.") + } + if got.Name != r.Name { + t.Errorf("Different response error. Got %s, expected %s", got.Name, r.Name) + } + err = TagCategory.Delete(r.ID) + if err != nil { + t.Errorf(err.Error()) + } }) } } From b0da0d6218543e0291a16d82b7cd14040e001dfe Mon Sep 17 00:00:00 2001 From: Sam Lucidi Date: Tue, 30 Apr 2024 12:32:04 -0400 Subject: [PATCH 4/4] Fix CVE, upgrade go-resty v2.12 Backport of https://github.com/konveyor/tackle2-hub/pull/628 Signed-off-by: Sam Lucidi --- go.mod | 16 ++++++++-------- go.sum | 54 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 2c6b55e11..b58c0a2cf 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/onsi/gomega v1.27.6 github.com/prometheus/client_golang v1.15.0 github.com/swaggo/swag v1.16.1 - golang.org/x/sys v0.13.0 + golang.org/x/sys v0.19.0 gopkg.in/yaml.v2 v2.4.0 gorm.io/datatypes v1.2.0 gorm.io/driver/sqlite v1.5.2 @@ -25,6 +25,7 @@ require ( k8s.io/apimachinery v0.25.0 k8s.io/apiserver v0.25.0 k8s.io/client-go v0.25.0 + k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed sigs.k8s.io/controller-runtime v0.13.1 ) @@ -46,7 +47,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-resty/resty/v2 v2.6.0 // indirect + github.com/go-resty/resty/v2 v2.12.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -84,12 +85,12 @@ require ( github.com/ugorji/go/codec v1.2.9 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/term v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.7.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -100,7 +101,6 @@ require ( k8s.io/component-base v0.25.0 // indirect k8s.io/klog/v2 v2.70.1 // indirect k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/go.sum b/go.sum index 1369f5f6f..8c5612c55 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,9 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= -github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4= github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= +github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= +github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -226,6 +227,7 @@ github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= @@ -237,14 +239,18 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -259,8 +265,13 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= @@ -270,6 +281,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -280,24 +293,37 @@ golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -306,6 +332,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=