diff --git a/go.mod b/go.mod index 4bdeedb6e..00f4b03b6 100644 --- a/go.mod +++ b/go.mod @@ -6,17 +6,24 @@ require ( github.com/Microsoft/go-winio v0.4.14 // indirect github.com/containernetworking/cni v0.7.1 github.com/containernetworking/plugins v0.8.2 + github.com/emicklei/go-restful v2.11.1+incompatible // indirect + github.com/go-openapi/spec v0.19.4 // indirect github.com/golang/protobuf v1.3.2 // indirect - github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191025120722-4c57cd5732f3 + github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 github.com/onsi/ginkgo v1.10.1 github.com/onsi/gomega v1.7.0 github.com/pkg/errors v0.8.1 github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf github.com/vishvananda/netns v0.0.0-20190625233234-7109fa855b0f // indirect - golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 + golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933 + golang.org/x/tools v0.0.0-20191203051722-db047d72ee39 // indirect + gonum.org/v1/gonum v0.6.1 // indirect google.golang.org/grpc v1.23.0 + gopkg.in/yaml.v2 v2.2.7 // indirect k8s.io/api v0.0.0-20181115043458-b799cb063522 k8s.io/apimachinery v0.0.0-20181110190943-2a7c93004028 k8s.io/client-go v0.0.0-20181115111358-9bea17718df8 + k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e // indirect + k8s.io/gengo v0.0.0-20191120174120-e74f70b9b27e // indirect k8s.io/kubernetes v1.13.0 ) diff --git a/go.sum b/go.sum index 9c9b8d91c..c8749b5e5 100644 --- a/go.sum +++ b/go.sum @@ -5,10 +5,14 @@ github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcy github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -24,33 +28,52 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/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/go-restful v2.10.0+incompatible h1:l6Soi8WCOOVAeCo4W98iBFC6Og7/X8bpRt51oNLZ2C8= github.com/emicklei/go-restful v2.10.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.11.1+incompatible h1:CjKsv3uWcCMvySPQYKxO8XX3f9zD4FeZRsW4G0B4ffE= +github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/evanphx/json-patch v4.1.0+incompatible h1:K1MDoo4AZ4wU0GIU/fPmtZg7VpzLjCxu+UwBD1FvwOc= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= +github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= @@ -58,8 +81,12 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM= @@ -72,11 +99,16 @@ github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab/go.mod h1:2EnlNZ0dea github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3 h1:/UewZcckqhvnnS0C6r3Sher2hSEbVmM6Ogpcjen08+Y= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/juju/errors v0.0.0-20180806074554-22422dad46e1/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20190613124551-e81189438503/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191025120722-4c57cd5732f3 h1:rGn6h+Qy9GUP4D0MKqzCCmEzuyFbm0JRoui+FzqKKzE= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191025120722-4c57cd5732f3/go.mod h1:nIUH9A0XLvWfHgOUq1MX3SuDsZ7qUf6xUdshzdKt0pU= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 h1:Lq6HJa0JqSg5ko/mkizFWlpIrY7845g9Dzz9qeD5aXI= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111/go.mod h1:MP2HbArq3QT+oVp8pmtHNZnSnkhdkHtDnc7h6nJXmBU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -86,33 +118,45 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b h1:Ey6yH0acn50T/v6CB75bGP4EMJqnv9WvnjN7oZaj+xE= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a h1:KfNOeFvoAssuZLT7IntKZElKwi/5LRuxY71k+t6rfaM= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -122,6 +166,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -138,11 +183,15 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad h1:5E5raQxcv+6CZ11RrBYQe5WRbUIWpScjh0kvHZkZIrQ= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -153,12 +202,16 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA= golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933 h1:e6HwijUxhDe+hPNjZQQn9bA5PW3vNmnN64U2ZW759Lk= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288 h1:JIqe8uIcRBHXDQVvZtHwp80ai3Lw3IJAeJEs55Dc1W0= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= @@ -169,13 +222,16 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190927073244-c990c680b611 h1:q9u40nxWT5zRClI/uU9dHCiYGottAg6Nzz4YUQyHxdA= golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -183,12 +239,20 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0 h1:7+F62GGWUowoiJOUDivedlBECd/fTeUDJnCu0JetQO0= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191203051722-db047d72ee39 h1:zARK4PTmTfx1BC6iKP21qIRjz0nFzFj4ZAlbUy6Q6pM= +golang.org/x/tools v0.0.0-20191203051722-db047d72ee39/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485 h1:OB/uP/Puiu5vS5QMRPrXCDWUPb+kt8f1KW8oQzFejQw= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.6.1 h1:/LSrTrgZtpbXyAR6+0e152SROCkJJSh7goYWVmdPFGc= +gonum.org/v1/gonum v0.6.1/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -215,6 +279,9 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20181115043458-b799cb063522 h1:JGWVL/WnKVncCXESoe8wCBZJbXbUvYi+AuSHJ/IuFN8= k8s.io/api v0.0.0-20181115043458-b799cb063522/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= @@ -224,14 +291,23 @@ k8s.io/client-go v0.0.0-20181115111358-9bea17718df8 h1:Q1pEgTyAmkwHY+lScBj4VZaGP k8s.io/client-go v0.0.0-20181115111358-9bea17718df8/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/code-generator v0.0.0-20181114232248-ae218e241252 h1:bURaCtXd+lhw5buMNdeUig98d3Eq97Muux1hUFvkqb0= k8s.io/code-generator v0.0.0-20181114232248-ae218e241252/go.mod h1:IPqxl/YHk05nodzupwjke6ctMjyNRdV2zZ5/j3/F204= +k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e h1:HB9Zu5ZUvJfNpLiTPhz+CebVKV8C39qTBMQkAgAZLNw= +k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/gengo v0.0.0-20181106084056-51747d6e00da/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190907103519-ebc107f98eab h1:j4L8spMe0tFfBvvW6lrc0c+Ql8+nnkcV3RYfi3eSwGY= k8s.io/gengo v0.0.0-20190907103519-ebc107f98eab/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20191120174120-e74f70b9b27e h1:HqlU9dKk5YVs7R84jmq6U3Wo/XslpkxHpBv2iWHLtLc= +k8s.io/gengo v0.0.0-20191120174120-e74f70b9b27e/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.0.0-20190306015804-8e90cee79f82/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/kube-openapi v0.0.0-20181114233023-0317810137be h1:aWEq4nbj7HRJ0mtKYjNSk/7X28Tl6TI6FeG8gKF+r7Q= k8s.io/kube-openapi v0.0.0-20181114233023-0317810137be/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -239,5 +315,7 @@ modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/k8sclient/k8sclient.go b/k8sclient/k8sclient.go index e445239fb..dea8df064 100644 --- a/k8sclient/k8sclient.go +++ b/k8sclient/k8sclient.go @@ -36,6 +36,10 @@ import ( "github.com/intel/multus-cni/logging" "github.com/intel/multus-cni/types" nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + netclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1" + + "k8s.io/client-go/kubernetes/fake" + netfake "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/fake" ) const ( @@ -51,48 +55,45 @@ type NoK8sNetworkError struct { // ClientInfo contains information given from k8s client type ClientInfo struct { - Client KubeClient - Podnamespace string - Podname string + Client kubernetes.Interface + NetClient netclient.K8sCniCncfIoV1Interface +} + +func (c *ClientInfo) AddPod(pod *v1.Pod) (*v1.Pod, error) { + return c.Client.Core().Pods(pod.ObjectMeta.Namespace).Create(pod) +} + +func (c *ClientInfo) GetPod(namespace, name string) (*v1.Pod, error) { + return c.Client.Core().Pods(namespace).Get(name, metav1.GetOptions{}) +} + +func (c *ClientInfo) DeletePod(namespace, name string) error { + return c.Client.Core().Pods(namespace).Delete(name, &metav1.DeleteOptions{}) +} + +func (c *ClientInfo) AddNetAttachDef(netattach *nettypes.NetworkAttachmentDefinition) (*nettypes.NetworkAttachmentDefinition, error) { + return c.NetClient.NetworkAttachmentDefinitions(netattach.ObjectMeta.Namespace).Create(netattach) +} + +func NewFakeClientInfo() *ClientInfo { + return &ClientInfo{ + Client: fake.NewSimpleClientset(), + NetClient: netfake.NewSimpleClientset().K8sCniCncfIoV1(), + } } func (e *NoK8sNetworkError) Error() string { return string(e.message) } -type defaultKubeClient struct { - client kubernetes.Interface -} - -// defaultKubeClient implements KubeClient -var _ KubeClient = &defaultKubeClient{} - -func (d *defaultKubeClient) GetRawWithPath(path string) ([]byte, error) { - return d.client.ExtensionsV1beta1().RESTClient().Get().AbsPath(path).DoRaw() -} - -func (d *defaultKubeClient) GetPod(namespace, name string) (*v1.Pod, error) { - return d.client.Core().Pods(namespace).Get(name, metav1.GetOptions{}) -} - -func (d *defaultKubeClient) UpdatePodStatus(pod *v1.Pod) (*v1.Pod, error) { - return d.client.Core().Pods(pod.Namespace).UpdateStatus(pod) -} - -func setKubeClientInfo(c *ClientInfo, client KubeClient, k8sArgs *types.K8sArgs) { - logging.Debugf("setKubeClientInfo: %v, %v, %v", c, client, k8sArgs) - c.Client = client - c.Podnamespace = string(k8sArgs.K8S_POD_NAMESPACE) - c.Podname = string(k8sArgs.K8S_POD_NAME) -} - // SetNetworkStatus sets network status into Pod annotation -func SetNetworkStatus(client KubeClient, k8sArgs *types.K8sArgs, netStatus []*types.NetworkStatus, conf *types.NetConf) error { +func SetNetworkStatus(client *ClientInfo, k8sArgs *types.K8sArgs, netStatus []*types.NetworkStatus, conf *types.NetConf) error { + var err error logging.Debugf("SetNetworkStatus: %v, %v, %v, %v", client, k8sArgs, netStatus, conf) - client, err := GetK8sClient(conf.Kubeconfig, client) + client, err = GetK8sClient(conf.Kubeconfig, client) if err != nil { return logging.Errorf("SetNetworkStatus: %v", err) } - if client == nil { + if client == nil || client.Client == nil { if len(conf.Delegates) == 0 { // No available kube client and no delegates, we can't do anything return logging.Errorf("SetNetworkStatus: must have either Kubernetes config or delegates") @@ -103,7 +104,7 @@ func SetNetworkStatus(client KubeClient, k8sArgs *types.K8sArgs, netStatus []*ty podName := string(k8sArgs.K8S_POD_NAME) podNamespace := string(k8sArgs.K8S_POD_NAMESPACE) - pod, err := client.GetPod(podNamespace, podName) + pod, err := client.Client.Core().Pods(podNamespace).Get(podName, metav1.GetOptions{}) if err != nil { return logging.Errorf("SetNetworkStatus: failed to query the pod %v in out of cluster comm: %v", podName, err) } @@ -143,7 +144,7 @@ func SetNetworkStatus(client KubeClient, k8sArgs *types.K8sArgs, netStatus []*ty return nil } -func setPodNetworkAnnotation(client KubeClient, namespace string, pod *v1.Pod, networkstatus string) (*v1.Pod, error) { +func setPodNetworkAnnotation(client *ClientInfo, namespace string, pod *v1.Pod, networkstatus string) (*v1.Pod, error) { logging.Debugf("setPodNetworkAnnotation: %v, %s, %v, %s", client, namespace, pod, networkstatus) //if pod annotations is empty, make sure it allocatable if len(pod.Annotations) == 0 { @@ -157,13 +158,13 @@ func setPodNetworkAnnotation(client KubeClient, namespace string, pod *v1.Pod, n if resultErr := retry.RetryOnConflict(retry.DefaultBackoff, func() error { if err != nil { // Re-get the pod unless it's the first attempt to update - pod, err = client.GetPod(pod.Namespace, pod.Name) + pod, err = client.Client.Core().Pods(pod.Namespace).Get(pod.Name, metav1.GetOptions{}) if err != nil { return err } } - pod, err = client.UpdatePodStatus(pod) + pod, err = client.Client.Core().Pods(pod.Namespace).UpdateStatus(pod) return err }); resultErr != nil { return nil, logging.Errorf("setPodNetworkAnnotation: status update failed for pod %s/%s: %v", pod.Namespace, pod.Name, resultErr) @@ -376,20 +377,14 @@ func cniConfigFromNetworkResource(customResource *nettypes.NetworkAttachmentDefi return config, nil } -func getKubernetesDelegate(client KubeClient, net *types.NetworkSelectionElement, confdir string, pod *v1.Pod, resourceMap map[string]*types.ResourceInfo) (*types.DelegateNetConf, map[string]*types.ResourceInfo, error) { +func getKubernetesDelegate(client *ClientInfo, net *types.NetworkSelectionElement, confdir string, pod *v1.Pod, resourceMap map[string]*types.ResourceInfo) (*types.DelegateNetConf, map[string]*types.ResourceInfo, error) { - logging.Debugf("getKubernetesDelegate: %v, %v, %s", client, net, confdir) - rawPath := fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", net.Namespace, net.Name) - netData, err := client.GetRawWithPath(rawPath) + logging.Debugf("getKubernetesDelegate: %v, %v, %s, %v, %v", client, net, confdir, pod, resourceMap) + customResource, err := client.NetClient.NetworkAttachmentDefinitions(net.Namespace).Get(net.Name, metav1.GetOptions{}) if err != nil { return nil, resourceMap, logging.Errorf("getKubernetesDelegate: cannot find get a network-attachment-definition (%s) in namespace (%s): %v", net.Name, net.Namespace, err) } - customResource := &nettypes.NetworkAttachmentDefinition{} - if err := json.Unmarshal(netData, customResource); err != nil { - return nil, resourceMap, logging.Errorf("getKubernetesDelegate: failed to parse the network-attachment-definition: %v", err) - } - // Get resourceName annotation from NetworkAttachmentDefinition deviceID := "" resourceName, ok := customResource.GetAnnotations()[resourceNameAnnot] @@ -432,13 +427,6 @@ func getKubernetesDelegate(client KubeClient, net *types.NetworkSelectionElement return delegate, resourceMap, nil } -// KubeClient is abstraction layer for k8s client (used testing package) -type KubeClient interface { - GetRawWithPath(path string) ([]byte, error) - GetPod(namespace, name string) (*v1.Pod, error) - UpdatePodStatus(pod *v1.Pod) (*v1.Pod, error) -} - // GetK8sArgs gets k8s related args from CNI args func GetK8sArgs(args *skel.CmdArgs) (*types.K8sArgs, error) { k8sArgs := &types.K8sArgs{} @@ -454,17 +442,16 @@ func GetK8sArgs(args *skel.CmdArgs) (*types.K8sArgs, error) { // TryLoadPodDelegates attempts to load Kubernetes-defined delegates and add them to the Multus config. // Returns the number of Kubernetes-defined delegates added or an error. -func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient KubeClient) (int, *ClientInfo, error) { +func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, clientInfo *ClientInfo) (int, *ClientInfo, error) { var err error - clientInfo := &ClientInfo{} - logging.Debugf("TryLoadPodDelegates: %v, %v, %v", k8sArgs, conf, kubeClient) - kubeClient, err = GetK8sClient(conf.Kubeconfig, kubeClient) + logging.Debugf("TryLoadPodDelegates: %v, %v, %v", k8sArgs, conf, clientInfo) + clientInfo, err = GetK8sClient(conf.Kubeconfig, clientInfo) if err != nil { return 0, nil, err } - if kubeClient == nil { + if clientInfo == nil { if len(conf.Delegates) == 0 { // No available kube client and no delegates, we can't do anything return 0, nil, logging.Errorf("TryLoadPodDelegates: must have either Kubernetes config or delegates") @@ -472,15 +459,14 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient return 0, nil, nil } - setKubeClientInfo(clientInfo, kubeClient, k8sArgs) // Get the pod info. If cannot get it, we use cached delegates - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.Client.Core().Pods(string(k8sArgs.K8S_POD_NAMESPACE)).Get(string(k8sArgs.K8S_POD_NAME), metav1.GetOptions{}) if err != nil { logging.Debugf("TryLoadPodDelegates: Err in loading K8s cluster default network from pod annotation: %v, use cached delegates", err) return 0, nil, nil } - delegate, err := tryLoadK8sPodDefaultNetwork(kubeClient, pod, conf) + delegate, err := tryLoadK8sPodDefaultNetwork(clientInfo, pod, conf) if err != nil { return 0, nil, logging.Errorf("TryLoadPodDelegates: error in loading K8s cluster default network from pod annotation: %v", err) } @@ -492,7 +478,7 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient networks, err := GetPodNetwork(pod) if networks != nil { - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, conf.ConfDir, conf.NamespaceIsolation) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, conf.ConfDir, conf.NamespaceIsolation) if err != nil { if _, ok := err.(*NoK8sNetworkError); ok { @@ -526,7 +512,7 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient } // GetK8sClient gets client info from kubeconfig -func GetK8sClient(kubeconfig string, kubeClient KubeClient) (KubeClient, error) { +func GetK8sClient(kubeconfig string, kubeClient *ClientInfo) (*ClientInfo, error) { logging.Debugf("GetK8sClient: %s, %v", kubeconfig, kubeClient) // If we get a valid kubeClient (eg from testcases) just return that // one. @@ -565,7 +551,15 @@ func GetK8sClient(kubeconfig string, kubeClient KubeClient) (KubeClient, error) return nil, err } - return &defaultKubeClient{client: client}, nil + netclient, err := netclient.NewForConfig(config) + if err != nil { + return nil, err + } + + return &ClientInfo{ + Client: client, + NetClient: netclient, + }, nil } // GetPodNetwork gets net-attach-def annotation from pod @@ -587,7 +581,7 @@ func GetPodNetwork(pod *v1.Pod) ([]*types.NetworkSelectionElement, error) { } // GetNetworkDelegates returns delegatenetconf from net-attach-def annotation in pod -func GetNetworkDelegates(k8sclient KubeClient, pod *v1.Pod, networks []*types.NetworkSelectionElement, confdir string, confnamespaceIsolation bool) ([]*types.DelegateNetConf, error) { +func GetNetworkDelegates(k8sclient *ClientInfo, pod *v1.Pod, networks []*types.NetworkSelectionElement, confdir string, confnamespaceIsolation bool) ([]*types.DelegateNetConf, error) { logging.Debugf("GetNetworkDelegates: %v, %v, %v, %v, %v", k8sclient, pod, networks, confdir, confnamespaceIsolation) // resourceMap holds Pod device allocation information; only initizized if CRD contains 'resourceName' annotation. // This will only be initialized once and all delegate objects can reference this to look up device info. @@ -618,19 +612,13 @@ func GetNetworkDelegates(k8sclient KubeClient, pod *v1.Pod, networks []*types.Ne return delegates, nil } -func getDefaultNetDelegateCRD(client KubeClient, net, confdir, namespace string) (*types.DelegateNetConf, error) { +func getDefaultNetDelegateCRD(client *ClientInfo, net, confdir, namespace string) (*types.DelegateNetConf, error) { logging.Debugf("getDefaultNetDelegateCRD: %v, %v, %s, %s", client, net, confdir, namespace) - rawPath := fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", namespace, net) - netData, err := client.GetRawWithPath(rawPath) + customResource, err := client.NetClient.NetworkAttachmentDefinitions(namespace).Get(net, metav1.GetOptions{}) if err != nil { return nil, logging.Errorf("getDefaultNetDelegateCRD: failed to get network resource: %v", err) } - customResource := &nettypes.NetworkAttachmentDefinition{} - if err := json.Unmarshal(netData, customResource); err != nil { - return nil, logging.Errorf("getDefaultNetDelegateCRD: failed to get the netplugin data: %v", err) - } - configBytes, err := cniConfigFromNetworkResource(customResource, confdir) if err != nil { return nil, err @@ -644,7 +632,7 @@ func getDefaultNetDelegateCRD(client KubeClient, net, confdir, namespace string) return delegate, nil } -func getNetDelegate(client KubeClient, netname, confdir, namespace string) (*types.DelegateNetConf, error) { +func getNetDelegate(client *ClientInfo, netname, confdir, namespace string) (*types.DelegateNetConf, error) { logging.Debugf("getNetDelegate: %v, %v, %v, %s", client, netname, confdir, namespace) // option1) search CRD object for the network delegate, err := getDefaultNetDelegateCRD(client, netname, confdir, namespace) @@ -689,7 +677,7 @@ func getNetDelegate(client KubeClient, netname, confdir, namespace string) (*typ } // GetDefaultNetworks parses 'defaultNetwork' config, gets network json and put it into netconf.Delegates. -func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient KubeClient) error { +func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient *ClientInfo) error { logging.Debugf("GetDefaultNetworks: %v, %v, %v", k8sArgs, conf, kubeClient) var delegates []*types.DelegateNetConf @@ -731,7 +719,7 @@ func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient } // tryLoadK8sPodDefaultNetwork get pod default network from annotations -func tryLoadK8sPodDefaultNetwork(kubeClient KubeClient, pod *v1.Pod, conf *types.NetConf) (*types.DelegateNetConf, error) { +func tryLoadK8sPodDefaultNetwork(kubeClient *ClientInfo, pod *v1.Pod, conf *types.NetConf) (*types.DelegateNetConf, error) { var netAnnot string logging.Debugf("tryLoadK8sPodDefaultNetwork: %v, %v, %v", kubeClient, pod, conf) diff --git a/k8sclient/k8sclient_test.go b/k8sclient/k8sclient_test.go index 8b6d3adb2..206a720d4 100644 --- a/k8sclient/k8sclient_test.go +++ b/k8sclient/k8sclient_test.go @@ -23,14 +23,19 @@ import ( "testing" types020 "github.com/containernetworking/cni/pkg/types/020" - testhelpers "github.com/intel/multus-cni/testing" testutils "github.com/intel/multus-cni/testing" "github.com/containernetworking/cni/pkg/skel" "github.com/intel/multus-cni/types" + //netscheme "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/scheme" + //netv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + //netfake "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/fake" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + + //"k8s.io/client-go/kubernetes/fake" ) func TestK8sClient(t *testing.T) { @@ -69,28 +74,30 @@ var _ = Describe("k8sclient operations", func() { "type": "mynet3", "cniVersion": "0.2.0" }` + args := &skel.CmdArgs{ Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net2", net2) - // net3 is not used; make sure it's not accessed - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net3", net3) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net2", net2)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + Expect(err).NotTo(HaveOccurred()) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(err).NotTo(HaveOccurred()) - Expect(fKubeClient.PodCount).To(Equal(1)) - Expect(fKubeClient.NetCount).To(Equal(2)) Expect(len(delegates)).To(Equal(2)) Expect(delegates[0].Conf.Name).To(Equal("net1")) @@ -112,20 +119,21 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net3", net3) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + Expect(err).NotTo(HaveOccurred()) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(len(delegates)).To(Equal(0)) - Expect(err).To(MatchError("GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find get a network-attachment-definition (net1) in namespace (test): resource not found")) + Expect(err).To(MatchError("GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find get a network-attachment-definition (net1) in namespace (test): network-attachment-definitions.k8s.cni.cncf.io \"net1\" not found")) }) It("retrieves delegates from kubernetes using JSON format annotation", func() { @@ -145,35 +153,35 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net2", `{ - "name": "net2", - "type": "mynet2", - "cniVersion": "0.2.0" -}`) - fKubeClient.AddNetConfig("other-ns", "net3", `{ - "name": "net3", - "type": "mynet3", - "cniVersion": "0.2.0" -}`) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net2", `{ + "name": "net2", + "type": "mynet2", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("other-ns", "net3", `{ + "name": "net3", + "type": "mynet3", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(err).NotTo(HaveOccurred()) - Expect(fKubeClient.PodCount).To(Equal(1)) - Expect(fKubeClient.NetCount).To(Equal(3)) Expect(len(delegates)).To(Equal(3)) Expect(delegates[0].Conf.Name).To(Equal("net1")) @@ -190,14 +198,13 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(len(networks)).To(Equal(0)) Expect(err).To(MatchError("parsePodNetworkAnnotation: failed to parse pod Network Attachment Selection Annotation JSON format: invalid character 'a' looking for beginning of value")) @@ -219,35 +226,36 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net2", `{ - "name": "net2", - "type": "mynet2", - "cniVersion": "0.2.0" -}`) - fKubeClient.AddNetConfig("other-ns", "net3", `{ - "name": "net3", - "type": "mynet3", - "cniVersion": "0.2.0" -}`) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net2", `{ + "name": "net2", + "type": "mynet2", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("other-ns", "net3", `{ + "name": "net3", + "type": "mynet3", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(err).NotTo(HaveOccurred()) - Expect(fKubeClient.PodCount).To(Equal(1)) - Expect(fKubeClient.NetCount).To(Equal(3)) Expect(len(delegates)).To(Equal(3)) Expect(delegates[0].Conf.Name).To(Equal("net1")) @@ -264,32 +272,34 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - net1Name := filepath.Join(tmpDir, "10-net1.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - net2Name := filepath.Join(tmpDir, "20-net2.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net2", net2Name, `{ - "name": "net2", - "type": "mynet2", - "cniVersion": "0.2.0" -}`) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + net1Name := filepath.Join(tmpDir, "10-net1.conf") + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + + net2Name := filepath.Join(tmpDir, "20-net2.conf") + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "net2", net2Name, `{ + "name": "net2", + "type": "mynet2", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(err).NotTo(HaveOccurred()) - Expect(fKubeClient.PodCount).To(Equal(1)) - Expect(fKubeClient.NetCount).To(Equal(2)) Expect(len(delegates)).To(Equal(2)) Expect(delegates[0].Conf.Name).To(Equal("net1")) @@ -304,21 +314,19 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", "{\"type\": \"mynet\"}") - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", "{\"type\": \"mynet\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(err).NotTo(HaveOccurred()) - Expect(fKubeClient.PodCount).To(Equal(1)) - Expect(fKubeClient.NetCount).To(Equal(1)) Expect(len(delegates)).To(Equal(1)) Expect(delegates[0].Conf.Name).To(Equal("net1")) @@ -331,25 +339,28 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - net1Name := filepath.Join(tmpDir, "10-net1.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - net2Name := filepath.Join(tmpDir, "20-net2.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net2", net2Name, "asdfasdfasfdasfd") - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + net1Name := filepath.Join(tmpDir, "10-net1.conf") + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + net2Name := filepath.Join(tmpDir, "20-net2.conf") + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "net2", net2Name, "asdfasdfasfdasfd")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(kubeClient, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) Expect(len(delegates)).To(Equal(0)) Expect(err).To(MatchError(fmt.Sprintf("GetNetworkDelegates: failed getting the delegate: cniConfigFromNetworkResource: getCNIConfigFromFile: error loading CNI config file %s: error parsing configuration: invalid character 'a' looking for beginning of value", net2Name))) }) @@ -369,15 +380,17 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig("kube-system", "myCRD1", "{\"type\": \"mynet\"}") - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "myCRD1", "{\"type\": \"mynet\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -400,16 +413,20 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig("kube-system", "myCRD1", "{\"type\": \"mynet\"}") - fKubeClient.AddNetConfig("kube-system", "myCRD2", "{\"type\": \"mynet2\"}") - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "myCRD1", "{\"type\": \"mynet\"}")) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "myCRD2", "{\"type\": \"mynet2\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(2)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -436,16 +453,20 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig("kube-system", "myCRD1", "{\"type\": \"mynet\"}") - fKubeClient.AddNetConfig("kube-system", "myCRD2", "{\"type\": \"mynet2\"}") - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "myCRD1", "{\"type\": \"mynet\"}")) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "myCRD2", "{\"type\": \"mynet2\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -468,20 +489,23 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - net1Name := filepath.Join(tmpDir, "10-net1.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ - "name": "myFile1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + + net1Name := filepath.Join(tmpDir, "10-net1.conf") + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ + "name": "myFile1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myFile1")) @@ -503,20 +527,21 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) net1Name := filepath.Join(tmpDir, "10-net1.conf") - fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "10-net1", net1Name, `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" -}`) - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefFile(fakePod.ObjectMeta.Namespace, "10-net1", net1Name, `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }`)) Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) @@ -538,14 +563,14 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).To(HaveOccurred()) }) @@ -565,22 +590,26 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig("kube-system", "net1", "{\"type\": \"mynet1\"}") - fKubeClient.AddNetConfig("kube-system", "net2", "{\"type\": \"mynet2\"}") - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net2", "{\"type\": \"mynet2\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net2")) Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet2")) - numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient) + numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(numK8sDelegates).To(Equal(0)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) @@ -603,21 +632,22 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", "") - fKubeClient.AddNetConfig("kube-system", "net2", "") - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", "")) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net2", "")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).To(HaveOccurred()) netConf.ConfDir = "badfilepath" - _, _, err = TryLoadPodDelegates(k8sArgs, netConf, kubeClient) + _, _, err = TryLoadPodDelegates(k8sArgs, netConf, clientInfo) Expect(err).To(HaveOccurred()) }) @@ -642,15 +672,17 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", "{\"type\": \"mynet1\"}") - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, kubeClient) + numK8sDelegates, _, err := TryLoadPodDelegates(k8sArgs, netConf, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(numK8sDelegates).To(Equal(0)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) @@ -677,11 +709,13 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", "{\"type\": \"mynet1\"}") - _, err = GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) @@ -709,10 +743,11 @@ var _ = Describe("k8sclient operations", func() { Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", "{\"type\": \"mynet1\"}") - _, err = GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) @@ -772,10 +807,11 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", "{\"type\": \"mynet1\"}") - _, err = GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) @@ -811,19 +847,19 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - _, err = GetNetworkDelegates(kubeClient, pod, networks, tmpDir, netConf.NamespaceIsolation) + _, err = GetNetworkDelegates(clientInfo, pod, networks, tmpDir, netConf.NamespaceIsolation) Expect(err).To(HaveOccurred()) Expect(err).To(MatchError("GetNetworkDelegates: namespace isolation enabled, annotation violates permission, pod is in namespace test but refers to target namespace kube-system")) @@ -853,17 +889,19 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig("kube-system", "net1", "") - fKubeClient.AddNetConfig("kube-system", "net2", "") - fKubeClient.AddPod(fakePod) - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", "")) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net2", "")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) netConf.ConfDir = "garbage value" - err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) Expect(err).To(HaveOccurred()) }) }) @@ -903,19 +941,24 @@ users: // Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), // } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfigAnnotation(fakePod.ObjectMeta.Namespace, "net1", net1) - fKubeClient.AddNetConfigAnnotation(fakePod.ObjectMeta.Namespace, "net2", net2) - // net3 is not used; make sure it's not accessed - fKubeClient.AddNetConfigAnnotation(fakePod.ObjectMeta.Namespace, "net3", net3) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefAnnotation(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefAnnotation(fakePod.ObjectMeta.Namespace, "net2", net2)) + Expect(err).NotTo(HaveOccurred()) + // net3 is not used; make sure it's not accessed + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDefAnnotation(fakePod.ObjectMeta.Namespace, "net3", net3)) + Expect(err).NotTo(HaveOccurred()) + networks, err := GetPodNetwork(fakePod) Expect(err).NotTo(HaveOccurred()) - _, err = GetNetworkDelegates(kubeClient, fakePod, networks, tmpDir, false) + _, err = GetNetworkDelegates(clientInfo, fakePod, networks, tmpDir, false) Expect(err).To(HaveOccurred()) }) }) @@ -927,15 +970,17 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", "{\"type\": \"mynet\"}") - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef( + testutils.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", "{\"type\": \"mynet\"}")) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) // invalid case 1 - can't have more than 2 items separated by "/" pod.Annotations[networkAttachmentAnnot] = "root@someIP/root@someOtherIP/root@thirdIP" @@ -968,20 +1013,21 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) Expect(err).NotTo(HaveOccurred()) networkstatus := "test status" - _, err = setPodNetworkAnnotation(kubeClient, "test", pod, networkstatus) + _, err = setPodNetworkAnnotation(clientInfo, "test", pod, networkstatus) Expect(err).NotTo(HaveOccurred()) }) @@ -999,20 +1045,84 @@ users: // Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), // } - // fKubeClient := testutils.NewFakeKubeClient() - // fKubeClient.AddPod(fakePod) - // fKubeClient.AddNetConfig("kube-system", "net1", net1) + // clientInfo := NewFakeClientInfo() + // _, err := clientInfo.AddPod(fakePod) + // Expect(err).NotTo(HaveOccurred()) + // _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + // Expect(err).NotTo(HaveOccurred()) - // kubeClient, err := GetK8sClient("", fKubeClient) - // Expect(err).NotTo(HaveOccurred()) // k8sArgs, err := GetK8sArgs(args) // Expect(err).NotTo(HaveOccurred()) - // pod, err := kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + // pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) // Expect(err).NotTo(HaveOccurred()) // networkstatus := "test status" - // _, err = setPodNetworkAnnotation(kubeClient, "test", pod, networkstatus) + // _, err = setPodNetworkAnnotation(clientInfo, "test", pod, networkstatus) + // Expect(err).NotTo(HaveOccurred()) + // }) + }) + + Context("setPodNetworkAnnotation", func() { + It("Sets pod network annotations without error", func() { + fakePod := testutils.NewFakePod("testpod", "kube-system/net1", "") + + net1 := `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }` + + args := &skel.CmdArgs{ + Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + } + + clientInfo := NewFakeClientInfo() + _, err := clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + + k8sArgs, err := GetK8sArgs(args) + Expect(err).NotTo(HaveOccurred()) + + pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + Expect(err).NotTo(HaveOccurred()) + + networkstatus := "test status" + _, err = setPodNetworkAnnotation(clientInfo, "test", pod, networkstatus) + Expect(err).NotTo(HaveOccurred()) + }) + + // TODO Still figuring this next one out. deals with exponentialBackoff + // It("Fails to set pod network annotations without error", func() { + // fakePod := testutils.NewFakePod("testpod", "kube-system/net1", "") + + // net1 := `{ + // "name": "net1", + // "type": "mynet", + // "cniVersion": "0.2.0" + // }` + + // args := &skel.CmdArgs{ + // Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + // } + + // clientInfo := NewFakeClientInfo() + // _, err := clientInfo.AddPod(fakePod) + // Expect(err).NotTo(HaveOccurred()) + // _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + // Expect(err).NotTo(HaveOccurred()) + + // k8sArgs, err := GetK8sArgs(args) + // Expect(err).NotTo(HaveOccurred()) + + // pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + // Expect(err).NotTo(HaveOccurred()) + + // networkstatus := "test status" + // _, err = setPodNetworkAnnotation(clientInfo, "test", pod, networkstatus) // Expect(err).NotTo(HaveOccurred()) // }) }) @@ -1022,7 +1132,7 @@ users: result := &types020.Result{ CNIVersion: "0.2.0", IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), + IP: *testutils.EnsureCIDR("1.1.1.2/24"), }, } @@ -1064,16 +1174,16 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) - - kubeClient, err := GetK8sClient("", fKubeClient) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = SetNetworkStatus(kubeClient, k8sArgs, netstatus, netConf) + err = SetNetworkStatus(clientInfo, k8sArgs, netstatus, netConf) Expect(err).NotTo(HaveOccurred()) }) @@ -1104,7 +1214,7 @@ users: result := &types020.Result{ CNIVersion: "0.2.0", IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), + IP: *testutils.EnsureCIDR("1.1.1.2/24"), }, } @@ -1146,9 +1256,11 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) @@ -1161,7 +1273,7 @@ users: result := &types020.Result{ CNIVersion: "0.2.0", IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), + IP: *testutils.EnsureCIDR("1.1.1.2/24"), }, } @@ -1204,9 +1316,11 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) @@ -1219,7 +1333,7 @@ users: result := &types020.Result{ CNIVersion: "0.2.0", IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), + IP: *testutils.EnsureCIDR("1.1.1.2/24"), }, } @@ -1261,9 +1375,11 @@ users: Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), } - fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) + clientInfo := NewFakeClientInfo() + _, err = clientInfo.AddPod(fakePod) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) diff --git a/multus/multus.go b/multus/multus.go index bd3a87805..304395018 100644 --- a/multus/multus.go +++ b/multus/multus.go @@ -367,7 +367,7 @@ func cmdErr(k8sArgs *types.K8sArgs, format string, args ...interface{}) error { return logging.Errorf(prefix+format, args...) } -func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) { +func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (cnitypes.Result, error) { n, err := types.LoadNetConf(args.StdinData) logging.Debugf("cmdAdd: %v, %v, %v", args, exec, kubeClient) if err != nil { @@ -465,7 +465,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn //create the network status, only in case Multus as kubeconfig if n.Kubeconfig != "" && kc != nil { - if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) { + if !types.CheckSystemNamespaces(string(k8sArgs.K8S_POD_NAME), n.SystemNamespaces) { delegateNetStatus, err := types.LoadNetworkStatus(tmpResult, delegate.Conf.Name, delegate.MasterPlugin) if err != nil { return nil, cmdErr(k8sArgs, "error setting network status: %v", err) @@ -478,7 +478,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn //set the network status annotation in apiserver, only in case Multus as kubeconfig if n.Kubeconfig != "" && kc != nil { - if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) { + if !types.CheckSystemNamespaces(string(k8sArgs.K8S_POD_NAME), n.SystemNamespaces) { err = k8s.SetNetworkStatus(kubeClient, k8sArgs, netStatus, n) if err != nil { return nil, cmdErr(k8sArgs, "error setting the networks status: %v", err) @@ -489,7 +489,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn return result, nil } -func cmdGet(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) { +func cmdGet(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (cnitypes.Result, error) { logging.Debugf("cmdGet: %v, %v, %v", args, exec, kubeClient) in, err := types.LoadNetConf(args.StdinData) if err != nil { @@ -501,7 +501,7 @@ func cmdGet(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn return in.PrevResult, nil } -func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) error { +func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) error { logging.Debugf("cmdDel: %v, %v, %v", args, exec, kubeClient) in, err := types.LoadNetConf(args.StdinData) if err != nil { diff --git a/multus/multus_test.go b/multus/multus_test.go index aed78d7d8..fd686c5e5 100644 --- a/multus/multus_test.go +++ b/multus/multus_test.go @@ -1334,17 +1334,19 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) + clientInfo := k8sclient.NewFakeClientInfo() + _, err := clientInfo.Client.Core().Pods(fakePod.ObjectMeta.Namespace).Create(fakePod) + Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") - result, err := cmdAdd(args, fExec, fKubeClient) + result, err := cmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) r := result.(*current.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1411,20 +1413,26 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net2", net2) + clientInfo := k8sclient.NewFakeClientInfo() + _, err := clientInfo.Client.Core().Pods(fakePod.ObjectMeta.Namespace).Create(fakePod) + Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + _, err = clientInfo.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net2", net2)) + Expect(err).NotTo(HaveOccurred()) // net3 is not used; make sure it's not accessed - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net3", net3) + _, err = clientInfo.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") - result, err := cmdAdd(args, fExec, fKubeClient) + result, err := cmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(2)) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1474,17 +1482,19 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) + clientInfo := k8sclient.NewFakeClientInfo() + _, err := clientInfo.Client.Core().Pods(fakePod.ObjectMeta.Namespace).Create(fakePod) + Expect(err).NotTo(HaveOccurred()) + + _, err = clientInfo.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") - result, err := cmdAdd(args, fExec, fKubeClient) + result, err := cmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1492,7 +1502,75 @@ var _ = Describe("multus operations", func() { os.Setenv("CNI_COMMAND", "DEL") os.Setenv("CNI_IFNAME", "eth0") // set fKubeClient to nil to emulate no pod info - fKubeClient.DeletePod(fakePod) + clientInfo.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) + err = cmdDel(args, fExec, clientInfo) + Expect(err).NotTo(HaveOccurred()) + Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) + }) + + It("executes kubernetes networks and delete it after pod removal", func() { + fakePod := testhelpers.NewFakePod("testpod", "net1", "") + net1 := `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" + }` + args := &skel.CmdArgs{ + ContainerID: "123456789", + Netns: testNS.Path(), + IfName: "eth0", + Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + StdinData: []byte(`{ + "name": "node-cni-network", + "type": "multus", + "kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml", + "delegates": [{ + "name": "weave1", + "cniVersion": "0.2.0", + "type": "weave-net" + }] + }`), + } + + fExec := &fakeExec{} + expectedResult1 := &types020.Result{ + CNIVersion: "0.2.0", + IP4: &types020.IPConfig{ + IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), + }, + } + expectedConf1 := `{ + "name": "weave1", + "cniVersion": "0.2.0", + "type": "weave-net" + }` + fExec.addPlugin020(nil, "eth0", expectedConf1, expectedResult1, nil) + fExec.addPlugin020(nil, "net1", net1, &types020.Result{ + CNIVersion: "0.2.0", + IP4: &types020.IPConfig{ + IP: *testhelpers.EnsureCIDR("1.1.1.3/24"), + }, + }, nil) + + fKubeClient := k8sclient.NewFakeClientInfo() + fKubeClient.AddPod(fakePod) + _, err := fKubeClient.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) + + os.Setenv("CNI_COMMAND", "ADD") + os.Setenv("CNI_IFNAME", "eth0") + result, err := cmdAdd(args, fExec, fKubeClient) + Expect(err).NotTo(HaveOccurred()) + Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) + r := result.(*types020.Result) + // plugin 1 is the masterplugin + Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) + + os.Setenv("CNI_COMMAND", "DEL") + os.Setenv("CNI_IFNAME", "eth0") + // set fKubeClient to nil to emulate no pod info + fKubeClient.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) err = cmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) @@ -1542,17 +1620,17 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() + fKubeClient := k8sclient.NewFakeClientInfo() fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) + _, err := fKubeClient.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") result, err := cmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1560,75 +1638,7 @@ var _ = Describe("multus operations", func() { os.Setenv("CNI_COMMAND", "DEL") os.Setenv("CNI_IFNAME", "eth0") // set fKubeClient to nil to emulate no pod info - fKubeClient.DeletePod(fakePod) - err = cmdDel(args, fExec, fKubeClient) - Expect(err).NotTo(HaveOccurred()) - Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) - }) - - It("executes kubernetes networks and delete it after pod removal", func() { - fakePod := testhelpers.NewFakePod("testpod", "net1", "") - net1 := `{ - "name": "net1", - "type": "mynet", - "cniVersion": "0.2.0" - }` - args := &skel.CmdArgs{ - ContainerID: "123456789", - Netns: testNS.Path(), - IfName: "eth0", - Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), - StdinData: []byte(`{ - "name": "node-cni-network", - "type": "multus", - "kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml", - "delegates": [{ - "name": "weave1", - "cniVersion": "0.2.0", - "type": "weave-net" - }] - }`), - } - - fExec := &fakeExec{} - expectedResult1 := &types020.Result{ - CNIVersion: "0.2.0", - IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.2/24"), - }, - } - expectedConf1 := `{ - "name": "weave1", - "cniVersion": "0.2.0", - "type": "weave-net" - }` - fExec.addPlugin020(nil, "eth0", expectedConf1, expectedResult1, nil) - fExec.addPlugin020(nil, "net1", net1, &types020.Result{ - CNIVersion: "0.2.0", - IP4: &types020.IPConfig{ - IP: *testhelpers.EnsureCIDR("1.1.1.3/24"), - }, - }, nil) - - fKubeClient := testhelpers.NewFakeKubeClient() - fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) - - os.Setenv("CNI_COMMAND", "ADD") - os.Setenv("CNI_IFNAME", "eth0") - result, err := cmdAdd(args, fExec, fKubeClient) - Expect(err).NotTo(HaveOccurred()) - Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) - r := result.(*types020.Result) - // plugin 1 is the masterplugin - Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - - os.Setenv("CNI_COMMAND", "DEL") - os.Setenv("CNI_IFNAME", "eth0") - // set fKubeClient to nil to emulate no pod info - fKubeClient.DeletePod(fakePod) + fKubeClient.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) err = cmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) @@ -1710,17 +1720,16 @@ var _ = Describe("multus operations", func() { fExec := &fakeExec{} fExec.addPlugin020(nil, "eth0", net1, expectedResult1, nil) - fKubeClient := testhelpers.NewFakeKubeClient() + fKubeClient := k8sclient.NewFakeClientInfo() fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig("kube-system", "net1", net1) + _, err := fKubeClient.AddNetAttachDef(testhelpers.NewFakeNetAttachDef("kube-system", "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") result, err := cmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(2)) r := result.(*types020.Result) Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1780,16 +1789,16 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() + fKubeClient := k8sclient.NewFakeClientInfo() fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) + _, err = fKubeClient.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") result, err := cmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1805,8 +1814,6 @@ var _ = Describe("multus operations", func() { err = cmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(3)) - Expect(fKubeClient.NetCount).To(Equal(1)) }) It("Delete pod without cache", func() { @@ -1858,16 +1865,16 @@ var _ = Describe("multus operations", func() { }, }, nil) - fKubeClient := testhelpers.NewFakeKubeClient() + fKubeClient := k8sclient.NewFakeClientInfo() fKubeClient.AddPod(fakePod) - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "net1", net1) + _, err = fKubeClient.AddNetAttachDef( + testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) + Expect(err).NotTo(HaveOccurred()) os.Setenv("CNI_COMMAND", "ADD") os.Setenv("CNI_IFNAME", "eth0") result, err := cmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(2)) - Expect(fKubeClient.NetCount).To(Equal(1)) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) @@ -1886,8 +1893,6 @@ var _ = Describe("multus operations", func() { err = cmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) - Expect(fKubeClient.PodCount).To(Equal(4)) - Expect(fKubeClient.NetCount).To(Equal(2)) }) It("fails to execute confListDel given no 'plugins' key", func() { diff --git a/testing/testing.go b/testing/testing.go index 135d18eb0..951f09080 100644 --- a/testing/testing.go +++ b/testing/testing.go @@ -26,121 +26,51 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + netv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" "github.com/containernetworking/cni/pkg/types" types020 "github.com/containernetworking/cni/pkg/types/020" + "github.com/onsi/gomega" ) -// FakeKubeClient is stub KubeClient for testing -type FakeKubeClient struct { - pods map[string]*v1.Pod - PodCount int - nets map[string]string - NetCount int +func NewFakeNetAttachDef(namespace, name, config string) *netv1.NetworkAttachmentDefinition { + return &netv1.NetworkAttachmentDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Spec: netv1.NetworkAttachmentDefinitionSpec{ + Config: config, + }, + } } -// NewFakeKubeClient creates FakeKubeClient for testing -func NewFakeKubeClient() *FakeKubeClient { - return &FakeKubeClient{ - pods: make(map[string]*v1.Pod), - nets: make(map[string]string), +func NewFakeNetAttachDefFile(namespace, name, filePath, fileData string) *netv1.NetworkAttachmentDefinition { + netAttach := &netv1.NetworkAttachmentDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, } -} - -// GetRawWithPath returns k8s raw data from its path -func (f *FakeKubeClient) GetRawWithPath(path string) ([]byte, error) { - obj, ok := f.nets[path] - if !ok { - return nil, fmt.Errorf("resource not found") - } - f.NetCount++ - return []byte(obj), nil -} - -// AddNetConfig adds net-attach-def into its client -func (f *FakeKubeClient) AddNetConfig(namespace, name, data string) { - cr := fmt.Sprintf(`{ - "apiVersion": "k8s.cni.cncf.io/v1", - "kind": "Network", - "metadata": { - "namespace": "%s", - "name": "%s" - }, - "spec": { - "config": "%s" - } -}`, namespace, name, strings.Replace(data, "\"", "\\\"", -1)) - cr = strings.Replace(cr, "\n", "", -1) - cr = strings.Replace(cr, "\t", "", -1) - f.nets[fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", namespace, name)] = cr -} - -// AddNetConfigAnnotation adds net-attach-def into its client with an annotation -func (f *FakeKubeClient) AddNetConfigAnnotation(namespace, name, data string) { - cr := fmt.Sprintf(`{ - "apiVersion": "k8s.cni.cncf.io/v1", - "kind": "Network", - "metadata": { - "namespace": "%s", - "name": "%s", - "annotations": { - "k8s.v1.cni.cncf.io/resourceName": "intel.com/sriov" - } - }, - "spec": { - "config": "%s" - } - }`, namespace, name, strings.Replace(data, "\"", "\\\"", -1)) - cr = strings.Replace(cr, "\n", "", -1) - cr = strings.Replace(cr, "\t", "", -1) - f.nets[fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", namespace, name)] = cr -} - -// AddNetFile puts config file as net-attach-def -func (f *FakeKubeClient) AddNetFile(namespace, name, filePath, fileData string) { - cr := fmt.Sprintf(`{ - "apiVersion": "k8s.cni.cncf.io/v1", - "kind": "Network", - "metadata": { - "namespace": "%s", - "name": "%s" - } -}`, namespace, name) - f.nets[fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", namespace, name)] = cr - err := ioutil.WriteFile(filePath, []byte(fileData), 0600) gomega.Expect(err).NotTo(gomega.HaveOccurred()) + return netAttach } -// GetPod query pod by namespace/pod and return it if exists -func (f *FakeKubeClient) GetPod(namespace, name string) (*v1.Pod, error) { - key := fmt.Sprintf("%s/%s", namespace, name) - pod, ok := f.pods[key] - if !ok { - return nil, fmt.Errorf("pod not found") - } - f.PodCount++ - return pod, nil -} - -// UpdatePodStatus update pod status -func (f *FakeKubeClient) UpdatePodStatus(pod *v1.Pod) (*v1.Pod, error) { - key := fmt.Sprintf("%s/%s", pod.Namespace, pod.Name) - f.pods[key] = pod - return f.pods[key], nil -} - -// AddPod adds pod into fake client -func (f *FakeKubeClient) AddPod(pod *v1.Pod) { - key := fmt.Sprintf("%s/%s", pod.ObjectMeta.Namespace, pod.ObjectMeta.Name) - f.pods[key] = pod -} - -// DeletePod remove pod from fake client -func (f *FakeKubeClient) DeletePod(pod *v1.Pod) { - key := fmt.Sprintf("%s/%s", pod.ObjectMeta.Namespace, pod.ObjectMeta.Name) - delete(f.pods, key) +func NewFakeNetAttachDefAnnotation(namespace, name, config string) *netv1.NetworkAttachmentDefinition { + return &netv1.NetworkAttachmentDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + Annotations: map[string]string { + "k8s.v1.cni.cncf.io/resourceName": "intel.com/sriov", + }, + }, + Spec: netv1.NetworkAttachmentDefinitionSpec{ + Config: config, + }, + } } // NewFakePod creates fake Pod object