diff --git a/go.mod b/go.mod index c6e2d2684..a5bcbe560 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ replace ( require ( github.com/aspenmesh/istio-vet v0.0.0-20200806222806-9c8e9a962b9f - github.com/layer5io/meshery-adapter-library v0.5.4 + github.com/layer5io/meshery-adapter-library v0.5.5 github.com/layer5io/meshkit v0.5.20 github.com/layer5io/service-mesh-performance v0.3.4 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index a499520a1..79436adf7 100644 --- a/go.sum +++ b/go.sum @@ -56,6 +56,7 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cuelang.org/go v0.4.3 h1:W3oBBjDTm7+IZfCKZAmC8uDG0eYfJL4Pp/xbbCMKaVo= cuelang.org/go v0.4.3/go.mod h1:7805vR9H+VoBNdWFdI7jyDR3QLUPp4+naHfbcgp55HI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -99,9 +100,11 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YH github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= @@ -111,6 +114,7 @@ github.com/Masterminds/vcs v1.13.3/go.mod h1:TiE7xuEjl1N4j016moRd6vezp6e6Lz23gyp github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200113171025-3fe6c5262873/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= @@ -135,6 +139,7 @@ github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:m github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -144,6 +149,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV 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 h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= 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= @@ -154,6 +160,7 @@ github.com/alessio/shellescape v0.0.0-20190409004728-b115ca0f9053/go.mod h1:xW8s github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= @@ -164,6 +171,7 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= @@ -206,6 +214,7 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -240,6 +249,7 @@ github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWH github.com/cnf/structhash v0.0.0-20180104161610-62a607eb0224 h1:rnCKRrdSBqc061l0CDuYB+7X3w6w8IK/VCSChJXv62g= github.com/cnf/structhash v0.0.0-20180104161610-62a607eb0224/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE= github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -290,6 +300,7 @@ github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0Npu github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200228182428-0f16d7a0959c/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= @@ -385,6 +396,7 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -393,6 +405,7 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY= github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684/go.mod h1:UfCu3YXJJCI+IdnqGgYP82dk2+Joxmv+mUTVBES6wac= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190711175710-5b38d82aa076/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= @@ -403,6 +416,7 @@ github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190916154449-92cc603036dd/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= @@ -420,6 +434,7 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libcompose v0.4.0/go.mod h1:EyqDS+Iyca0hS44T7qIMTeO1EOYWWWNOGpufHu9R8cs= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= @@ -433,6 +448,8 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/proto v1.6.15 h1:XbpwxmuOPrdES97FrSfpyy67SSCV/wBIKXqgJzh6hNw= +github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -444,6 +461,7 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/evanphx/json-patch v0.0.0-20190815234213-e83c0a1c26c8/go.mod h1:pmLOTb3x90VhIKxsA9yeQG5yfOkkKnkk1h+Ql8NDYDw= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -457,8 +475,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -466,6 +486,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsouza/go-dockerclient v1.6.5/go.mod h1:GOdftxWLWIbIWKbIMDroKFJzPdg6Iw7r+jX1DDZdVsA= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= @@ -474,10 +495,16 @@ github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49P github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -683,6 +710,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= @@ -701,6 +729,7 @@ github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -720,6 +749,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -730,6 +760,7 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -762,6 +793,7 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= @@ -782,6 +814,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -791,6 +825,7 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w= github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -813,6 +848,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -837,6 +873,8 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kubernetes/kompose v1.26.1/go.mod h1:IJd7R1JvhxPSLPAM3MNPGGuHGprVft//t6OTSt1vY5I= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -844,13 +882,15 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/layer5io/kuttl v0.4.1-0.20200723152044-916f10574334/go.mod h1:UmrVd7x+bNVKrpmKgTtfRiTKHZeNPcMjQproJ0vGwhE= github.com/layer5io/learn-layer5/smi-conformance v0.0.0-20210317075357-06b4f88b3e34 h1:QaViadDOBCMDUwYx78kfRvHMkzRVnh/GOhm3s2gxoP4= github.com/layer5io/learn-layer5/smi-conformance v0.0.0-20210317075357-06b4f88b3e34/go.mod h1:BQPLwdJt7v7y0fXIejI4whR9zMyX07Wjt5xrbgEmHLw= -github.com/layer5io/meshery-adapter-library v0.5.4 h1:QQ+nVGHd7KhV58KhY40V00kC+IEM4+AlOhQcSHSbOUE= -github.com/layer5io/meshery-adapter-library v0.5.4/go.mod h1:YmLV0w6ucBagrqUB0x9q8ZVXrhN1tJBP5j+Pu6LOY/M= +github.com/layer5io/meshery-adapter-library v0.5.5 h1:4dGsHBDCLnkOOA/RaUM5n4bPdEdySREnkd3raU9LSDI= +github.com/layer5io/meshery-adapter-library v0.5.5/go.mod h1:YmLV0w6ucBagrqUB0x9q8ZVXrhN1tJBP5j+Pu6LOY/M= +github.com/layer5io/meshkit v0.5.16/go.mod h1:tj5TAjty7T/WJ8YvlDfOZF94t4g3mhWuKBCc6MOUoNU= github.com/layer5io/meshkit v0.5.20 h1:QpN/SEepUZk+Jj2K4TBRZJCRr/pzuvHqDaUr30vWddI= github.com/layer5io/meshkit v0.5.20/go.mod h1:EUfXIcztap9Dh0Ao3Dmoxf3FMsm4h7zFHGwagj+5ra4= github.com/layer5io/service-mesh-performance v0.3.2-0.20210122142912-a94e0658b021/go.mod h1:W153amv8aHAeIWxO7b7d7Vibt9RhaEVh4Uh+RG+BumQ= github.com/layer5io/service-mesh-performance v0.3.4 h1:aw/elsx0wkry7SyiQRIj31wW7TPCP4YfhINdNOLXVg8= github.com/layer5io/service-mesh-performance v0.3.4/go.mod h1:W153amv8aHAeIWxO7b7d7Vibt9RhaEVh4Uh+RG+BumQ= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= @@ -881,6 +921,7 @@ github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2 github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -906,6 +947,7 @@ github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -914,6 +956,7 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -942,6 +985,8 @@ github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= @@ -950,6 +995,7 @@ github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 h1:yH0SvLzcbZxcJXho2yh7CqdENGMQe73Cw3woZBpPli0= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -972,8 +1018,15 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/nats-server/v2 v2.7.4/go.mod h1:1vZ2Nijh8tcyNe8BDVyTviCd9NYzRbubQYiEHsvOQWc= +github.com/nats-io/nats.go v1.13.1-0.20220308171302-2f2f6968e98d/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nats.go v1.14.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/novln/docker-parser v1.0.0/go.mod h1:oCeM32fsoUwkwByB5wVjsrsVQySzPWkl3JdlTn1txpE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1036,6 +1089,8 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/openshift/api v0.0.0-20200803131051-87466835fcc0/go.mod h1:IXsT3F4NjLtRzfnQvwU+g/oPWpoNsVV5vd5aaOMO8eU= +github.com/openshift/build-machinery-go v0.0.0-20200713135615-1f43d26dccc7/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1053,6 +1108,7 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1107,12 +1163,14 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc h1:gSVONBi2HWMFXCa9jFdYvYk7IwW/mTLxWOF7rXS4LO0= +github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc/go.mod h1:KbKfKPy2I6ecOIGA9apfheFv14+P3RSmmQvshofQyMY= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= 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= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc h1:BD7uZqkN8CpjJtN/tScAKiccBikU4dlqe/gNrkRaPY4= github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= @@ -1123,6 +1181,7 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= @@ -1183,6 +1242,7 @@ github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7Sr github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= @@ -1235,6 +1295,7 @@ github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1 github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -1268,10 +1329,13 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= @@ -1288,6 +1352,7 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc v0.11.0 h1:jx+6CPh/uE5xW4uCm5gCb5B36+/c/k58mH+8YQ1glZo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc v0.11.0/go.mod h1:+6Kxsolxctkb7k57eHfR2T1EF7ukt5btjo8s/92wk4M= @@ -1333,6 +1398,7 @@ golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1352,9 +1418,12 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1362,6 +1431,7 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1369,6 +1439,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20210126221216-84987778548c/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1385,12 +1456,15 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -1448,6 +1522,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= @@ -1509,6 +1584,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1596,6 +1672,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20210502180810-71e4cd670f79/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-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1619,6 +1696,7 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1691,6 +1769,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1707,6 +1786,8 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200602230032-c00d67ef29d0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1733,6 +1814,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -1945,6 +2027,7 @@ gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1962,6 +2045,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.4 h1:1BKWM67O6CflSLcwGQR7ccfmC4ebOxQrTfOQGRE9wjg= gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -1992,6 +2077,7 @@ k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= k8s.io/api v0.18.1/go.mod h1:3My4jorQWzSs5a+l7Ge6JBbIxChLnY8HnuT58ZWolss= +k8s.io/api v0.19.0-rc.2/go.mod h1:9nHeM2gbqeaL7yN6UFvOxKzLG5gZ4v+DJ6bpavDetZo= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= @@ -2008,6 +2094,7 @@ k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZ k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= k8s.io/apimachinery v0.18.1/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= +k8s.io/apimachinery v0.19.0-rc.2/go.mod h1:eHbWZVMaaewmYBAUuRYnAmTTMtDhvpPNZuh8/6Yl7v0= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= @@ -2042,6 +2129,7 @@ k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= +k8s.io/code-generator v0.19.0-rc.2/go.mod h1:uR3gwQvtcOjBrvwXhFF1lw5kq9BOOAfSKl/pZZ1zW3I= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= @@ -2066,6 +2154,7 @@ k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= @@ -2075,6 +2164,7 @@ k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9/go.mod h1:bfCVj+qXcEaE5SCvzBaqpOySr6tuCcpPKqF6HD8nyCw= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= @@ -2112,16 +2202,20 @@ sigs.k8s.io/controller-tools v0.2.6/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9u sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/kind v0.7.0/go.mod h1:An/AbWHT6pA/Lm0Og8j3ukGhfJP3RiVN/IBU6Lo3zl8= +sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0= sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8= sigs.k8s.io/kustomize/cmd/config v0.10.2/go.mod h1:K2aW7nXJ0AaT+VA/eO0/dzFLxmpFcTzudmAgDwPY1HQ= sigs.k8s.io/kustomize/kustomize/v4 v4.4.1/go.mod h1:qOKJMMz2mBP+vcS7vK+mNz4HBLjaQSWRY22EF6Tb7Io= +sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= sigs.k8s.io/kustomize/kyaml v0.13.0 h1:9c+ETyNfSrVhxvphs+K2dzT3dh5oVPPEqPOE/cUpScY= sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.1-0.20200706213357-43c19bbb7fba/go.mod h1:V06abazjHneE37ZdSY/UUwPVgcJMKI/jU5XGUjgIKoc= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/istio/addons.go b/istio/addons.go index a0def26d5..96339985a 100644 --- a/istio/addons.go +++ b/istio/addons.go @@ -5,11 +5,12 @@ import ( "fmt" "net/url" "strings" + "sync" "github.com/layer5io/meshery-adapter-library/adapter" "github.com/layer5io/meshery-adapter-library/status" "github.com/layer5io/meshkit/utils" - + mesherykube "github.com/layer5io/meshkit/utils/kubernetes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -18,7 +19,7 @@ import ( // // the template defines the manifest's link/location which needs to be used to // install the addon -func (istio *Istio) installAddon(namespace string, del bool, service string, patches []string, templates []adapter.Template) (string, error) { +func (istio *Istio) installAddon(namespace string, del bool, service string, patches []string, templates []adapter.Template, kubeconfigs []string) (string, error) { st := status.Installing if del { @@ -27,42 +28,68 @@ func (istio *Istio) installAddon(namespace string, del bool, service string, pat istio.Log.Debug(fmt.Sprintf("Overidden namespace: %s", namespace)) namespace = "istio-system" - - for _, template := range templates { - if istio.KubeClient == nil { - return st, ErrNilClient - } - err := istio.applyManifest([]byte(template.String()), del, namespace) - // Specifically choosing to ignore kiali dashboard's error. - // Referring to: https://github.com/kiali/kiali/issues/3112 - if err != nil && !strings.Contains(err.Error(), "no matches for kind \"MonitoringDashboard\" in version \"monitoring.kiali.io/v1alpha1\"") { - if !strings.Contains(err.Error(), "clusterIP") { - return st, ErrAddonFromTemplate(err) - } - } - } - - for _, patch := range patches { - if patch == "" { - continue //avoid throwing error when a given patch key didn't exist for a specific addon type in operations - } - if !del { - _, err := url.ParseRequestURI(patch) + var wg sync.WaitGroup + var errMx sync.Mutex + var errs []error + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + mclient, err := mesherykube.New([]byte(k8sconfig)) if err != nil { - return st, ErrAddonFromTemplate(err) + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return } - - content, err := utils.ReadFileSource(patch) - if err != nil { - return st, ErrAddonFromTemplate(err) + for _, template := range templates { + err := istio.applyManifestOnSingleCluster([]byte(template.String()), del, namespace, mclient) + // Specifically choosing to ignore kiali dashboard's error. + // Referring to: https://github.com/kiali/kiali/issues/3112 + if err != nil && !strings.Contains(err.Error(), "no matches for kind \"MonitoringDashboard\" in version \"monitoring.kiali.io/v1alpha1\"") { + if !strings.Contains(err.Error(), "clusterIP") { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + } + } } - _, err = istio.KubeClient.CoreV1().Services(namespace).Patch(context.TODO(), service, types.MergePatchType, []byte(content), metav1.PatchOptions{}) - if err != nil { - return st, ErrAddonFromTemplate(err) + for _, patch := range patches { + if patch == "" { + continue //avoid throwing error when a given patch key didn't exist for a specific addon type in operations + } + if !del { + _, err := url.ParseRequestURI(patch) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + content, err := utils.ReadFileSource(patch) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + _, err = mclient.KubeClient.CoreV1().Services(namespace).Patch(context.TODO(), service, types.MergePatchType, []byte(content), metav1.PatchOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + } } - } + }(k8sconfig) } - - return status.Installed, nil + wg.Wait() + if len(errs) == 0 { + return status.Installed, nil + } + return st, ErrAddonFromTemplate(mergeErrors(errs)) } diff --git a/istio/addons_test.go b/istio/addons_test.go index 20df47748..f293a506e 100644 --- a/istio/addons_test.go +++ b/istio/addons_test.go @@ -22,19 +22,19 @@ func TestIstio_installAddon(t *testing.T) { ch := make(chan interface{}, 10) fs := fields{ Adapter: adapter.Adapter{ - Config: getConfigHandler(t), - Log: getLoggerHandler(t), - KubeconfigHandler: getKubeconfigHandler(t), - Channel: &ch, + Config: getConfigHandler(t), + Log: getLoggerHandler(t), + Channel: &ch, }, } tests := []struct { - name string - fields fields - args args - want string - wantErr bool + name string + fields fields + args args + want string + kubeconfigs []string + wantErr bool }{ // TODO: Add test cases. { @@ -84,7 +84,7 @@ func TestIstio_installAddon(t *testing.T) { istio := &Istio{ Adapter: tt.fields.Adapter, } - got, err := istio.installAddon(tt.args.namespace, tt.args.del, tt.args.service, tt.args.patches, tt.args.templates) + got, err := istio.installAddon(tt.args.namespace, tt.args.del, tt.args.service, tt.args.patches, tt.args.templates, tt.kubeconfigs) if (err != nil) != tt.wantErr { t.Errorf("Istio.installAddon() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/istio/custom_operations.go b/istio/custom_operations.go index 76baec318..49a5ed2a3 100644 --- a/istio/custom_operations.go +++ b/istio/custom_operations.go @@ -5,13 +5,10 @@ import ( "github.com/layer5io/meshery-adapter-library/status" ) -func (istio *Istio) applyCustomOperation(namespace string, manifest string, isDel bool) (string, error) { +func (istio *Istio) applyCustomOperation(namespace string, manifest string, isDel bool, kubeconfigs []string) (string, error) { st := status.Starting - if istio.KubeClient == nil { - return st, ErrNilClient - } - err := istio.applyManifest([]byte(manifest), isDel, namespace) + err := istio.applyManifest([]byte(manifest), isDel, namespace, kubeconfigs) if err != nil { return st, ErrCustomOperation(err) } diff --git a/istio/custom_operations_test.go b/istio/custom_operations_test.go index ede2a5925..64191df48 100644 --- a/istio/custom_operations_test.go +++ b/istio/custom_operations_test.go @@ -21,18 +21,18 @@ func TestIstio_applyCustomOperation(t *testing.T) { ch := make(chan interface{}, 10) fs := fields{ Adapter: adapter.Adapter{ - Config: getConfigHandler(t), - Log: getLoggerHandler(t), - KubeconfigHandler: getKubeconfigHandler(t), - Channel: &ch, + Config: getConfigHandler(t), + Log: getLoggerHandler(t), + Channel: &ch, }, } tests := []struct { - name string - fields fields - args args - want string - wantErr bool + name string + fields fields + args args + kubeconfigs []string + want string + wantErr bool }{ // TODO: Add test cases. { @@ -52,7 +52,7 @@ func TestIstio_applyCustomOperation(t *testing.T) { istio := &Istio{ Adapter: tt.fields.Adapter, } - got, err := istio.applyCustomOperation(tt.args.namespace, tt.args.manifest, tt.args.isDel) + got, err := istio.applyCustomOperation(tt.args.namespace, tt.args.manifest, tt.args.isDel, tt.kubeconfigs) if (err != nil) != tt.wantErr { t.Errorf("Istio.applyCustomOperation() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/istio/install.go b/istio/install.go index 19c3c8f48..7e895034b 100644 --- a/istio/install.go +++ b/istio/install.go @@ -14,6 +14,7 @@ import ( "path" "runtime" "strings" + "sync" "github.com/layer5io/meshery-adapter-library/adapter" "github.com/layer5io/meshery-adapter-library/status" @@ -32,7 +33,7 @@ var ( // installs Istio using either helm charts or istioctl. // Priority given to helm charts unless useBin set to true -func (istio *Istio) installIstio(del, useBin bool, version, namespace string, profile string) (string, error) { +func (istio *Istio) installIstio(del, useBin bool, version, namespace string, profile string, kubeconfigs []string) (string, error) { istio.Log.Debug(fmt.Sprintf("Requested install of version: %s", version)) istio.Log.Debug(fmt.Sprintf("Requested action is delete: %v", del)) istio.Log.Debug(fmt.Sprintf("Requested action is in namespace: %s", namespace)) @@ -58,19 +59,19 @@ func (istio *Istio) installIstio(del, useBin bool, version, namespace string, pr // Install using istioctl if explicitly stated if useBin { istio.Log.Info("Installing istio using istioctl...") - err = istio.runIstioCtlCmd(version, del, dirName) + err = istio.runIstioCtlCmd(version, del, dirName, kubeconfigs) if err != nil { return st, ErrInstallUsingIstioctl(err) } } // Install using Helm Chart and fallback to istioctl - err = istio.applyHelmChart(del, version, namespace, dirName, profile) + err = istio.applyHelmChart(del, version, namespace, dirName, profile, kubeconfigs) if err != nil { istio.Log.Error(err) istio.Log.Info("Retrying to install using istioctl...") - err = istio.runIstioCtlCmd(version, del, dirName) + err = istio.runIstioCtlCmd(version, del, dirName, kubeconfigs) if err != nil { return st, ErrInstallUsingIstioctl(err) } @@ -84,15 +85,11 @@ func (istio *Istio) installIstio(del, useBin bool, version, namespace string, pr return status.Installed, nil } -func (istio *Istio) applyHelmChart(del bool, version, namespace, dirName string, profile string) error { +func (istio *Istio) applyHelmChart(del bool, version, namespace, dirName string, profile string, kubeconfigs []string) error { if profile != "demo" && profile != "default" && profile != "minimal" { return ErrInvalidInstallationProfile(profile) // This code will never be executed as json schema would have been validated beforehand } - kClient := istio.MesheryKubeclient - if kClient == nil { - return ErrNilClient - } - + var errs []error istio.Log.Info("Installing using helm charts...") var act mesherykube.HelmChartAction if del { @@ -100,53 +97,89 @@ func (istio *Istio) applyHelmChart(del bool, version, namespace, dirName string, } else { act = mesherykube.INSTALL } - err := kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ - LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/base"), - Namespace: "istio-system", - Action: act, - CreateNamespace: true, - }) - if err != nil { - return ErrApplyHelmChart(err) - } - err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ - LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/istio-control/istio-discovery"), - Namespace: "istio-system", - Action: act, - CreateNamespace: true, - }) - if err != nil { - return ErrApplyHelmChart(err) - } + var wg sync.WaitGroup + var errMx sync.Mutex + for _, config := range kubeconfigs { + wg.Add(1) + go func(config string, act mesherykube.HelmChartAction) { + defer wg.Done() + kClient, err := mesherykube.New([]byte(config)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ + LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/base"), + Namespace: "istio-system", + Action: act, + CreateNamespace: true, + }) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return - if profile == "minimal" { - return nil - } - err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ - LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/gateways/istio-ingress"), - Namespace: "istio-system", - Action: act, - CreateNamespace: true, - }) - if err != nil { - return ErrApplyHelmChart(err) - } + } - if profile == "default" { - return nil + err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ + LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/istio-control/istio-discovery"), + Namespace: "istio-system", + Action: act, + CreateNamespace: true, + }) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + + } + + if profile == "minimal" { + return + } + err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ + LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/gateways/istio-ingress"), + Namespace: "istio-system", + Action: act, + CreateNamespace: true, + }) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + + } + + if profile == "default" { + return + } + err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ + LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/gateways/istio-egress"), + Namespace: "istio-system", + Action: act, + CreateNamespace: true, + }) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + + } + + }(config, act) } - err = kClient.ApplyHelmChart(mesherykube.ApplyHelmChartConfig{ - LocalPath: path.Join(downloadLocation, dirName, "manifests/charts/gateways/istio-egress"), - Namespace: "istio-system", - Action: act, - CreateNamespace: true, - }) - if err != nil { - return ErrApplyHelmChart(err) + wg.Wait() + if len(errs) == 0 { + return nil } - - return nil + return ErrApplyHelmChart(mergeErrors(errs)) } // getIstioRelease gets the manifests for latest istio release. @@ -230,39 +263,106 @@ func extractTar(res *http.Response) error { // Installs Istio using Istioctl // TODO: Figure out why this is not working in containers -func (istio *Istio) runIstioCtlCmd(version string, isDel bool, dirName string) error { +func (istio *Istio) runIstioCtlCmd(version string, isDel bool, dirName string, kubeconfigs []string) error { var ( out bytes.Buffer er bytes.Buffer ) + var wg sync.WaitGroup + var errMx sync.Mutex + var errs []error + for _, config := range kubeconfigs { + wg.Add(1) + go func(config string, isDel bool) { + defer wg.Done() + kClient, err := mesherykube.New([]byte(config)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + kContext, err := kClient.GetCurrentContext() + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + istio.Log.Info("Installing using istioctl...") - istio.Log.Info("Installing using istioctl...") + Executable, err := istio.getExecutable(version, dirName) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + execCmd := []string{"install", "--set", "profile=demo", "-y", "--context", kContext} + if isDel { + execCmd = []string{"x", "uninstall", "--purge", "-y", "--context", kContext} + } - Executable, err := istio.getExecutable(version, dirName) - if err != nil { - return ErrRunIstioCtlCmd(err, err.Error()) - } - execCmd := []string{"install", "--set", "profile=demo", "-y"} - if isDel { - execCmd = []string{"x", "uninstall", "--purge", "-y"} + // We need a variable executable here hence using nosec + // #nosec + command := exec.Command(Executable, execCmd...) + command.Stdout = &out + command.Stderr = &er + err = command.Run() + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + }(config, isDel) } - - // We need a variable executable here hence using nosec - // #nosec - command := exec.Command(Executable, execCmd...) - command.Stdout = &out - command.Stderr = &er - err = command.Run() - if err != nil { - return ErrRunIstioCtlCmd(err, er.String()) + wg.Wait() + if len(errs) == 0 { + return nil } - return nil + return ErrRunIstioCtlCmd(mergeErrors(errs), mergeErrors(errs).Error()) } -func (istio *Istio) applyManifest(contents []byte, isDel bool, namespace string) error { +func (istio *Istio) applyManifest(contents []byte, isDel bool, namespace string, kubeconfigs []string) error { + var wg sync.WaitGroup + var errs []error + var errMx sync.Mutex + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + mclient, err := mesherykube.New([]byte(k8sconfig)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + err = mclient.ApplyManifest(contents, mesherykube.ApplyOptions{ + Namespace: namespace, + Update: true, + Delete: isDel, + }) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + }(k8sconfig) + } + wg.Wait() + if len(errs) == 0 { + return nil + } + return mergeErrors(errs) +} - err := istio.MesheryKubeclient.ApplyManifest(contents, mesherykube.ApplyOptions{ +//For direct simpler use cases +func (istio *Istio) applyManifestOnSingleCluster(contents []byte, isDel bool, namespace string, mclient *mesherykube.Client) error { + err := mclient.ApplyManifest(contents, mesherykube.ApplyOptions{ Namespace: namespace, Update: true, Delete: isDel, @@ -270,7 +370,6 @@ func (istio *Istio) applyManifest(contents []byte, isDel bool, namespace string) if err != nil { return err } - return nil } diff --git a/istio/istio.go b/istio/istio.go index 0a69bfc17..e9bc3ef02 100644 --- a/istio/istio.go +++ b/istio/istio.go @@ -24,15 +24,16 @@ type Istio struct { func New(c meshkitCfg.Handler, l logger.Handler, kc meshkitCfg.Handler) adapter.Handler { return &Istio{ Adapter: adapter.Adapter{ - Config: c, - Log: l, - KubeconfigHandler: kc, + Config: c, + Log: l, }, } } // ApplyOperation applies the operation on istio -func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationRequest) error { +func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationRequest, hchan *chan interface{}) error { + kubeConfigs := opReq.K8sConfigs + istio.SetChannel(hchan) operations := make(adapter.Operations) err := istio.Config.GetObject(adapter.OperationsKey, &operations) if err != nil { @@ -49,7 +50,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR case internalconfig.IstioOperation: go func(hh *Istio, ee *adapter.Event) { version := string(operations[opReq.OperationName].Versions[0]) - stat, err := hh.installIstio(opReq.IsDeleteOperation, false, version, opReq.Namespace, "default") + stat, err := hh.installIstio(opReq.IsDeleteOperation, false, version, opReq.Namespace, "default", kubeConfigs) if err != nil { e.Summary = fmt.Sprintf("Error while %s Istio service mesh", stat) e.Details = err.Error() @@ -63,7 +64,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR case common.BookInfoOperation, common.HTTPBinOperation, common.ImageHubOperation, common.EmojiVotoOperation: go func(hh *Istio, ee *adapter.Event) { appName := operations[opReq.OperationName].AdditionalProperties[common.ServiceName] - stat, err := hh.installSampleApp(opReq.Namespace, opReq.IsDeleteOperation, operations[opReq.OperationName].Templates) + stat, err := hh.installSampleApp(opReq.Namespace, opReq.IsDeleteOperation, operations[opReq.OperationName].Templates, kubeConfigs) if err != nil { e.Summary = fmt.Sprintf("Error while %s %s application", stat, appName) e.Details = err.Error() @@ -99,7 +100,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR }(istio, e) case internalconfig.DenyAllPolicyOperation, internalconfig.StrictMTLSPolicyOperation, internalconfig.MutualMTLSPolicyOperation, internalconfig.DisableMTLSPolicyOperation: go func(hh *Istio, ee *adapter.Event) { - stat, err := hh.applyPolicy(opReq.Namespace, opReq.IsDeleteOperation, operations[opReq.OperationName].Templates) + stat, err := hh.applyPolicy(opReq.Namespace, opReq.IsDeleteOperation, operations[opReq.OperationName].Templates, kubeConfigs) if err != nil { e.Summary = fmt.Sprintf("Error while %s policy", stat) e.Details = err.Error() @@ -112,7 +113,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR }(istio, e) case common.CustomOperation: go func(hh *Istio, ee *adapter.Event) { - stat, err := hh.applyCustomOperation(opReq.Namespace, opReq.CustomBody, opReq.IsDeleteOperation) + stat, err := hh.applyCustomOperation(opReq.Namespace, opReq.CustomBody, opReq.IsDeleteOperation, kubeConfigs) if err != nil { e.Summary = fmt.Sprintf("Error while %s custom operation", stat) e.Details = err.Error() @@ -125,7 +126,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR }(istio, e) case internalconfig.LabelNamespace: go func(hh *Istio, ee *adapter.Event) { - err := hh.LoadNamespaceToMesh(opReq.Namespace, opReq.IsDeleteOperation) + err := hh.LoadNamespaceToMesh(opReq.Namespace, opReq.IsDeleteOperation, kubeConfigs) operation := "enabled" if opReq.IsDeleteOperation { operation = "removed" @@ -146,7 +147,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR patches := make([]string, 0) patches = append(patches, operations[opReq.OperationName].AdditionalProperties[internalconfig.ServicePatchFile]) - _, err := hh.installAddon(opReq.Namespace, opReq.IsDeleteOperation, svcname, patches, operations[opReq.OperationName].Templates) + _, err := hh.installAddon(opReq.Namespace, opReq.IsDeleteOperation, svcname, patches, operations[opReq.OperationName].Templates, kubeConfigs) operation := "install" if opReq.IsDeleteOperation { operation = "uninstall" @@ -166,7 +167,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR go func(hh *Istio, ee *adapter.Event) { responseChan := make(chan *adapter.Event, 1) - go hh.RunVet(responseChan) + go hh.RunVet(responseChan, kubeConfigs) for msg := range responseChan { switch msg.EType { @@ -185,7 +186,7 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR go func(hh *Istio, ee *adapter.Event) { appName := operations[opReq.OperationName].AdditionalProperties[common.ServiceName] patchFile := operations[opReq.OperationName].AdditionalProperties[internalconfig.FilterPatchFile] - stat, err := hh.patchWithEnvoyFilter(opReq.Namespace, opReq.IsDeleteOperation, appName, operations[opReq.OperationName].Templates, patchFile) + stat, err := hh.patchWithEnvoyFilter(opReq.Namespace, opReq.IsDeleteOperation, appName, operations[opReq.OperationName].Templates, patchFile, kubeConfigs) if err != nil { e.Summary = fmt.Sprintf("Error while %s %s application", stat, appName) e.Details = err.Error() @@ -204,7 +205,9 @@ func (istio *Istio) ApplyOperation(ctx context.Context, opReq adapter.OperationR } // ProcessOAM will handles the grpc invocation for handling OAM objects -func (istio *Istio) ProcessOAM(ctx context.Context, oamReq adapter.OAMRequest) (string, error) { +func (istio *Istio) ProcessOAM(ctx context.Context, oamReq adapter.OAMRequest, hchan *chan interface{}) (string, error) { + istio.SetChannel(hchan) + kubeconfigs := oamReq.K8sConfigs var comps []v1alpha1.Component for _, acomp := range oamReq.OamComps { comp, err := oam.ParseApplicationComponent(acomp) @@ -224,13 +227,13 @@ func (istio *Istio) ProcessOAM(ctx context.Context, oamReq adapter.OAMRequest) ( // If operation is delete then first HandleConfiguration and then handle the deployment if oamReq.DeleteOp { // Process configuration - msg2, err := istio.HandleApplicationConfiguration(config, oamReq.DeleteOp) + msg2, err := istio.HandleApplicationConfiguration(config, oamReq.DeleteOp, kubeconfigs) if err != nil { return msg2, ErrProcessOAM(err) } // Process components - msg1, err := istio.HandleComponents(comps, oamReq.DeleteOp) + msg1, err := istio.HandleComponents(comps, oamReq.DeleteOp, kubeconfigs) if err != nil { return msg1 + "\n" + msg2, ErrProcessOAM(err) } @@ -239,13 +242,13 @@ func (istio *Istio) ProcessOAM(ctx context.Context, oamReq adapter.OAMRequest) ( } // Process components - msg1, err := istio.HandleComponents(comps, oamReq.DeleteOp) + msg1, err := istio.HandleComponents(comps, oamReq.DeleteOp, kubeconfigs) if err != nil { return msg1, ErrProcessOAM(err) } // Process configuration - msg2, err := istio.HandleApplicationConfiguration(config, oamReq.DeleteOp) + msg2, err := istio.HandleApplicationConfiguration(config, oamReq.DeleteOp, kubeconfigs) if err != nil { return msg1 + "\n" + msg2, ErrProcessOAM(err) } diff --git a/istio/istio_test.go b/istio/istio_test.go index 0b860b703..8aeed8eeb 100644 --- a/istio/istio_test.go +++ b/istio/istio_test.go @@ -62,10 +62,9 @@ func TestIstio_ApplyOperation(t *testing.T) { ch := make(chan interface{}, 10) fs := fields{ Adapter: adapter.Adapter{ - Config: getConfigHandler(t), - Log: getLoggerHandler(t), - KubeconfigHandler: getKubeconfigHandler(t), - Channel: &ch, + Config: getConfigHandler(t), + Log: getLoggerHandler(t), + Channel: &ch, }, } @@ -386,7 +385,7 @@ func TestIstio_ApplyOperation(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := tt.fields.Adapter.ApplyOperation(tt.args.ctx, tt.args.opReq); (err != nil) != tt.wantErr { + if err := tt.fields.Adapter.ApplyOperation(tt.args.ctx, tt.args.opReq, &ch); (err != nil) != tt.wantErr { t.Errorf("Istio.ApplyOperation() error = %v, wantErr %v", err, tt.wantErr) } }) @@ -397,25 +396,35 @@ func TestIstio_ProcessOAM(t *testing.T) { type fields struct { Adapter adapter.Adapter } + // ch := make(chan interface{}, 10) + // fs := fields{ + // Adapter: adapter.Adapter{ + // Config: getConfigHandler(t), + // Log: getLoggerHandler(t), + // KubeconfigHandler: getKubeconfigHandler(t), + // Channel: &ch, + // }, + // } type args struct { ctx context.Context oamReq adapter.OAMRequest } tests := []struct { name string - fields fields + fs fields args args want string wantErr bool + hchan *chan interface{} }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { istio := &Istio{ - Adapter: tt.fields.Adapter, + Adapter: tt.fs.Adapter, } - got, err := istio.ProcessOAM(tt.args.ctx, tt.args.oamReq) + got, err := istio.ProcessOAM(tt.args.ctx, tt.args.oamReq, tt.hchan) if (err != nil) != tt.wantErr { t.Errorf("Istio.ProcessOAM() error = %v, wantErr %v", err, tt.wantErr) return @@ -448,8 +457,3 @@ func getLoggerHandler(t *testing.T) logger.Handler { }) return log } - -func getKubeconfigHandler(t *testing.T) adapterconfig.Handler { - h, _ := internalconfig.NewKubeconfigBuilder(configprovider.ViperKey) - return h -} diff --git a/istio/oam.go b/istio/oam.go index a5e96e3ef..ae63c8bd9 100644 --- a/istio/oam.go +++ b/istio/oam.go @@ -11,10 +11,10 @@ import ( ) // CompHandler is the type for functions which can handle OAM components -type CompHandler func(*Istio, v1alpha1.Component, bool) (string, error) +type CompHandler func(*Istio, v1alpha1.Component, bool, []string) (string, error) // HandleComponents handles the processing of OAM components -func (istio *Istio) HandleComponents(comps []v1alpha1.Component, isDel bool) (string, error) { +func (istio *Istio) HandleComponents(comps []v1alpha1.Component, isDel bool, kubeconfigs []string) (string, error) { var errs []error var msgs []string @@ -31,7 +31,7 @@ func (istio *Istio) HandleComponents(comps []v1alpha1.Component, isDel bool) (st for _, comp := range comps { fnc, ok := compFuncMap[comp.Spec.Type] if !ok { - msg, err := handleIstioCoreComponent(istio, comp, isDel, "", "") + msg, err := handleIstioCoreComponent(istio, comp, isDel, "", "", kubeconfigs) if err != nil { errs = append(errs, err) continue @@ -41,7 +41,7 @@ func (istio *Istio) HandleComponents(comps []v1alpha1.Component, isDel bool) (st continue } - msg, err := fnc(istio, comp, isDel) + msg, err := fnc(istio, comp, isDel, kubeconfigs) if err != nil { errs = append(errs, err) continue @@ -58,7 +58,7 @@ func (istio *Istio) HandleComponents(comps []v1alpha1.Component, isDel bool) (st } // HandleApplicationConfiguration handles the processing of OAM application configuration -func (istio *Istio) HandleApplicationConfiguration(config v1alpha1.Configuration, isDel bool) (string, error) { +func (istio *Istio) HandleApplicationConfiguration(config v1alpha1.Configuration, isDel bool, kubeconfigs []string) (string, error) { var errs []error var msgs []string for _, comp := range config.Spec.Components { @@ -67,14 +67,14 @@ func (istio *Istio) HandleApplicationConfiguration(config v1alpha1.Configuration namespaces := castSliceInterfaceToSliceString(trait.Properties["namespaces"].([]interface{})) policy := trait.Properties["policy"].(string) - if err := handleMTLS(istio, namespaces, policy, isDel); err != nil { + if err := handleMTLS(istio, namespaces, policy, isDel, kubeconfigs); err != nil { errs = append(errs, err) } } if trait.Name == "automaticSidecarInjection" { namespaces := castSliceInterfaceToSliceString(trait.Properties["namespaces"].([]interface{})) - if err := handleNamespaceLabel(istio, namespaces, isDel); err != nil { + if err := handleNamespaceLabel(istio, namespaces, isDel, kubeconfigs); err != nil { errs = append(errs, err) } } @@ -90,12 +90,12 @@ func (istio *Istio) HandleApplicationConfiguration(config v1alpha1.Configuration return mergeMsgs(msgs), nil } -func handleMTLS(istio *Istio, namespaces []string, policy string, isDel bool) error { +func handleMTLS(istio *Istio, namespaces []string, policy string, isDel bool, kubeconfigs []string) error { var errs []error for _, ns := range namespaces { policyName := fmt.Sprintf("%s-mtls-policy-operation", policy) - if _, err := istio.applyPolicy(ns, isDel, config.Operations[policyName].Templates); err != nil { + if _, err := istio.applyPolicy(ns, isDel, config.Operations[policyName].Templates, kubeconfigs); err != nil { errs = append(errs, err) } } @@ -103,10 +103,10 @@ func handleMTLS(istio *Istio, namespaces []string, policy string, isDel bool) er return mergeErrors(errs) } -func handleNamespaceLabel(istio *Istio, namespaces []string, isDel bool) error { +func handleNamespaceLabel(istio *Istio, namespaces []string, isDel bool, kubeconfigs []string) error { var errs []error for _, ns := range namespaces { - if err := istio.LoadNamespaceToMesh(ns, isDel); err != nil { + if err := istio.LoadNamespaceToMesh(ns, isDel, kubeconfigs); err != nil { errs = append(errs, err) } } @@ -114,21 +114,21 @@ func handleNamespaceLabel(istio *Istio, namespaces []string, isDel bool) error { return mergeErrors(errs) } -func handleComponentIstioMesh(istio *Istio, comp v1alpha1.Component, isDel bool) (string, error) { +func handleComponentIstioMesh(istio *Istio, comp v1alpha1.Component, isDel bool, kubeconfigs []string) (string, error) { // Get the istio version from the settings // we are sure that the version of istio would be present // because the configuration is already validated against the schema version := comp.Spec.Settings["version"].(string) profile := comp.Spec.Settings["profile"].(string) - return istio.installIstio(isDel, false, version, comp.Namespace, profile) + return istio.installIstio(isDel, false, version, comp.Namespace, profile, kubeconfigs) } -func handleComponentVirtualService(istio *Istio, comp v1alpha1.Component, isDel bool) (string, error) { - return handleIstioCoreComponent(istio, comp, isDel, "networking.istio.io/v1beta1", "VirtualService") +func handleComponentVirtualService(istio *Istio, comp v1alpha1.Component, isDel bool, kubeconfigs []string) (string, error) { + return handleIstioCoreComponent(istio, comp, isDel, "networking.istio.io/v1beta1", "VirtualService", kubeconfigs) } -func handleComponentEnvoyFilter(istio *Istio, comp v1alpha1.Component, isDel bool) (string, error) { - return handleIstioCoreComponent(istio, comp, isDel, "networking.istio.io/v1alpha3", "EnvoyFilter") +func handleComponentEnvoyFilter(istio *Istio, comp v1alpha1.Component, isDel bool, kubeconfigs []string) (string, error) { + return handleIstioCoreComponent(istio, comp, isDel, "networking.istio.io/v1alpha3", "EnvoyFilter", kubeconfigs) } func handleIstioCoreComponent( @@ -136,7 +136,8 @@ func handleIstioCoreComponent( comp v1alpha1.Component, isDel bool, apiVersion, - kind string) (string, error) { + kind string, + kubeconfigs []string) (string, error) { if apiVersion == "" { apiVersion = getAPIVersionFromComponent(comp) if apiVersion == "" { @@ -175,10 +176,10 @@ func handleIstioCoreComponent( msg = fmt.Sprintf("deleted %s config \"%s\" in namespace \"%s\"", kind, comp.Name, comp.Namespace) } - return msg, istio.applyManifest(yamlByt, isDel, comp.Namespace) + return msg, istio.applyManifest(yamlByt, isDel, comp.Namespace, kubeconfigs) } -func handleComponentIstioAddon(istio *Istio, comp v1alpha1.Component, isDel bool) (string, error) { +func handleComponentIstioAddon(istio *Istio, comp v1alpha1.Component, isDel bool, kubeconfigs []string) (string, error) { var addonName string switch comp.Spec.Type { @@ -206,7 +207,7 @@ func handleComponentIstioAddon(istio *Istio, comp v1alpha1.Component, isDel bool // Get the templates templates := config.Operations[addonName].Templates - _, err := istio.installAddon(comp.Namespace, isDel, svc, patches, templates) + _, err := istio.installAddon(comp.Namespace, isDel, svc, patches, templates, kubeconfigs) msg := fmt.Sprintf("created service of type \"%s\"", comp.Spec.Type) if isDel { diff --git a/istio/sample_apps.go b/istio/sample_apps.go index 23640a19c..a59ea506c 100644 --- a/istio/sample_apps.go +++ b/istio/sample_apps.go @@ -2,16 +2,18 @@ package istio import ( "context" + "sync" "github.com/layer5io/meshery-adapter-library/adapter" "github.com/layer5io/meshery-adapter-library/status" "github.com/layer5io/meshkit/utils" + mesherykube "github.com/layer5io/meshkit/utils/kubernetes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" ) -func (istio *Istio) installSampleApp(namespace string, del bool, templates []adapter.Template) (string, error) { +func (istio *Istio) installSampleApp(namespace string, del bool, templates []adapter.Template, kubeconfigs []string) (string, error) { st := status.Installing if del { @@ -19,7 +21,7 @@ func (istio *Istio) installSampleApp(namespace string, del bool, templates []ada } for _, template := range templates { - err := istio.applyManifest([]byte(template.String()), del, namespace) + err := istio.applyManifest([]byte(template.String()), del, namespace, kubeconfigs) if err != nil { return st, ErrSampleApp(err) } @@ -28,7 +30,7 @@ func (istio *Istio) installSampleApp(namespace string, del bool, templates []ada return status.Installed, nil } -func (istio *Istio) patchWithEnvoyFilter(namespace string, del bool, app string, templates []adapter.Template, patchObject string) (string, error) { +func (istio *Istio) patchWithEnvoyFilter(namespace string, del bool, app string, templates []adapter.Template, patchObject string, kubeconfigs []string) (string, error) { st := status.Deploying if del { @@ -39,27 +41,55 @@ func (istio *Istio) patchWithEnvoyFilter(namespace string, del bool, app string, if err != nil { return st, ErrEnvoyFilter(err) } + var wg sync.WaitGroup + var errMx sync.Mutex + var errs []error + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + mclient, err := mesherykube.New([]byte(k8sconfig)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + _, err = mclient.KubeClient.AppsV1().Deployments(namespace).Patch(context.TODO(), app, types.MergePatchType, []byte(jsonContents), metav1.PatchOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + for _, template := range templates { + contents, err := utils.ReadFileSource(string(template)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + continue + } + + err = istio.applyManifestOnSingleCluster([]byte(contents), del, namespace, mclient) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + } + }(k8sconfig) + } + wg.Wait() + if len(errs) == 0 { + return status.Deployed, nil + } + return st, ErrEnvoyFilter(mergeErrors(errs)) - _, err = istio.KubeClient.AppsV1().Deployments(namespace).Patch(context.TODO(), app, types.MergePatchType, []byte(jsonContents), metav1.PatchOptions{}) - if err != nil { - return st, ErrEnvoyFilter(err) - } - - for _, template := range templates { - contents, err := utils.ReadFileSource(string(template)) - if err != nil { - return st, ErrEnvoyFilter(err) - } - - err = istio.applyManifest([]byte(contents), del, namespace) - if err != nil { - return st, ErrEnvoyFilter(err) - } - } - - return status.Deployed, nil } -func (istio *Istio) applyPolicy(namespace string, del bool, templates []adapter.Template) (string, error) { +func (istio *Istio) applyPolicy(namespace string, del bool, templates []adapter.Template, kubeconfigs []string) (string, error) { st := status.Deploying if del { @@ -72,7 +102,7 @@ func (istio *Istio) applyPolicy(namespace string, del bool, templates []adapter. return st, ErrApplyPolicy(err) } - err = istio.applyManifest([]byte(contents), del, namespace) + err = istio.applyManifest([]byte(contents), del, namespace, kubeconfigs) if err != nil { return st, ErrApplyPolicy(err) } @@ -81,66 +111,105 @@ func (istio *Istio) applyPolicy(namespace string, del bool, templates []adapter. } // LoadToMesh is used to mark deployment for automatic sidecar injection (or not) -func (istio *Istio) LoadToMesh(namespace string, service string, remove bool) error { - deploy, err := istio.KubeClient.AppsV1().Deployments(namespace).Get(context.TODO(), service, metav1.GetOptions{}) - if err != nil { - return err - } - - if deploy.ObjectMeta.Labels == nil { - deploy.ObjectMeta.Labels = map[string]string{} - } - deploy.ObjectMeta.Labels["istio-injection"] = "enabled" +func (istio *Istio) LoadToMesh(namespace string, service string, remove bool, kubeconfigs []string) error { + var wg sync.WaitGroup + var errMx sync.Mutex + var errs []error + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + kclient, err := mesherykube.New([]byte(k8sconfig)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + deploy, err := kclient.KubeClient.AppsV1().Deployments(namespace).Get(context.TODO(), service, metav1.GetOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + if deploy.ObjectMeta.Labels == nil { + deploy.ObjectMeta.Labels = map[string]string{} + } + deploy.ObjectMeta.Labels["istio-injection"] = "enabled" + + if remove { + delete(deploy.ObjectMeta.Labels, "istio-injection") + } + + _, err = kclient.KubeClient.AppsV1().Deployments(namespace).Update(context.TODO(), deploy, metav1.UpdateOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + return + } + + }(k8sconfig) + } + wg.Wait() + if len(errs) == 0 { + return nil + } + return mergeErrors(errs) - if remove { - delete(deploy.ObjectMeta.Labels, "istio-injection") - } - - _, err = istio.KubeClient.AppsV1().Deployments(namespace).Update(context.TODO(), deploy, metav1.UpdateOptions{}) - if err != nil { - return err - } - - return nil } // LoadNamespaceToMesh is used to mark namespaces for automatic sidecar injection (or not) -func (istio *Istio) LoadNamespaceToMesh(namespace string, remove bool) error { - if istio.KubeClient == nil { - return ErrNilClient - } - - ns, err := istio.KubeClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}) - if err != nil { - return ErrLoadNamespace(err, namespace) - } - - if ns.ObjectMeta.Labels == nil { - ns.ObjectMeta.Labels = map[string]string{} - } - ns.ObjectMeta.Labels["istio-injection"] = "enabled" - - if remove { - delete(ns.ObjectMeta.Labels, "istio-injection") - } - - // How to use meshkit errors which are logged using meshkit logger - // - // The LoadNamespaceToMesh() function is called in istio/istio.go and the - // error returned by this is logged through the meshkit logger - // - // The below function returns Go's built-in error type but we can't - // log that using meshkit logger. - // - // Thus, the error returned in the line below should be wrapped into a meshkit - // error first and then returned. - _, err = istio.KubeClient.CoreV1().Namespaces().Update(context.TODO(), ns, metav1.UpdateOptions{}) - if err != nil { - // Don't do this ❌ - // return err - - // Do this ✔ - return ErrLoadNamespace(err, namespace) - } - return nil +func (istio *Istio) LoadNamespaceToMesh(namespace string, remove bool, kubeconfigs []string) error { + var wg sync.WaitGroup + var errMx sync.Mutex + var errs []error + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + kclient, err := mesherykube.New([]byte(k8sconfig)) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + // return ErrLoadNamespace(err, namespace) + return + } + + ns, err := kclient.KubeClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + // return ErrLoadNamespace(err, namespace) + return + } + if ns.ObjectMeta.Labels == nil { + ns.ObjectMeta.Labels = map[string]string{} + } + ns.ObjectMeta.Labels["istio-injection"] = "enabled" + + if remove { + delete(ns.ObjectMeta.Labels, "istio-injection") + } + + _, err = kclient.KubeClient.CoreV1().Namespaces().Update(context.TODO(), ns, metav1.UpdateOptions{}) + if err != nil { + errMx.Lock() + errs = append(errs, err) + errMx.Unlock() + // return ErrLoadNamespace(err, namespace) + return + } + }(k8sconfig) + } + wg.Wait() + if len(errs) == 0 { + return nil + } + return ErrLoadNamespace(mergeErrors(errs), namespace) } diff --git a/istio/vet.go b/istio/vet.go index 83c099256..746102866 100644 --- a/istio/vet.go +++ b/istio/vet.go @@ -4,6 +4,7 @@ import ( "fmt" "reflect" "strings" + "sync" "time" "github.com/aspenmesh/istio-vet/pkg/istioclient" @@ -17,6 +18,7 @@ import ( "github.com/aspenmesh/istio-vet/pkg/vetter/serviceportprefix" "github.com/layer5io/meshery-adapter-library/adapter" "github.com/layer5io/meshery-adapter-library/meshes" + mesherykube "github.com/layer5io/meshkit/utils/kubernetes" istioinformer "istio.io/client-go/pkg/informers/externalversions" "k8s.io/client-go/informers" ) @@ -36,126 +38,141 @@ func (m *metaInformerFactory) Istio() istioinformer.SharedInformerFactory { } // RunVet runs istio-vet -func (istio *Istio) RunVet(ch chan<- *adapter.Event) { +func (istio *Istio) RunVet(ch chan<- *adapter.Event, kubeconfigs []string) { defer close(ch) + var wg sync.WaitGroup + for _, k8sconfig := range kubeconfigs { + wg.Add(1) + go func(k8sconfig string) { + defer wg.Done() + mclient, err := mesherykube.New([]byte(k8sconfig)) + if err != nil { + e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrCreatingIstioClient(err).Error() + e.Summary = "Unable to create k8s client" + ch <- e + } + istioClient, err := istioclient.New(&mclient.RestConfig) + if err != nil { + e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrCreatingIstioClient(err).Error() + e.Summary = "Unable to create istio client" + ch <- e + } - istioClient, err := istioclient.New(&istio.RestConfig) - if err != nil { - e := &adapter.Event{} - e.EType = int32(meshes.EventType_ERROR) - e.Details = ErrCreatingIstioClient(err).Error() - e.Summary = "Unable to create istio client" - ch <- e - } - - kubeInformerFactory := informers.NewSharedInformerFactory(istio.KubeClient, 0) - istioInformerFactory := istioinformer.NewSharedInformerFactory(istioClient, 0) - informerFactory := &metaInformerFactory{ - k8s: kubeInformerFactory, - istio: istioInformerFactory, - } + kubeInformerFactory := informers.NewSharedInformerFactory(mclient.KubeClient, 0) + istioInformerFactory := istioinformer.NewSharedInformerFactory(istioClient, 0) + informerFactory := &metaInformerFactory{ + k8s: kubeInformerFactory, + istio: istioInformerFactory, + } - vList := []vetter.Vetter{ - vetter.Vetter(podsinmesh.NewVetter(informerFactory)), - vetter.Vetter(meshversion.NewVetter(informerFactory)), - vetter.Vetter(applabel.NewVetter(informerFactory)), - vetter.Vetter(serviceportprefix.NewVetter(informerFactory)), - vetter.Vetter(serviceassociation.NewVetter(informerFactory)), - vetter.Vetter(danglingroutedestinationhost.NewVetter(informerFactory)), - vetter.Vetter(conflictingvirtualservicehost.NewVetter(informerFactory)), - } + vList := []vetter.Vetter{ + vetter.Vetter(podsinmesh.NewVetter(informerFactory)), + vetter.Vetter(meshversion.NewVetter(informerFactory)), + vetter.Vetter(applabel.NewVetter(informerFactory)), + vetter.Vetter(serviceportprefix.NewVetter(informerFactory)), + vetter.Vetter(serviceassociation.NewVetter(informerFactory)), + vetter.Vetter(danglingroutedestinationhost.NewVetter(informerFactory)), + vetter.Vetter(conflictingvirtualservicehost.NewVetter(informerFactory)), + } - stopCh := make(chan struct{}) - - kubeInformerFactory.Start(stopCh) - oks, timedout := completeBefore(istioVetSyncTimeout, func() map[reflect.Type]bool { - return kubeInformerFactory.WaitForCacheSync(stopCh) - }) - if timedout { - e := &adapter.Event{} - e.EType = int32(meshes.EventType_ERROR) - e.Details = ErrIstioVetSync(fmt.Errorf("istio service mesh was either not found or is not deployed")).Error() - e.Summary = "Failed to sync: Request timed out" - ch <- e - close(stopCh) - return - } - for inf, ok := range oks { - if !ok { - e := &adapter.Event{} - e.EType = int32(meshes.EventType_ERROR) - e.Details = ErrIstioVetSync(fmt.Errorf("%s", inf)).Error() - e.Summary = "Failed to sync" - ch <- e - return - } - } + stopCh := make(chan struct{}) - istioInformerFactory.Start(stopCh) - oks, timedout = completeBefore(istioVetSyncTimeout, func() map[reflect.Type]bool { - return istioInformerFactory.WaitForCacheSync(stopCh) - }) - if timedout { - e := &adapter.Event{} - e.EType = int32(meshes.EventType_ERROR) - e.Details = ErrIstioVetSync(fmt.Errorf("istio service mesh was either not found or is not deployed")).Error() - e.Summary = "Failed to sync: Request timed out" - ch <- e - close(stopCh) - return - } - for inf, ok := range oks { - if !ok { - e := &adapter.Event{} - e.EType = int32(meshes.EventType_ERROR) - e.Details = ErrIstioVetSync(fmt.Errorf("%s", inf)).Error() - e.Summary = "Failed to sync" - ch <- e - return - } - } - close(stopCh) - - for _, v := range vList { - nList, err := v.Vet() - if err != nil { - e := &adapter.Event{} - e.Summary = fmt.Sprintf("Vetter: %s reported error", v.Info().GetId()) - e.Details = err.Error() - e.EType = int32(meshes.EventType_ERROR) - ch <- e - continue - } - if len(nList) > 0 { - for i := range nList { + kubeInformerFactory.Start(stopCh) + oks, timedout := completeBefore(istioVetSyncTimeout, func() map[reflect.Type]bool { + return kubeInformerFactory.WaitForCacheSync(stopCh) + }) + if timedout { e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrIstioVetSync(fmt.Errorf("istio service mesh was either not found or is not deployed")).Error() + e.Summary = "Failed to sync: Request timed out" + ch <- e + close(stopCh) + return + } + for inf, ok := range oks { + if !ok { + e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrIstioVetSync(fmt.Errorf("%s", inf)).Error() + e.Summary = "Failed to sync" + ch <- e + return + } + } - var ts []string - for k, v := range nList[i].Attr { - ts = append(ts, "${"+k+"}", v) + istioInformerFactory.Start(stopCh) + oks, timedout = completeBefore(istioVetSyncTimeout, func() map[reflect.Type]bool { + return istioInformerFactory.WaitForCacheSync(stopCh) + }) + if timedout { + e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrIstioVetSync(fmt.Errorf("istio service mesh was either not found or is not deployed")).Error() + e.Summary = "Failed to sync: Request timed out" + ch <- e + close(stopCh) + return + } + for inf, ok := range oks { + if !ok { + e := &adapter.Event{} + e.EType = int32(meshes.EventType_ERROR) + e.Details = ErrIstioVetSync(fmt.Errorf("%s", inf)).Error() + e.Summary = "Failed to sync" + ch <- e + return } - r := strings.NewReplacer(ts...) - e.Summary = r.Replace(nList[i].GetSummary()) - e.Details = r.Replace(nList[i].GetMsg()) - switch nList[i].GetLevel().String() { - case "WARNING": - e.EType = int32(meshes.EventType_WARN) - case "ERROR": + } + close(stopCh) + + for _, v := range vList { + nList, err := v.Vet() + if err != nil { + e := &adapter.Event{} + e.Summary = fmt.Sprintf("Vetter: %s reported error", v.Info().GetId()) + e.Details = err.Error() e.EType = int32(meshes.EventType_ERROR) - default: + ch <- e + continue + } + if len(nList) > 0 { + for i := range nList { + e := &adapter.Event{} + + var ts []string + for k, v := range nList[i].Attr { + ts = append(ts, "${"+k+"}", v) + } + r := strings.NewReplacer(ts...) + e.Summary = r.Replace(nList[i].GetSummary()) + e.Details = r.Replace(nList[i].GetMsg()) + switch nList[i].GetLevel().String() { + case "WARNING": + e.EType = int32(meshes.EventType_WARN) + case "ERROR": + e.EType = int32(meshes.EventType_ERROR) + default: + e.EType = int32(meshes.EventType_INFO) + } + ch <- e + } + } else { + e := &adapter.Event{} + istio.Log.Debug(fmt.Sprintf("Vetter %s ran successfully and generated no notes", v.Info().GetId())) + e.Summary = fmt.Sprintf("Vetter: %s ran successfully", v.Info().GetId()) + e.Details = "No notes generated" e.EType = int32(meshes.EventType_INFO) + ch <- e } - ch <- e } - } else { - e := &adapter.Event{} - istio.Log.Debug(fmt.Sprintf("Vetter %s ran successfully and generated no notes", v.Info().GetId())) - e.Summary = fmt.Sprintf("Vetter: %s ran successfully", v.Info().GetId()) - e.Details = "No notes generated" - e.EType = int32(meshes.EventType_INFO) - ch <- e - } + }(k8sconfig) } + } // StreamWarn streams a warning message to the channel diff --git a/templates/oam/workloads/1.10.1/authorizationpolicy.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/authorizationpolicy.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/authorizationpolicy.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/authorizationpolicy.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/authorizationpolicy.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/authorizationpolicy.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/authorizationpolicy.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/authorizationpolicy.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/destinationrule.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/destinationrule.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/destinationrule.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/destinationrule.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/destinationrule.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/destinationrule.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/destinationrule.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/destinationrule.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/envoyfilter.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/envoyfilter.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/envoyfilter.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/envoyfilter.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/envoyfilter.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/envoyfilter.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/envoyfilter.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/envoyfilter.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/gateway.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/gateway.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/gateway.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/gateway.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/gateway.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/gateway.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/gateway.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/gateway.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/peerauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/peerauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/peerauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/peerauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/peerauthentication.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/peerauthentication.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/peerauthentication.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/peerauthentication.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/requestauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/requestauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/requestauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/requestauthentication.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/requestauthentication.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/requestauthentication.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/requestauthentication.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/requestauthentication.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/serviceentry.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/serviceentry.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/serviceentry.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/serviceentry.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/serviceentry.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/serviceentry.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/serviceentry.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/serviceentry.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/sidecar.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/sidecar.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/sidecar.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/sidecar.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/sidecar.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/sidecar.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/sidecar.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/sidecar.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/telemetry.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/telemetry.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/telemetry.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/telemetry.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/telemetry.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/telemetry.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/telemetry.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/telemetry.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/virtualservice.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/virtualservice.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/virtualservice.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/virtualservice.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/virtualservice.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/virtualservice.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/virtualservice.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/virtualservice.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/workloadentry.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/workloadentry.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/workloadentry.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/workloadentry.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/workloadentry.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/workloadentry.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/workloadentry.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/workloadentry.istio.meshery.layer5.io_definition.json diff --git a/templates/oam/workloads/1.10.1/workloadgroup.istio.meshery.layer5.io.meshery.layer5io.schema.json b/templates/oam/workloads/1.7.7/1.10.1/workloadgroup.istio.meshery.layer5.io.meshery.layer5io.schema.json similarity index 100% rename from templates/oam/workloads/1.10.1/workloadgroup.istio.meshery.layer5.io.meshery.layer5io.schema.json rename to templates/oam/workloads/1.7.7/1.10.1/workloadgroup.istio.meshery.layer5.io.meshery.layer5io.schema.json diff --git a/templates/oam/workloads/1.10.1/workloadgroup.istio.meshery.layer5.io_definition.json b/templates/oam/workloads/1.7.7/1.10.1/workloadgroup.istio.meshery.layer5.io_definition.json similarity index 100% rename from templates/oam/workloads/1.10.1/workloadgroup.istio.meshery.layer5.io_definition.json rename to templates/oam/workloads/1.7.7/1.10.1/workloadgroup.istio.meshery.layer5.io_definition.json