mirror of
https://github.com/containers/podman
synced 2024-10-21 17:53:44 +00:00
commit
e92b383033
8
go.mod
8
go.mod
|
@ -6,11 +6,11 @@ require (
|
||||||
github.com/BurntSushi/toml v0.4.1
|
github.com/BurntSushi/toml v0.4.1
|
||||||
github.com/blang/semver v3.5.1+incompatible
|
github.com/blang/semver v3.5.1+incompatible
|
||||||
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37
|
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37
|
||||||
github.com/checkpoint-restore/checkpointctl v0.0.0-20210301084134-a2024f5584e7
|
github.com/checkpoint-restore/checkpointctl v0.0.0-20210922093614-c31748bec9f2
|
||||||
github.com/checkpoint-restore/go-criu/v5 v5.1.0
|
github.com/checkpoint-restore/go-criu/v5 v5.1.0
|
||||||
github.com/container-orchestrated-devices/container-device-interface v0.0.0-20210325223243-f99e8b6c10b9
|
github.com/container-orchestrated-devices/container-device-interface v0.0.0-20210325223243-f99e8b6c10b9
|
||||||
github.com/containernetworking/cni v0.8.1
|
github.com/containernetworking/cni v1.0.1
|
||||||
github.com/containernetworking/plugins v0.9.1
|
github.com/containernetworking/plugins v1.0.1
|
||||||
github.com/containers/buildah v1.23.0
|
github.com/containers/buildah v1.23.0
|
||||||
github.com/containers/common v0.44.1-0.20210921143342-f2f10e650c73
|
github.com/containers/common v0.44.1-0.20210921143342-f2f10e650c73
|
||||||
github.com/containers/conmon v2.0.20+incompatible
|
github.com/containers/conmon v2.0.20+incompatible
|
||||||
|
@ -62,7 +62,7 @@ require (
|
||||||
github.com/uber/jaeger-client-go v2.29.1+incompatible
|
github.com/uber/jaeger-client-go v2.29.1+incompatible
|
||||||
github.com/vbauerster/mpb/v6 v6.0.4
|
github.com/vbauerster/mpb/v6 v6.0.4
|
||||||
github.com/vbauerster/mpb/v7 v7.1.4 // indirect
|
github.com/vbauerster/mpb/v7 v7.1.4 // indirect
|
||||||
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852
|
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5
|
||||||
go.etcd.io/bbolt v1.3.6
|
go.etcd.io/bbolt v1.3.6
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||||
|
|
26
go.sum
26
go.sum
|
@ -95,6 +95,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
||||||
|
github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
|
@ -121,6 +122,7 @@ github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR
|
||||||
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37 h1:uxxtrnACqI9zK4ENDMf0WpXfUsHP5V8liuq5QdgDISU=
|
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37 h1:uxxtrnACqI9zK4ENDMf0WpXfUsHP5V8liuq5QdgDISU=
|
||||||
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
|
github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
|
||||||
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||||
|
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||||
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
|
@ -129,8 +131,8 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/checkpoint-restore/checkpointctl v0.0.0-20210301084134-a2024f5584e7 h1:ZmSAEFFtv3mepC4/Ze6E/hi6vGZlhRvywqp1l+w+qqw=
|
github.com/checkpoint-restore/checkpointctl v0.0.0-20210922093614-c31748bec9f2 h1:z7G4H5f1Z/n3di9qnGtKDm6jmP434HD7dIEh3YyLn9I=
|
||||||
github.com/checkpoint-restore/checkpointctl v0.0.0-20210301084134-a2024f5584e7/go.mod h1:Kp3ezoDVdhfYxZUtgs4OL8sVvgOLz3txk0sbQD0opvw=
|
github.com/checkpoint-restore/checkpointctl v0.0.0-20210922093614-c31748bec9f2/go.mod h1:yvaQuauIKzvfX/PIqINxWxoOYd35Dk/U2MS8onfkRHU=
|
||||||
github.com/checkpoint-restore/go-criu/v4 v4.0.2/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
github.com/checkpoint-restore/go-criu/v4 v4.0.2/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
||||||
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
||||||
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
|
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
|
||||||
|
@ -238,11 +240,13 @@ github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1Dv
|
||||||
github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
|
github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
|
||||||
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI=
|
|
||||||
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
|
github.com/containernetworking/cni v1.0.1 h1:9OIL/sZmMYDBe+G8svzILAlulUpaDTUjeAbtH/JNLBo=
|
||||||
|
github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
|
||||||
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
|
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
|
||||||
github.com/containernetworking/plugins v0.9.1 h1:FD1tADPls2EEi3flPc2OegIY1M9pUa9r2Quag7HMLV8=
|
|
||||||
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
|
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
|
||||||
|
github.com/containernetworking/plugins v1.0.1 h1:wwCfYbTCj5FC0EJgyzyjTXmqysOiJE9r712Z+2KVZAk=
|
||||||
|
github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
|
||||||
github.com/containers/buildah v1.23.0 h1:qGIeSNOczUHzvnaaOS29HSMiYAjw6JgIXYksAyvqnLs=
|
github.com/containers/buildah v1.23.0 h1:qGIeSNOczUHzvnaaOS29HSMiYAjw6JgIXYksAyvqnLs=
|
||||||
github.com/containers/buildah v1.23.0/go.mod h1:K0iMKgy/MffkkgELBXhSXwTy2HTT6hM0X8qruDR1FwU=
|
github.com/containers/buildah v1.23.0/go.mod h1:K0iMKgy/MffkkgELBXhSXwTy2HTT6hM0X8qruDR1FwU=
|
||||||
github.com/containers/common v0.44.0/go.mod h1:7sdP4vmI5Bm6FPFxb3lvAh1Iktb6tiO1MzjUzhxdoGo=
|
github.com/containers/common v0.44.0/go.mod h1:7sdP4vmI5Bm6FPFxb3lvAh1Iktb6tiO1MzjUzhxdoGo=
|
||||||
|
@ -270,6 +274,7 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||||
github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||||
|
github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
||||||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
@ -555,6 +560,7 @@ github.com/insomniacslk/dhcp v0.0.0-20210120172423-cc9239ac6294/go.mod h1:TKl4jN
|
||||||
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee h1:PAXLXk1heNZ5yokbMBpVLZQxo43wCZxRwl00mX+dd44=
|
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee h1:PAXLXk1heNZ5yokbMBpVLZQxo43wCZxRwl00mX+dd44=
|
||||||
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
|
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
|
||||||
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
|
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
|
||||||
|
github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw=
|
||||||
github.com/jinzhu/copier v0.3.2 h1:QdBOCbaouLDYaIPFfi1bKv5F5tPpeTwXe4sD0jqtz5w=
|
github.com/jinzhu/copier v0.3.2 h1:QdBOCbaouLDYaIPFfi1bKv5F5tPpeTwXe4sD0jqtz5w=
|
||||||
github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
|
github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
@ -704,8 +710,8 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
|
||||||
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
|
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
||||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
|
|
||||||
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
||||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||||
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
|
@ -714,7 +720,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
|
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
|
||||||
github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
|
github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
|
||||||
github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
@ -819,7 +825,9 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||||
|
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||||
github.com/seccomp/libseccomp-golang v0.9.2-0.20200616122406-847368b35ebf h1:b0+ZBD3rohnkQ4q5duD1+RyTXTg9yk+qTOPMSQtapO0=
|
github.com/seccomp/libseccomp-golang v0.9.2-0.20200616122406-847368b35ebf h1:b0+ZBD3rohnkQ4q5duD1+RyTXTg9yk+qTOPMSQtapO0=
|
||||||
|
@ -910,12 +918,14 @@ github.com/vbauerster/mpb/v7 v7.1.4 h1:XGWpWEB8aWnvqSlAMA7F7kdeUGqcTujuVFvYj9+59
|
||||||
github.com/vbauerster/mpb/v7 v7.1.4/go.mod h1:4zulrZfvshMOnd2APiHgWS9Yrw08AzZVRr9G11tkpcQ=
|
github.com/vbauerster/mpb/v7 v7.1.4/go.mod h1:4zulrZfvshMOnd2APiHgWS9Yrw08AzZVRr9G11tkpcQ=
|
||||||
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||||
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA=
|
|
||||||
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
|
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
|
||||||
|
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA=
|
||||||
|
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
|
||||||
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
||||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns=
|
|
||||||
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
|
||||||
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||||
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
|
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
cnitypes "github.com/containernetworking/cni/pkg/types/current"
|
types040 "github.com/containernetworking/cni/pkg/types/040"
|
||||||
"github.com/containers/common/pkg/secrets"
|
"github.com/containers/common/pkg/secrets"
|
||||||
"github.com/containers/image/v5/manifest"
|
"github.com/containers/image/v5/manifest"
|
||||||
"github.com/containers/podman/v3/libpod/define"
|
"github.com/containers/podman/v3/libpod/define"
|
||||||
|
@ -176,7 +176,7 @@ type ContainerState struct {
|
||||||
// active.
|
// active.
|
||||||
// These are DEPRECATED and will be removed in a future release.
|
// These are DEPRECATED and will be removed in a future release.
|
||||||
// This field is only used for backwarts compatibility.
|
// This field is only used for backwarts compatibility.
|
||||||
NetworkStatusOld []*cnitypes.Result `json:"networkResults,omitempty"`
|
NetworkStatusOld []*types040.Result `json:"networkResults,omitempty"`
|
||||||
// NetworkStatus contains the network Status for all networks
|
// NetworkStatus contains the network Status for all networks
|
||||||
// the container is attached to. Only populated if we created a network
|
// the container is attached to. Only populated if we created a network
|
||||||
// namespace for the container, and the network namespace is currently
|
// namespace for the container, and the network namespace is currently
|
||||||
|
|
|
@ -14,7 +14,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containernetworking/cni/libcni"
|
"github.com/containernetworking/cni/libcni"
|
||||||
"github.com/containernetworking/cni/pkg/version"
|
|
||||||
"github.com/containers/podman/v3/libpod/network/types"
|
"github.com/containers/podman/v3/libpod/network/types"
|
||||||
"github.com/containers/podman/v3/libpod/network/util"
|
"github.com/containers/podman/v3/libpod/network/util"
|
||||||
pkgutil "github.com/containers/podman/v3/pkg/util"
|
pkgutil "github.com/containers/podman/v3/pkg/util"
|
||||||
|
@ -283,7 +282,10 @@ func (n *cniNetwork) createCNIConfigListFromNetwork(network *types.Network, writ
|
||||||
ipMasq = false
|
ipMasq = false
|
||||||
}
|
}
|
||||||
// create CNI plugin configuration
|
// create CNI plugin configuration
|
||||||
ncList := newNcList(network.Name, version.Current(), network.Labels, network.Options)
|
// explicitly use CNI version 0.4.0 here, to use v1.0.0 at least containernetwork-plugins-1.0.1 has to be installed
|
||||||
|
// the dnsname plugin also needs to be updated for 1.0.0
|
||||||
|
// TODO change to 1.0.0 when most distros support it
|
||||||
|
ncList := newNcList(network.Name, "0.4.0", network.Labels, network.Options)
|
||||||
var plugins []interface{}
|
var plugins []interface{}
|
||||||
|
|
||||||
switch network.Driver {
|
switch network.Driver {
|
||||||
|
|
|
@ -127,7 +127,7 @@ func (n *cniNetwork) loadNetworks() error {
|
||||||
conf, err := libcni.ConfListFromFile(file)
|
conf, err := libcni.ConfListFromFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// do not log ENOENT errors
|
// do not log ENOENT errors
|
||||||
if !os.IsNotExist(err) {
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
logrus.Warnf("Error loading CNI config file %s: %v", file, err)
|
logrus.Warnf("Error loading CNI config file %s: %v", file, err)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
"github.com/containernetworking/cni/libcni"
|
"github.com/containernetworking/cni/libcni"
|
||||||
cnitypes "github.com/containernetworking/cni/pkg/types"
|
cnitypes "github.com/containernetworking/cni/pkg/types"
|
||||||
"github.com/containernetworking/cni/pkg/types/current"
|
types040 "github.com/containernetworking/cni/pkg/types/040"
|
||||||
"github.com/containernetworking/plugins/pkg/ns"
|
"github.com/containernetworking/plugins/pkg/ns"
|
||||||
"github.com/containers/podman/v3/libpod/define"
|
"github.com/containers/podman/v3/libpod/define"
|
||||||
"github.com/containers/podman/v3/libpod/network/types"
|
"github.com/containers/podman/v3/libpod/network/types"
|
||||||
|
@ -107,14 +107,9 @@ func (n *cniNetwork) Setup(namespacePath string, options types.SetupOptions) (ma
|
||||||
return nil, retErr
|
return nil, retErr
|
||||||
}
|
}
|
||||||
|
|
||||||
var cnires *current.Result
|
logrus.Debugf("cni result for container %s network %s: %v", options.ContainerID, name, res)
|
||||||
cnires, retErr = current.GetResult(res)
|
|
||||||
if retErr != nil {
|
|
||||||
return nil, retErr
|
|
||||||
}
|
|
||||||
logrus.Debugf("cni result for container %s network %s: %v", options.ContainerID, name, cnires)
|
|
||||||
var status types.StatusBlock
|
var status types.StatusBlock
|
||||||
status, retErr = CNIResultToStatus(cnires)
|
status, retErr = CNIResultToStatus(res)
|
||||||
if retErr != nil {
|
if retErr != nil {
|
||||||
return nil, retErr
|
return nil, retErr
|
||||||
}
|
}
|
||||||
|
@ -125,8 +120,12 @@ func (n *cniNetwork) Setup(namespacePath string, options types.SetupOptions) (ma
|
||||||
|
|
||||||
// CNIResultToStatus convert the cni result to status block
|
// CNIResultToStatus convert the cni result to status block
|
||||||
// nolint:golint
|
// nolint:golint
|
||||||
func CNIResultToStatus(cniResult *current.Result) (types.StatusBlock, error) {
|
func CNIResultToStatus(res cnitypes.Result) (types.StatusBlock, error) {
|
||||||
result := types.StatusBlock{}
|
result := types.StatusBlock{}
|
||||||
|
cniResult, err := types040.GetResult(res)
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
nameservers := make([]net.IP, 0, len(cniResult.DNS.Nameservers))
|
nameservers := make([]net.IP, 0, len(cniResult.DNS.Nameservers))
|
||||||
for _, nameserver := range cniResult.DNS.Nameservers {
|
for _, nameserver := range cniResult.DNS.Nameservers {
|
||||||
ip := net.ParseIP(nameserver)
|
ip := net.ParseIP(nameserver)
|
||||||
|
|
108
vendor/github.com/checkpoint-restore/checkpointctl/lib/metadata.go
generated
vendored
108
vendor/github.com/checkpoint-restore/checkpointctl/lib/metadata.go
generated
vendored
|
@ -6,12 +6,10 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
cnitypes "github.com/containernetworking/cni/pkg/types/current"
|
|
||||||
spec "github.com/opencontainers/runtime-spec/specs-go"
|
spec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
@ -91,16 +89,73 @@ type CheckpointedPodOptions struct {
|
||||||
ProcessLabel string `json:"processLabel"`
|
ProcessLabel string `json:"processLabel"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func DetectCheckpointArchiveType(checkpointDirectory string) (CheckpointType, error) {
|
// This is metadata stored inside of Pod checkpoint archive
|
||||||
_, err := os.Stat(filepath.Join(checkpointDirectory, CheckpointedPodsFile))
|
type PodSandboxConfig struct {
|
||||||
|
Metadata SandboxMetadta `json:"metadata"`
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SandboxMetadta struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
UID string `json:"uid"`
|
||||||
|
Namespace string `json:"namespace"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkForFile(checkpointDirectory, file string) (bool, error) {
|
||||||
|
_, err := os.Stat(filepath.Join(checkpointDirectory, file))
|
||||||
if err != nil && !os.IsNotExist(err) {
|
if err != nil && !os.IsNotExist(err) {
|
||||||
return Unknown, errors.Wrapf(err, "Failed to access %q\n", CheckpointedPodsFile)
|
return false, errors.Wrapf(err, "Failed to access %q\n", file)
|
||||||
}
|
}
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DetectCheckpointArchiveType(checkpointDirectory string) (CheckpointType, error) {
|
||||||
|
kubelet, err := checkForFile(checkpointDirectory, CheckpointedPodsFile)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return Unknown, err
|
||||||
|
}
|
||||||
|
|
||||||
|
container, err := checkForFile(checkpointDirectory, ConfigDumpFile)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return Unknown, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pod, err := checkForFile(checkpointDirectory, PodDumpFile)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return Unknown, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if pod && !container && !kubelet {
|
||||||
|
return Pod, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if !pod && container && !kubelet {
|
||||||
return Container, nil
|
return Container, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return Kubelet, nil
|
if !pod && !container && kubelet {
|
||||||
|
return Kubelet, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return Unknown, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadPodCheckpointDumpFile(checkpointDirectory string) (*PodSandboxConfig, string, error) {
|
||||||
|
var podSandboxConfig PodSandboxConfig
|
||||||
|
podDumpFile, err := ReadJSONFile(&podSandboxConfig, checkpointDirectory, PodDumpFile)
|
||||||
|
|
||||||
|
return &podSandboxConfig, podDumpFile, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadPodCheckpointOptionsFile(checkpointDirectory string) (*CheckpointedPodOptions, string, error) {
|
||||||
|
var checkpointedPodOptions CheckpointedPodOptions
|
||||||
|
podOptionsFile, err := ReadJSONFile(&checkpointedPodOptions, checkpointDirectory, PodOptionsFile)
|
||||||
|
|
||||||
|
return &checkpointedPodOptions, podOptionsFile, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadContainerCheckpointSpecDump(checkpointDirectory string) (*spec.Spec, string, error) {
|
func ReadContainerCheckpointSpecDump(checkpointDirectory string) (*spec.Spec, string, error) {
|
||||||
|
@ -124,13 +179,6 @@ func ReadContainerCheckpointDeletedFiles(checkpointDirectory string) ([]string,
|
||||||
return deletedFiles, deletedFilesFile, err
|
return deletedFiles, deletedFilesFile, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadContainerCheckpointNetworkStatus(checkpointDirectory string) ([]*cnitypes.Result, string, error) {
|
|
||||||
var networkStatus []*cnitypes.Result
|
|
||||||
networkStatusFile, err := ReadJSONFile(&networkStatus, checkpointDirectory, NetworkStatusFile)
|
|
||||||
|
|
||||||
return networkStatus, networkStatusFile, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadKubeletCheckpoints(checkpointsDirectory string) (*CheckpointMetadata, string, error) {
|
func ReadKubeletCheckpoints(checkpointsDirectory string) (*CheckpointMetadata, string, error) {
|
||||||
var checkpointMetadata CheckpointMetadata
|
var checkpointMetadata CheckpointMetadata
|
||||||
checkpointMetadataPath, err := ReadJSONFile(&checkpointMetadata, checkpointsDirectory, CheckpointedPodsFile)
|
checkpointMetadataPath, err := ReadJSONFile(&checkpointMetadata, checkpointsDirectory, CheckpointedPodsFile)
|
||||||
|
@ -138,40 +186,6 @@ func ReadKubeletCheckpoints(checkpointsDirectory string) (*CheckpointMetadata, s
|
||||||
return &checkpointMetadata, checkpointMetadataPath, err
|
return &checkpointMetadata, checkpointMetadataPath, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetIPFromNetworkStatus(networkStatus []*cnitypes.Result) net.IP {
|
|
||||||
if len(networkStatus) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// Take the first IP address
|
|
||||||
if len(networkStatus[0].IPs) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
IP := networkStatus[0].IPs[0].Address.IP
|
|
||||||
|
|
||||||
return IP
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMACFromNetworkStatus(networkStatus []*cnitypes.Result) net.HardwareAddr {
|
|
||||||
if len(networkStatus) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// Take the first device with a defined sandbox
|
|
||||||
if len(networkStatus[0].Interfaces) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var MAC net.HardwareAddr
|
|
||||||
MAC = nil
|
|
||||||
for _, n := range networkStatus[0].Interfaces {
|
|
||||||
if n.Sandbox != "" {
|
|
||||||
MAC, _ = net.ParseMAC(n.Mac)
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MAC
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteJSONFile marshalls and writes the given data to a JSON file
|
// WriteJSONFile marshalls and writes the given data to a JSON file
|
||||||
func WriteJSONFile(v interface{}, dir, file string) (string, error) {
|
func WriteJSONFile(v interface{}, dir, file string) (string, error) {
|
||||||
fileJSON, err := json.MarshalIndent(v, "", " ")
|
fileJSON, err := json.MarshalIndent(v, "", " ")
|
||||||
|
|
74
vendor/github.com/containernetworking/cni/libcni/api.go
generated
vendored
74
vendor/github.com/containernetworking/cni/libcni/api.go
generated
vendored
|
@ -14,6 +14,12 @@
|
||||||
|
|
||||||
package libcni
|
package libcni
|
||||||
|
|
||||||
|
// Note this is the actual implementation of the CNI specification, which
|
||||||
|
// is reflected in the https://github.com/containernetworking/cni/blob/master/SPEC.md file
|
||||||
|
// it is typically bundled into runtime providers (i.e. containerd or cri-o would use this
|
||||||
|
// before calling runc or hcsshim). It is also bundled into CNI providers as well, for example,
|
||||||
|
// to add an IP to a container, to parse the configuration of the CNI and so on.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
@ -25,6 +31,7 @@ import (
|
||||||
|
|
||||||
"github.com/containernetworking/cni/pkg/invoke"
|
"github.com/containernetworking/cni/pkg/invoke"
|
||||||
"github.com/containernetworking/cni/pkg/types"
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
"github.com/containernetworking/cni/pkg/types/create"
|
||||||
"github.com/containernetworking/cni/pkg/utils"
|
"github.com/containernetworking/cni/pkg/utils"
|
||||||
"github.com/containernetworking/cni/pkg/version"
|
"github.com/containernetworking/cni/pkg/version"
|
||||||
)
|
)
|
||||||
|
@ -278,7 +285,7 @@ func (c *CNIConfig) getCachedConfig(netName string, rt *RuntimeConf) ([]byte, *R
|
||||||
|
|
||||||
unmarshaled := cachedInfo{}
|
unmarshaled := cachedInfo{}
|
||||||
if err := json.Unmarshal(bytes, &unmarshaled); err != nil {
|
if err := json.Unmarshal(bytes, &unmarshaled); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal cached network %q config: %v", netName, err)
|
return nil, nil, fmt.Errorf("failed to unmarshal cached network %q config: %w", netName, err)
|
||||||
}
|
}
|
||||||
if unmarshaled.Kind != CNICacheV1 {
|
if unmarshaled.Kind != CNICacheV1 {
|
||||||
return nil, nil, fmt.Errorf("read cached network %q config has wrong kind: %v", netName, unmarshaled.Kind)
|
return nil, nil, fmt.Errorf("read cached network %q config has wrong kind: %v", netName, unmarshaled.Kind)
|
||||||
|
@ -304,15 +311,8 @@ func (c *CNIConfig) getLegacyCachedResult(netName, cniVersion string, rt *Runtim
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the version of the cached result
|
// Load the cached result
|
||||||
decoder := version.ConfigDecoder{}
|
result, err := create.CreateFromBytes(data)
|
||||||
resultCniVersion, err := decoder.Decode(data)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure we can understand the result
|
|
||||||
result, err := version.NewResult(resultCniVersion, data)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -322,10 +322,10 @@ func (c *CNIConfig) getLegacyCachedResult(netName, cniVersion string, rt *Runtim
|
||||||
// should match the config version unless the config was changed
|
// should match the config version unless the config was changed
|
||||||
// while the container was running.
|
// while the container was running.
|
||||||
result, err = result.GetAsVersion(cniVersion)
|
result, err = result.GetAsVersion(cniVersion)
|
||||||
if err != nil && resultCniVersion != cniVersion {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to convert cached result version %q to config version %q: %v", resultCniVersion, cniVersion, err)
|
return nil, fmt.Errorf("failed to convert cached result to config version %q: %w", cniVersion, err)
|
||||||
}
|
}
|
||||||
return result, err
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CNIConfig) getCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, error) {
|
func (c *CNIConfig) getCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, error) {
|
||||||
|
@ -346,18 +346,11 @@ func (c *CNIConfig) getCachedResult(netName, cniVersion string, rt *RuntimeConf)
|
||||||
|
|
||||||
newBytes, err := json.Marshal(&cachedInfo.RawResult)
|
newBytes, err := json.Marshal(&cachedInfo.RawResult)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to marshal cached network %q config: %v", netName, err)
|
return nil, fmt.Errorf("failed to marshal cached network %q config: %w", netName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the version of the cached result
|
// Load the cached result
|
||||||
decoder := version.ConfigDecoder{}
|
result, err := create.CreateFromBytes(newBytes)
|
||||||
resultCniVersion, err := decoder.Decode(newBytes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure we can understand the result
|
|
||||||
result, err := version.NewResult(resultCniVersion, newBytes)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -367,10 +360,10 @@ func (c *CNIConfig) getCachedResult(netName, cniVersion string, rt *RuntimeConf)
|
||||||
// should match the config version unless the config was changed
|
// should match the config version unless the config was changed
|
||||||
// while the container was running.
|
// while the container was running.
|
||||||
result, err = result.GetAsVersion(cniVersion)
|
result, err = result.GetAsVersion(cniVersion)
|
||||||
if err != nil && resultCniVersion != cniVersion {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to convert cached result version %q to config version %q: %v", resultCniVersion, cniVersion, err)
|
return nil, fmt.Errorf("failed to convert cached result to config version %q: %w", cniVersion, err)
|
||||||
}
|
}
|
||||||
return result, err
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNetworkListCachedResult returns the cached Result of the previous
|
// GetNetworkListCachedResult returns the cached Result of the previous
|
||||||
|
@ -428,12 +421,12 @@ func (c *CNIConfig) AddNetworkList(ctx context.Context, list *NetworkConfigList,
|
||||||
for _, net := range list.Plugins {
|
for _, net := range list.Plugins {
|
||||||
result, err = c.addNetwork(ctx, list.Name, list.CNIVersion, net, result, rt)
|
result, err = c.addNetwork(ctx, list.Name, list.CNIVersion, net, result, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("plugin %s failed (add): %w", pluginDescription(net.Network), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = c.cacheAdd(result, list.Bytes, list.Name, rt); err != nil {
|
if err = c.cacheAdd(result, list.Bytes, list.Name, rt); err != nil {
|
||||||
return nil, fmt.Errorf("failed to set network %q cached result: %v", list.Name, err)
|
return nil, fmt.Errorf("failed to set network %q cached result: %w", list.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -469,7 +462,7 @@ func (c *CNIConfig) CheckNetworkList(ctx context.Context, list *NetworkConfigLis
|
||||||
|
|
||||||
cachedResult, err := c.getCachedResult(list.Name, list.CNIVersion, rt)
|
cachedResult, err := c.getCachedResult(list.Name, list.CNIVersion, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get network %q cached result: %v", list.Name, err)
|
return fmt.Errorf("failed to get network %q cached result: %w", list.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, net := range list.Plugins {
|
for _, net := range list.Plugins {
|
||||||
|
@ -506,14 +499,14 @@ func (c *CNIConfig) DelNetworkList(ctx context.Context, list *NetworkConfigList,
|
||||||
} else if gtet {
|
} else if gtet {
|
||||||
cachedResult, err = c.getCachedResult(list.Name, list.CNIVersion, rt)
|
cachedResult, err = c.getCachedResult(list.Name, list.CNIVersion, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get network %q cached result: %v", list.Name, err)
|
return fmt.Errorf("failed to get network %q cached result: %w", list.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := len(list.Plugins) - 1; i >= 0; i-- {
|
for i := len(list.Plugins) - 1; i >= 0; i-- {
|
||||||
net := list.Plugins[i]
|
net := list.Plugins[i]
|
||||||
if err := c.delNetwork(ctx, list.Name, list.CNIVersion, net, cachedResult, rt); err != nil {
|
if err := c.delNetwork(ctx, list.Name, list.CNIVersion, net, cachedResult, rt); err != nil {
|
||||||
return err
|
return fmt.Errorf("plugin %s failed (delete): %w", pluginDescription(net.Network), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ = c.cacheDel(list.Name, rt)
|
_ = c.cacheDel(list.Name, rt)
|
||||||
|
@ -521,6 +514,19 @@ func (c *CNIConfig) DelNetworkList(ctx context.Context, list *NetworkConfigList,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pluginDescription(net *types.NetConf) string {
|
||||||
|
if net == nil {
|
||||||
|
return "<missing>"
|
||||||
|
}
|
||||||
|
pluginType := net.Type
|
||||||
|
out := fmt.Sprintf("type=%q", pluginType)
|
||||||
|
name := net.Name
|
||||||
|
if name != "" {
|
||||||
|
out += fmt.Sprintf(" name=%q", name)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// AddNetwork executes the plugin with the ADD command
|
// AddNetwork executes the plugin with the ADD command
|
||||||
func (c *CNIConfig) AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error) {
|
func (c *CNIConfig) AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error) {
|
||||||
result, err := c.addNetwork(ctx, net.Network.Name, net.Network.CNIVersion, net, nil, rt)
|
result, err := c.addNetwork(ctx, net.Network.Name, net.Network.CNIVersion, net, nil, rt)
|
||||||
|
@ -529,7 +535,7 @@ func (c *CNIConfig) AddNetwork(ctx context.Context, net *NetworkConfig, rt *Runt
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = c.cacheAdd(result, net.Bytes, net.Network.Name, rt); err != nil {
|
if err = c.cacheAdd(result, net.Bytes, net.Network.Name, rt); err != nil {
|
||||||
return nil, fmt.Errorf("failed to set network %q cached result: %v", net.Network.Name, err)
|
return nil, fmt.Errorf("failed to set network %q cached result: %w", net.Network.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -546,7 +552,7 @@ func (c *CNIConfig) CheckNetwork(ctx context.Context, net *NetworkConfig, rt *Ru
|
||||||
|
|
||||||
cachedResult, err := c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt)
|
cachedResult, err := c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get network %q cached result: %v", net.Network.Name, err)
|
return fmt.Errorf("failed to get network %q cached result: %w", net.Network.Name, err)
|
||||||
}
|
}
|
||||||
return c.checkNetwork(ctx, net.Network.Name, net.Network.CNIVersion, net, cachedResult, rt)
|
return c.checkNetwork(ctx, net.Network.Name, net.Network.CNIVersion, net, cachedResult, rt)
|
||||||
}
|
}
|
||||||
|
@ -561,7 +567,7 @@ func (c *CNIConfig) DelNetwork(ctx context.Context, net *NetworkConfig, rt *Runt
|
||||||
} else if gtet {
|
} else if gtet {
|
||||||
cachedResult, err = c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt)
|
cachedResult, err = c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get network %q cached result: %v", net.Network.Name, err)
|
return fmt.Errorf("failed to get network %q cached result: %w", net.Network.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
vendor/github.com/containernetworking/cni/libcni/conf.go
generated
vendored
14
vendor/github.com/containernetworking/cni/libcni/conf.go
generated
vendored
|
@ -43,7 +43,7 @@ func (e NoConfigsFoundError) Error() string {
|
||||||
func ConfFromBytes(bytes []byte) (*NetworkConfig, error) {
|
func ConfFromBytes(bytes []byte) (*NetworkConfig, error) {
|
||||||
conf := &NetworkConfig{Bytes: bytes}
|
conf := &NetworkConfig{Bytes: bytes}
|
||||||
if err := json.Unmarshal(bytes, &conf.Network); err != nil {
|
if err := json.Unmarshal(bytes, &conf.Network); err != nil {
|
||||||
return nil, fmt.Errorf("error parsing configuration: %s", err)
|
return nil, fmt.Errorf("error parsing configuration: %w", err)
|
||||||
}
|
}
|
||||||
if conf.Network.Type == "" {
|
if conf.Network.Type == "" {
|
||||||
return nil, fmt.Errorf("error parsing configuration: missing 'type'")
|
return nil, fmt.Errorf("error parsing configuration: missing 'type'")
|
||||||
|
@ -54,7 +54,7 @@ func ConfFromBytes(bytes []byte) (*NetworkConfig, error) {
|
||||||
func ConfFromFile(filename string) (*NetworkConfig, error) {
|
func ConfFromFile(filename string) (*NetworkConfig, error) {
|
||||||
bytes, err := ioutil.ReadFile(filename)
|
bytes, err := ioutil.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error reading %s: %s", filename, err)
|
return nil, fmt.Errorf("error reading %s: %w", filename, err)
|
||||||
}
|
}
|
||||||
return ConfFromBytes(bytes)
|
return ConfFromBytes(bytes)
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ func ConfFromFile(filename string) (*NetworkConfig, error) {
|
||||||
func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
|
func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
|
||||||
rawList := make(map[string]interface{})
|
rawList := make(map[string]interface{})
|
||||||
if err := json.Unmarshal(bytes, &rawList); err != nil {
|
if err := json.Unmarshal(bytes, &rawList); err != nil {
|
||||||
return nil, fmt.Errorf("error parsing configuration list: %s", err)
|
return nil, fmt.Errorf("error parsing configuration list: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rawName, ok := rawList["name"]
|
rawName, ok := rawList["name"]
|
||||||
|
@ -114,11 +114,11 @@ func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
|
||||||
for i, conf := range plugins {
|
for i, conf := range plugins {
|
||||||
newBytes, err := json.Marshal(conf)
|
newBytes, err := json.Marshal(conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to marshal plugin config %d: %v", i, err)
|
return nil, fmt.Errorf("failed to marshal plugin config %d: %w", i, err)
|
||||||
}
|
}
|
||||||
netConf, err := ConfFromBytes(newBytes)
|
netConf, err := ConfFromBytes(newBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse plugin config %d: %v", i, err)
|
return nil, fmt.Errorf("failed to parse plugin config %d: %w", i, err)
|
||||||
}
|
}
|
||||||
list.Plugins = append(list.Plugins, netConf)
|
list.Plugins = append(list.Plugins, netConf)
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
|
||||||
func ConfListFromFile(filename string) (*NetworkConfigList, error) {
|
func ConfListFromFile(filename string) (*NetworkConfigList, error) {
|
||||||
bytes, err := ioutil.ReadFile(filename)
|
bytes, err := ioutil.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error reading %s: %s", filename, err)
|
return nil, fmt.Errorf("error reading %s: %w", filename, err)
|
||||||
}
|
}
|
||||||
return ConfListFromBytes(bytes)
|
return ConfListFromBytes(bytes)
|
||||||
}
|
}
|
||||||
|
@ -218,7 +218,7 @@ func InjectConf(original *NetworkConfig, newValues map[string]interface{}) (*Net
|
||||||
config := make(map[string]interface{})
|
config := make(map[string]interface{})
|
||||||
err := json.Unmarshal(original.Bytes, &config)
|
err := json.Unmarshal(original.Bytes, &config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unmarshal existing network bytes: %s", err)
|
return nil, fmt.Errorf("unmarshal existing network bytes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for key, value := range newValues {
|
for key, value := range newValues {
|
||||||
|
|
10
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
generated
vendored
10
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
generated
vendored
|
@ -20,6 +20,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/containernetworking/cni/pkg/types"
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
"github.com/containernetworking/cni/pkg/types/create"
|
||||||
"github.com/containernetworking/cni/pkg/version"
|
"github.com/containernetworking/cni/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -83,14 +84,7 @@ func ExecPluginWithResult(ctx context.Context, pluginPath string, netconf []byte
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Plugin must return result in same version as specified in netconf
|
return create.CreateFromBytes(stdoutBytes)
|
||||||
versionDecoder := &version.ConfigDecoder{}
|
|
||||||
confVersion, err := versionDecoder.Decode(netconf)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return version.NewResult(confVersion, stdoutBytes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExecPluginWithoutResult(ctx context.Context, pluginPath string, netconf []byte, args CNIArgs, exec Exec) error {
|
func ExecPluginWithoutResult(ctx context.Context, pluginPath string, netconf []byte, args CNIArgs, exec Exec) error {
|
||||||
|
|
85
vendor/github.com/containernetworking/cni/pkg/types/020/types.go
generated
vendored
85
vendor/github.com/containernetworking/cni/pkg/types/020/types.go
generated
vendored
|
@ -22,25 +22,47 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/containernetworking/cni/pkg/types"
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
convert "github.com/containernetworking/cni/pkg/types/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ImplementedSpecVersion string = "0.2.0"
|
const ImplementedSpecVersion string = "0.2.0"
|
||||||
|
|
||||||
var SupportedVersions = []string{"", "0.1.0", ImplementedSpecVersion}
|
var supportedVersions = []string{"", "0.1.0", ImplementedSpecVersion}
|
||||||
|
|
||||||
|
// Register converters for all versions less than the implemented spec version
|
||||||
|
func init() {
|
||||||
|
convert.RegisterConverter("0.1.0", []string{ImplementedSpecVersion}, convertFrom010)
|
||||||
|
convert.RegisterConverter(ImplementedSpecVersion, []string{"0.1.0"}, convertTo010)
|
||||||
|
|
||||||
|
// Creator
|
||||||
|
convert.RegisterCreator(supportedVersions, NewResult)
|
||||||
|
}
|
||||||
|
|
||||||
// Compatibility types for CNI version 0.1.0 and 0.2.0
|
// Compatibility types for CNI version 0.1.0 and 0.2.0
|
||||||
|
|
||||||
|
// NewResult creates a new Result object from JSON data. The JSON data
|
||||||
|
// must be compatible with the CNI versions implemented by this type.
|
||||||
func NewResult(data []byte) (types.Result, error) {
|
func NewResult(data []byte) (types.Result, error) {
|
||||||
result := &Result{}
|
result := &Result{}
|
||||||
if err := json.Unmarshal(data, result); err != nil {
|
if err := json.Unmarshal(data, result); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return result, nil
|
for _, v := range supportedVersions {
|
||||||
|
if result.CNIVersion == v {
|
||||||
|
if result.CNIVersion == "" {
|
||||||
|
result.CNIVersion = "0.1.0"
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("result type supports %v but unmarshalled CNIVersion is %q",
|
||||||
|
supportedVersions, result.CNIVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetResult converts the given Result object to the ImplementedSpecVersion
|
||||||
|
// and returns the concrete type or an error
|
||||||
func GetResult(r types.Result) (*Result, error) {
|
func GetResult(r types.Result) (*Result, error) {
|
||||||
// We expect version 0.1.0/0.2.0 results
|
result020, err := convert.Convert(r, ImplementedSpecVersion)
|
||||||
result020, err := r.GetAsVersion(ImplementedSpecVersion)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -51,6 +73,32 @@ func GetResult(r types.Result) (*Result, error) {
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertFrom010(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
if toVersion != "0.2.0" {
|
||||||
|
panic("only converts to version 0.2.0")
|
||||||
|
}
|
||||||
|
fromResult := from.(*Result)
|
||||||
|
return &Result{
|
||||||
|
CNIVersion: ImplementedSpecVersion,
|
||||||
|
IP4: fromResult.IP4.Copy(),
|
||||||
|
IP6: fromResult.IP6.Copy(),
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertTo010(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
if toVersion != "0.1.0" {
|
||||||
|
panic("only converts to version 0.1.0")
|
||||||
|
}
|
||||||
|
fromResult := from.(*Result)
|
||||||
|
return &Result{
|
||||||
|
CNIVersion: "0.1.0",
|
||||||
|
IP4: fromResult.IP4.Copy(),
|
||||||
|
IP6: fromResult.IP6.Copy(),
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Result is what gets returned from the plugin (via stdout) to the caller
|
// Result is what gets returned from the plugin (via stdout) to the caller
|
||||||
type Result struct {
|
type Result struct {
|
||||||
CNIVersion string `json:"cniVersion,omitempty"`
|
CNIVersion string `json:"cniVersion,omitempty"`
|
||||||
|
@ -60,17 +108,16 @@ type Result struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Result) Version() string {
|
func (r *Result) Version() string {
|
||||||
return ImplementedSpecVersion
|
return r.CNIVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Result) GetAsVersion(version string) (types.Result, error) {
|
func (r *Result) GetAsVersion(version string) (types.Result, error) {
|
||||||
for _, supportedVersion := range SupportedVersions {
|
// If the creator of the result did not set the CNIVersion, assume it
|
||||||
if version == supportedVersion {
|
// should be the highest spec version implemented by this Result
|
||||||
r.CNIVersion = version
|
if r.CNIVersion == "" {
|
||||||
return r, nil
|
r.CNIVersion = ImplementedSpecVersion
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("cannot convert version %q to %s", SupportedVersions, version)
|
return convert.Convert(r, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Result) Print() error {
|
func (r *Result) Print() error {
|
||||||
|
@ -93,6 +140,22 @@ type IPConfig struct {
|
||||||
Routes []types.Route
|
Routes []types.Route
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *IPConfig) Copy() *IPConfig {
|
||||||
|
if i == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var routes []types.Route
|
||||||
|
for _, fromRoute := range i.Routes {
|
||||||
|
routes = append(routes, *fromRoute.Copy())
|
||||||
|
}
|
||||||
|
return &IPConfig{
|
||||||
|
IP: i.IP,
|
||||||
|
Gateway: i.Gateway,
|
||||||
|
Routes: routes,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// net.IPNet is not JSON (un)marshallable so this duality is needed
|
// net.IPNet is not JSON (un)marshallable so this duality is needed
|
||||||
// for our custom IPNet type
|
// for our custom IPNet type
|
||||||
|
|
||||||
|
|
306
vendor/github.com/containernetworking/cni/pkg/types/040/types.go
generated
vendored
Normal file
306
vendor/github.com/containernetworking/cni/pkg/types/040/types.go
generated
vendored
Normal file
|
@ -0,0 +1,306 @@
|
||||||
|
// Copyright 2016 CNI authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package types040
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
types020 "github.com/containernetworking/cni/pkg/types/020"
|
||||||
|
convert "github.com/containernetworking/cni/pkg/types/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ImplementedSpecVersion string = "0.4.0"
|
||||||
|
|
||||||
|
var supportedVersions = []string{"0.3.0", "0.3.1", ImplementedSpecVersion}
|
||||||
|
|
||||||
|
// Register converters for all versions less than the implemented spec version
|
||||||
|
func init() {
|
||||||
|
// Up-converters
|
||||||
|
convert.RegisterConverter("0.1.0", supportedVersions, convertFrom02x)
|
||||||
|
convert.RegisterConverter("0.2.0", supportedVersions, convertFrom02x)
|
||||||
|
convert.RegisterConverter("0.3.0", supportedVersions, convertInternal)
|
||||||
|
convert.RegisterConverter("0.3.1", supportedVersions, convertInternal)
|
||||||
|
|
||||||
|
// Down-converters
|
||||||
|
convert.RegisterConverter("0.4.0", []string{"0.3.0", "0.3.1"}, convertInternal)
|
||||||
|
convert.RegisterConverter("0.4.0", []string{"0.1.0", "0.2.0"}, convertTo02x)
|
||||||
|
convert.RegisterConverter("0.3.1", []string{"0.1.0", "0.2.0"}, convertTo02x)
|
||||||
|
convert.RegisterConverter("0.3.0", []string{"0.1.0", "0.2.0"}, convertTo02x)
|
||||||
|
|
||||||
|
// Creator
|
||||||
|
convert.RegisterCreator(supportedVersions, NewResult)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewResult(data []byte) (types.Result, error) {
|
||||||
|
result := &Result{}
|
||||||
|
if err := json.Unmarshal(data, result); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, v := range supportedVersions {
|
||||||
|
if result.CNIVersion == v {
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("result type supports %v but unmarshalled CNIVersion is %q",
|
||||||
|
supportedVersions, result.CNIVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetResult(r types.Result) (*Result, error) {
|
||||||
|
resultCurrent, err := r.GetAsVersion(ImplementedSpecVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result, ok := resultCurrent.(*Result)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("failed to convert result")
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewResultFromResult(result types.Result) (*Result, error) {
|
||||||
|
newResult, err := convert.Convert(result, ImplementedSpecVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return newResult.(*Result), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result is what gets returned from the plugin (via stdout) to the caller
|
||||||
|
type Result struct {
|
||||||
|
CNIVersion string `json:"cniVersion,omitempty"`
|
||||||
|
Interfaces []*Interface `json:"interfaces,omitempty"`
|
||||||
|
IPs []*IPConfig `json:"ips,omitempty"`
|
||||||
|
Routes []*types.Route `json:"routes,omitempty"`
|
||||||
|
DNS types.DNS `json:"dns,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func convert020IPConfig(from *types020.IPConfig, ipVersion string) *IPConfig {
|
||||||
|
return &IPConfig{
|
||||||
|
Version: ipVersion,
|
||||||
|
Address: from.IP,
|
||||||
|
Gateway: from.Gateway,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertFrom02x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
fromResult := from.(*types020.Result)
|
||||||
|
toResult := &Result{
|
||||||
|
CNIVersion: toVersion,
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
Routes: []*types.Route{},
|
||||||
|
}
|
||||||
|
if fromResult.IP4 != nil {
|
||||||
|
toResult.IPs = append(toResult.IPs, convert020IPConfig(fromResult.IP4, "4"))
|
||||||
|
for _, fromRoute := range fromResult.IP4.Routes {
|
||||||
|
toResult.Routes = append(toResult.Routes, fromRoute.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if fromResult.IP6 != nil {
|
||||||
|
toResult.IPs = append(toResult.IPs, convert020IPConfig(fromResult.IP6, "6"))
|
||||||
|
for _, fromRoute := range fromResult.IP6.Routes {
|
||||||
|
toResult.Routes = append(toResult.Routes, fromRoute.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return toResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertInternal(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
fromResult := from.(*Result)
|
||||||
|
toResult := &Result{
|
||||||
|
CNIVersion: toVersion,
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
Routes: []*types.Route{},
|
||||||
|
}
|
||||||
|
for _, fromIntf := range fromResult.Interfaces {
|
||||||
|
toResult.Interfaces = append(toResult.Interfaces, fromIntf.Copy())
|
||||||
|
}
|
||||||
|
for _, fromIPC := range fromResult.IPs {
|
||||||
|
toResult.IPs = append(toResult.IPs, fromIPC.Copy())
|
||||||
|
}
|
||||||
|
for _, fromRoute := range fromResult.Routes {
|
||||||
|
toResult.Routes = append(toResult.Routes, fromRoute.Copy())
|
||||||
|
}
|
||||||
|
return toResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertTo02x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
fromResult := from.(*Result)
|
||||||
|
toResult := &types020.Result{
|
||||||
|
CNIVersion: toVersion,
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fromIP := range fromResult.IPs {
|
||||||
|
// Only convert the first IP address of each version as 0.2.0
|
||||||
|
// and earlier cannot handle multiple IP addresses
|
||||||
|
if fromIP.Version == "4" && toResult.IP4 == nil {
|
||||||
|
toResult.IP4 = &types020.IPConfig{
|
||||||
|
IP: fromIP.Address,
|
||||||
|
Gateway: fromIP.Gateway,
|
||||||
|
}
|
||||||
|
} else if fromIP.Version == "6" && toResult.IP6 == nil {
|
||||||
|
toResult.IP6 = &types020.IPConfig{
|
||||||
|
IP: fromIP.Address,
|
||||||
|
Gateway: fromIP.Gateway,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if toResult.IP4 != nil && toResult.IP6 != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fromRoute := range fromResult.Routes {
|
||||||
|
is4 := fromRoute.Dst.IP.To4() != nil
|
||||||
|
if is4 && toResult.IP4 != nil {
|
||||||
|
toResult.IP4.Routes = append(toResult.IP4.Routes, types.Route{
|
||||||
|
Dst: fromRoute.Dst,
|
||||||
|
GW: fromRoute.GW,
|
||||||
|
})
|
||||||
|
} else if !is4 && toResult.IP6 != nil {
|
||||||
|
toResult.IP6.Routes = append(toResult.IP6.Routes, types.Route{
|
||||||
|
Dst: fromRoute.Dst,
|
||||||
|
GW: fromRoute.GW,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0.2.0 and earlier require at least one IP address in the Result
|
||||||
|
if toResult.IP4 == nil && toResult.IP6 == nil {
|
||||||
|
return nil, fmt.Errorf("cannot convert: no valid IP addresses")
|
||||||
|
}
|
||||||
|
|
||||||
|
return toResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) Version() string {
|
||||||
|
return r.CNIVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) GetAsVersion(version string) (types.Result, error) {
|
||||||
|
// If the creator of the result did not set the CNIVersion, assume it
|
||||||
|
// should be the highest spec version implemented by this Result
|
||||||
|
if r.CNIVersion == "" {
|
||||||
|
r.CNIVersion = ImplementedSpecVersion
|
||||||
|
}
|
||||||
|
return convert.Convert(r, version)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) Print() error {
|
||||||
|
return r.PrintTo(os.Stdout)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) PrintTo(writer io.Writer) error {
|
||||||
|
data, err := json.MarshalIndent(r, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = writer.Write(data)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interface contains values about the created interfaces
|
||||||
|
type Interface struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Mac string `json:"mac,omitempty"`
|
||||||
|
Sandbox string `json:"sandbox,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) String() string {
|
||||||
|
return fmt.Sprintf("%+v", *i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) Copy() *Interface {
|
||||||
|
if i == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
newIntf := *i
|
||||||
|
return &newIntf
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int returns a pointer to the int value passed in. Used to
|
||||||
|
// set the IPConfig.Interface field.
|
||||||
|
func Int(v int) *int {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPConfig contains values necessary to configure an IP address on an interface
|
||||||
|
type IPConfig struct {
|
||||||
|
// IP version, either "4" or "6"
|
||||||
|
Version string
|
||||||
|
// Index into Result structs Interfaces list
|
||||||
|
Interface *int
|
||||||
|
Address net.IPNet
|
||||||
|
Gateway net.IP
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IPConfig) String() string {
|
||||||
|
return fmt.Sprintf("%+v", *i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IPConfig) Copy() *IPConfig {
|
||||||
|
if i == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc := &IPConfig{
|
||||||
|
Version: i.Version,
|
||||||
|
Address: i.Address,
|
||||||
|
Gateway: i.Gateway,
|
||||||
|
}
|
||||||
|
if i.Interface != nil {
|
||||||
|
intf := *i.Interface
|
||||||
|
ipc.Interface = &intf
|
||||||
|
}
|
||||||
|
return ipc
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON (un)marshallable types
|
||||||
|
type ipConfig struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Interface *int `json:"interface,omitempty"`
|
||||||
|
Address types.IPNet `json:"address"`
|
||||||
|
Gateway net.IP `json:"gateway,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *IPConfig) MarshalJSON() ([]byte, error) {
|
||||||
|
ipc := ipConfig{
|
||||||
|
Version: c.Version,
|
||||||
|
Interface: c.Interface,
|
||||||
|
Address: types.IPNet(c.Address),
|
||||||
|
Gateway: c.Gateway,
|
||||||
|
}
|
||||||
|
|
||||||
|
return json.Marshal(ipc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *IPConfig) UnmarshalJSON(data []byte) error {
|
||||||
|
ipc := ipConfig{}
|
||||||
|
if err := json.Unmarshal(data, &ipc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Version = ipc.Version
|
||||||
|
c.Interface = ipc.Interface
|
||||||
|
c.Address = net.IPNet(ipc.Address)
|
||||||
|
c.Gateway = ipc.Gateway
|
||||||
|
return nil
|
||||||
|
}
|
307
vendor/github.com/containernetworking/cni/pkg/types/100/types.go
generated
vendored
Normal file
307
vendor/github.com/containernetworking/cni/pkg/types/100/types.go
generated
vendored
Normal file
|
@ -0,0 +1,307 @@
|
||||||
|
// Copyright 2016 CNI authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package types100
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
types040 "github.com/containernetworking/cni/pkg/types/040"
|
||||||
|
convert "github.com/containernetworking/cni/pkg/types/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ImplementedSpecVersion string = "1.0.0"
|
||||||
|
|
||||||
|
var supportedVersions = []string{ImplementedSpecVersion}
|
||||||
|
|
||||||
|
// Register converters for all versions less than the implemented spec version
|
||||||
|
func init() {
|
||||||
|
// Up-converters
|
||||||
|
convert.RegisterConverter("0.1.0", supportedVersions, convertFrom02x)
|
||||||
|
convert.RegisterConverter("0.2.0", supportedVersions, convertFrom02x)
|
||||||
|
convert.RegisterConverter("0.3.0", supportedVersions, convertFrom04x)
|
||||||
|
convert.RegisterConverter("0.3.1", supportedVersions, convertFrom04x)
|
||||||
|
convert.RegisterConverter("0.4.0", supportedVersions, convertFrom04x)
|
||||||
|
|
||||||
|
// Down-converters
|
||||||
|
convert.RegisterConverter("1.0.0", []string{"0.3.0", "0.3.1", "0.4.0"}, convertTo04x)
|
||||||
|
convert.RegisterConverter("1.0.0", []string{"0.1.0", "0.2.0"}, convertTo02x)
|
||||||
|
|
||||||
|
// Creator
|
||||||
|
convert.RegisterCreator(supportedVersions, NewResult)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewResult(data []byte) (types.Result, error) {
|
||||||
|
result := &Result{}
|
||||||
|
if err := json.Unmarshal(data, result); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, v := range supportedVersions {
|
||||||
|
if result.CNIVersion == v {
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("result type supports %v but unmarshalled CNIVersion is %q",
|
||||||
|
supportedVersions, result.CNIVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetResult(r types.Result) (*Result, error) {
|
||||||
|
resultCurrent, err := r.GetAsVersion(ImplementedSpecVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result, ok := resultCurrent.(*Result)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("failed to convert result")
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewResultFromResult(result types.Result) (*Result, error) {
|
||||||
|
newResult, err := convert.Convert(result, ImplementedSpecVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return newResult.(*Result), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result is what gets returned from the plugin (via stdout) to the caller
|
||||||
|
type Result struct {
|
||||||
|
CNIVersion string `json:"cniVersion,omitempty"`
|
||||||
|
Interfaces []*Interface `json:"interfaces,omitempty"`
|
||||||
|
IPs []*IPConfig `json:"ips,omitempty"`
|
||||||
|
Routes []*types.Route `json:"routes,omitempty"`
|
||||||
|
DNS types.DNS `json:"dns,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertFrom02x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
result040, err := convert.Convert(from, "0.4.0")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result100, err := convertFrom04x(result040, ImplementedSpecVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result100, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertIPConfigFrom040(from *types040.IPConfig) *IPConfig {
|
||||||
|
to := &IPConfig{
|
||||||
|
Address: from.Address,
|
||||||
|
Gateway: from.Gateway,
|
||||||
|
}
|
||||||
|
if from.Interface != nil {
|
||||||
|
intf := *from.Interface
|
||||||
|
to.Interface = &intf
|
||||||
|
}
|
||||||
|
return to
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertInterfaceFrom040(from *types040.Interface) *Interface {
|
||||||
|
return &Interface{
|
||||||
|
Name: from.Name,
|
||||||
|
Mac: from.Mac,
|
||||||
|
Sandbox: from.Sandbox,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertFrom04x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
fromResult := from.(*types040.Result)
|
||||||
|
toResult := &Result{
|
||||||
|
CNIVersion: toVersion,
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
Routes: []*types.Route{},
|
||||||
|
}
|
||||||
|
for _, fromIntf := range fromResult.Interfaces {
|
||||||
|
toResult.Interfaces = append(toResult.Interfaces, convertInterfaceFrom040(fromIntf))
|
||||||
|
}
|
||||||
|
for _, fromIPC := range fromResult.IPs {
|
||||||
|
toResult.IPs = append(toResult.IPs, convertIPConfigFrom040(fromIPC))
|
||||||
|
}
|
||||||
|
for _, fromRoute := range fromResult.Routes {
|
||||||
|
toResult.Routes = append(toResult.Routes, fromRoute.Copy())
|
||||||
|
}
|
||||||
|
return toResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertIPConfigTo040(from *IPConfig) *types040.IPConfig {
|
||||||
|
version := "6"
|
||||||
|
if from.Address.IP.To4() != nil {
|
||||||
|
version = "4"
|
||||||
|
}
|
||||||
|
to := &types040.IPConfig{
|
||||||
|
Version: version,
|
||||||
|
Address: from.Address,
|
||||||
|
Gateway: from.Gateway,
|
||||||
|
}
|
||||||
|
if from.Interface != nil {
|
||||||
|
intf := *from.Interface
|
||||||
|
to.Interface = &intf
|
||||||
|
}
|
||||||
|
return to
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertInterfaceTo040(from *Interface) *types040.Interface {
|
||||||
|
return &types040.Interface{
|
||||||
|
Name: from.Name,
|
||||||
|
Mac: from.Mac,
|
||||||
|
Sandbox: from.Sandbox,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertTo04x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
fromResult := from.(*Result)
|
||||||
|
toResult := &types040.Result{
|
||||||
|
CNIVersion: toVersion,
|
||||||
|
DNS: *fromResult.DNS.Copy(),
|
||||||
|
Routes: []*types.Route{},
|
||||||
|
}
|
||||||
|
for _, fromIntf := range fromResult.Interfaces {
|
||||||
|
toResult.Interfaces = append(toResult.Interfaces, convertInterfaceTo040(fromIntf))
|
||||||
|
}
|
||||||
|
for _, fromIPC := range fromResult.IPs {
|
||||||
|
toResult.IPs = append(toResult.IPs, convertIPConfigTo040(fromIPC))
|
||||||
|
}
|
||||||
|
for _, fromRoute := range fromResult.Routes {
|
||||||
|
toResult.Routes = append(toResult.Routes, fromRoute.Copy())
|
||||||
|
}
|
||||||
|
return toResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertTo02x(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
// First convert to 0.4.0
|
||||||
|
result040, err := convertTo04x(from, "0.4.0")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result02x, err := convert.Convert(result040, toVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result02x, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) Version() string {
|
||||||
|
return r.CNIVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) GetAsVersion(version string) (types.Result, error) {
|
||||||
|
// If the creator of the result did not set the CNIVersion, assume it
|
||||||
|
// should be the highest spec version implemented by this Result
|
||||||
|
if r.CNIVersion == "" {
|
||||||
|
r.CNIVersion = ImplementedSpecVersion
|
||||||
|
}
|
||||||
|
return convert.Convert(r, version)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) Print() error {
|
||||||
|
return r.PrintTo(os.Stdout)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Result) PrintTo(writer io.Writer) error {
|
||||||
|
data, err := json.MarshalIndent(r, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = writer.Write(data)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interface contains values about the created interfaces
|
||||||
|
type Interface struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Mac string `json:"mac,omitempty"`
|
||||||
|
Sandbox string `json:"sandbox,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) String() string {
|
||||||
|
return fmt.Sprintf("%+v", *i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) Copy() *Interface {
|
||||||
|
if i == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
newIntf := *i
|
||||||
|
return &newIntf
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int returns a pointer to the int value passed in. Used to
|
||||||
|
// set the IPConfig.Interface field.
|
||||||
|
func Int(v int) *int {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPConfig contains values necessary to configure an IP address on an interface
|
||||||
|
type IPConfig struct {
|
||||||
|
// Index into Result structs Interfaces list
|
||||||
|
Interface *int
|
||||||
|
Address net.IPNet
|
||||||
|
Gateway net.IP
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IPConfig) String() string {
|
||||||
|
return fmt.Sprintf("%+v", *i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IPConfig) Copy() *IPConfig {
|
||||||
|
if i == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc := &IPConfig{
|
||||||
|
Address: i.Address,
|
||||||
|
Gateway: i.Gateway,
|
||||||
|
}
|
||||||
|
if i.Interface != nil {
|
||||||
|
intf := *i.Interface
|
||||||
|
ipc.Interface = &intf
|
||||||
|
}
|
||||||
|
return ipc
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON (un)marshallable types
|
||||||
|
type ipConfig struct {
|
||||||
|
Interface *int `json:"interface,omitempty"`
|
||||||
|
Address types.IPNet `json:"address"`
|
||||||
|
Gateway net.IP `json:"gateway,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *IPConfig) MarshalJSON() ([]byte, error) {
|
||||||
|
ipc := ipConfig{
|
||||||
|
Interface: c.Interface,
|
||||||
|
Address: types.IPNet(c.Address),
|
||||||
|
Gateway: c.Gateway,
|
||||||
|
}
|
||||||
|
|
||||||
|
return json.Marshal(ipc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *IPConfig) UnmarshalJSON(data []byte) error {
|
||||||
|
ipc := ipConfig{}
|
||||||
|
if err := json.Unmarshal(data, &ipc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Interface = ipc.Interface
|
||||||
|
c.Address = net.IPNet(ipc.Address)
|
||||||
|
c.Gateway = ipc.Gateway
|
||||||
|
return nil
|
||||||
|
}
|
18
vendor/github.com/containernetworking/cni/pkg/types/args.go
generated
vendored
18
vendor/github.com/containernetworking/cni/pkg/types/args.go
generated
vendored
|
@ -91,16 +91,26 @@ func LoadArgs(args string, container interface{}) error {
|
||||||
unknownArgs = append(unknownArgs, pair)
|
unknownArgs = append(unknownArgs, pair)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
keyFieldIface := keyField.Addr().Interface()
|
|
||||||
u, ok := keyFieldIface.(encoding.TextUnmarshaler)
|
var keyFieldInterface interface{}
|
||||||
|
switch {
|
||||||
|
case keyField.Kind() == reflect.Ptr:
|
||||||
|
keyField.Set(reflect.New(keyField.Type().Elem()))
|
||||||
|
keyFieldInterface = keyField.Interface()
|
||||||
|
case keyField.CanAddr() && keyField.Addr().CanInterface():
|
||||||
|
keyFieldInterface = keyField.Addr().Interface()
|
||||||
|
default:
|
||||||
|
return UnmarshalableArgsError{fmt.Errorf("field '%s' has no valid interface", keyString)}
|
||||||
|
}
|
||||||
|
u, ok := keyFieldInterface.(encoding.TextUnmarshaler)
|
||||||
if !ok {
|
if !ok {
|
||||||
return UnmarshalableArgsError{fmt.Errorf(
|
return UnmarshalableArgsError{fmt.Errorf(
|
||||||
"ARGS: cannot unmarshal into field '%s' - type '%s' does not implement encoding.TextUnmarshaler",
|
"ARGS: cannot unmarshal into field '%s' - type '%s' does not implement encoding.TextUnmarshaler",
|
||||||
keyString, reflect.TypeOf(keyFieldIface))}
|
keyString, reflect.TypeOf(keyFieldInterface))}
|
||||||
}
|
}
|
||||||
err := u.UnmarshalText([]byte(valueString))
|
err := u.UnmarshalText([]byte(valueString))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ARGS: error parsing value of pair %q: %v)", pair, err)
|
return fmt.Errorf("ARGS: error parsing value of pair %q: %w", pair, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
56
vendor/github.com/containernetworking/cni/pkg/types/create/create.go
generated
vendored
Normal file
56
vendor/github.com/containernetworking/cni/pkg/types/create/create.go
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// Copyright 2016 CNI authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package create
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
convert "github.com/containernetworking/cni/pkg/types/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DecodeVersion returns the CNI version from CNI configuration or result JSON,
|
||||||
|
// or an error if the operation could not be performed.
|
||||||
|
func DecodeVersion(jsonBytes []byte) (string, error) {
|
||||||
|
var conf struct {
|
||||||
|
CNIVersion string `json:"cniVersion"`
|
||||||
|
}
|
||||||
|
err := json.Unmarshal(jsonBytes, &conf)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("decoding version from network config: %w", err)
|
||||||
|
}
|
||||||
|
if conf.CNIVersion == "" {
|
||||||
|
return "0.1.0", nil
|
||||||
|
}
|
||||||
|
return conf.CNIVersion, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates a CNI Result using the given JSON with the expected
|
||||||
|
// version, or an error if the creation could not be performed
|
||||||
|
func Create(version string, bytes []byte) (types.Result, error) {
|
||||||
|
return convert.Create(version, bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateFromBytes creates a CNI Result from the given JSON, automatically
|
||||||
|
// detecting the CNI spec version of the result. An error is returned if the
|
||||||
|
// operation could not be performed.
|
||||||
|
func CreateFromBytes(bytes []byte) (types.Result, error) {
|
||||||
|
version, err := DecodeVersion(bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return convert.Create(version, bytes)
|
||||||
|
}
|
276
vendor/github.com/containernetworking/cni/pkg/types/current/types.go
generated
vendored
276
vendor/github.com/containernetworking/cni/pkg/types/current/types.go
generated
vendored
|
@ -1,276 +0,0 @@
|
||||||
// Copyright 2016 CNI authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package current
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/containernetworking/cni/pkg/types"
|
|
||||||
"github.com/containernetworking/cni/pkg/types/020"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ImplementedSpecVersion string = "0.4.0"
|
|
||||||
|
|
||||||
var SupportedVersions = []string{"0.3.0", "0.3.1", ImplementedSpecVersion}
|
|
||||||
|
|
||||||
func NewResult(data []byte) (types.Result, error) {
|
|
||||||
result := &Result{}
|
|
||||||
if err := json.Unmarshal(data, result); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetResult(r types.Result) (*Result, error) {
|
|
||||||
resultCurrent, err := r.GetAsVersion(ImplementedSpecVersion)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result, ok := resultCurrent.(*Result)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("failed to convert result")
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var resultConverters = []struct {
|
|
||||||
versions []string
|
|
||||||
convert func(types.Result) (*Result, error)
|
|
||||||
}{
|
|
||||||
{types020.SupportedVersions, convertFrom020},
|
|
||||||
{SupportedVersions, convertFrom030},
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertFrom020(result types.Result) (*Result, error) {
|
|
||||||
oldResult, err := types020.GetResult(result)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newResult := &Result{
|
|
||||||
CNIVersion: ImplementedSpecVersion,
|
|
||||||
DNS: oldResult.DNS,
|
|
||||||
Routes: []*types.Route{},
|
|
||||||
}
|
|
||||||
|
|
||||||
if oldResult.IP4 != nil {
|
|
||||||
newResult.IPs = append(newResult.IPs, &IPConfig{
|
|
||||||
Version: "4",
|
|
||||||
Address: oldResult.IP4.IP,
|
|
||||||
Gateway: oldResult.IP4.Gateway,
|
|
||||||
})
|
|
||||||
for _, route := range oldResult.IP4.Routes {
|
|
||||||
newResult.Routes = append(newResult.Routes, &types.Route{
|
|
||||||
Dst: route.Dst,
|
|
||||||
GW: route.GW,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if oldResult.IP6 != nil {
|
|
||||||
newResult.IPs = append(newResult.IPs, &IPConfig{
|
|
||||||
Version: "6",
|
|
||||||
Address: oldResult.IP6.IP,
|
|
||||||
Gateway: oldResult.IP6.Gateway,
|
|
||||||
})
|
|
||||||
for _, route := range oldResult.IP6.Routes {
|
|
||||||
newResult.Routes = append(newResult.Routes, &types.Route{
|
|
||||||
Dst: route.Dst,
|
|
||||||
GW: route.GW,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newResult, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertFrom030(result types.Result) (*Result, error) {
|
|
||||||
newResult, ok := result.(*Result)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("failed to convert result")
|
|
||||||
}
|
|
||||||
newResult.CNIVersion = ImplementedSpecVersion
|
|
||||||
return newResult, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewResultFromResult(result types.Result) (*Result, error) {
|
|
||||||
version := result.Version()
|
|
||||||
for _, converter := range resultConverters {
|
|
||||||
for _, supportedVersion := range converter.versions {
|
|
||||||
if version == supportedVersion {
|
|
||||||
return converter.convert(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("unsupported CNI result22 version %q", version)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Result is what gets returned from the plugin (via stdout) to the caller
|
|
||||||
type Result struct {
|
|
||||||
CNIVersion string `json:"cniVersion,omitempty"`
|
|
||||||
Interfaces []*Interface `json:"interfaces,omitempty"`
|
|
||||||
IPs []*IPConfig `json:"ips,omitempty"`
|
|
||||||
Routes []*types.Route `json:"routes,omitempty"`
|
|
||||||
DNS types.DNS `json:"dns,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert to the older 0.2.0 CNI spec Result type
|
|
||||||
func (r *Result) convertTo020() (*types020.Result, error) {
|
|
||||||
oldResult := &types020.Result{
|
|
||||||
CNIVersion: types020.ImplementedSpecVersion,
|
|
||||||
DNS: r.DNS,
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, ip := range r.IPs {
|
|
||||||
// Only convert the first IP address of each version as 0.2.0
|
|
||||||
// and earlier cannot handle multiple IP addresses
|
|
||||||
if ip.Version == "4" && oldResult.IP4 == nil {
|
|
||||||
oldResult.IP4 = &types020.IPConfig{
|
|
||||||
IP: ip.Address,
|
|
||||||
Gateway: ip.Gateway,
|
|
||||||
}
|
|
||||||
} else if ip.Version == "6" && oldResult.IP6 == nil {
|
|
||||||
oldResult.IP6 = &types020.IPConfig{
|
|
||||||
IP: ip.Address,
|
|
||||||
Gateway: ip.Gateway,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if oldResult.IP4 != nil && oldResult.IP6 != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, route := range r.Routes {
|
|
||||||
is4 := route.Dst.IP.To4() != nil
|
|
||||||
if is4 && oldResult.IP4 != nil {
|
|
||||||
oldResult.IP4.Routes = append(oldResult.IP4.Routes, types.Route{
|
|
||||||
Dst: route.Dst,
|
|
||||||
GW: route.GW,
|
|
||||||
})
|
|
||||||
} else if !is4 && oldResult.IP6 != nil {
|
|
||||||
oldResult.IP6.Routes = append(oldResult.IP6.Routes, types.Route{
|
|
||||||
Dst: route.Dst,
|
|
||||||
GW: route.GW,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if oldResult.IP4 == nil && oldResult.IP6 == nil {
|
|
||||||
return nil, fmt.Errorf("cannot convert: no valid IP addresses")
|
|
||||||
}
|
|
||||||
|
|
||||||
return oldResult, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Result) Version() string {
|
|
||||||
return ImplementedSpecVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Result) GetAsVersion(version string) (types.Result, error) {
|
|
||||||
switch version {
|
|
||||||
case "0.3.0", "0.3.1", ImplementedSpecVersion:
|
|
||||||
r.CNIVersion = version
|
|
||||||
return r, nil
|
|
||||||
case types020.SupportedVersions[0], types020.SupportedVersions[1], types020.SupportedVersions[2]:
|
|
||||||
return r.convertTo020()
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("cannot convert version 0.3.x to %q", version)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Result) Print() error {
|
|
||||||
return r.PrintTo(os.Stdout)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Result) PrintTo(writer io.Writer) error {
|
|
||||||
data, err := json.MarshalIndent(r, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = writer.Write(data)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert this old version result to the current CNI version result
|
|
||||||
func (r *Result) Convert() (*Result, error) {
|
|
||||||
return r, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Interface contains values about the created interfaces
|
|
||||||
type Interface struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Mac string `json:"mac,omitempty"`
|
|
||||||
Sandbox string `json:"sandbox,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *Interface) String() string {
|
|
||||||
return fmt.Sprintf("%+v", *i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int returns a pointer to the int value passed in. Used to
|
|
||||||
// set the IPConfig.Interface field.
|
|
||||||
func Int(v int) *int {
|
|
||||||
return &v
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPConfig contains values necessary to configure an IP address on an interface
|
|
||||||
type IPConfig struct {
|
|
||||||
// IP version, either "4" or "6"
|
|
||||||
Version string
|
|
||||||
// Index into Result structs Interfaces list
|
|
||||||
Interface *int
|
|
||||||
Address net.IPNet
|
|
||||||
Gateway net.IP
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *IPConfig) String() string {
|
|
||||||
return fmt.Sprintf("%+v", *i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSON (un)marshallable types
|
|
||||||
type ipConfig struct {
|
|
||||||
Version string `json:"version"`
|
|
||||||
Interface *int `json:"interface,omitempty"`
|
|
||||||
Address types.IPNet `json:"address"`
|
|
||||||
Gateway net.IP `json:"gateway,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *IPConfig) MarshalJSON() ([]byte, error) {
|
|
||||||
ipc := ipConfig{
|
|
||||||
Version: c.Version,
|
|
||||||
Interface: c.Interface,
|
|
||||||
Address: types.IPNet(c.Address),
|
|
||||||
Gateway: c.Gateway,
|
|
||||||
}
|
|
||||||
|
|
||||||
return json.Marshal(ipc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *IPConfig) UnmarshalJSON(data []byte) error {
|
|
||||||
ipc := ipConfig{}
|
|
||||||
if err := json.Unmarshal(data, &ipc); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Version = ipc.Version
|
|
||||||
c.Interface = ipc.Interface
|
|
||||||
c.Address = net.IPNet(ipc.Address)
|
|
||||||
c.Gateway = ipc.Gateway
|
|
||||||
return nil
|
|
||||||
}
|
|
92
vendor/github.com/containernetworking/cni/pkg/types/internal/convert.go
generated
vendored
Normal file
92
vendor/github.com/containernetworking/cni/pkg/types/internal/convert.go
generated
vendored
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
// Copyright 2016 CNI authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package convert
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConvertFn should convert from the given arbitrary Result type into a
|
||||||
|
// Result implementing CNI specification version passed in toVersion.
|
||||||
|
// The function is guaranteed to be passed a Result type matching the
|
||||||
|
// fromVersion it was registered with, and is guaranteed to be
|
||||||
|
// passed a toVersion matching one of the toVersions it was registered with.
|
||||||
|
type ConvertFn func(from types.Result, toVersion string) (types.Result, error)
|
||||||
|
|
||||||
|
type converter struct {
|
||||||
|
// fromVersion is the CNI Result spec version that convertFn accepts
|
||||||
|
fromVersion string
|
||||||
|
// toVersions is a list of versions that convertFn can convert to
|
||||||
|
toVersions []string
|
||||||
|
convertFn ConvertFn
|
||||||
|
}
|
||||||
|
|
||||||
|
var converters []*converter
|
||||||
|
|
||||||
|
func findConverter(fromVersion, toVersion string) *converter {
|
||||||
|
for _, c := range converters {
|
||||||
|
if c.fromVersion == fromVersion {
|
||||||
|
for _, v := range c.toVersions {
|
||||||
|
if v == toVersion {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert converts a CNI Result to the requested CNI specification version,
|
||||||
|
// or returns an error if the conversion could not be performed or failed
|
||||||
|
func Convert(from types.Result, toVersion string) (types.Result, error) {
|
||||||
|
if toVersion == "" {
|
||||||
|
toVersion = "0.1.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
fromVersion := from.Version()
|
||||||
|
|
||||||
|
// Shortcut for same version
|
||||||
|
if fromVersion == toVersion {
|
||||||
|
return from, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise find the right converter
|
||||||
|
c := findConverter(fromVersion, toVersion)
|
||||||
|
if c == nil {
|
||||||
|
return nil, fmt.Errorf("no converter for CNI result version %s to %s",
|
||||||
|
fromVersion, toVersion)
|
||||||
|
}
|
||||||
|
return c.convertFn(from, toVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterConverter registers a CNI Result converter. SHOULD NOT BE CALLED
|
||||||
|
// EXCEPT FROM CNI ITSELF.
|
||||||
|
func RegisterConverter(fromVersion string, toVersions []string, convertFn ConvertFn) {
|
||||||
|
// Make sure there is no converter already registered for these
|
||||||
|
// from and to versions
|
||||||
|
for _, v := range toVersions {
|
||||||
|
if findConverter(fromVersion, v) != nil {
|
||||||
|
panic(fmt.Sprintf("converter already registered for %s to %s",
|
||||||
|
fromVersion, v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
converters = append(converters, &converter{
|
||||||
|
fromVersion: fromVersion,
|
||||||
|
toVersions: toVersions,
|
||||||
|
convertFn: convertFn,
|
||||||
|
})
|
||||||
|
}
|
66
vendor/github.com/containernetworking/cni/pkg/types/internal/create.go
generated
vendored
Normal file
66
vendor/github.com/containernetworking/cni/pkg/types/internal/create.go
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright 2016 CNI authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package convert
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ResultFactoryFunc func([]byte) (types.Result, error)
|
||||||
|
|
||||||
|
type creator struct {
|
||||||
|
// CNI Result spec versions that createFn can create a Result for
|
||||||
|
versions []string
|
||||||
|
createFn ResultFactoryFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
var creators []*creator
|
||||||
|
|
||||||
|
func findCreator(version string) *creator {
|
||||||
|
for _, c := range creators {
|
||||||
|
for _, v := range c.versions {
|
||||||
|
if v == version {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates a CNI Result using the given JSON, or an error if the creation
|
||||||
|
// could not be performed
|
||||||
|
func Create(version string, bytes []byte) (types.Result, error) {
|
||||||
|
if c := findCreator(version); c != nil {
|
||||||
|
return c.createFn(bytes)
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("unsupported CNI result version %q", version)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterCreator registers a CNI Result creator. SHOULD NOT BE CALLED
|
||||||
|
// EXCEPT FROM CNI ITSELF.
|
||||||
|
func RegisterCreator(versions []string, createFn ResultFactoryFunc) {
|
||||||
|
// Make sure there is no creator already registered for these versions
|
||||||
|
for _, v := range versions {
|
||||||
|
if findCreator(v) != nil {
|
||||||
|
panic(fmt.Sprintf("creator already registered for %s", v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
creators = append(creators, &creator{
|
||||||
|
versions: versions,
|
||||||
|
createFn: createFn,
|
||||||
|
})
|
||||||
|
}
|
31
vendor/github.com/containernetworking/cni/pkg/types/types.go
generated
vendored
31
vendor/github.com/containernetworking/cni/pkg/types/types.go
generated
vendored
|
@ -83,8 +83,6 @@ type NetConfList struct {
|
||||||
Plugins []*NetConf `json:"plugins,omitempty"`
|
Plugins []*NetConf `json:"plugins,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ResultFactoryFunc func([]byte) (Result, error)
|
|
||||||
|
|
||||||
// Result is an interface that provides the result of plugin execution
|
// Result is an interface that provides the result of plugin execution
|
||||||
type Result interface {
|
type Result interface {
|
||||||
// The highest CNI specification result version the result supports
|
// The highest CNI specification result version the result supports
|
||||||
|
@ -118,6 +116,24 @@ type DNS struct {
|
||||||
Options []string `json:"options,omitempty"`
|
Options []string `json:"options,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DNS) Copy() *DNS {
|
||||||
|
if d == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
to := &DNS{Domain: d.Domain}
|
||||||
|
for _, ns := range d.Nameservers {
|
||||||
|
to.Nameservers = append(to.Nameservers, ns)
|
||||||
|
}
|
||||||
|
for _, s := range d.Search {
|
||||||
|
to.Search = append(to.Search, s)
|
||||||
|
}
|
||||||
|
for _, o := range d.Options {
|
||||||
|
to.Options = append(to.Options, o)
|
||||||
|
}
|
||||||
|
return to
|
||||||
|
}
|
||||||
|
|
||||||
type Route struct {
|
type Route struct {
|
||||||
Dst net.IPNet
|
Dst net.IPNet
|
||||||
GW net.IP
|
GW net.IP
|
||||||
|
@ -127,6 +143,17 @@ func (r *Route) String() string {
|
||||||
return fmt.Sprintf("%+v", *r)
|
return fmt.Sprintf("%+v", *r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Route) Copy() *Route {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Route{
|
||||||
|
Dst: r.Dst,
|
||||||
|
GW: r.GW,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Well known error codes
|
// Well known error codes
|
||||||
// see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes
|
// see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes
|
||||||
const (
|
const (
|
||||||
|
|
15
vendor/github.com/containernetworking/cni/pkg/version/conf.go
generated
vendored
15
vendor/github.com/containernetworking/cni/pkg/version/conf.go
generated
vendored
|
@ -15,23 +15,12 @@
|
||||||
package version
|
package version
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"github.com/containernetworking/cni/pkg/types/create"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConfigDecoder can decode the CNI version available in network config data
|
// ConfigDecoder can decode the CNI version available in network config data
|
||||||
type ConfigDecoder struct{}
|
type ConfigDecoder struct{}
|
||||||
|
|
||||||
func (*ConfigDecoder) Decode(jsonBytes []byte) (string, error) {
|
func (*ConfigDecoder) Decode(jsonBytes []byte) (string, error) {
|
||||||
var conf struct {
|
return create.DecodeVersion(jsonBytes)
|
||||||
CNIVersion string `json:"cniVersion"`
|
|
||||||
}
|
|
||||||
err := json.Unmarshal(jsonBytes, &conf)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("decoding version from network config: %s", err)
|
|
||||||
}
|
|
||||||
if conf.CNIVersion == "" {
|
|
||||||
return "0.1.0", nil
|
|
||||||
}
|
|
||||||
return conf.CNIVersion, nil
|
|
||||||
}
|
}
|
||||||
|
|
8
vendor/github.com/containernetworking/cni/pkg/version/plugin.go
generated
vendored
8
vendor/github.com/containernetworking/cni/pkg/version/plugin.go
generated
vendored
|
@ -68,7 +68,7 @@ func (*PluginDecoder) Decode(jsonBytes []byte) (PluginInfo, error) {
|
||||||
var info pluginInfo
|
var info pluginInfo
|
||||||
err := json.Unmarshal(jsonBytes, &info)
|
err := json.Unmarshal(jsonBytes, &info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("decoding version info: %s", err)
|
return nil, fmt.Errorf("decoding version info: %w", err)
|
||||||
}
|
}
|
||||||
if info.CNIVersion_ == "" {
|
if info.CNIVersion_ == "" {
|
||||||
return nil, fmt.Errorf("decoding version info: missing field cniVersion")
|
return nil, fmt.Errorf("decoding version info: missing field cniVersion")
|
||||||
|
@ -97,20 +97,20 @@ func ParseVersion(version string) (int, int, int, error) {
|
||||||
|
|
||||||
major, err := strconv.Atoi(parts[0])
|
major, err := strconv.Atoi(parts[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, -1, -1, fmt.Errorf("failed to convert major version part %q: %v", parts[0], err)
|
return -1, -1, -1, fmt.Errorf("failed to convert major version part %q: %w", parts[0], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(parts) >= 2 {
|
if len(parts) >= 2 {
|
||||||
minor, err = strconv.Atoi(parts[1])
|
minor, err = strconv.Atoi(parts[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, -1, -1, fmt.Errorf("failed to convert minor version part %q: %v", parts[1], err)
|
return -1, -1, -1, fmt.Errorf("failed to convert minor version part %q: %w", parts[1], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(parts) >= 3 {
|
if len(parts) >= 3 {
|
||||||
micro, err = strconv.Atoi(parts[2])
|
micro, err = strconv.Atoi(parts[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, -1, -1, fmt.Errorf("failed to convert micro version part %q: %v", parts[2], err)
|
return -1, -1, -1, fmt.Errorf("failed to convert micro version part %q: %w", parts[2], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
52
vendor/github.com/containernetworking/cni/pkg/version/version.go
generated
vendored
52
vendor/github.com/containernetworking/cni/pkg/version/version.go
generated
vendored
|
@ -19,13 +19,13 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/containernetworking/cni/pkg/types"
|
"github.com/containernetworking/cni/pkg/types"
|
||||||
"github.com/containernetworking/cni/pkg/types/020"
|
types100 "github.com/containernetworking/cni/pkg/types/100"
|
||||||
"github.com/containernetworking/cni/pkg/types/current"
|
"github.com/containernetworking/cni/pkg/types/create"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Current reports the version of the CNI spec implemented by this library
|
// Current reports the version of the CNI spec implemented by this library
|
||||||
func Current() string {
|
func Current() string {
|
||||||
return "0.4.0"
|
return types100.ImplementedSpecVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy PluginInfo describes a plugin that is backwards compatible with the
|
// Legacy PluginInfo describes a plugin that is backwards compatible with the
|
||||||
|
@ -36,29 +36,28 @@ func Current() string {
|
||||||
// Any future CNI spec versions which meet this definition should be added to
|
// Any future CNI spec versions which meet this definition should be added to
|
||||||
// this list.
|
// this list.
|
||||||
var Legacy = PluginSupports("0.1.0", "0.2.0")
|
var Legacy = PluginSupports("0.1.0", "0.2.0")
|
||||||
var All = PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0")
|
var All = PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0", "1.0.0")
|
||||||
|
|
||||||
var resultFactories = []struct {
|
// VersionsFrom returns a list of versions starting from min, inclusive
|
||||||
supportedVersions []string
|
func VersionsStartingFrom(min string) PluginInfo {
|
||||||
newResult types.ResultFactoryFunc
|
out := []string{}
|
||||||
}{
|
// cheat, just assume ordered
|
||||||
{current.SupportedVersions, current.NewResult},
|
ok := false
|
||||||
{types020.SupportedVersions, types020.NewResult},
|
for _, v := range All.SupportedVersions() {
|
||||||
|
if !ok && v == min {
|
||||||
|
ok = true
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
|
out = append(out, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PluginSupports(out...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finds a Result object matching the requested version (if any) and asks
|
// Finds a Result object matching the requested version (if any) and asks
|
||||||
// that object to parse the plugin result, returning an error if parsing failed.
|
// that object to parse the plugin result, returning an error if parsing failed.
|
||||||
func NewResult(version string, resultBytes []byte) (types.Result, error) {
|
func NewResult(version string, resultBytes []byte) (types.Result, error) {
|
||||||
reconciler := &Reconciler{}
|
return create.Create(version, resultBytes)
|
||||||
for _, resultFactory := range resultFactories {
|
|
||||||
err := reconciler.CheckRaw(version, resultFactory.supportedVersions)
|
|
||||||
if err == nil {
|
|
||||||
// Result supports this version
|
|
||||||
return resultFactory.newResult(resultBytes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("unsupported CNI result version %q", version)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParsePrevResult parses a prevResult in a NetConf structure and sets
|
// ParsePrevResult parses a prevResult in a NetConf structure and sets
|
||||||
|
@ -68,15 +67,22 @@ func ParsePrevResult(conf *types.NetConf) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prior to 1.0.0, Result types may not marshal a CNIVersion. Since the
|
||||||
|
// result version must match the config version, if the Result's version
|
||||||
|
// is empty, inject the config version.
|
||||||
|
if ver, ok := conf.RawPrevResult["CNIVersion"]; !ok || ver == "" {
|
||||||
|
conf.RawPrevResult["CNIVersion"] = conf.CNIVersion
|
||||||
|
}
|
||||||
|
|
||||||
resultBytes, err := json.Marshal(conf.RawPrevResult)
|
resultBytes, err := json.Marshal(conf.RawPrevResult)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not serialize prevResult: %v", err)
|
return fmt.Errorf("could not serialize prevResult: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
conf.RawPrevResult = nil
|
conf.RawPrevResult = nil
|
||||||
conf.PrevResult, err = NewResult(conf.CNIVersion, resultBytes)
|
conf.PrevResult, err = create.Create(conf.CNIVersion, resultBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not parse prevResult: %v", err)
|
return fmt.Errorf("could not parse prevResult: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
10
vendor/github.com/vishvananda/netlink/class_linux.go
generated
vendored
10
vendor/github.com/vishvananda/netlink/class_linux.go
generated
vendored
|
@ -176,6 +176,12 @@ func classPayload(req *nl.NetlinkRequest, class Class) error {
|
||||||
options.AddRtAttr(nl.TCA_HTB_PARMS, opt.Serialize())
|
options.AddRtAttr(nl.TCA_HTB_PARMS, opt.Serialize())
|
||||||
options.AddRtAttr(nl.TCA_HTB_RTAB, SerializeRtab(rtab))
|
options.AddRtAttr(nl.TCA_HTB_RTAB, SerializeRtab(rtab))
|
||||||
options.AddRtAttr(nl.TCA_HTB_CTAB, SerializeRtab(ctab))
|
options.AddRtAttr(nl.TCA_HTB_CTAB, SerializeRtab(ctab))
|
||||||
|
if htb.Rate >= uint64(1<<32) {
|
||||||
|
options.AddRtAttr(nl.TCA_HTB_RATE64, nl.Uint64Attr(htb.Rate))
|
||||||
|
}
|
||||||
|
if htb.Ceil >= uint64(1<<32) {
|
||||||
|
options.AddRtAttr(nl.TCA_HTB_CEIL64, nl.Uint64Attr(htb.Ceil))
|
||||||
|
}
|
||||||
case "hfsc":
|
case "hfsc":
|
||||||
hfsc := class.(*HfscClass)
|
hfsc := class.(*HfscClass)
|
||||||
opt := nl.HfscCopt{}
|
opt := nl.HfscCopt{}
|
||||||
|
@ -306,6 +312,10 @@ func parseHtbClassData(class Class, data []syscall.NetlinkRouteAttr) (bool, erro
|
||||||
htb.Quantum = opt.Quantum
|
htb.Quantum = opt.Quantum
|
||||||
htb.Level = opt.Level
|
htb.Level = opt.Level
|
||||||
htb.Prio = opt.Prio
|
htb.Prio = opt.Prio
|
||||||
|
case nl.TCA_HTB_RATE64:
|
||||||
|
htb.Rate = native.Uint64(datum.Value[0:8])
|
||||||
|
case nl.TCA_HTB_CEIL64:
|
||||||
|
htb.Ceil = native.Uint64(datum.Value[0:8])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return detailed, nil
|
return detailed, nil
|
||||||
|
|
121
vendor/github.com/vishvananda/netlink/devlink_linux.go
generated
vendored
121
vendor/github.com/vishvananda/netlink/devlink_linux.go
generated
vendored
|
@ -27,6 +27,18 @@ type DevlinkDevice struct {
|
||||||
Attrs DevlinkDevAttrs
|
Attrs DevlinkDevAttrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DevlinkPort represents port and its attributes
|
||||||
|
type DevlinkPort struct {
|
||||||
|
BusName string
|
||||||
|
DeviceName string
|
||||||
|
PortIndex uint32
|
||||||
|
PortType uint16
|
||||||
|
NetdeviceName string
|
||||||
|
NetdevIfIndex uint32
|
||||||
|
RdmaDeviceName string
|
||||||
|
PortFlavour uint16
|
||||||
|
}
|
||||||
|
|
||||||
func parseDevLinkDeviceList(msgs [][]byte) ([]*DevlinkDevice, error) {
|
func parseDevLinkDeviceList(msgs [][]byte) ([]*DevlinkDevice, error) {
|
||||||
devices := make([]*DevlinkDevice, 0, len(msgs))
|
devices := make([]*DevlinkDevice, 0, len(msgs))
|
||||||
for _, m := range msgs {
|
for _, m := range msgs {
|
||||||
|
@ -270,3 +282,112 @@ func (h *Handle) DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error
|
||||||
func DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error {
|
func DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error {
|
||||||
return pkgHandle.DevLinkSetEswitchMode(Dev, NewMode)
|
return pkgHandle.DevLinkSetEswitchMode(Dev, NewMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (port *DevlinkPort) parseAttributes(attrs []syscall.NetlinkRouteAttr) error {
|
||||||
|
for _, a := range attrs {
|
||||||
|
switch a.Attr.Type {
|
||||||
|
case nl.DEVLINK_ATTR_BUS_NAME:
|
||||||
|
port.BusName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_DEV_NAME:
|
||||||
|
port.DeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_INDEX:
|
||||||
|
port.PortIndex = native.Uint32(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_TYPE:
|
||||||
|
port.PortType = native.Uint16(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_NETDEV_NAME:
|
||||||
|
port.NetdeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_NETDEV_IFINDEX:
|
||||||
|
port.NetdevIfIndex = native.Uint32(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_IBDEV_NAME:
|
||||||
|
port.RdmaDeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_FLAVOUR:
|
||||||
|
port.PortFlavour = native.Uint16(a.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDevLinkAllPortList(msgs [][]byte) ([]*DevlinkPort, error) {
|
||||||
|
ports := make([]*DevlinkPort, 0, len(msgs))
|
||||||
|
for _, m := range msgs {
|
||||||
|
attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
port := &DevlinkPort{}
|
||||||
|
if err = port.parseAttributes(attrs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ports = append(ports, port)
|
||||||
|
}
|
||||||
|
return ports, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortList provides a pointer to devlink ports and nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func (h *Handle) DevLinkGetAllPortList() ([]*DevlinkPort, error) {
|
||||||
|
f, err := h.GenlFamilyGet(nl.GENL_DEVLINK_NAME)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
msg := &nl.Genlmsg{
|
||||||
|
Command: nl.DEVLINK_CMD_PORT_GET,
|
||||||
|
Version: nl.GENL_DEVLINK_VERSION,
|
||||||
|
}
|
||||||
|
req := h.newNetlinkRequest(int(f.ID),
|
||||||
|
unix.NLM_F_REQUEST|unix.NLM_F_ACK|unix.NLM_F_DUMP)
|
||||||
|
req.AddData(msg)
|
||||||
|
msgs, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ports, err := parseDevLinkAllPortList(msgs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ports, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortList provides a pointer to devlink ports and nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func DevLinkGetAllPortList() ([]*DevlinkPort, error) {
|
||||||
|
return pkgHandle.DevLinkGetAllPortList()
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDevlinkPortMsg(msgs [][]byte) (*DevlinkPort, error) {
|
||||||
|
m := msgs[0]
|
||||||
|
attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
port := &DevlinkPort{}
|
||||||
|
if err = port.parseAttributes(attrs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return port, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortByIndexprovides a pointer to devlink device and nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func (h *Handle) DevLinkGetPortByIndex(Bus string, Device string, PortIndex uint32) (*DevlinkPort, error) {
|
||||||
|
|
||||||
|
_, req, err := h.createCmdReq(nl.DEVLINK_CMD_PORT_GET, Bus, Device)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.AddData(nl.NewRtAttr(nl.DEVLINK_ATTR_PORT_INDEX, nl.Uint32Attr(PortIndex)))
|
||||||
|
|
||||||
|
respmsg, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
port, err := parseDevlinkPortMsg(respmsg)
|
||||||
|
return port, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortByIndex provides a pointer to devlink portand nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func DevLinkGetPortByIndex(Bus string, Device string, PortIndex uint32) (*DevlinkPort, error) {
|
||||||
|
return pkgHandle.DevLinkGetPortByIndex(Bus, Device, PortIndex)
|
||||||
|
}
|
||||||
|
|
6
vendor/github.com/vishvananda/netlink/filter_linux.go
generated
vendored
6
vendor/github.com/vishvananda/netlink/filter_linux.go
generated
vendored
|
@ -36,6 +36,7 @@ type U32 struct {
|
||||||
ClassId uint32
|
ClassId uint32
|
||||||
Divisor uint32 // Divisor MUST be power of 2.
|
Divisor uint32 // Divisor MUST be power of 2.
|
||||||
Hash uint32
|
Hash uint32
|
||||||
|
Link uint32
|
||||||
RedirIndex int
|
RedirIndex int
|
||||||
Sel *TcU32Sel
|
Sel *TcU32Sel
|
||||||
Actions []Action
|
Actions []Action
|
||||||
|
@ -225,6 +226,9 @@ func (h *Handle) filterModify(filter Filter, flags int) error {
|
||||||
if filter.Hash != 0 {
|
if filter.Hash != 0 {
|
||||||
options.AddRtAttr(nl.TCA_U32_HASH, nl.Uint32Attr(filter.Hash))
|
options.AddRtAttr(nl.TCA_U32_HASH, nl.Uint32Attr(filter.Hash))
|
||||||
}
|
}
|
||||||
|
if filter.Link != 0 {
|
||||||
|
options.AddRtAttr(nl.TCA_U32_LINK, nl.Uint32Attr(filter.Link))
|
||||||
|
}
|
||||||
actionsAttr := options.AddRtAttr(nl.TCA_U32_ACT, nil)
|
actionsAttr := options.AddRtAttr(nl.TCA_U32_ACT, nil)
|
||||||
// backwards compatibility
|
// backwards compatibility
|
||||||
if filter.RedirIndex != 0 {
|
if filter.RedirIndex != 0 {
|
||||||
|
@ -666,6 +670,8 @@ func parseU32Data(filter Filter, data []syscall.NetlinkRouteAttr) (bool, error)
|
||||||
u32.Divisor = native.Uint32(datum.Value)
|
u32.Divisor = native.Uint32(datum.Value)
|
||||||
case nl.TCA_U32_HASH:
|
case nl.TCA_U32_HASH:
|
||||||
u32.Hash = native.Uint32(datum.Value)
|
u32.Hash = native.Uint32(datum.Value)
|
||||||
|
case nl.TCA_U32_LINK:
|
||||||
|
u32.Link = native.Uint32(datum.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return detailed, nil
|
return detailed, nil
|
||||||
|
|
16
vendor/github.com/vishvananda/netlink/handle_linux.go
generated
vendored
16
vendor/github.com/vishvananda/netlink/handle_linux.go
generated
vendored
|
@ -21,6 +21,22 @@ type Handle struct {
|
||||||
lookupByDump bool
|
lookupByDump bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetSocketTimeout configures timeout for default netlink sockets
|
||||||
|
func SetSocketTimeout(to time.Duration) error {
|
||||||
|
if to < time.Microsecond {
|
||||||
|
return fmt.Errorf("invalid timeout, minimul value is %s", time.Microsecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
nl.SocketTimeoutTv = unix.NsecToTimeval(to.Nanoseconds())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSocketTimeout returns the timeout value used by default netlink sockets
|
||||||
|
func GetSocketTimeout() time.Duration {
|
||||||
|
nsec := unix.TimevalToNsec(nl.SocketTimeoutTv)
|
||||||
|
return time.Duration(nsec) * time.Nanosecond
|
||||||
|
}
|
||||||
|
|
||||||
// SupportsNetlinkFamily reports whether the passed netlink family is supported by this Handle
|
// SupportsNetlinkFamily reports whether the passed netlink family is supported by this Handle
|
||||||
func (h *Handle) SupportsNetlinkFamily(nlFamily int) bool {
|
func (h *Handle) SupportsNetlinkFamily(nlFamily int) bool {
|
||||||
_, ok := h.sockets[nlFamily]
|
_, ok := h.sockets[nlFamily]
|
||||||
|
|
4
vendor/github.com/vishvananda/netlink/handle_unspecified.go
generated
vendored
4
vendor/github.com/vishvananda/netlink/handle_unspecified.go
generated
vendored
|
@ -237,6 +237,10 @@ func (h *Handle) RouteAdd(route *Route) error {
|
||||||
return ErrNotImplemented
|
return ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handle) RouteAppend(route *Route) error {
|
||||||
|
return ErrNotImplemented
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handle) RouteDel(route *Route) error {
|
func (h *Handle) RouteDel(route *Route) error {
|
||||||
return ErrNotImplemented
|
return ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
1
vendor/github.com/vishvananda/netlink/inet_diag.go
generated
vendored
1
vendor/github.com/vishvananda/netlink/inet_diag.go
generated
vendored
|
@ -27,4 +27,5 @@ const (
|
||||||
type InetDiagTCPInfoResp struct {
|
type InetDiagTCPInfoResp struct {
|
||||||
InetDiagMsg *Socket
|
InetDiagMsg *Socket
|
||||||
TCPInfo *TCPInfo
|
TCPInfo *TCPInfo
|
||||||
|
TCPBBRInfo *TCPBBRInfo
|
||||||
}
|
}
|
||||||
|
|
60
vendor/github.com/vishvananda/netlink/ipset_linux.go
generated
vendored
60
vendor/github.com/vishvananda/netlink/ipset_linux.go
generated
vendored
|
@ -23,13 +23,15 @@ type IPSetEntry struct {
|
||||||
|
|
||||||
// IPSetResult is the result of a dump request for a set
|
// IPSetResult is the result of a dump request for a set
|
||||||
type IPSetResult struct {
|
type IPSetResult struct {
|
||||||
Nfgenmsg *nl.Nfgenmsg
|
Nfgenmsg *nl.Nfgenmsg
|
||||||
Protocol uint8
|
Protocol uint8
|
||||||
Revision uint8
|
ProtocolMinVersion uint8
|
||||||
Family uint8
|
Revision uint8
|
||||||
Flags uint8
|
Family uint8
|
||||||
SetName string
|
Flags uint8
|
||||||
TypeName string
|
SetName string
|
||||||
|
TypeName string
|
||||||
|
Comment string
|
||||||
|
|
||||||
HashSize uint32
|
HashSize uint32
|
||||||
NumEntries uint32
|
NumEntries uint32
|
||||||
|
@ -38,6 +40,7 @@ type IPSetResult struct {
|
||||||
SizeInMemory uint32
|
SizeInMemory uint32
|
||||||
CadtFlags uint32
|
CadtFlags uint32
|
||||||
Timeout *uint32
|
Timeout *uint32
|
||||||
|
LineNo uint32
|
||||||
|
|
||||||
Entries []IPSetEntry
|
Entries []IPSetEntry
|
||||||
}
|
}
|
||||||
|
@ -52,7 +55,7 @@ type IpsetCreateOptions struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IpsetProtocol returns the ipset protocol version from the kernel
|
// IpsetProtocol returns the ipset protocol version from the kernel
|
||||||
func IpsetProtocol() (uint8, error) {
|
func IpsetProtocol() (uint8, uint8, error) {
|
||||||
return pkgHandle.IpsetProtocol()
|
return pkgHandle.IpsetProtocol()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,20 +89,20 @@ func IpsetAdd(setname string, entry *IPSetEntry) error {
|
||||||
return pkgHandle.ipsetAddDel(nl.IPSET_CMD_ADD, setname, entry)
|
return pkgHandle.ipsetAddDel(nl.IPSET_CMD_ADD, setname, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IpsetDele deletes an entry from an existing ipset.
|
// IpsetDel deletes an entry from an existing ipset.
|
||||||
func IpsetDel(setname string, entry *IPSetEntry) error {
|
func IpsetDel(setname string, entry *IPSetEntry) error {
|
||||||
return pkgHandle.ipsetAddDel(nl.IPSET_CMD_DEL, setname, entry)
|
return pkgHandle.ipsetAddDel(nl.IPSET_CMD_DEL, setname, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handle) IpsetProtocol() (uint8, error) {
|
func (h *Handle) IpsetProtocol() (protocol uint8, minVersion uint8, err error) {
|
||||||
req := h.newIpsetRequest(nl.IPSET_CMD_PROTOCOL)
|
req := h.newIpsetRequest(nl.IPSET_CMD_PROTOCOL)
|
||||||
msgs, err := req.Execute(unix.NETLINK_NETFILTER, 0)
|
msgs, err := req.Execute(unix.NETLINK_NETFILTER, 0)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
|
response := ipsetUnserialize(msgs)
|
||||||
return ipsetUnserialize(msgs).Protocol, nil
|
return response.Protocol, response.ProtocolMinVersion, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handle) IpsetCreate(setname, typename string, options IpsetCreateOptions) error {
|
func (h *Handle) IpsetCreate(setname, typename string, options IpsetCreateOptions) error {
|
||||||
|
@ -112,7 +115,7 @@ func (h *Handle) IpsetCreate(setname, typename string, options IpsetCreateOption
|
||||||
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_SETNAME, nl.ZeroTerminated(setname)))
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_SETNAME, nl.ZeroTerminated(setname)))
|
||||||
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_TYPENAME, nl.ZeroTerminated(typename)))
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_TYPENAME, nl.ZeroTerminated(typename)))
|
||||||
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_REVISION, nl.Uint8Attr(0)))
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_REVISION, nl.Uint8Attr(0)))
|
||||||
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_FAMILY, nl.Uint8Attr(0)))
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_FAMILY, nl.Uint8Attr(2))) // 2 == inet
|
||||||
|
|
||||||
data := nl.NewRtAttr(nl.IPSET_ATTR_DATA|int(nl.NLA_F_NESTED), nil)
|
data := nl.NewRtAttr(nl.IPSET_ATTR_DATA|int(nl.NLA_F_NESTED), nil)
|
||||||
|
|
||||||
|
@ -187,6 +190,11 @@ func (h *Handle) IpsetListAll() ([]IPSetResult, error) {
|
||||||
func (h *Handle) ipsetAddDel(nlCmd int, setname string, entry *IPSetEntry) error {
|
func (h *Handle) ipsetAddDel(nlCmd int, setname string, entry *IPSetEntry) error {
|
||||||
req := h.newIpsetRequest(nlCmd)
|
req := h.newIpsetRequest(nlCmd)
|
||||||
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_SETNAME, nl.ZeroTerminated(setname)))
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_SETNAME, nl.ZeroTerminated(setname)))
|
||||||
|
|
||||||
|
if entry.Comment != "" {
|
||||||
|
req.AddData(nl.NewRtAttr(nl.IPSET_ATTR_COMMENT, nl.ZeroTerminated(entry.Comment)))
|
||||||
|
}
|
||||||
|
|
||||||
data := nl.NewRtAttr(nl.IPSET_ATTR_DATA|int(nl.NLA_F_NESTED), nil)
|
data := nl.NewRtAttr(nl.IPSET_ATTR_DATA|int(nl.NLA_F_NESTED), nil)
|
||||||
|
|
||||||
if !entry.Replace {
|
if !entry.Replace {
|
||||||
|
@ -197,7 +205,12 @@ func (h *Handle) ipsetAddDel(nlCmd int, setname string, entry *IPSetEntry) error
|
||||||
data.AddChild(&nl.Uint32Attribute{Type: nl.IPSET_ATTR_TIMEOUT | nl.NLA_F_NET_BYTEORDER, Value: *entry.Timeout})
|
data.AddChild(&nl.Uint32Attribute{Type: nl.IPSET_ATTR_TIMEOUT | nl.NLA_F_NET_BYTEORDER, Value: *entry.Timeout})
|
||||||
}
|
}
|
||||||
if entry.MAC != nil {
|
if entry.MAC != nil {
|
||||||
data.AddChild(nl.NewRtAttr(nl.IPSET_ATTR_ETHER, entry.MAC))
|
nestedData := nl.NewRtAttr(nl.IPSET_ATTR_ETHER|int(nl.NLA_F_NET_BYTEORDER), entry.MAC)
|
||||||
|
data.AddChild(nl.NewRtAttr(nl.IPSET_ATTR_ETHER|int(nl.NLA_F_NESTED), nestedData.Serialize()))
|
||||||
|
}
|
||||||
|
if entry.IP != nil {
|
||||||
|
nestedData := nl.NewRtAttr(nl.IPSET_ATTR_IP|int(nl.NLA_F_NET_BYTEORDER), entry.IP)
|
||||||
|
data.AddChild(nl.NewRtAttr(nl.IPSET_ATTR_IP|int(nl.NLA_F_NESTED), nestedData.Serialize()))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.AddChild(&nl.Uint32Attribute{Type: nl.IPSET_ATTR_LINENO | nl.NLA_F_NET_BYTEORDER, Value: 0})
|
data.AddChild(&nl.Uint32Attribute{Type: nl.IPSET_ATTR_LINENO | nl.NLA_F_NET_BYTEORDER, Value: 0})
|
||||||
|
@ -249,6 +262,8 @@ func (result *IPSetResult) unserialize(msg []byte) {
|
||||||
result.Protocol = attr.Value[0]
|
result.Protocol = attr.Value[0]
|
||||||
case nl.IPSET_ATTR_SETNAME:
|
case nl.IPSET_ATTR_SETNAME:
|
||||||
result.SetName = nl.BytesToString(attr.Value)
|
result.SetName = nl.BytesToString(attr.Value)
|
||||||
|
case nl.IPSET_ATTR_COMMENT:
|
||||||
|
result.Comment = nl.BytesToString(attr.Value)
|
||||||
case nl.IPSET_ATTR_TYPENAME:
|
case nl.IPSET_ATTR_TYPENAME:
|
||||||
result.TypeName = nl.BytesToString(attr.Value)
|
result.TypeName = nl.BytesToString(attr.Value)
|
||||||
case nl.IPSET_ATTR_REVISION:
|
case nl.IPSET_ATTR_REVISION:
|
||||||
|
@ -261,6 +276,8 @@ func (result *IPSetResult) unserialize(msg []byte) {
|
||||||
result.parseAttrData(attr.Value)
|
result.parseAttrData(attr.Value)
|
||||||
case nl.IPSET_ATTR_ADT | nl.NLA_F_NESTED:
|
case nl.IPSET_ATTR_ADT | nl.NLA_F_NESTED:
|
||||||
result.parseAttrADT(attr.Value)
|
result.parseAttrADT(attr.Value)
|
||||||
|
case nl.IPSET_ATTR_PROTOCOL_MIN:
|
||||||
|
result.ProtocolMinVersion = attr.Value[0]
|
||||||
default:
|
default:
|
||||||
log.Printf("unknown ipset attribute from kernel: %+v %v", attr, attr.Type&nl.NLA_TYPE_MASK)
|
log.Printf("unknown ipset attribute from kernel: %+v %v", attr, attr.Type&nl.NLA_TYPE_MASK)
|
||||||
}
|
}
|
||||||
|
@ -285,6 +302,17 @@ func (result *IPSetResult) parseAttrData(data []byte) {
|
||||||
result.SizeInMemory = attr.Uint32()
|
result.SizeInMemory = attr.Uint32()
|
||||||
case nl.IPSET_ATTR_CADT_FLAGS | nl.NLA_F_NET_BYTEORDER:
|
case nl.IPSET_ATTR_CADT_FLAGS | nl.NLA_F_NET_BYTEORDER:
|
||||||
result.CadtFlags = attr.Uint32()
|
result.CadtFlags = attr.Uint32()
|
||||||
|
case nl.IPSET_ATTR_IP | nl.NLA_F_NESTED:
|
||||||
|
for nested := range nl.ParseAttributes(attr.Value) {
|
||||||
|
switch nested.Type {
|
||||||
|
case nl.IPSET_ATTR_IP | nl.NLA_F_NET_BYTEORDER:
|
||||||
|
result.Entries = append(result.Entries, IPSetEntry{IP: nested.Value})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case nl.IPSET_ATTR_CADT_LINENO | nl.NLA_F_NET_BYTEORDER:
|
||||||
|
result.LineNo = attr.Uint32()
|
||||||
|
case nl.IPSET_ATTR_COMMENT:
|
||||||
|
result.Comment = nl.BytesToString(attr.Value)
|
||||||
default:
|
default:
|
||||||
log.Printf("unknown ipset data attribute from kernel: %+v %v", attr, attr.Type&nl.NLA_TYPE_MASK)
|
log.Printf("unknown ipset data attribute from kernel: %+v %v", attr, attr.Type&nl.NLA_TYPE_MASK)
|
||||||
}
|
}
|
||||||
|
@ -316,6 +344,8 @@ func parseIPSetEntry(data []byte) (entry IPSetEntry) {
|
||||||
entry.Packets = &val
|
entry.Packets = &val
|
||||||
case nl.IPSET_ATTR_ETHER:
|
case nl.IPSET_ATTR_ETHER:
|
||||||
entry.MAC = net.HardwareAddr(attr.Value)
|
entry.MAC = net.HardwareAddr(attr.Value)
|
||||||
|
case nl.IPSET_ATTR_IP:
|
||||||
|
entry.IP = net.IP(attr.Value)
|
||||||
case nl.IPSET_ATTR_COMMENT:
|
case nl.IPSET_ATTR_COMMENT:
|
||||||
entry.Comment = nl.BytesToString(attr.Value)
|
entry.Comment = nl.BytesToString(attr.Value)
|
||||||
case nl.IPSET_ATTR_IP | nl.NLA_F_NESTED:
|
case nl.IPSET_ATTR_IP | nl.NLA_F_NESTED:
|
||||||
|
|
195
vendor/github.com/vishvananda/netlink/link.go
generated
vendored
195
vendor/github.com/vishvananda/netlink/link.go
generated
vendored
|
@ -555,6 +555,27 @@ const (
|
||||||
BOND_ARP_VALIDATE_ALL
|
BOND_ARP_VALIDATE_ALL
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bondArpValidateToString = map[BondArpValidate]string{
|
||||||
|
BOND_ARP_VALIDATE_NONE: "none",
|
||||||
|
BOND_ARP_VALIDATE_ACTIVE: "active",
|
||||||
|
BOND_ARP_VALIDATE_BACKUP: "backup",
|
||||||
|
BOND_ARP_VALIDATE_ALL: "none",
|
||||||
|
}
|
||||||
|
var StringToBondArpValidateMap = map[string]BondArpValidate{
|
||||||
|
"none": BOND_ARP_VALIDATE_NONE,
|
||||||
|
"active": BOND_ARP_VALIDATE_ACTIVE,
|
||||||
|
"backup": BOND_ARP_VALIDATE_BACKUP,
|
||||||
|
"all": BOND_ARP_VALIDATE_ALL,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BondArpValidate) String() string {
|
||||||
|
s, ok := bondArpValidateToString[b]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Sprintf("BondArpValidate(%d)", b)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// BondPrimaryReselect type
|
// BondPrimaryReselect type
|
||||||
type BondPrimaryReselect int
|
type BondPrimaryReselect int
|
||||||
|
|
||||||
|
@ -565,6 +586,25 @@ const (
|
||||||
BOND_PRIMARY_RESELECT_FAILURE
|
BOND_PRIMARY_RESELECT_FAILURE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bondPrimaryReselectToString = map[BondPrimaryReselect]string{
|
||||||
|
BOND_PRIMARY_RESELECT_ALWAYS: "always",
|
||||||
|
BOND_PRIMARY_RESELECT_BETTER: "better",
|
||||||
|
BOND_PRIMARY_RESELECT_FAILURE: "failure",
|
||||||
|
}
|
||||||
|
var StringToBondPrimaryReselectMap = map[string]BondPrimaryReselect{
|
||||||
|
"always": BOND_PRIMARY_RESELECT_ALWAYS,
|
||||||
|
"better": BOND_PRIMARY_RESELECT_BETTER,
|
||||||
|
"failure": BOND_PRIMARY_RESELECT_FAILURE,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BondPrimaryReselect) String() string {
|
||||||
|
s, ok := bondPrimaryReselectToString[b]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Sprintf("BondPrimaryReselect(%d)", b)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// BondArpAllTargets type
|
// BondArpAllTargets type
|
||||||
type BondArpAllTargets int
|
type BondArpAllTargets int
|
||||||
|
|
||||||
|
@ -574,6 +614,23 @@ const (
|
||||||
BOND_ARP_ALL_TARGETS_ALL
|
BOND_ARP_ALL_TARGETS_ALL
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bondArpAllTargetsToString = map[BondArpAllTargets]string{
|
||||||
|
BOND_ARP_ALL_TARGETS_ANY: "any",
|
||||||
|
BOND_ARP_ALL_TARGETS_ALL: "all",
|
||||||
|
}
|
||||||
|
var StringToBondArpAllTargetsMap = map[string]BondArpAllTargets{
|
||||||
|
"any": BOND_ARP_ALL_TARGETS_ANY,
|
||||||
|
"all": BOND_ARP_ALL_TARGETS_ALL,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BondArpAllTargets) String() string {
|
||||||
|
s, ok := bondArpAllTargetsToString[b]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Sprintf("BondArpAllTargets(%d)", b)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// BondFailOverMac type
|
// BondFailOverMac type
|
||||||
type BondFailOverMac int
|
type BondFailOverMac int
|
||||||
|
|
||||||
|
@ -584,6 +641,25 @@ const (
|
||||||
BOND_FAIL_OVER_MAC_FOLLOW
|
BOND_FAIL_OVER_MAC_FOLLOW
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bondFailOverMacToString = map[BondFailOverMac]string{
|
||||||
|
BOND_FAIL_OVER_MAC_NONE: "none",
|
||||||
|
BOND_FAIL_OVER_MAC_ACTIVE: "active",
|
||||||
|
BOND_FAIL_OVER_MAC_FOLLOW: "follow",
|
||||||
|
}
|
||||||
|
var StringToBondFailOverMacMap = map[string]BondFailOverMac{
|
||||||
|
"none": BOND_FAIL_OVER_MAC_NONE,
|
||||||
|
"active": BOND_FAIL_OVER_MAC_ACTIVE,
|
||||||
|
"follow": BOND_FAIL_OVER_MAC_FOLLOW,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BondFailOverMac) String() string {
|
||||||
|
s, ok := bondFailOverMacToString[b]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Sprintf("BondFailOverMac(%d)", b)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// BondXmitHashPolicy type
|
// BondXmitHashPolicy type
|
||||||
type BondXmitHashPolicy int
|
type BondXmitHashPolicy int
|
||||||
|
|
||||||
|
@ -675,6 +751,25 @@ const (
|
||||||
BOND_AD_SELECT_COUNT
|
BOND_AD_SELECT_COUNT
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bondAdSelectToString = map[BondAdSelect]string{
|
||||||
|
BOND_AD_SELECT_STABLE: "stable",
|
||||||
|
BOND_AD_SELECT_BANDWIDTH: "bandwidth",
|
||||||
|
BOND_AD_SELECT_COUNT: "count",
|
||||||
|
}
|
||||||
|
var StringToBondAdSelectMap = map[string]BondAdSelect{
|
||||||
|
"stable": BOND_AD_SELECT_STABLE,
|
||||||
|
"bandwidth": BOND_AD_SELECT_BANDWIDTH,
|
||||||
|
"count": BOND_AD_SELECT_COUNT,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BondAdSelect) String() string {
|
||||||
|
s, ok := bondAdSelectToString[b]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Sprintf("BondAdSelect(%d)", b)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// BondAdInfo represents ad info for bond
|
// BondAdInfo represents ad info for bond
|
||||||
type BondAdInfo struct {
|
type BondAdInfo struct {
|
||||||
AggregatorId int
|
AggregatorId int
|
||||||
|
@ -706,7 +801,7 @@ type Bond struct {
|
||||||
AllSlavesActive int
|
AllSlavesActive int
|
||||||
MinLinks int
|
MinLinks int
|
||||||
LpInterval int
|
LpInterval int
|
||||||
PackersPerSlave int
|
PacketsPerSlave int
|
||||||
LacpRate BondLacpRate
|
LacpRate BondLacpRate
|
||||||
AdSelect BondAdSelect
|
AdSelect BondAdSelect
|
||||||
// looking at iproute tool AdInfo can only be retrived. It can't be set.
|
// looking at iproute tool AdInfo can only be retrived. It can't be set.
|
||||||
|
@ -739,7 +834,7 @@ func NewLinkBond(atr LinkAttrs) *Bond {
|
||||||
AllSlavesActive: -1,
|
AllSlavesActive: -1,
|
||||||
MinLinks: -1,
|
MinLinks: -1,
|
||||||
LpInterval: -1,
|
LpInterval: -1,
|
||||||
PackersPerSlave: -1,
|
PacketsPerSlave: -1,
|
||||||
LacpRate: -1,
|
LacpRate: -1,
|
||||||
AdSelect: -1,
|
AdSelect: -1,
|
||||||
AdActorSysPrio: -1,
|
AdActorSysPrio: -1,
|
||||||
|
@ -789,8 +884,10 @@ func (bond *Bond) Type() string {
|
||||||
type BondSlaveState uint8
|
type BondSlaveState uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
BondStateActive = iota // Link is active.
|
//BondStateActive Link is active.
|
||||||
BondStateBackup // Link is backup.
|
BondStateActive BondSlaveState = iota
|
||||||
|
//BondStateBackup Link is backup.
|
||||||
|
BondStateBackup
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s BondSlaveState) String() string {
|
func (s BondSlaveState) String() string {
|
||||||
|
@ -804,15 +901,19 @@ func (s BondSlaveState) String() string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// BondSlaveState represents the values of the IFLA_BOND_SLAVE_MII_STATUS bond slave
|
// BondSlaveMiiStatus represents the values of the IFLA_BOND_SLAVE_MII_STATUS bond slave
|
||||||
// attribute, which contains the status of MII link monitoring
|
// attribute, which contains the status of MII link monitoring
|
||||||
type BondSlaveMiiStatus uint8
|
type BondSlaveMiiStatus uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
BondLinkUp = iota // link is up and running.
|
//BondLinkUp link is up and running.
|
||||||
BondLinkFail // link has just gone down.
|
BondLinkUp BondSlaveMiiStatus = iota
|
||||||
BondLinkDown // link has been down for too long time.
|
//BondLinkFail link has just gone down.
|
||||||
BondLinkBack // link is going back.
|
BondLinkFail
|
||||||
|
//BondLinkDown link has been down for too long time.
|
||||||
|
BondLinkDown
|
||||||
|
//BondLinkBack link is going back.
|
||||||
|
BondLinkBack
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s BondSlaveMiiStatus) String() string {
|
func (s BondSlaveMiiStatus) String() string {
|
||||||
|
@ -845,6 +946,30 @@ func (b *BondSlave) SlaveType() string {
|
||||||
return "bond"
|
return "bond"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Geneve devices must specify RemoteIP and ID (VNI) on create
|
||||||
|
// https://github.com/torvalds/linux/blob/47ec5303d73ea344e84f46660fff693c57641386/drivers/net/geneve.c#L1209-L1223
|
||||||
|
type Geneve struct {
|
||||||
|
LinkAttrs
|
||||||
|
ID uint32 // vni
|
||||||
|
Remote net.IP
|
||||||
|
Ttl uint8
|
||||||
|
Tos uint8
|
||||||
|
Dport uint16
|
||||||
|
UdpCsum uint8
|
||||||
|
UdpZeroCsum6Tx uint8
|
||||||
|
UdpZeroCsum6Rx uint8
|
||||||
|
Link uint32
|
||||||
|
FlowBased bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (geneve *Geneve) Attrs() *LinkAttrs {
|
||||||
|
return &geneve.LinkAttrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (geneve *Geneve) Type() string {
|
||||||
|
return "geneve"
|
||||||
|
}
|
||||||
|
|
||||||
// Gretap devices must specify LocalIP and RemoteIP on create
|
// Gretap devices must specify LocalIP and RemoteIP on create
|
||||||
type Gretap struct {
|
type Gretap struct {
|
||||||
LinkAttrs
|
LinkAttrs
|
||||||
|
@ -1068,6 +1193,58 @@ var StringToIPoIBMode = map[string]IPoIBMode{
|
||||||
"connected": IPOIB_MODE_CONNECTED,
|
"connected": IPOIB_MODE_CONNECTED,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
CAN_STATE_ERROR_ACTIVE = iota
|
||||||
|
CAN_STATE_ERROR_WARNING
|
||||||
|
CAN_STATE_ERROR_PASSIVE
|
||||||
|
CAN_STATE_BUS_OFF
|
||||||
|
CAN_STATE_STOPPED
|
||||||
|
CAN_STATE_SLEEPING
|
||||||
|
)
|
||||||
|
|
||||||
|
type Can struct {
|
||||||
|
LinkAttrs
|
||||||
|
|
||||||
|
BitRate uint32
|
||||||
|
SamplePoint uint32
|
||||||
|
TimeQuanta uint32
|
||||||
|
PropagationSegment uint32
|
||||||
|
PhaseSegment1 uint32
|
||||||
|
PhaseSegment2 uint32
|
||||||
|
SyncJumpWidth uint32
|
||||||
|
BitRatePreScaler uint32
|
||||||
|
|
||||||
|
Name string
|
||||||
|
TimeSegment1Min uint32
|
||||||
|
TimeSegment1Max uint32
|
||||||
|
TimeSegment2Min uint32
|
||||||
|
TimeSegment2Max uint32
|
||||||
|
SyncJumpWidthMax uint32
|
||||||
|
BitRatePreScalerMin uint32
|
||||||
|
BitRatePreScalerMax uint32
|
||||||
|
BitRatePreScalerInc uint32
|
||||||
|
|
||||||
|
ClockFrequency uint32
|
||||||
|
|
||||||
|
State uint32
|
||||||
|
|
||||||
|
Mask uint32
|
||||||
|
Flags uint32
|
||||||
|
|
||||||
|
TxError uint16
|
||||||
|
RxError uint16
|
||||||
|
|
||||||
|
RestartMs uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (can *Can) Attrs() *LinkAttrs {
|
||||||
|
return &can.LinkAttrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (can *Can) Type() string {
|
||||||
|
return "can"
|
||||||
|
}
|
||||||
|
|
||||||
type IPoIB struct {
|
type IPoIB struct {
|
||||||
LinkAttrs
|
LinkAttrs
|
||||||
Pkey uint16
|
Pkey uint16
|
||||||
|
|
131
vendor/github.com/vishvananda/netlink/link_linux.go
generated
vendored
131
vendor/github.com/vishvananda/netlink/link_linux.go
generated
vendored
|
@ -34,6 +34,21 @@ const (
|
||||||
TUNTAP_MULTI_QUEUE_DEFAULTS TuntapFlag = TUNTAP_MULTI_QUEUE | TUNTAP_NO_PI
|
TUNTAP_MULTI_QUEUE_DEFAULTS TuntapFlag = TUNTAP_MULTI_QUEUE | TUNTAP_NO_PI
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var StringToTuntapModeMap = map[string]TuntapMode{
|
||||||
|
"tun": TUNTAP_MODE_TUN,
|
||||||
|
"tap": TUNTAP_MODE_TAP,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ttm TuntapMode) String() string {
|
||||||
|
switch ttm {
|
||||||
|
case TUNTAP_MODE_TUN:
|
||||||
|
return "tun"
|
||||||
|
case TUNTAP_MODE_TAP:
|
||||||
|
return "tap"
|
||||||
|
}
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
VF_LINK_STATE_AUTO uint32 = 0
|
VF_LINK_STATE_AUTO uint32 = 0
|
||||||
VF_LINK_STATE_ENABLE uint32 = 1
|
VF_LINK_STATE_ENABLE uint32 = 1
|
||||||
|
@ -1046,8 +1061,8 @@ func addBondAttrs(bond *Bond, linkInfo *nl.RtAttr) {
|
||||||
if bond.LpInterval >= 0 {
|
if bond.LpInterval >= 0 {
|
||||||
data.AddRtAttr(nl.IFLA_BOND_LP_INTERVAL, nl.Uint32Attr(uint32(bond.LpInterval)))
|
data.AddRtAttr(nl.IFLA_BOND_LP_INTERVAL, nl.Uint32Attr(uint32(bond.LpInterval)))
|
||||||
}
|
}
|
||||||
if bond.PackersPerSlave >= 0 {
|
if bond.PacketsPerSlave >= 0 {
|
||||||
data.AddRtAttr(nl.IFLA_BOND_PACKETS_PER_SLAVE, nl.Uint32Attr(uint32(bond.PackersPerSlave)))
|
data.AddRtAttr(nl.IFLA_BOND_PACKETS_PER_SLAVE, nl.Uint32Attr(uint32(bond.PacketsPerSlave)))
|
||||||
}
|
}
|
||||||
if bond.LacpRate >= 0 {
|
if bond.LacpRate >= 0 {
|
||||||
data.AddRtAttr(nl.IFLA_BOND_AD_LACP_RATE, nl.Uint8Attr(uint8(bond.LacpRate)))
|
data.AddRtAttr(nl.IFLA_BOND_AD_LACP_RATE, nl.Uint8Attr(uint8(bond.LacpRate)))
|
||||||
|
@ -1404,6 +1419,8 @@ func (h *Handle) linkModify(link Link, flags int) error {
|
||||||
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
||||||
data.AddRtAttr(nl.IFLA_MACVLAN_MODE, nl.Uint32Attr(macvlanModes[link.Mode]))
|
data.AddRtAttr(nl.IFLA_MACVLAN_MODE, nl.Uint32Attr(macvlanModes[link.Mode]))
|
||||||
}
|
}
|
||||||
|
case *Geneve:
|
||||||
|
addGeneveAttrs(link, linkInfo)
|
||||||
case *Gretap:
|
case *Gretap:
|
||||||
addGretapAttrs(link, linkInfo)
|
addGretapAttrs(link, linkInfo)
|
||||||
case *Iptun:
|
case *Iptun:
|
||||||
|
@ -1667,6 +1684,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
|
||||||
link = &Macvlan{}
|
link = &Macvlan{}
|
||||||
case "macvtap":
|
case "macvtap":
|
||||||
link = &Macvtap{}
|
link = &Macvtap{}
|
||||||
|
case "geneve":
|
||||||
|
link = &Geneve{}
|
||||||
case "gretap":
|
case "gretap":
|
||||||
link = &Gretap{}
|
link = &Gretap{}
|
||||||
case "ip6gretap":
|
case "ip6gretap":
|
||||||
|
@ -1693,6 +1712,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
|
||||||
link = &Tuntap{}
|
link = &Tuntap{}
|
||||||
case "ipoib":
|
case "ipoib":
|
||||||
link = &IPoIB{}
|
link = &IPoIB{}
|
||||||
|
case "can":
|
||||||
|
link = &Can{}
|
||||||
default:
|
default:
|
||||||
link = &GenericLink{LinkType: linkType}
|
link = &GenericLink{LinkType: linkType}
|
||||||
}
|
}
|
||||||
|
@ -1714,6 +1735,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
|
||||||
parseMacvlanData(link, data)
|
parseMacvlanData(link, data)
|
||||||
case "macvtap":
|
case "macvtap":
|
||||||
parseMacvtapData(link, data)
|
parseMacvtapData(link, data)
|
||||||
|
case "geneve":
|
||||||
|
parseGeneveData(link, data)
|
||||||
case "gretap":
|
case "gretap":
|
||||||
parseGretapData(link, data)
|
parseGretapData(link, data)
|
||||||
case "ip6gretap":
|
case "ip6gretap":
|
||||||
|
@ -1742,6 +1765,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
|
||||||
parseTuntapData(link, data)
|
parseTuntapData(link, data)
|
||||||
case "ipoib":
|
case "ipoib":
|
||||||
parseIPoIBData(link, data)
|
parseIPoIBData(link, data)
|
||||||
|
case "can":
|
||||||
|
parseCanData(link, data)
|
||||||
}
|
}
|
||||||
case nl.IFLA_INFO_SLAVE_KIND:
|
case nl.IFLA_INFO_SLAVE_KIND:
|
||||||
slaveType = string(info.Value[:len(info.Value)-1])
|
slaveType = string(info.Value[:len(info.Value)-1])
|
||||||
|
@ -2299,7 +2324,7 @@ func parseBondData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
case nl.IFLA_BOND_LP_INTERVAL:
|
case nl.IFLA_BOND_LP_INTERVAL:
|
||||||
bond.LpInterval = int(native.Uint32(data[i].Value[0:4]))
|
bond.LpInterval = int(native.Uint32(data[i].Value[0:4]))
|
||||||
case nl.IFLA_BOND_PACKETS_PER_SLAVE:
|
case nl.IFLA_BOND_PACKETS_PER_SLAVE:
|
||||||
bond.PackersPerSlave = int(native.Uint32(data[i].Value[0:4]))
|
bond.PacketsPerSlave = int(native.Uint32(data[i].Value[0:4]))
|
||||||
case nl.IFLA_BOND_AD_LACP_RATE:
|
case nl.IFLA_BOND_AD_LACP_RATE:
|
||||||
bond.LacpRate = BondLacpRate(data[i].Value[0])
|
bond.LacpRate = BondLacpRate(data[i].Value[0])
|
||||||
case nl.IFLA_BOND_AD_SELECT:
|
case nl.IFLA_BOND_AD_SELECT:
|
||||||
|
@ -2448,6 +2473,58 @@ func linkFlags(rawFlags uint32) net.Flags {
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addGeneveAttrs(geneve *Geneve, linkInfo *nl.RtAttr) {
|
||||||
|
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
||||||
|
|
||||||
|
if geneve.FlowBased {
|
||||||
|
// In flow based mode, no other attributes need to be configured
|
||||||
|
linkInfo.AddRtAttr(nl.IFLA_GENEVE_COLLECT_METADATA, boolAttr(geneve.FlowBased))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ip := geneve.Remote; ip != nil {
|
||||||
|
if ip4 := ip.To4(); ip4 != nil {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_REMOTE, ip.To4())
|
||||||
|
} else {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_REMOTE6, []byte(ip))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if geneve.ID != 0 {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_ID, nl.Uint32Attr(geneve.ID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if geneve.Dport != 0 {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_PORT, htons(geneve.Dport))
|
||||||
|
}
|
||||||
|
|
||||||
|
if geneve.Ttl != 0 {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_TTL, nl.Uint8Attr(geneve.Ttl))
|
||||||
|
}
|
||||||
|
|
||||||
|
if geneve.Tos != 0 {
|
||||||
|
data.AddRtAttr(nl.IFLA_GENEVE_TOS, nl.Uint8Attr(geneve.Tos))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseGeneveData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
|
geneve := link.(*Geneve)
|
||||||
|
for _, datum := range data {
|
||||||
|
switch datum.Attr.Type {
|
||||||
|
case nl.IFLA_GENEVE_ID:
|
||||||
|
geneve.ID = native.Uint32(datum.Value[0:4])
|
||||||
|
case nl.IFLA_GENEVE_REMOTE, nl.IFLA_GENEVE_REMOTE6:
|
||||||
|
geneve.Remote = datum.Value
|
||||||
|
case nl.IFLA_GENEVE_PORT:
|
||||||
|
geneve.Dport = ntohs(datum.Value[0:2])
|
||||||
|
case nl.IFLA_GENEVE_TTL:
|
||||||
|
geneve.Ttl = uint8(datum.Value[0])
|
||||||
|
case nl.IFLA_GENEVE_TOS:
|
||||||
|
geneve.Tos = uint8(datum.Value[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func addGretapAttrs(gretap *Gretap, linkInfo *nl.RtAttr) {
|
func addGretapAttrs(gretap *Gretap, linkInfo *nl.RtAttr) {
|
||||||
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
||||||
|
|
||||||
|
@ -3172,6 +3249,54 @@ func parseIPoIBData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseCanData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
|
can := link.(*Can)
|
||||||
|
for _, datum := range data {
|
||||||
|
|
||||||
|
switch datum.Attr.Type {
|
||||||
|
case nl.IFLA_CAN_BITTIMING:
|
||||||
|
can.BitRate = native.Uint32(datum.Value)
|
||||||
|
can.SamplePoint = native.Uint32(datum.Value[4:])
|
||||||
|
can.TimeQuanta = native.Uint32(datum.Value[8:])
|
||||||
|
can.PropagationSegment = native.Uint32(datum.Value[12:])
|
||||||
|
can.PhaseSegment1 = native.Uint32(datum.Value[16:])
|
||||||
|
can.PhaseSegment2 = native.Uint32(datum.Value[20:])
|
||||||
|
can.SyncJumpWidth = native.Uint32(datum.Value[24:])
|
||||||
|
can.BitRatePreScaler = native.Uint32(datum.Value[28:])
|
||||||
|
case nl.IFLA_CAN_BITTIMING_CONST:
|
||||||
|
can.Name = string(datum.Value[:16])
|
||||||
|
can.TimeSegment1Min = native.Uint32(datum.Value[16:])
|
||||||
|
can.TimeSegment1Max = native.Uint32(datum.Value[20:])
|
||||||
|
can.TimeSegment2Min = native.Uint32(datum.Value[24:])
|
||||||
|
can.TimeSegment2Max = native.Uint32(datum.Value[28:])
|
||||||
|
can.SyncJumpWidthMax = native.Uint32(datum.Value[32:])
|
||||||
|
can.BitRatePreScalerMin = native.Uint32(datum.Value[36:])
|
||||||
|
can.BitRatePreScalerMax = native.Uint32(datum.Value[40:])
|
||||||
|
can.BitRatePreScalerInc = native.Uint32(datum.Value[44:])
|
||||||
|
case nl.IFLA_CAN_CLOCK:
|
||||||
|
can.ClockFrequency = native.Uint32(datum.Value)
|
||||||
|
case nl.IFLA_CAN_STATE:
|
||||||
|
can.State = native.Uint32(datum.Value)
|
||||||
|
case nl.IFLA_CAN_CTRLMODE:
|
||||||
|
can.Mask = native.Uint32(datum.Value)
|
||||||
|
can.Flags = native.Uint32(datum.Value[4:])
|
||||||
|
case nl.IFLA_CAN_BERR_COUNTER:
|
||||||
|
can.TxError = native.Uint16(datum.Value)
|
||||||
|
can.RxError = native.Uint16(datum.Value[2:])
|
||||||
|
case nl.IFLA_CAN_RESTART_MS:
|
||||||
|
can.RestartMs = native.Uint32(datum.Value)
|
||||||
|
case nl.IFLA_CAN_DATA_BITTIMING_CONST:
|
||||||
|
case nl.IFLA_CAN_RESTART:
|
||||||
|
case nl.IFLA_CAN_DATA_BITTIMING:
|
||||||
|
case nl.IFLA_CAN_TERMINATION:
|
||||||
|
case nl.IFLA_CAN_TERMINATION_CONST:
|
||||||
|
case nl.IFLA_CAN_BITRATE_CONST:
|
||||||
|
case nl.IFLA_CAN_DATA_BITRATE_CONST:
|
||||||
|
case nl.IFLA_CAN_BITRATE_MAX:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func addIPoIBAttrs(ipoib *IPoIB, linkInfo *nl.RtAttr) {
|
func addIPoIBAttrs(ipoib *IPoIB, linkInfo *nl.RtAttr) {
|
||||||
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil)
|
||||||
data.AddRtAttr(nl.IFLA_IPOIB_PKEY, nl.Uint16Attr(uint16(ipoib.Pkey)))
|
data.AddRtAttr(nl.IFLA_IPOIB_PKEY, nl.Uint16Attr(uint16(ipoib.Pkey)))
|
||||||
|
|
23
vendor/github.com/vishvananda/netlink/nl/devlink_linux.go
generated
vendored
23
vendor/github.com/vishvananda/netlink/nl/devlink_linux.go
generated
vendored
|
@ -10,6 +10,7 @@ const (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
DEVLINK_CMD_GET = 1
|
DEVLINK_CMD_GET = 1
|
||||||
|
DEVLINK_CMD_PORT_GET = 5
|
||||||
DEVLINK_CMD_ESWITCH_GET = 29
|
DEVLINK_CMD_ESWITCH_GET = 29
|
||||||
DEVLINK_CMD_ESWITCH_SET = 30
|
DEVLINK_CMD_ESWITCH_SET = 30
|
||||||
)
|
)
|
||||||
|
@ -17,9 +18,15 @@ const (
|
||||||
const (
|
const (
|
||||||
DEVLINK_ATTR_BUS_NAME = 1
|
DEVLINK_ATTR_BUS_NAME = 1
|
||||||
DEVLINK_ATTR_DEV_NAME = 2
|
DEVLINK_ATTR_DEV_NAME = 2
|
||||||
|
DEVLINK_ATTR_PORT_INDEX = 3
|
||||||
|
DEVLINK_ATTR_PORT_TYPE = 4
|
||||||
|
DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6
|
||||||
|
DEVLINK_ATTR_PORT_NETDEV_NAME = 7
|
||||||
|
DEVLINK_ATTR_PORT_IBDEV_NAME = 8
|
||||||
DEVLINK_ATTR_ESWITCH_MODE = 25
|
DEVLINK_ATTR_ESWITCH_MODE = 25
|
||||||
DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26
|
DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26
|
||||||
DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62
|
DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62
|
||||||
|
DEVLINK_ATTR_PORT_FLAVOUR = 77
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -38,3 +45,19 @@ const (
|
||||||
DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0
|
DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0
|
||||||
DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1
|
DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEVLINK_PORT_FLAVOUR_PHYSICAL = 0
|
||||||
|
DEVLINK_PORT_FLAVOUR_CPU = 1
|
||||||
|
DEVLINK_PORT_FLAVOUR_DSA = 2
|
||||||
|
DEVLINK_PORT_FLAVOUR_PCI_PF = 3
|
||||||
|
DEVLINK_PORT_FLAVOUR_PCI_VF = 4
|
||||||
|
DEVLINK_PORT_FLAVOUR_VIRTUAL = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEVLINK_PORT_TYPE_NOTSET = 0
|
||||||
|
DEVLINK_PORT_TYPE_AUTO = 1
|
||||||
|
DEVLINK_PORT_TYPE_ETH = 2
|
||||||
|
DEVLINK_PORT_TYPE_IB = 3
|
||||||
|
)
|
||||||
|
|
36
vendor/github.com/vishvananda/netlink/nl/link_linux.go
generated
vendored
36
vendor/github.com/vishvananda/netlink/nl/link_linux.go
generated
vendored
|
@ -173,6 +173,22 @@ const (
|
||||||
IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE
|
IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
IFLA_GENEVE_UNSPEC = iota
|
||||||
|
IFLA_GENEVE_ID // vni
|
||||||
|
IFLA_GENEVE_REMOTE
|
||||||
|
IFLA_GENEVE_TTL
|
||||||
|
IFLA_GENEVE_TOS
|
||||||
|
IFLA_GENEVE_PORT // destination port
|
||||||
|
IFLA_GENEVE_COLLECT_METADATA
|
||||||
|
IFLA_GENEVE_REMOTE6
|
||||||
|
IFLA_GENEVE_UDP_CSUM
|
||||||
|
IFLA_GENEVE_UDP_ZERO_CSUM6_TX
|
||||||
|
IFLA_GENEVE_UDP_ZERO_CSUM6_RX
|
||||||
|
IFLA_GENEVE_LABEL
|
||||||
|
IFLA_GENEVE_MAX = IFLA_GENEVE_LABEL
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
IFLA_GRE_UNSPEC = iota
|
IFLA_GRE_UNSPEC = iota
|
||||||
IFLA_GRE_LINK
|
IFLA_GRE_LINK
|
||||||
|
@ -673,3 +689,23 @@ const (
|
||||||
IFLA_IPOIB_UMCAST
|
IFLA_IPOIB_UMCAST
|
||||||
IFLA_IPOIB_MAX = IFLA_IPOIB_UMCAST
|
IFLA_IPOIB_MAX = IFLA_IPOIB_UMCAST
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
IFLA_CAN_UNSPEC = iota
|
||||||
|
IFLA_CAN_BITTIMING
|
||||||
|
IFLA_CAN_BITTIMING_CONST
|
||||||
|
IFLA_CAN_CLOCK
|
||||||
|
IFLA_CAN_STATE
|
||||||
|
IFLA_CAN_CTRLMODE
|
||||||
|
IFLA_CAN_RESTART_MS
|
||||||
|
IFLA_CAN_RESTART
|
||||||
|
IFLA_CAN_BERR_COUNTER
|
||||||
|
IFLA_CAN_DATA_BITTIMING
|
||||||
|
IFLA_CAN_DATA_BITTIMING_CONST
|
||||||
|
IFLA_CAN_TERMINATION
|
||||||
|
IFLA_CAN_TERMINATION_CONST
|
||||||
|
IFLA_CAN_BITRATE_CONST
|
||||||
|
IFLA_CAN_DATA_BITRATE_CONST
|
||||||
|
IFLA_CAN_BITRATE_MAX
|
||||||
|
IFLA_CAN_MAX = IFLA_CAN_BITRATE_MAX
|
||||||
|
)
|
||||||
|
|
11
vendor/github.com/vishvananda/netlink/nl/nl_linux.go
generated
vendored
11
vendor/github.com/vishvananda/netlink/nl/nl_linux.go
generated
vendored
|
@ -35,6 +35,9 @@ var SupportedNlFamilies = []int{unix.NETLINK_ROUTE, unix.NETLINK_XFRM, unix.NETL
|
||||||
|
|
||||||
var nextSeqNr uint32
|
var nextSeqNr uint32
|
||||||
|
|
||||||
|
// Default netlink socket timeout, 60s
|
||||||
|
var SocketTimeoutTv = unix.Timeval{Sec: 60, Usec: 0}
|
||||||
|
|
||||||
// GetIPFamily returns the family type of a net.IP.
|
// GetIPFamily returns the family type of a net.IP.
|
||||||
func GetIPFamily(ip net.IP) int {
|
func GetIPFamily(ip net.IP) int {
|
||||||
if len(ip) <= net.IPv4len {
|
if len(ip) <= net.IPv4len {
|
||||||
|
@ -426,6 +429,14 @@ func (req *NetlinkRequest) Execute(sockType int, resType uint16) ([][]byte, erro
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := s.SetSendTimeout(&SocketTimeoutTv); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := s.SetReceiveTimeout(&SocketTimeoutTv); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
defer s.Close()
|
defer s.Close()
|
||||||
} else {
|
} else {
|
||||||
s.Lock()
|
s.Lock()
|
||||||
|
|
|
@ -3,6 +3,7 @@ package nl
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Attribute struct {
|
type Attribute struct {
|
||||||
|
@ -18,9 +19,20 @@ func ParseAttributes(data []byte) <-chan Attribute {
|
||||||
i := 0
|
i := 0
|
||||||
for i+4 < len(data) {
|
for i+4 < len(data) {
|
||||||
length := int(native.Uint16(data[i : i+2]))
|
length := int(native.Uint16(data[i : i+2]))
|
||||||
|
attrType := native.Uint16(data[i+2 : i+4])
|
||||||
|
|
||||||
|
if length < 4 {
|
||||||
|
log.Printf("attribute 0x%02x has invalid length of %d bytes", attrType, length)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(data) < i+length {
|
||||||
|
log.Printf("attribute 0x%02x of length %d is truncated, only %d bytes remaining", attrType, length, len(data)-i)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
result <- Attribute{
|
result <- Attribute{
|
||||||
Type: native.Uint16(data[i+2 : i+4]),
|
Type: attrType,
|
||||||
Value: data[i+4 : i+length],
|
Value: data[i+4 : i+length],
|
||||||
}
|
}
|
||||||
i += rtaAlignOf(length)
|
i += rtaAlignOf(length)
|
16
vendor/github.com/vishvananda/netlink/qdisc.go
generated
vendored
16
vendor/github.com/vishvananda/netlink/qdisc.go
generated
vendored
|
@ -308,13 +308,15 @@ func (qdisc *Fq) Type() string {
|
||||||
// FQ_Codel (Fair Queuing Controlled Delay) is queuing discipline that combines Fair Queuing with the CoDel AQM scheme.
|
// FQ_Codel (Fair Queuing Controlled Delay) is queuing discipline that combines Fair Queuing with the CoDel AQM scheme.
|
||||||
type FqCodel struct {
|
type FqCodel struct {
|
||||||
QdiscAttrs
|
QdiscAttrs
|
||||||
Target uint32
|
Target uint32
|
||||||
Limit uint32
|
Limit uint32
|
||||||
Interval uint32
|
Interval uint32
|
||||||
ECN uint32
|
ECN uint32
|
||||||
Flows uint32
|
Flows uint32
|
||||||
Quantum uint32
|
Quantum uint32
|
||||||
// There are some more attributes here, but support for them seems not ubiquitous
|
CEThreshold uint32
|
||||||
|
DropBatchSize uint32
|
||||||
|
MemoryLimit uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fqcodel *FqCodel) String() string {
|
func (fqcodel *FqCodel) String() string {
|
||||||
|
|
16
vendor/github.com/vishvananda/netlink/qdisc_linux.go
generated
vendored
16
vendor/github.com/vishvananda/netlink/qdisc_linux.go
generated
vendored
|
@ -250,7 +250,15 @@ func qdiscPayload(req *nl.NetlinkRequest, qdisc Qdisc) error {
|
||||||
if qdisc.Quantum > 0 {
|
if qdisc.Quantum > 0 {
|
||||||
options.AddRtAttr(nl.TCA_FQ_CODEL_QUANTUM, nl.Uint32Attr((uint32(qdisc.Quantum))))
|
options.AddRtAttr(nl.TCA_FQ_CODEL_QUANTUM, nl.Uint32Attr((uint32(qdisc.Quantum))))
|
||||||
}
|
}
|
||||||
|
if qdisc.CEThreshold > 0 {
|
||||||
|
options.AddRtAttr(nl.TCA_FQ_CODEL_CE_THRESHOLD, nl.Uint32Attr(qdisc.CEThreshold))
|
||||||
|
}
|
||||||
|
if qdisc.DropBatchSize > 0 {
|
||||||
|
options.AddRtAttr(nl.TCA_FQ_CODEL_DROP_BATCH_SIZE, nl.Uint32Attr(qdisc.DropBatchSize))
|
||||||
|
}
|
||||||
|
if qdisc.MemoryLimit > 0 {
|
||||||
|
options.AddRtAttr(nl.TCA_FQ_CODEL_MEMORY_LIMIT, nl.Uint32Attr(qdisc.MemoryLimit))
|
||||||
|
}
|
||||||
case *Fq:
|
case *Fq:
|
||||||
options.AddRtAttr(nl.TCA_FQ_RATE_ENABLE, nl.Uint32Attr((uint32(qdisc.Pacing))))
|
options.AddRtAttr(nl.TCA_FQ_RATE_ENABLE, nl.Uint32Attr((uint32(qdisc.Pacing))))
|
||||||
|
|
||||||
|
@ -497,6 +505,12 @@ func parseFqCodelData(qdisc Qdisc, data []syscall.NetlinkRouteAttr) error {
|
||||||
fqCodel.Flows = native.Uint32(datum.Value)
|
fqCodel.Flows = native.Uint32(datum.Value)
|
||||||
case nl.TCA_FQ_CODEL_QUANTUM:
|
case nl.TCA_FQ_CODEL_QUANTUM:
|
||||||
fqCodel.Quantum = native.Uint32(datum.Value)
|
fqCodel.Quantum = native.Uint32(datum.Value)
|
||||||
|
case nl.TCA_FQ_CODEL_CE_THRESHOLD:
|
||||||
|
fqCodel.CEThreshold = native.Uint32(datum.Value)
|
||||||
|
case nl.TCA_FQ_CODEL_DROP_BATCH_SIZE:
|
||||||
|
fqCodel.DropBatchSize = native.Uint32(datum.Value)
|
||||||
|
case nl.TCA_FQ_CODEL_MEMORY_LIMIT:
|
||||||
|
fqCodel.MemoryLimit = native.Uint32(datum.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
14
vendor/github.com/vishvananda/netlink/route.go
generated
vendored
14
vendor/github.com/vishvananda/netlink/route.go
generated
vendored
|
@ -27,6 +27,9 @@ type Encap interface {
|
||||||
Equal(Encap) bool
|
Equal(Encap) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Protocol describe what was the originator of the route
|
||||||
|
type RouteProtocol int
|
||||||
|
|
||||||
// Route represents a netlink route.
|
// Route represents a netlink route.
|
||||||
type Route struct {
|
type Route struct {
|
||||||
LinkIndex int
|
LinkIndex int
|
||||||
|
@ -36,7 +39,7 @@ type Route struct {
|
||||||
Src net.IP
|
Src net.IP
|
||||||
Gw net.IP
|
Gw net.IP
|
||||||
MultiPath []*NexthopInfo
|
MultiPath []*NexthopInfo
|
||||||
Protocol int
|
Protocol RouteProtocol
|
||||||
Priority int
|
Priority int
|
||||||
Table int
|
Table int
|
||||||
Type int
|
Type int
|
||||||
|
@ -45,6 +48,7 @@ type Route struct {
|
||||||
MPLSDst *int
|
MPLSDst *int
|
||||||
NewDst Destination
|
NewDst Destination
|
||||||
Encap Encap
|
Encap Encap
|
||||||
|
Via Destination
|
||||||
MTU int
|
MTU int
|
||||||
Window int
|
Window int
|
||||||
Rtt int
|
Rtt int
|
||||||
|
@ -79,6 +83,9 @@ func (r Route) String() string {
|
||||||
if r.Encap != nil {
|
if r.Encap != nil {
|
||||||
elems = append(elems, fmt.Sprintf("Encap: %s", r.Encap))
|
elems = append(elems, fmt.Sprintf("Encap: %s", r.Encap))
|
||||||
}
|
}
|
||||||
|
if r.Via != nil {
|
||||||
|
elems = append(elems, fmt.Sprintf("Via: %s", r.Via))
|
||||||
|
}
|
||||||
elems = append(elems, fmt.Sprintf("Src: %s", r.Src))
|
elems = append(elems, fmt.Sprintf("Src: %s", r.Src))
|
||||||
if len(r.MultiPath) > 0 {
|
if len(r.MultiPath) > 0 {
|
||||||
elems = append(elems, fmt.Sprintf("Gw: %s", r.MultiPath))
|
elems = append(elems, fmt.Sprintf("Gw: %s", r.MultiPath))
|
||||||
|
@ -107,6 +114,7 @@ func (r Route) Equal(x Route) bool {
|
||||||
r.Flags == x.Flags &&
|
r.Flags == x.Flags &&
|
||||||
(r.MPLSDst == x.MPLSDst || (r.MPLSDst != nil && x.MPLSDst != nil && *r.MPLSDst == *x.MPLSDst)) &&
|
(r.MPLSDst == x.MPLSDst || (r.MPLSDst != nil && x.MPLSDst != nil && *r.MPLSDst == *x.MPLSDst)) &&
|
||||||
(r.NewDst == x.NewDst || (r.NewDst != nil && r.NewDst.Equal(x.NewDst))) &&
|
(r.NewDst == x.NewDst || (r.NewDst != nil && r.NewDst.Equal(x.NewDst))) &&
|
||||||
|
(r.Via == x.Via || (r.Via != nil && r.Via.Equal(x.Via))) &&
|
||||||
(r.Encap == x.Encap || (r.Encap != nil && r.Encap.Equal(x.Encap)))
|
(r.Encap == x.Encap || (r.Encap != nil && r.Encap.Equal(x.Encap)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,6 +144,7 @@ type NexthopInfo struct {
|
||||||
Flags int
|
Flags int
|
||||||
NewDst Destination
|
NewDst Destination
|
||||||
Encap Encap
|
Encap Encap
|
||||||
|
Via Destination
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NexthopInfo) String() string {
|
func (n *NexthopInfo) String() string {
|
||||||
|
@ -147,6 +156,9 @@ func (n *NexthopInfo) String() string {
|
||||||
if n.Encap != nil {
|
if n.Encap != nil {
|
||||||
elems = append(elems, fmt.Sprintf("Encap: %s", n.Encap))
|
elems = append(elems, fmt.Sprintf("Encap: %s", n.Encap))
|
||||||
}
|
}
|
||||||
|
if n.Via != nil {
|
||||||
|
elems = append(elems, fmt.Sprintf("Via: %s", n.Via))
|
||||||
|
}
|
||||||
elems = append(elems, fmt.Sprintf("Weight: %d", n.Hops+1))
|
elems = append(elems, fmt.Sprintf("Weight: %d", n.Hops+1))
|
||||||
elems = append(elems, fmt.Sprintf("Gw: %s", n.Gw))
|
elems = append(elems, fmt.Sprintf("Gw: %s", n.Gw))
|
||||||
elems = append(elems, fmt.Sprintf("Flags: %s", n.ListFlags()))
|
elems = append(elems, fmt.Sprintf("Flags: %s", n.ListFlags()))
|
||||||
|
|
220
vendor/github.com/vishvananda/netlink/route_linux.go
generated
vendored
220
vendor/github.com/vishvananda/netlink/route_linux.go
generated
vendored
|
@ -1,8 +1,11 @@
|
||||||
package netlink
|
package netlink
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
@ -21,6 +24,23 @@ const (
|
||||||
SCOPE_NOWHERE Scope = unix.RT_SCOPE_NOWHERE
|
SCOPE_NOWHERE Scope = unix.RT_SCOPE_NOWHERE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (s Scope) String() string {
|
||||||
|
switch s {
|
||||||
|
case SCOPE_UNIVERSE:
|
||||||
|
return "universe"
|
||||||
|
case SCOPE_SITE:
|
||||||
|
return "site"
|
||||||
|
case SCOPE_LINK:
|
||||||
|
return "link"
|
||||||
|
case SCOPE_HOST:
|
||||||
|
return "host"
|
||||||
|
case SCOPE_NOWHERE:
|
||||||
|
return "nowhere"
|
||||||
|
default:
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
RT_FILTER_PROTOCOL uint64 = 1 << (1 + iota)
|
RT_FILTER_PROTOCOL uint64 = 1 << (1 + iota)
|
||||||
RT_FILTER_SCOPE
|
RT_FILTER_SCOPE
|
||||||
|
@ -446,6 +466,62 @@ func (e *SEG6LocalEncap) Equal(x Encap) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Via struct {
|
||||||
|
AddrFamily int
|
||||||
|
Addr net.IP
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Via) Equal(x Destination) bool {
|
||||||
|
o, ok := x.(*Via)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if v.AddrFamily == x.Family() && v.Addr.Equal(o.Addr) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Via) String() string {
|
||||||
|
return fmt.Sprintf("Family: %d, Address: %s", v.AddrFamily, v.Addr.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Via) Family() int {
|
||||||
|
return v.AddrFamily
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Via) Encode() ([]byte, error) {
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
err := binary.Write(buf, native, uint16(v.AddrFamily))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = binary.Write(buf, native, v.Addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Via) Decode(b []byte) error {
|
||||||
|
native := nl.NativeEndian()
|
||||||
|
if len(b) < 6 {
|
||||||
|
return fmt.Errorf("decoding failed: buffer too small (%d bytes)", len(b))
|
||||||
|
}
|
||||||
|
v.AddrFamily = int(native.Uint16(b[0:2]))
|
||||||
|
if v.AddrFamily == nl.FAMILY_V4 {
|
||||||
|
v.Addr = net.IP(b[2:6])
|
||||||
|
return nil
|
||||||
|
} else if v.AddrFamily == nl.FAMILY_V6 {
|
||||||
|
if len(b) < 18 {
|
||||||
|
return fmt.Errorf("decoding failed: buffer too small (%d bytes)", len(b))
|
||||||
|
}
|
||||||
|
v.Addr = net.IP(b[2:])
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("decoding failed: address family %d unknown", v.AddrFamily)
|
||||||
|
}
|
||||||
|
|
||||||
// RouteAdd will add a route to the system.
|
// RouteAdd will add a route to the system.
|
||||||
// Equivalent to: `ip route add $route`
|
// Equivalent to: `ip route add $route`
|
||||||
func RouteAdd(route *Route) error {
|
func RouteAdd(route *Route) error {
|
||||||
|
@ -460,6 +536,32 @@ func (h *Handle) RouteAdd(route *Route) error {
|
||||||
return h.routeHandle(route, req, nl.NewRtMsg())
|
return h.routeHandle(route, req, nl.NewRtMsg())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RouteAppend will append a route to the system.
|
||||||
|
// Equivalent to: `ip route append $route`
|
||||||
|
func RouteAppend(route *Route) error {
|
||||||
|
return pkgHandle.RouteAppend(route)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RouteAppend will append a route to the system.
|
||||||
|
// Equivalent to: `ip route append $route`
|
||||||
|
func (h *Handle) RouteAppend(route *Route) error {
|
||||||
|
flags := unix.NLM_F_CREATE | unix.NLM_F_APPEND | unix.NLM_F_ACK
|
||||||
|
req := h.newNetlinkRequest(unix.RTM_NEWROUTE, flags)
|
||||||
|
return h.routeHandle(route, req, nl.NewRtMsg())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RouteAddEcmp will add a route to the system.
|
||||||
|
func RouteAddEcmp(route *Route) error {
|
||||||
|
return pkgHandle.RouteAddEcmp(route)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RouteAddEcmp will add a route to the system.
|
||||||
|
func (h *Handle) RouteAddEcmp(route *Route) error {
|
||||||
|
flags := unix.NLM_F_CREATE | unix.NLM_F_ACK
|
||||||
|
req := h.newNetlinkRequest(unix.RTM_NEWROUTE, flags)
|
||||||
|
return h.routeHandle(route, req, nl.NewRtMsg())
|
||||||
|
}
|
||||||
|
|
||||||
// RouteReplace will add a route to the system.
|
// RouteReplace will add a route to the system.
|
||||||
// Equivalent to: `ip route replace $route`
|
// Equivalent to: `ip route replace $route`
|
||||||
func RouteReplace(route *Route) error {
|
func RouteReplace(route *Route) error {
|
||||||
|
@ -567,6 +669,14 @@ func (h *Handle) routeHandle(route *Route, req *nl.NetlinkRequest, msg *nl.RtMsg
|
||||||
rtAttrs = append(rtAttrs, nl.NewRtAttr(unix.RTA_GATEWAY, gwData))
|
rtAttrs = append(rtAttrs, nl.NewRtAttr(unix.RTA_GATEWAY, gwData))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if route.Via != nil {
|
||||||
|
buf, err := route.Via.Encode()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to encode RTA_VIA: %v", err)
|
||||||
|
}
|
||||||
|
rtAttrs = append(rtAttrs, nl.NewRtAttr(unix.RTA_VIA, buf))
|
||||||
|
}
|
||||||
|
|
||||||
if len(route.MultiPath) > 0 {
|
if len(route.MultiPath) > 0 {
|
||||||
buf := []byte{}
|
buf := []byte{}
|
||||||
for _, nh := range route.MultiPath {
|
for _, nh := range route.MultiPath {
|
||||||
|
@ -609,6 +719,13 @@ func (h *Handle) routeHandle(route *Route, req *nl.NetlinkRequest, msg *nl.RtMsg
|
||||||
}
|
}
|
||||||
children = append(children, nl.NewRtAttr(unix.RTA_ENCAP, buf))
|
children = append(children, nl.NewRtAttr(unix.RTA_ENCAP, buf))
|
||||||
}
|
}
|
||||||
|
if nh.Via != nil {
|
||||||
|
buf, err := nh.Via.Encode()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
children = append(children, nl.NewRtAttr(unix.RTA_VIA, buf))
|
||||||
|
}
|
||||||
rtnh.Children = children
|
rtnh.Children = children
|
||||||
buf = append(buf, rtnh.Serialize()...)
|
buf = append(buf, rtnh.Serialize()...)
|
||||||
}
|
}
|
||||||
|
@ -834,7 +951,7 @@ func deserializeRoute(m []byte) (Route, error) {
|
||||||
}
|
}
|
||||||
route := Route{
|
route := Route{
|
||||||
Scope: Scope(msg.Scope),
|
Scope: Scope(msg.Scope),
|
||||||
Protocol: int(msg.Protocol),
|
Protocol: RouteProtocol(int(msg.Protocol)),
|
||||||
Table: int(msg.Table),
|
Table: int(msg.Table),
|
||||||
Type: int(msg.Type),
|
Type: int(msg.Type),
|
||||||
Tos: int(msg.Tos),
|
Tos: int(msg.Tos),
|
||||||
|
@ -907,6 +1024,12 @@ func deserializeRoute(m []byte) (Route, error) {
|
||||||
encapType = attr
|
encapType = attr
|
||||||
case unix.RTA_ENCAP:
|
case unix.RTA_ENCAP:
|
||||||
encap = attr
|
encap = attr
|
||||||
|
case unix.RTA_VIA:
|
||||||
|
d := &Via{}
|
||||||
|
if err := d.Decode(attr.Value); err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
info.Via = d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -944,6 +1067,12 @@ func deserializeRoute(m []byte) (Route, error) {
|
||||||
return route, err
|
return route, err
|
||||||
}
|
}
|
||||||
route.NewDst = d
|
route.NewDst = d
|
||||||
|
case unix.RTA_VIA:
|
||||||
|
v := &Via{}
|
||||||
|
if err := v.Decode(attr.Value); err != nil {
|
||||||
|
return route, err
|
||||||
|
}
|
||||||
|
route.Via = v
|
||||||
case unix.RTA_ENCAP_TYPE:
|
case unix.RTA_ENCAP_TYPE:
|
||||||
encapType = attr
|
encapType = attr
|
||||||
case unix.RTA_ENCAP:
|
case unix.RTA_ENCAP:
|
||||||
|
@ -1022,6 +1151,7 @@ func deserializeRoute(m []byte) (Route, error) {
|
||||||
// RouteGetWithOptions
|
// RouteGetWithOptions
|
||||||
type RouteGetOptions struct {
|
type RouteGetOptions struct {
|
||||||
VrfName string
|
VrfName string
|
||||||
|
SrcAddr net.IP
|
||||||
}
|
}
|
||||||
|
|
||||||
// RouteGetWithOptions gets a route to a specific destination from the host system.
|
// RouteGetWithOptions gets a route to a specific destination from the host system.
|
||||||
|
@ -1053,23 +1183,40 @@ func (h *Handle) RouteGetWithOptions(destination net.IP, options *RouteGetOption
|
||||||
msg := &nl.RtMsg{}
|
msg := &nl.RtMsg{}
|
||||||
msg.Family = uint8(family)
|
msg.Family = uint8(family)
|
||||||
msg.Dst_len = bitlen
|
msg.Dst_len = bitlen
|
||||||
|
if options != nil && options.SrcAddr != nil {
|
||||||
|
msg.Src_len = bitlen
|
||||||
|
}
|
||||||
|
msg.Flags = unix.RTM_F_LOOKUP_TABLE
|
||||||
req.AddData(msg)
|
req.AddData(msg)
|
||||||
|
|
||||||
rtaDst := nl.NewRtAttr(unix.RTA_DST, destinationData)
|
rtaDst := nl.NewRtAttr(unix.RTA_DST, destinationData)
|
||||||
req.AddData(rtaDst)
|
req.AddData(rtaDst)
|
||||||
|
|
||||||
if options != nil {
|
if options != nil {
|
||||||
link, err := LinkByName(options.VrfName)
|
if options.VrfName != "" {
|
||||||
if err != nil {
|
link, err := LinkByName(options.VrfName)
|
||||||
return nil, err
|
if err != nil {
|
||||||
}
|
return nil, err
|
||||||
var (
|
}
|
||||||
b = make([]byte, 4)
|
var (
|
||||||
native = nl.NativeEndian()
|
b = make([]byte, 4)
|
||||||
)
|
native = nl.NativeEndian()
|
||||||
native.PutUint32(b, uint32(link.Attrs().Index))
|
)
|
||||||
|
native.PutUint32(b, uint32(link.Attrs().Index))
|
||||||
|
|
||||||
req.AddData(nl.NewRtAttr(unix.RTA_OIF, b))
|
req.AddData(nl.NewRtAttr(unix.RTA_OIF, b))
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.SrcAddr != nil {
|
||||||
|
var srcAddr []byte
|
||||||
|
if family == FAMILY_V4 {
|
||||||
|
srcAddr = options.SrcAddr.To4()
|
||||||
|
} else {
|
||||||
|
srcAddr = options.SrcAddr.To16()
|
||||||
|
}
|
||||||
|
|
||||||
|
req.AddData(nl.NewRtAttr(unix.RTA_SRC, srcAddr))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msgs, err := req.Execute(unix.NETLINK_ROUTE, unix.RTM_NEWROUTE)
|
msgs, err := req.Execute(unix.NETLINK_ROUTE, unix.RTM_NEWROUTE)
|
||||||
|
@ -1190,3 +1337,54 @@ func routeSubscribeAt(newNs, curNs netns.NsHandle, ch chan<- RouteUpdate, done <
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p RouteProtocol) String() string {
|
||||||
|
switch int(p) {
|
||||||
|
case unix.RTPROT_BABEL:
|
||||||
|
return "babel"
|
||||||
|
case unix.RTPROT_BGP:
|
||||||
|
return "bgp"
|
||||||
|
case unix.RTPROT_BIRD:
|
||||||
|
return "bird"
|
||||||
|
case unix.RTPROT_BOOT:
|
||||||
|
return "boot"
|
||||||
|
case unix.RTPROT_DHCP:
|
||||||
|
return "dhcp"
|
||||||
|
case unix.RTPROT_DNROUTED:
|
||||||
|
return "dnrouted"
|
||||||
|
case unix.RTPROT_EIGRP:
|
||||||
|
return "eigrp"
|
||||||
|
case unix.RTPROT_GATED:
|
||||||
|
return "gated"
|
||||||
|
case unix.RTPROT_ISIS:
|
||||||
|
return "isis"
|
||||||
|
//case unix.RTPROT_KEEPALIVED:
|
||||||
|
// return "keepalived"
|
||||||
|
case unix.RTPROT_KERNEL:
|
||||||
|
return "kernel"
|
||||||
|
case unix.RTPROT_MROUTED:
|
||||||
|
return "mrouted"
|
||||||
|
case unix.RTPROT_MRT:
|
||||||
|
return "mrt"
|
||||||
|
case unix.RTPROT_NTK:
|
||||||
|
return "ntk"
|
||||||
|
case unix.RTPROT_OSPF:
|
||||||
|
return "ospf"
|
||||||
|
case unix.RTPROT_RA:
|
||||||
|
return "ra"
|
||||||
|
case unix.RTPROT_REDIRECT:
|
||||||
|
return "redirect"
|
||||||
|
case unix.RTPROT_RIP:
|
||||||
|
return "rip"
|
||||||
|
case unix.RTPROT_STATIC:
|
||||||
|
return "static"
|
||||||
|
case unix.RTPROT_UNSPEC:
|
||||||
|
return "unspec"
|
||||||
|
case unix.RTPROT_XORP:
|
||||||
|
return "xorp"
|
||||||
|
case unix.RTPROT_ZEBRA:
|
||||||
|
return "zebra"
|
||||||
|
default:
|
||||||
|
return strconv.Itoa(int(p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
10
vendor/github.com/vishvananda/netlink/route_unspecified.go
generated
vendored
10
vendor/github.com/vishvananda/netlink/route_unspecified.go
generated
vendored
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
package netlink
|
package netlink
|
||||||
|
|
||||||
|
import "strconv"
|
||||||
|
|
||||||
func (r *Route) ListFlags() []string {
|
func (r *Route) ListFlags() []string {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
|
@ -9,3 +11,11 @@ func (r *Route) ListFlags() []string {
|
||||||
func (n *NexthopInfo) ListFlags() []string {
|
func (n *NexthopInfo) ListFlags() []string {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s Scope) String() string {
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p RouteProtocol) String() string {
|
||||||
|
return strconv.Itoa(int(p))
|
||||||
|
}
|
||||||
|
|
47
vendor/github.com/vishvananda/netlink/socket_linux.go
generated
vendored
47
vendor/github.com/vishvananda/netlink/socket_linux.go
generated
vendored
|
@ -184,7 +184,7 @@ func SocketDiagTCPInfo(family uint8) ([]*InetDiagTCPInfoResp, error) {
|
||||||
req.AddData(&socketRequest{
|
req.AddData(&socketRequest{
|
||||||
Family: family,
|
Family: family,
|
||||||
Protocol: unix.IPPROTO_TCP,
|
Protocol: unix.IPPROTO_TCP,
|
||||||
Ext: INET_DIAG_INFO,
|
Ext: (1 << (INET_DIAG_VEGASINFO - 1)) | (1 << (INET_DIAG_INFO - 1)),
|
||||||
States: uint32(0xfff), // All TCP states
|
States: uint32(0xfff), // All TCP states
|
||||||
})
|
})
|
||||||
s.Send(req)
|
s.Send(req)
|
||||||
|
@ -220,19 +220,42 @@ loop:
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var tcpInfo *TCPInfo
|
|
||||||
for _, a := range attrs {
|
res, err := attrsToInetDiagTCPInfoResp(attrs, sockInfo)
|
||||||
if a.Attr.Type == INET_DIAG_INFO {
|
if err != nil {
|
||||||
tcpInfo = &TCPInfo{}
|
return nil, err
|
||||||
if err := tcpInfo.deserialize(a.Value); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
r := &InetDiagTCPInfoResp{InetDiagMsg: sockInfo, TCPInfo: tcpInfo}
|
|
||||||
result = append(result, r)
|
result = append(result, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func attrsToInetDiagTCPInfoResp(attrs []syscall.NetlinkRouteAttr, sockInfo *Socket) (*InetDiagTCPInfoResp, error) {
|
||||||
|
var tcpInfo *TCPInfo
|
||||||
|
var tcpBBRInfo *TCPBBRInfo
|
||||||
|
for _, a := range attrs {
|
||||||
|
if a.Attr.Type == INET_DIAG_INFO {
|
||||||
|
tcpInfo = &TCPInfo{}
|
||||||
|
if err := tcpInfo.deserialize(a.Value); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.Attr.Type == INET_DIAG_BBRINFO {
|
||||||
|
tcpBBRInfo = &TCPBBRInfo{}
|
||||||
|
if err := tcpBBRInfo.deserialize(a.Value); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &InetDiagTCPInfoResp{
|
||||||
|
InetDiagMsg: sockInfo,
|
||||||
|
TCPInfo: tcpInfo,
|
||||||
|
TCPBBRInfo: tcpBBRInfo,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
66
vendor/github.com/vishvananda/netlink/tcp.go
generated
vendored
66
vendor/github.com/vishvananda/netlink/tcp.go
generated
vendored
|
@ -16,3 +16,69 @@ const (
|
||||||
TCP_NEW_SYN_REC
|
TCP_NEW_SYN_REC
|
||||||
TCP_MAX_STATES
|
TCP_MAX_STATES
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type TCPInfo struct {
|
||||||
|
State uint8
|
||||||
|
Ca_state uint8
|
||||||
|
Retransmits uint8
|
||||||
|
Probes uint8
|
||||||
|
Backoff uint8
|
||||||
|
Options uint8
|
||||||
|
Snd_wscale uint8 // no uint4
|
||||||
|
Rcv_wscale uint8
|
||||||
|
Delivery_rate_app_limited uint8
|
||||||
|
Fastopen_client_fail uint8
|
||||||
|
Rto uint32
|
||||||
|
Ato uint32
|
||||||
|
Snd_mss uint32
|
||||||
|
Rcv_mss uint32
|
||||||
|
Unacked uint32
|
||||||
|
Sacked uint32
|
||||||
|
Lost uint32
|
||||||
|
Retrans uint32
|
||||||
|
Fackets uint32
|
||||||
|
Last_data_sent uint32
|
||||||
|
Last_ack_sent uint32
|
||||||
|
Last_data_recv uint32
|
||||||
|
Last_ack_recv uint32
|
||||||
|
Pmtu uint32
|
||||||
|
Rcv_ssthresh uint32
|
||||||
|
Rtt uint32
|
||||||
|
Rttvar uint32
|
||||||
|
Snd_ssthresh uint32
|
||||||
|
Snd_cwnd uint32
|
||||||
|
Advmss uint32
|
||||||
|
Reordering uint32
|
||||||
|
Rcv_rtt uint32
|
||||||
|
Rcv_space uint32
|
||||||
|
Total_retrans uint32
|
||||||
|
Pacing_rate uint64
|
||||||
|
Max_pacing_rate uint64
|
||||||
|
Bytes_acked uint64 /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
|
||||||
|
Bytes_received uint64 /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
|
||||||
|
Segs_out uint32 /* RFC4898 tcpEStatsPerfSegsOut */
|
||||||
|
Segs_in uint32 /* RFC4898 tcpEStatsPerfSegsIn */
|
||||||
|
Notsent_bytes uint32
|
||||||
|
Min_rtt uint32
|
||||||
|
Data_segs_in uint32 /* RFC4898 tcpEStatsDataSegsIn */
|
||||||
|
Data_segs_out uint32 /* RFC4898 tcpEStatsDataSegsOut */
|
||||||
|
Delivery_rate uint64
|
||||||
|
Busy_time uint64 /* Time (usec) busy sending data */
|
||||||
|
Rwnd_limited uint64 /* Time (usec) limited by receive window */
|
||||||
|
Sndbuf_limited uint64 /* Time (usec) limited by send buffer */
|
||||||
|
Delivered uint32
|
||||||
|
Delivered_ce uint32
|
||||||
|
Bytes_sent uint64 /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
|
||||||
|
Bytes_retrans uint64 /* RFC4898 tcpEStatsPerfOctetsRetrans */
|
||||||
|
Dsack_dups uint32 /* RFC4898 tcpEStatsStackDSACKDups */
|
||||||
|
Reord_seen uint32 /* reordering events seen */
|
||||||
|
Rcv_ooopack uint32 /* Out-of-order packets received */
|
||||||
|
Snd_wnd uint32 /* peer's advertised receive window after * scaling (bytes) */
|
||||||
|
}
|
||||||
|
|
||||||
|
type TCPBBRInfo struct {
|
||||||
|
BBRBW uint64
|
||||||
|
BBRMinRTT uint32
|
||||||
|
BBRPacingGain uint32
|
||||||
|
BBRCwndGain uint32
|
||||||
|
}
|
||||||
|
|
76
vendor/github.com/vishvananda/netlink/tcp_linux.go
generated
vendored
76
vendor/github.com/vishvananda/netlink/tcp_linux.go
generated
vendored
|
@ -2,67 +2,13 @@ package netlink
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TCPInfo struct {
|
const (
|
||||||
State uint8
|
tcpBBRInfoLen = 20
|
||||||
Ca_state uint8
|
)
|
||||||
Retransmits uint8
|
|
||||||
Probes uint8
|
|
||||||
Backoff uint8
|
|
||||||
Options uint8
|
|
||||||
Snd_wscale uint8 // no uint4
|
|
||||||
Rcv_wscale uint8
|
|
||||||
Delivery_rate_app_limited uint8
|
|
||||||
Fastopen_client_fail uint8
|
|
||||||
Rto uint32
|
|
||||||
Ato uint32
|
|
||||||
Snd_mss uint32
|
|
||||||
Rcv_mss uint32
|
|
||||||
Unacked uint32
|
|
||||||
Sacked uint32
|
|
||||||
Lost uint32
|
|
||||||
Retrans uint32
|
|
||||||
Fackets uint32
|
|
||||||
Last_data_sent uint32
|
|
||||||
Last_ack_sent uint32
|
|
||||||
Last_data_recv uint32
|
|
||||||
Last_ack_recv uint32
|
|
||||||
Pmtu uint32
|
|
||||||
Rcv_ssthresh uint32
|
|
||||||
Rtt uint32
|
|
||||||
Rttvar uint32
|
|
||||||
Snd_ssthresh uint32
|
|
||||||
Snd_cwnd uint32
|
|
||||||
Advmss uint32
|
|
||||||
Reordering uint32
|
|
||||||
Rcv_rtt uint32
|
|
||||||
Rcv_space uint32
|
|
||||||
Total_retrans uint32
|
|
||||||
Pacing_rate uint64
|
|
||||||
Max_pacing_rate uint64
|
|
||||||
Bytes_acked uint64 /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
|
|
||||||
Bytes_received uint64 /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
|
|
||||||
Segs_out uint32 /* RFC4898 tcpEStatsPerfSegsOut */
|
|
||||||
Segs_in uint32 /* RFC4898 tcpEStatsPerfSegsIn */
|
|
||||||
Notsent_bytes uint32
|
|
||||||
Min_rtt uint32
|
|
||||||
Data_segs_in uint32 /* RFC4898 tcpEStatsDataSegsIn */
|
|
||||||
Data_segs_out uint32 /* RFC4898 tcpEStatsDataSegsOut */
|
|
||||||
Delivery_rate uint64
|
|
||||||
Busy_time uint64 /* Time (usec) busy sending data */
|
|
||||||
Rwnd_limited uint64 /* Time (usec) limited by receive window */
|
|
||||||
Sndbuf_limited uint64 /* Time (usec) limited by send buffer */
|
|
||||||
Delivered uint32
|
|
||||||
Delivered_ce uint32
|
|
||||||
Bytes_sent uint64 /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
|
|
||||||
Bytes_retrans uint64 /* RFC4898 tcpEStatsPerfOctetsRetrans */
|
|
||||||
Dsack_dups uint32 /* RFC4898 tcpEStatsStackDSACKDups */
|
|
||||||
Reord_seen uint32 /* reordering events seen */
|
|
||||||
Rcv_ooopack uint32 /* Out-of-order packets received */
|
|
||||||
Snd_wnd uint32 /* peer's advertised receive window after * scaling (bytes) */
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkDeserErr(err error) error {
|
func checkDeserErr(err error) error {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
@ -391,3 +337,17 @@ func (t *TCPInfo) deserialize(b []byte) error {
|
||||||
t.Snd_wnd = native.Uint32(next)
|
t.Snd_wnd = native.Uint32(next)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TCPBBRInfo) deserialize(b []byte) error {
|
||||||
|
if len(b) != tcpBBRInfoLen {
|
||||||
|
return errors.New("Invalid length")
|
||||||
|
}
|
||||||
|
|
||||||
|
rb := bytes.NewBuffer(b)
|
||||||
|
t.BBRBW = native.Uint64(rb.Next(8))
|
||||||
|
t.BBRMinRTT = native.Uint32(rb.Next(4))
|
||||||
|
t.BBRPacingGain = native.Uint32(rb.Next(4))
|
||||||
|
t.BBRCwndGain = native.Uint32(rb.Next(4))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
13
vendor/github.com/vishvananda/netlink/xfrm_policy.go
generated
vendored
13
vendor/github.com/vishvananda/netlink/xfrm_policy.go
generated
vendored
|
@ -58,12 +58,13 @@ func (a PolicyAction) String() string {
|
||||||
// policy. These rules are matched with XfrmState to determine encryption
|
// policy. These rules are matched with XfrmState to determine encryption
|
||||||
// and authentication algorithms.
|
// and authentication algorithms.
|
||||||
type XfrmPolicyTmpl struct {
|
type XfrmPolicyTmpl struct {
|
||||||
Dst net.IP
|
Dst net.IP
|
||||||
Src net.IP
|
Src net.IP
|
||||||
Proto Proto
|
Proto Proto
|
||||||
Mode Mode
|
Mode Mode
|
||||||
Spi int
|
Spi int
|
||||||
Reqid int
|
Reqid int
|
||||||
|
Optional int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t XfrmPolicyTmpl) String() string {
|
func (t XfrmPolicyTmpl) String() string {
|
||||||
|
|
2
vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go
generated
vendored
2
vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go
generated
vendored
|
@ -79,6 +79,7 @@ func (h *Handle) xfrmPolicyAddOrUpdate(policy *XfrmPolicy, nlProto int) error {
|
||||||
userTmpl.XfrmId.Spi = nl.Swap32(uint32(tmpl.Spi))
|
userTmpl.XfrmId.Spi = nl.Swap32(uint32(tmpl.Spi))
|
||||||
userTmpl.Mode = uint8(tmpl.Mode)
|
userTmpl.Mode = uint8(tmpl.Mode)
|
||||||
userTmpl.Reqid = uint32(tmpl.Reqid)
|
userTmpl.Reqid = uint32(tmpl.Reqid)
|
||||||
|
userTmpl.Optional = uint8(tmpl.Optional)
|
||||||
userTmpl.Aalgos = ^uint32(0)
|
userTmpl.Aalgos = ^uint32(0)
|
||||||
userTmpl.Ealgos = ^uint32(0)
|
userTmpl.Ealgos = ^uint32(0)
|
||||||
userTmpl.Calgos = ^uint32(0)
|
userTmpl.Calgos = ^uint32(0)
|
||||||
|
@ -247,6 +248,7 @@ func parseXfrmPolicy(m []byte, family int) (*XfrmPolicy, error) {
|
||||||
resTmpl.Mode = Mode(tmpl.Mode)
|
resTmpl.Mode = Mode(tmpl.Mode)
|
||||||
resTmpl.Spi = int(nl.Swap32(tmpl.XfrmId.Spi))
|
resTmpl.Spi = int(nl.Swap32(tmpl.XfrmId.Spi))
|
||||||
resTmpl.Reqid = int(tmpl.Reqid)
|
resTmpl.Reqid = int(tmpl.Reqid)
|
||||||
|
resTmpl.Optional = int(tmpl.Optional)
|
||||||
policy.Tmpls = append(policy.Tmpls, resTmpl)
|
policy.Tmpls = append(policy.Tmpls, resTmpl)
|
||||||
}
|
}
|
||||||
case nl.XFRMA_MARK:
|
case nl.XFRMA_MARK:
|
||||||
|
|
4
vendor/github.com/vishvananda/netlink/xfrm_state.go
generated
vendored
4
vendor/github.com/vishvananda/netlink/xfrm_state.go
generated
vendored
|
@ -94,7 +94,7 @@ type XfrmState struct {
|
||||||
Limits XfrmStateLimits
|
Limits XfrmStateLimits
|
||||||
Statistics XfrmStateStats
|
Statistics XfrmStateStats
|
||||||
Mark *XfrmMark
|
Mark *XfrmMark
|
||||||
OutputMark int
|
OutputMark *XfrmMark
|
||||||
Ifid int
|
Ifid int
|
||||||
Auth *XfrmStateAlgo
|
Auth *XfrmStateAlgo
|
||||||
Crypt *XfrmStateAlgo
|
Crypt *XfrmStateAlgo
|
||||||
|
@ -104,7 +104,7 @@ type XfrmState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sa XfrmState) String() string {
|
func (sa XfrmState) String() string {
|
||||||
return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, OutputMark: %d, Ifid: %d, Auth: %v, Crypt: %v, Aead: %v, Encap: %v, ESN: %t",
|
return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, OutputMark: %v, Ifid: %d, Auth: %v, Crypt: %v, Aead: %v, Encap: %v, ESN: %t",
|
||||||
sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.OutputMark, sa.Ifid, sa.Auth, sa.Crypt, sa.Aead, sa.Encap, sa.ESN)
|
sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.OutputMark, sa.Ifid, sa.Auth, sa.Crypt, sa.Aead, sa.Encap, sa.ESN)
|
||||||
}
|
}
|
||||||
func (sa XfrmState) Print(stats bool) string {
|
func (sa XfrmState) Print(stats bool) string {
|
||||||
|
|
23
vendor/github.com/vishvananda/netlink/xfrm_state_linux.go
generated
vendored
23
vendor/github.com/vishvananda/netlink/xfrm_state_linux.go
generated
vendored
|
@ -158,9 +158,13 @@ func (h *Handle) xfrmStateAddOrUpdate(state *XfrmState, nlProto int) error {
|
||||||
out := nl.NewRtAttr(nl.XFRMA_REPLAY_ESN_VAL, writeReplayEsn(state.ReplayWindow))
|
out := nl.NewRtAttr(nl.XFRMA_REPLAY_ESN_VAL, writeReplayEsn(state.ReplayWindow))
|
||||||
req.AddData(out)
|
req.AddData(out)
|
||||||
}
|
}
|
||||||
if state.OutputMark != 0 {
|
if state.OutputMark != nil {
|
||||||
out := nl.NewRtAttr(nl.XFRMA_OUTPUT_MARK, nl.Uint32Attr(uint32(state.OutputMark)))
|
out := nl.NewRtAttr(nl.XFRMA_SET_MARK, nl.Uint32Attr(state.OutputMark.Value))
|
||||||
req.AddData(out)
|
req.AddData(out)
|
||||||
|
if state.OutputMark.Mask != 0 {
|
||||||
|
out = nl.NewRtAttr(nl.XFRMA_SET_MARK_MASK, nl.Uint32Attr(state.OutputMark.Mask))
|
||||||
|
req.AddData(out)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ifId := nl.NewRtAttr(nl.XFRMA_IF_ID, nl.Uint32Attr(uint32(state.Ifid)))
|
ifId := nl.NewRtAttr(nl.XFRMA_IF_ID, nl.Uint32Attr(uint32(state.Ifid)))
|
||||||
|
@ -377,8 +381,19 @@ func parseXfrmState(m []byte, family int) (*XfrmState, error) {
|
||||||
state.Mark = new(XfrmMark)
|
state.Mark = new(XfrmMark)
|
||||||
state.Mark.Value = mark.Value
|
state.Mark.Value = mark.Value
|
||||||
state.Mark.Mask = mark.Mask
|
state.Mark.Mask = mark.Mask
|
||||||
case nl.XFRMA_OUTPUT_MARK:
|
case nl.XFRMA_SET_MARK:
|
||||||
state.OutputMark = int(native.Uint32(attr.Value))
|
if state.OutputMark == nil {
|
||||||
|
state.OutputMark = new(XfrmMark)
|
||||||
|
}
|
||||||
|
state.OutputMark.Value = native.Uint32(attr.Value)
|
||||||
|
case nl.XFRMA_SET_MARK_MASK:
|
||||||
|
if state.OutputMark == nil {
|
||||||
|
state.OutputMark = new(XfrmMark)
|
||||||
|
}
|
||||||
|
state.OutputMark.Mask = native.Uint32(attr.Value)
|
||||||
|
if state.OutputMark.Mask == 0xffffffff {
|
||||||
|
state.OutputMark.Mask = 0
|
||||||
|
}
|
||||||
case nl.XFRMA_IF_ID:
|
case nl.XFRMA_IF_ID:
|
||||||
state.Ifid = int(native.Uint32(attr.Value))
|
state.Ifid = int(native.Uint32(attr.Value))
|
||||||
}
|
}
|
||||||
|
|
11
vendor/github.com/vishvananda/netns/README.md
generated
vendored
11
vendor/github.com/vishvananda/netns/README.md
generated
vendored
|
@ -48,3 +48,14 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## NOTE
|
||||||
|
|
||||||
|
The library can be safely used only with Go >= 1.10 due to [golang/go#20676](https://github.com/golang/go/issues/20676).
|
||||||
|
|
||||||
|
After locking a goroutine to its current OS thread with `runtime.LockOSThread()`
|
||||||
|
and changing its network namespace, any new subsequent goroutine won't be
|
||||||
|
scheduled on that thread while it's locked. Therefore, the new goroutine
|
||||||
|
will run in a different namespace leading to unexpected results.
|
||||||
|
|
||||||
|
See [here](https://www.weave.works/blog/linux-namespaces-golang-followup) for more details.
|
||||||
|
|
18
vendor/github.com/vishvananda/netns/netns_linux.go
generated
vendored
18
vendor/github.com/vishvananda/netns/netns_linux.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
// +build linux
|
// +build linux,go1.10
|
||||||
|
|
||||||
package netns
|
package netns
|
||||||
|
|
||||||
|
@ -218,12 +218,18 @@ func getPidForContainer(id string) (int, error) {
|
||||||
filepath.Join(cgroupRoot, "system.slice", "docker-"+id+".scope", "tasks"),
|
filepath.Join(cgroupRoot, "system.slice", "docker-"+id+".scope", "tasks"),
|
||||||
// Even more recent docker versions under cgroup/systemd/docker/<id>/
|
// Even more recent docker versions under cgroup/systemd/docker/<id>/
|
||||||
filepath.Join(cgroupRoot, "..", "systemd", "docker", id, "tasks"),
|
filepath.Join(cgroupRoot, "..", "systemd", "docker", id, "tasks"),
|
||||||
// Kubernetes with docker and CNI is even more different
|
// Kubernetes with docker and CNI is even more different. Works for BestEffort and Burstable QoS
|
||||||
filepath.Join(cgroupRoot, "..", "systemd", "kubepods", "*", "pod*", id, "tasks"),
|
filepath.Join(cgroupRoot, "..", "systemd", "kubepods", "*", "pod*", id, "tasks"),
|
||||||
// Another flavor of containers location in recent kubernetes 1.11+
|
// Same as above but for Guaranteed QoS
|
||||||
filepath.Join(cgroupRoot, cgroupThis, "kubepods.slice", "kubepods-besteffort.slice", "*", "docker-"+id+".scope", "tasks"),
|
filepath.Join(cgroupRoot, "..", "systemd", "kubepods", "pod*", id, "tasks"),
|
||||||
// When runs inside of a container with recent kubernetes 1.11+
|
// Another flavor of containers location in recent kubernetes 1.11+. Works for BestEffort and Burstable QoS
|
||||||
filepath.Join(cgroupRoot, "kubepods.slice", "kubepods-besteffort.slice", "*", "docker-"+id+".scope", "tasks"),
|
filepath.Join(cgroupRoot, cgroupThis, "kubepods.slice", "*.slice", "*", "docker-"+id+".scope", "tasks"),
|
||||||
|
// Same as above but for Guaranteed QoS
|
||||||
|
filepath.Join(cgroupRoot, cgroupThis, "kubepods.slice", "*", "docker-"+id+".scope", "tasks"),
|
||||||
|
// When runs inside of a container with recent kubernetes 1.11+. Works for BestEffort and Burstable QoS
|
||||||
|
filepath.Join(cgroupRoot, "kubepods.slice", "*.slice", "*", "docker-"+id+".scope", "tasks"),
|
||||||
|
// Same as above but for Guaranteed QoS
|
||||||
|
filepath.Join(cgroupRoot, "kubepods.slice", "*", "docker-"+id+".scope", "tasks"),
|
||||||
}
|
}
|
||||||
|
|
||||||
var filename string
|
var filename string
|
||||||
|
|
15
vendor/modules.txt
vendored
15
vendor/modules.txt
vendored
|
@ -45,7 +45,7 @@ github.com/blang/semver
|
||||||
github.com/buger/goterm
|
github.com/buger/goterm
|
||||||
# github.com/cespare/xxhash/v2 v2.1.1
|
# github.com/cespare/xxhash/v2 v2.1.1
|
||||||
github.com/cespare/xxhash/v2
|
github.com/cespare/xxhash/v2
|
||||||
# github.com/checkpoint-restore/checkpointctl v0.0.0-20210301084134-a2024f5584e7
|
# github.com/checkpoint-restore/checkpointctl v0.0.0-20210922093614-c31748bec9f2
|
||||||
github.com/checkpoint-restore/checkpointctl/lib
|
github.com/checkpoint-restore/checkpointctl/lib
|
||||||
# github.com/checkpoint-restore/go-criu/v5 v5.1.0
|
# github.com/checkpoint-restore/go-criu/v5 v5.1.0
|
||||||
github.com/checkpoint-restore/go-criu/v5
|
github.com/checkpoint-restore/go-criu/v5
|
||||||
|
@ -66,15 +66,18 @@ github.com/containerd/containerd/sys
|
||||||
# github.com/containerd/stargz-snapshotter/estargz v0.8.0
|
# github.com/containerd/stargz-snapshotter/estargz v0.8.0
|
||||||
github.com/containerd/stargz-snapshotter/estargz
|
github.com/containerd/stargz-snapshotter/estargz
|
||||||
github.com/containerd/stargz-snapshotter/estargz/errorutil
|
github.com/containerd/stargz-snapshotter/estargz/errorutil
|
||||||
# github.com/containernetworking/cni v0.8.1
|
# github.com/containernetworking/cni v1.0.1
|
||||||
github.com/containernetworking/cni/libcni
|
github.com/containernetworking/cni/libcni
|
||||||
github.com/containernetworking/cni/pkg/invoke
|
github.com/containernetworking/cni/pkg/invoke
|
||||||
github.com/containernetworking/cni/pkg/types
|
github.com/containernetworking/cni/pkg/types
|
||||||
github.com/containernetworking/cni/pkg/types/020
|
github.com/containernetworking/cni/pkg/types/020
|
||||||
github.com/containernetworking/cni/pkg/types/current
|
github.com/containernetworking/cni/pkg/types/040
|
||||||
|
github.com/containernetworking/cni/pkg/types/100
|
||||||
|
github.com/containernetworking/cni/pkg/types/create
|
||||||
|
github.com/containernetworking/cni/pkg/types/internal
|
||||||
github.com/containernetworking/cni/pkg/utils
|
github.com/containernetworking/cni/pkg/utils
|
||||||
github.com/containernetworking/cni/pkg/version
|
github.com/containernetworking/cni/pkg/version
|
||||||
# github.com/containernetworking/plugins v0.9.1
|
# github.com/containernetworking/plugins v1.0.1
|
||||||
github.com/containernetworking/plugins/pkg/ns
|
github.com/containernetworking/plugins/pkg/ns
|
||||||
# github.com/containers/buildah v1.23.0
|
# github.com/containers/buildah v1.23.0
|
||||||
github.com/containers/buildah
|
github.com/containers/buildah
|
||||||
|
@ -614,10 +617,10 @@ github.com/vbauerster/mpb/v7
|
||||||
github.com/vbauerster/mpb/v7/cwriter
|
github.com/vbauerster/mpb/v7/cwriter
|
||||||
github.com/vbauerster/mpb/v7/decor
|
github.com/vbauerster/mpb/v7/decor
|
||||||
github.com/vbauerster/mpb/v7/internal
|
github.com/vbauerster/mpb/v7/internal
|
||||||
# github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852
|
# github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5
|
||||||
github.com/vishvananda/netlink
|
github.com/vishvananda/netlink
|
||||||
github.com/vishvananda/netlink/nl
|
github.com/vishvananda/netlink/nl
|
||||||
# github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae
|
# github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f
|
||||||
github.com/vishvananda/netns
|
github.com/vishvananda/netns
|
||||||
# github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b
|
# github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b
|
||||||
github.com/xeipuuv/gojsonpointer
|
github.com/xeipuuv/gojsonpointer
|
||||||
|
|
Loading…
Reference in a new issue