Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
8963dd1b
Commit
8963dd1b
authored
Apr 10, 2017
by
Casey Callendrello
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
deps: update containernetworking/cni to v0.5.2
parent
eccba3b6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
1201 additions
and
128 deletions
+1201
-128
Godeps.json
Godeps/Godeps.json
+21
-6
LICENSES
Godeps/LICENSES
+0
-0
api.go
vendor/github.com/containernetworking/cni/libcni/api.go
+149
-3
conf.go
vendor/github.com/containernetworking/cni/libcni/conf.go
+160
-14
args.go
vendor/github.com/containernetworking/cni/pkg/invoke/args.go
+3
-0
delegate.go
...github.com/containernetworking/cni/pkg/invoke/delegate.go
+4
-4
exec.go
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
+55
-35
find.go
vendor/github.com/containernetworking/cni/pkg/invoke/find.go
+6
-10
os_unix.go
.../github.com/containernetworking/cni/pkg/invoke/os_unix.go
+20
-0
os_windows.go
...thub.com/containernetworking/cni/pkg/invoke/os_windows.go
+18
-0
raw_exec.go
...github.com/containernetworking/cni/pkg/invoke/raw_exec.go
+63
-0
types.go
...github.com/containernetworking/cni/pkg/types/020/types.go
+133
-0
types.go
...ub.com/containernetworking/cni/pkg/types/current/types.go
+291
-0
types.go
vendor/github.com/containernetworking/cni/pkg/types/types.go
+50
-56
conf.go
...or/github.com/containernetworking/cni/pkg/version/conf.go
+37
-0
plugin.go
.../github.com/containernetworking/cni/pkg/version/plugin.go
+81
-0
reconcile.go
...thub.com/containernetworking/cni/pkg/version/reconcile.go
+49
-0
version.go
...github.com/containernetworking/cni/pkg/version/version.go
+61
-0
No files found.
Godeps/Godeps.json
View file @
8963dd1b
...
...
@@ -416,18 +416,33 @@
},
{
"ImportPath"
:
"github.com/containernetworking/cni/libcni"
,
"Comment"
:
"v0.
3.0-61-g9d5e6e6
"
,
"Rev"
:
"
9d5e6e60e79491207834ae8439e80c943db65a69
"
"Comment"
:
"v0.
5.2
"
,
"Rev"
:
"
137b4975ecab6e1f0c24c1e3c228a50a3cfba75e
"
},
{
"ImportPath"
:
"github.com/containernetworking/cni/pkg/invoke"
,
"Comment"
:
"v0.
3.0-61-g9d5e6e6
"
,
"Rev"
:
"
9d5e6e60e79491207834ae8439e80c943db65a69
"
"Comment"
:
"v0.
5.2
"
,
"Rev"
:
"
137b4975ecab6e1f0c24c1e3c228a50a3cfba75e
"
},
{
"ImportPath"
:
"github.com/containernetworking/cni/pkg/types"
,
"Comment"
:
"v0.3.0-61-g9d5e6e6"
,
"Rev"
:
"9d5e6e60e79491207834ae8439e80c943db65a69"
"Comment"
:
"v0.5.2"
,
"Rev"
:
"137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
},
{
"ImportPath"
:
"github.com/containernetworking/cni/pkg/types/020"
,
"Comment"
:
"v0.5.2"
,
"Rev"
:
"137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
},
{
"ImportPath"
:
"github.com/containernetworking/cni/pkg/types/current"
,
"Comment"
:
"v0.5.2"
,
"Rev"
:
"137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
},
{
"ImportPath"
:
"github.com/containernetworking/cni/pkg/version"
,
"Comment"
:
"v0.5.2"
,
"Rev"
:
"137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
},
{
"ImportPath"
:
"github.com/coreos/etcd/alarm"
,
...
...
Godeps/LICENSES
View file @
8963dd1b
This diff is collapsed.
Click to expand it.
vendor/github.com/containernetworking/cni/libcni/api.go
View file @
8963dd1b
...
...
@@ -15,10 +15,12 @@
package
libcni
import
(
"os"
"strings"
"github.com/containernetworking/cni/pkg/invoke"
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/cni/pkg/version"
)
type
RuntimeConf
struct
{
...
...
@@ -26,6 +28,12 @@ type RuntimeConf struct {
NetNS
string
IfName
string
Args
[][
2
]
string
// A dictionary of capability-specific data passed by the runtime
// to plugins as top-level keys in the 'runtimeConfig' dictionary
// of the plugin's stdin data. libcni will ensure that only keys
// in this map which match the capabilities of the plugin are passed
// to the plugin
CapabilityArgs
map
[
string
]
interface
{}
}
type
NetworkConfig
struct
{
...
...
@@ -33,8 +41,18 @@ type NetworkConfig struct {
Bytes
[]
byte
}
type
NetworkConfigList
struct
{
Name
string
CNIVersion
string
Plugins
[]
*
NetworkConfig
Bytes
[]
byte
}
type
CNI
interface
{
AddNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
(
*
types
.
Result
,
error
)
AddNetworkList
(
net
*
NetworkConfigList
,
rt
*
RuntimeConf
)
(
types
.
Result
,
error
)
DelNetworkList
(
net
*
NetworkConfigList
,
rt
*
RuntimeConf
)
error
AddNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
(
types
.
Result
,
error
)
DelNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
error
}
...
...
@@ -42,24 +60,152 @@ type CNIConfig struct {
Path
[]
string
}
func
(
c
*
CNIConfig
)
AddNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
(
*
types
.
Result
,
error
)
{
// CNIConfig implements the CNI interface
var
_
CNI
=
&
CNIConfig
{}
func
buildOneConfig
(
list
*
NetworkConfigList
,
orig
*
NetworkConfig
,
prevResult
types
.
Result
,
rt
*
RuntimeConf
)
(
*
NetworkConfig
,
error
)
{
var
err
error
inject
:=
map
[
string
]
interface
{}{
"name"
:
list
.
Name
,
"cniVersion"
:
list
.
CNIVersion
,
}
// Add previous plugin result
if
prevResult
!=
nil
{
inject
[
"prevResult"
]
=
prevResult
}
// Ensure every config uses the same name and version
orig
,
err
=
InjectConf
(
orig
,
inject
)
if
err
!=
nil
{
return
nil
,
err
}
return
injectRuntimeConfig
(
orig
,
rt
)
}
// This function takes a libcni RuntimeConf structure and injects values into
// a "runtimeConfig" dictionary in the CNI network configuration JSON that
// will be passed to the plugin on stdin.
//
// Only "capabilities arguments" passed by the runtime are currently injected.
// These capabilities arguments are filtered through the plugin's advertised
// capabilities from its config JSON, and any keys in the CapabilityArgs
// matching plugin capabilities are added to the "runtimeConfig" dictionary
// sent to the plugin via JSON on stdin. For exmaple, if the plugin's
// capabilities include "portMappings", and the CapabilityArgs map includes a
// "portMappings" key, that key and its value are added to the "runtimeConfig"
// dictionary to be passed to the plugin's stdin.
func
injectRuntimeConfig
(
orig
*
NetworkConfig
,
rt
*
RuntimeConf
)
(
*
NetworkConfig
,
error
)
{
var
err
error
rc
:=
make
(
map
[
string
]
interface
{})
for
capability
,
supported
:=
range
orig
.
Network
.
Capabilities
{
if
!
supported
{
continue
}
if
data
,
ok
:=
rt
.
CapabilityArgs
[
capability
];
ok
{
rc
[
capability
]
=
data
}
}
if
len
(
rc
)
>
0
{
orig
,
err
=
InjectConf
(
orig
,
map
[
string
]
interface
{}{
"runtimeConfig"
:
rc
})
if
err
!=
nil
{
return
nil
,
err
}
}
return
orig
,
nil
}
// AddNetworkList executes a sequence of plugins with the ADD command
func
(
c
*
CNIConfig
)
AddNetworkList
(
list
*
NetworkConfigList
,
rt
*
RuntimeConf
)
(
types
.
Result
,
error
)
{
var
prevResult
types
.
Result
for
_
,
net
:=
range
list
.
Plugins
{
pluginPath
,
err
:=
invoke
.
FindInPath
(
net
.
Network
.
Type
,
c
.
Path
)
if
err
!=
nil
{
return
nil
,
err
}
newConf
,
err
:=
buildOneConfig
(
list
,
net
,
prevResult
,
rt
)
if
err
!=
nil
{
return
nil
,
err
}
prevResult
,
err
=
invoke
.
ExecPluginWithResult
(
pluginPath
,
newConf
.
Bytes
,
c
.
args
(
"ADD"
,
rt
))
if
err
!=
nil
{
return
nil
,
err
}
}
return
prevResult
,
nil
}
// DelNetworkList executes a sequence of plugins with the DEL command
func
(
c
*
CNIConfig
)
DelNetworkList
(
list
*
NetworkConfigList
,
rt
*
RuntimeConf
)
error
{
for
i
:=
len
(
list
.
Plugins
)
-
1
;
i
>=
0
;
i
--
{
net
:=
list
.
Plugins
[
i
]
pluginPath
,
err
:=
invoke
.
FindInPath
(
net
.
Network
.
Type
,
c
.
Path
)
if
err
!=
nil
{
return
err
}
newConf
,
err
:=
buildOneConfig
(
list
,
net
,
nil
,
rt
)
if
err
!=
nil
{
return
err
}
if
err
:=
invoke
.
ExecPluginWithoutResult
(
pluginPath
,
newConf
.
Bytes
,
c
.
args
(
"DEL"
,
rt
));
err
!=
nil
{
return
err
}
}
return
nil
}
// AddNetwork executes the plugin with the ADD command
func
(
c
*
CNIConfig
)
AddNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
(
types
.
Result
,
error
)
{
pluginPath
,
err
:=
invoke
.
FindInPath
(
net
.
Network
.
Type
,
c
.
Path
)
if
err
!=
nil
{
return
nil
,
err
}
net
,
err
=
injectRuntimeConfig
(
net
,
rt
)
if
err
!=
nil
{
return
nil
,
err
}
return
invoke
.
ExecPluginWithResult
(
pluginPath
,
net
.
Bytes
,
c
.
args
(
"ADD"
,
rt
))
}
// DelNetwork executes the plugin with the DEL command
func
(
c
*
CNIConfig
)
DelNetwork
(
net
*
NetworkConfig
,
rt
*
RuntimeConf
)
error
{
pluginPath
,
err
:=
invoke
.
FindInPath
(
net
.
Network
.
Type
,
c
.
Path
)
if
err
!=
nil
{
return
err
}
net
,
err
=
injectRuntimeConfig
(
net
,
rt
)
if
err
!=
nil
{
return
err
}
return
invoke
.
ExecPluginWithoutResult
(
pluginPath
,
net
.
Bytes
,
c
.
args
(
"DEL"
,
rt
))
}
// GetVersionInfo reports which versions of the CNI spec are supported by
// the given plugin.
func
(
c
*
CNIConfig
)
GetVersionInfo
(
pluginType
string
)
(
version
.
PluginInfo
,
error
)
{
pluginPath
,
err
:=
invoke
.
FindInPath
(
pluginType
,
c
.
Path
)
if
err
!=
nil
{
return
nil
,
err
}
return
invoke
.
GetVersionInfo
(
pluginPath
)
}
// =====
func
(
c
*
CNIConfig
)
args
(
action
string
,
rt
*
RuntimeConf
)
*
invoke
.
Args
{
return
&
invoke
.
Args
{
...
...
@@ -68,6 +214,6 @@ func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args {
NetNS
:
rt
.
NetNS
,
PluginArgs
:
rt
.
Args
,
IfName
:
rt
.
IfName
,
Path
:
strings
.
Join
(
c
.
Path
,
":"
),
Path
:
strings
.
Join
(
c
.
Path
,
string
(
os
.
PathListSeparator
)
),
}
}
vendor/github.com/containernetworking/cni/libcni/conf.go
View file @
8963dd1b
...
...
@@ -23,6 +23,23 @@ import (
"sort"
)
type
NotFoundError
struct
{
Dir
string
Name
string
}
func
(
e
NotFoundError
)
Error
()
string
{
return
fmt
.
Sprintf
(
`no net configuration with name "%s" in %s`
,
e
.
Name
,
e
.
Dir
)
}
type
NoConfigsFoundError
struct
{
Dir
string
}
func
(
e
NoConfigsFoundError
)
Error
()
string
{
return
fmt
.
Sprintf
(
`no net configurations found in %s`
,
e
.
Dir
)
}
func
ConfFromBytes
(
bytes
[]
byte
)
(
*
NetworkConfig
,
error
)
{
conf
:=
&
NetworkConfig
{
Bytes
:
bytes
}
if
err
:=
json
.
Unmarshal
(
bytes
,
&
conf
.
Network
);
err
!=
nil
{
...
...
@@ -39,7 +56,73 @@ func ConfFromFile(filename string) (*NetworkConfig, error) {
return
ConfFromBytes
(
bytes
)
}
func
ConfFiles
(
dir
string
)
([]
string
,
error
)
{
func
ConfListFromBytes
(
bytes
[]
byte
)
(
*
NetworkConfigList
,
error
)
{
rawList
:=
make
(
map
[
string
]
interface
{})
if
err
:=
json
.
Unmarshal
(
bytes
,
&
rawList
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: %s"
,
err
)
}
rawName
,
ok
:=
rawList
[
"name"
]
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: no name"
)
}
name
,
ok
:=
rawName
.
(
string
)
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: invalid name type %T"
,
rawName
)
}
var
cniVersion
string
rawVersion
,
ok
:=
rawList
[
"cniVersion"
]
if
ok
{
cniVersion
,
ok
=
rawVersion
.
(
string
)
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: invalid cniVersion type %T"
,
rawVersion
)
}
}
list
:=
&
NetworkConfigList
{
Name
:
name
,
CNIVersion
:
cniVersion
,
Bytes
:
bytes
,
}
var
plugins
[]
interface
{}
plug
,
ok
:=
rawList
[
"plugins"
]
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: no 'plugins' key"
)
}
plugins
,
ok
=
plug
.
([]
interface
{})
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: invalid 'plugins' type %T"
,
plug
)
}
if
len
(
plugins
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"error parsing configuration list: no plugins in list"
)
}
for
i
,
conf
:=
range
plugins
{
newBytes
,
err
:=
json
.
Marshal
(
conf
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"Failed to marshal plugin config %d: %v"
,
i
,
err
)
}
netConf
,
err
:=
ConfFromBytes
(
newBytes
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"Failed to parse plugin config %d: %v"
,
i
,
err
)
}
list
.
Plugins
=
append
(
list
.
Plugins
,
netConf
)
}
return
list
,
nil
}
func
ConfListFromFile
(
filename
string
)
(
*
NetworkConfigList
,
error
)
{
bytes
,
err
:=
ioutil
.
ReadFile
(
filename
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"error reading %s: %s"
,
filename
,
err
)
}
return
ConfListFromBytes
(
bytes
)
}
func
ConfFiles
(
dir
string
,
extensions
[]
string
)
([]
string
,
error
)
{
// In part, adapted from rkt/networking/podenv.go#listFiles
files
,
err
:=
ioutil
.
ReadDir
(
dir
)
switch
{
...
...
@@ -55,20 +138,23 @@ func ConfFiles(dir string) ([]string, error) {
if
f
.
IsDir
()
{
continue
}
if
filepath
.
Ext
(
f
.
Name
())
==
".conf"
{
confFiles
=
append
(
confFiles
,
filepath
.
Join
(
dir
,
f
.
Name
()))
fileExt
:=
filepath
.
Ext
(
f
.
Name
())
for
_
,
ext
:=
range
extensions
{
if
fileExt
==
ext
{
confFiles
=
append
(
confFiles
,
filepath
.
Join
(
dir
,
f
.
Name
()))
}
}
}
return
confFiles
,
nil
}
func
LoadConf
(
dir
,
name
string
)
(
*
NetworkConfig
,
error
)
{
files
,
err
:=
ConfFiles
(
dir
)
files
,
err
:=
ConfFiles
(
dir
,
[]
string
{
".conf"
,
".json"
}
)
switch
{
case
err
!=
nil
:
return
nil
,
err
case
len
(
files
)
==
0
:
return
nil
,
fmt
.
Errorf
(
"no net configurations found"
)
return
nil
,
NoConfigsFoundError
{
Dir
:
dir
}
}
sort
.
Strings
(
files
)
...
...
@@ -81,25 +167,59 @@ func LoadConf(dir, name string) (*NetworkConfig, error) {
return
conf
,
nil
}
}
return
nil
,
fmt
.
Errorf
(
`no net configuration with name "%s" in %s`
,
name
,
dir
)
return
nil
,
NotFoundError
{
dir
,
name
}
}
func
InjectConf
(
original
*
NetworkConfig
,
key
string
,
newValue
interface
{})
(
*
NetworkConfig
,
error
)
{
func
LoadConfList
(
dir
,
name
string
)
(
*
NetworkConfigList
,
error
)
{
files
,
err
:=
ConfFiles
(
dir
,
[]
string
{
".conflist"
})
if
err
!=
nil
{
return
nil
,
err
}
sort
.
Strings
(
files
)
for
_
,
confFile
:=
range
files
{
conf
,
err
:=
ConfListFromFile
(
confFile
)
if
err
!=
nil
{
return
nil
,
err
}
if
conf
.
Name
==
name
{
return
conf
,
nil
}
}
// Try and load a network configuration file (instead of list)
// from the same name, then upconvert.
singleConf
,
err
:=
LoadConf
(
dir
,
name
)
if
err
!=
nil
{
// A little extra logic so the error makes sense
if
_
,
ok
:=
err
.
(
NoConfigsFoundError
);
len
(
files
)
!=
0
&&
ok
{
// Config lists found but no config files found
return
nil
,
NotFoundError
{
dir
,
name
}
}
return
nil
,
err
}
return
ConfListFromConf
(
singleConf
)
}
func
InjectConf
(
original
*
NetworkConfig
,
newValues
map
[
string
]
interface
{})
(
*
NetworkConfig
,
error
)
{
config
:=
make
(
map
[
string
]
interface
{})
err
:=
json
.
Unmarshal
(
original
.
Bytes
,
&
config
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"unmarshal existing network bytes: %s"
,
err
)
}
if
key
==
""
{
return
nil
,
fmt
.
Errorf
(
"key value can not be empty"
)
}
for
key
,
value
:=
range
newValues
{
if
key
==
""
{
return
nil
,
fmt
.
Errorf
(
"keys cannot be empty"
)
}
if
newV
alue
==
nil
{
return
nil
,
fmt
.
Errorf
(
"newValue must be specified"
)
}
if
v
alue
==
nil
{
return
nil
,
fmt
.
Errorf
(
"key '%s' value must not be nil"
,
key
)
}
config
[
key
]
=
newValue
config
[
key
]
=
value
}
newBytes
,
err
:=
json
.
Marshal
(
config
)
if
err
!=
nil
{
...
...
@@ -108,3 +228,29 @@ func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*Net
return
ConfFromBytes
(
newBytes
)
}
// ConfListFromConf "upconverts" a network config in to a NetworkConfigList,
// with the single network as the only entry in the list.
func
ConfListFromConf
(
original
*
NetworkConfig
)
(
*
NetworkConfigList
,
error
)
{
// Re-deserialize the config's json, then make a raw map configlist.
// This may seem a bit strange, but it's to make the Bytes fields
// actually make sense. Otherwise, the generated json is littered with
// golang default values.
rawConfig
:=
make
(
map
[
string
]
interface
{})
if
err
:=
json
.
Unmarshal
(
original
.
Bytes
,
&
rawConfig
);
err
!=
nil
{
return
nil
,
err
}
rawConfigList
:=
map
[
string
]
interface
{}{
"name"
:
original
.
Network
.
Name
,
"cniVersion"
:
original
.
Network
.
CNIVersion
,
"plugins"
:
[]
interface
{}{
rawConfig
},
}
b
,
err
:=
json
.
Marshal
(
rawConfigList
)
if
err
!=
nil
{
return
nil
,
err
}
return
ConfListFromBytes
(
b
)
}
vendor/github.com/containernetworking/cni/pkg/invoke/args.go
View file @
8963dd1b
...
...
@@ -47,6 +47,9 @@ type Args struct {
Path
string
}
// Args implements the CNIArgs interface
var
_
CNIArgs
=
&
Args
{}
func
(
args
*
Args
)
AsEnv
()
[]
string
{
env
:=
os
.
Environ
()
pluginArgsStr
:=
args
.
PluginArgsStr
...
...
vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
View file @
8963dd1b
...
...
@@ -17,17 +17,17 @@ package invoke
import
(
"fmt"
"os"
"
strings
"
"
path/filepath
"
"github.com/containernetworking/cni/pkg/types"
)
func
DelegateAdd
(
delegatePlugin
string
,
netconf
[]
byte
)
(
*
types
.
Result
,
error
)
{
func
DelegateAdd
(
delegatePlugin
string
,
netconf
[]
byte
)
(
types
.
Result
,
error
)
{
if
os
.
Getenv
(
"CNI_COMMAND"
)
!=
"ADD"
{
return
nil
,
fmt
.
Errorf
(
"CNI_COMMAND is not ADD"
)
}
paths
:=
strings
.
Split
(
os
.
Getenv
(
"CNI_PATH"
),
":"
)
paths
:=
filepath
.
SplitList
(
os
.
Getenv
(
"CNI_PATH"
)
)
pluginPath
,
err
:=
FindInPath
(
delegatePlugin
,
paths
)
if
err
!=
nil
{
...
...
@@ -42,7 +42,7 @@ func DelegateDel(delegatePlugin string, netconf []byte) error {
return
fmt
.
Errorf
(
"CNI_COMMAND is not DEL"
)
}
paths
:=
strings
.
Split
(
os
.
Getenv
(
"CNI_PATH"
),
":"
)
paths
:=
filepath
.
SplitList
(
os
.
Getenv
(
"CNI_PATH"
)
)
pluginPath
,
err
:=
FindInPath
(
delegatePlugin
,
paths
)
if
err
!=
nil
{
...
...
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
View file @
8963dd1b
...
...
@@ -15,61 +15,81 @@
package
invoke
import
(
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/cni/pkg/version"
)
func
pluginErr
(
err
error
,
output
[]
byte
)
error
{
if
_
,
ok
:=
err
.
(
*
exec
.
ExitError
);
ok
{
emsg
:=
types
.
Error
{}
if
perr
:=
json
.
Unmarshal
(
output
,
&
emsg
);
perr
!=
nil
{
return
fmt
.
Errorf
(
"netplugin failed but error parsing its diagnostic message %q: %v"
,
string
(
output
),
perr
)
}
details
:=
""
if
emsg
.
Details
!=
""
{
details
=
fmt
.
Sprintf
(
"; %v"
,
emsg
.
Details
)
}
return
fmt
.
Errorf
(
"%v%v"
,
emsg
.
Msg
,
details
)
}
func
ExecPluginWithResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
(
types
.
Result
,
error
)
{
return
defaultPluginExec
.
WithResult
(
pluginPath
,
netconf
,
args
)
}
return
err
func
ExecPluginWithoutResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
error
{
return
defaultPluginExec
.
WithoutResult
(
pluginPath
,
netconf
,
args
)
}
func
GetVersionInfo
(
pluginPath
string
)
(
version
.
PluginInfo
,
error
)
{
return
defaultPluginExec
.
GetVersionInfo
(
pluginPath
)
}
var
defaultPluginExec
=
&
PluginExec
{
RawExec
:
&
RawExec
{
Stderr
:
os
.
Stderr
},
VersionDecoder
:
&
version
.
PluginDecoder
{},
}
type
PluginExec
struct
{
RawExec
interface
{
ExecPlugin
(
pluginPath
string
,
stdinData
[]
byte
,
environ
[]
string
)
([]
byte
,
error
)
}
VersionDecoder
interface
{
Decode
(
jsonBytes
[]
byte
)
(
version
.
PluginInfo
,
error
)
}
}
func
ExecPluginWithResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
(
*
types
.
Result
,
error
)
{
stdoutBytes
,
err
:=
e
xecPlugin
(
pluginPath
,
netconf
,
args
)
func
(
e
*
PluginExec
)
WithResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
(
types
.
Result
,
error
)
{
stdoutBytes
,
err
:=
e
.
RawExec
.
ExecPlugin
(
pluginPath
,
netconf
,
args
.
AsEnv
()
)
if
err
!=
nil
{
return
nil
,
err
}
res
:=
&
types
.
Result
{}
err
=
json
.
Unmarshal
(
stdoutBytes
,
res
)
return
res
,
err
// Plugin must return result in same version as specified in netconf
versionDecoder
:=
&
version
.
ConfigDecoder
{}
confVersion
,
err
:=
versionDecoder
.
Decode
(
netconf
)
if
err
!=
nil
{
return
nil
,
err
}
return
version
.
NewResult
(
confVersion
,
stdoutBytes
)
}
func
ExecPlugin
WithoutResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
error
{
_
,
err
:=
e
xecPlugin
(
pluginPath
,
netconf
,
args
)
func
(
e
*
PluginExec
)
WithoutResult
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
error
{
_
,
err
:=
e
.
RawExec
.
ExecPlugin
(
pluginPath
,
netconf
,
args
.
AsEnv
()
)
return
err
}
func
execPlugin
(
pluginPath
string
,
netconf
[]
byte
,
args
CNIArgs
)
([]
byte
,
error
)
{
stdout
:=
&
bytes
.
Buffer
{}
// GetVersionInfo returns the version information available about the plugin.
// For recent-enough plugins, it uses the information returned by the VERSION
// command. For older plugins which do not recognize that command, it reports
// version 0.1.0
func
(
e
*
PluginExec
)
GetVersionInfo
(
pluginPath
string
)
(
version
.
PluginInfo
,
error
)
{
args
:=
&
Args
{
Command
:
"VERSION"
,
c
:=
exec
.
Cmd
{
Env
:
args
.
AsEnv
(),
Path
:
pluginPath
,
Args
:
[]
string
{
pluginPath
},
Stdin
:
bytes
.
NewBuffer
(
netconf
),
Stdout
:
stdout
,
Stderr
:
os
.
Stderr
,
// set fake values required by plugins built against an older version of skel
NetNS
:
"dummy"
,
IfName
:
"dummy"
,
Path
:
"dummy"
,
}
if
err
:=
c
.
Run
();
err
!=
nil
{
return
nil
,
pluginErr
(
err
,
stdout
.
Bytes
())
stdin
:=
[]
byte
(
fmt
.
Sprintf
(
`{"cniVersion":%q}`
,
version
.
Current
()))
stdoutBytes
,
err
:=
e
.
RawExec
.
ExecPlugin
(
pluginPath
,
stdin
,
args
.
AsEnv
())
if
err
!=
nil
{
if
err
.
Error
()
==
"unknown CNI_COMMAND: VERSION"
{
return
version
.
PluginSupports
(
"0.1.0"
),
nil
}
return
nil
,
err
}
return
stdout
.
Bytes
(),
nil
return
e
.
VersionDecoder
.
Decode
(
stdoutBytes
)
}
vendor/github.com/containernetworking/cni/pkg/invoke/find.go
View file @
8963dd1b
...
...
@@ -30,18 +30,14 @@ func FindInPath(plugin string, paths []string) (string, error) {
return
""
,
fmt
.
Errorf
(
"no paths provided"
)
}
var
fullpath
string
for
_
,
path
:=
range
paths
{
full
:=
filepath
.
Join
(
path
,
plugin
)
if
fi
,
err
:=
os
.
Stat
(
full
);
err
==
nil
&&
fi
.
Mode
()
.
IsRegular
()
{
fullpath
=
full
break
for
_
,
fe
:=
range
ExecutableFileExtensions
{
fullpath
:=
filepath
.
Join
(
path
,
plugin
)
+
fe
if
fi
,
err
:=
os
.
Stat
(
fullpath
);
err
==
nil
&&
fi
.
Mode
()
.
IsRegular
()
{
return
fullpath
,
nil
}
}
}
if
fullpath
==
""
{
return
""
,
fmt
.
Errorf
(
"failed to find plugin %q in path %s"
,
plugin
,
paths
)
}
return
fullpath
,
nil
return
""
,
fmt
.
Errorf
(
"failed to find plugin %q in path %s"
,
plugin
,
paths
)
}
vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
0 → 100644
View file @
8963dd1b
// 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.
// +build darwin dragonfly freebsd linux netbsd opensbd solaris
package
invoke
// Valid file extensions for plugin executables.
var
ExecutableFileExtensions
=
[]
string
{
""
}
vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
0 → 100644
View file @
8963dd1b
// 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
invoke
// Valid file extensions for plugin executables.
var
ExecutableFileExtensions
=
[]
string
{
".exe"
,
""
}
vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
0 → 100644
View file @
8963dd1b
// 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
invoke
import
(
"bytes"
"encoding/json"
"fmt"
"io"
"os/exec"
"github.com/containernetworking/cni/pkg/types"
)
type
RawExec
struct
{
Stderr
io
.
Writer
}
func
(
e
*
RawExec
)
ExecPlugin
(
pluginPath
string
,
stdinData
[]
byte
,
environ
[]
string
)
([]
byte
,
error
)
{
stdout
:=
&
bytes
.
Buffer
{}
c
:=
exec
.
Cmd
{
Env
:
environ
,
Path
:
pluginPath
,
Args
:
[]
string
{
pluginPath
},
Stdin
:
bytes
.
NewBuffer
(
stdinData
),
Stdout
:
stdout
,
Stderr
:
e
.
Stderr
,
}
if
err
:=
c
.
Run
();
err
!=
nil
{
return
nil
,
pluginErr
(
err
,
stdout
.
Bytes
())
}
return
stdout
.
Bytes
(),
nil
}
func
pluginErr
(
err
error
,
output
[]
byte
)
error
{
if
_
,
ok
:=
err
.
(
*
exec
.
ExitError
);
ok
{
emsg
:=
types
.
Error
{}
if
perr
:=
json
.
Unmarshal
(
output
,
&
emsg
);
perr
!=
nil
{
return
fmt
.
Errorf
(
"netplugin failed but error parsing its diagnostic message %q: %v"
,
string
(
output
),
perr
)
}
details
:=
""
if
emsg
.
Details
!=
""
{
details
=
fmt
.
Sprintf
(
"; %v"
,
emsg
.
Details
)
}
return
fmt
.
Errorf
(
"%v%v"
,
emsg
.
Msg
,
details
)
}
return
err
}
vendor/github.com/containernetworking/cni/pkg/types/020/types.go
0 → 100644
View file @
8963dd1b
// 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
types020
import
(
"encoding/json"
"fmt"
"net"
"os"
"github.com/containernetworking/cni/pkg/types"
)
const
implementedSpecVersion
string
=
"0.2.0"
var
SupportedVersions
=
[]
string
{
""
,
"0.1.0"
,
implementedSpecVersion
}
// Compatibility types for CNI version 0.1.0 and 0.2.0
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
)
{
// We expect version 0.1.0/0.2.0 results
result020
,
err
:=
r
.
GetAsVersion
(
implementedSpecVersion
)
if
err
!=
nil
{
return
nil
,
err
}
result
,
ok
:=
result020
.
(
*
Result
)
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"failed to convert result"
)
}
return
result
,
nil
}
// Result is what gets returned from the plugin (via stdout) to the caller
type
Result
struct
{
IP4
*
IPConfig
`json:"ip4,omitempty"`
IP6
*
IPConfig
`json:"ip6,omitempty"`
DNS
types
.
DNS
`json:"dns,omitempty"`
}
func
(
r
*
Result
)
Version
()
string
{
return
implementedSpecVersion
}
func
(
r
*
Result
)
GetAsVersion
(
version
string
)
(
types
.
Result
,
error
)
{
for
_
,
supportedVersion
:=
range
SupportedVersions
{
if
version
==
supportedVersion
{
return
r
,
nil
}
}
return
nil
,
fmt
.
Errorf
(
"cannot convert version %q to %s"
,
SupportedVersions
,
version
)
}
func
(
r
*
Result
)
Print
()
error
{
data
,
err
:=
json
.
MarshalIndent
(
r
,
""
,
" "
)
if
err
!=
nil
{
return
err
}
_
,
err
=
os
.
Stdout
.
Write
(
data
)
return
err
}
// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where
// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
func
(
r
*
Result
)
String
()
string
{
var
str
string
if
r
.
IP4
!=
nil
{
str
=
fmt
.
Sprintf
(
"IP4:%+v, "
,
*
r
.
IP4
)
}
if
r
.
IP6
!=
nil
{
str
+=
fmt
.
Sprintf
(
"IP6:%+v, "
,
*
r
.
IP6
)
}
return
fmt
.
Sprintf
(
"%sDNS:%+v"
,
str
,
r
.
DNS
)
}
// IPConfig contains values necessary to configure an interface
type
IPConfig
struct
{
IP
net
.
IPNet
Gateway
net
.
IP
Routes
[]
types
.
Route
}
// net.IPNet is not JSON (un)marshallable so this duality is needed
// for our custom IPNet type
// JSON (un)marshallable types
type
ipConfig
struct
{
IP
types
.
IPNet
`json:"ip"`
Gateway
net
.
IP
`json:"gateway,omitempty"`
Routes
[]
types
.
Route
`json:"routes,omitempty"`
}
func
(
c
*
IPConfig
)
MarshalJSON
()
([]
byte
,
error
)
{
ipc
:=
ipConfig
{
IP
:
types
.
IPNet
(
c
.
IP
),
Gateway
:
c
.
Gateway
,
Routes
:
c
.
Routes
,
}
return
json
.
Marshal
(
ipc
)
}
func
(
c
*
IPConfig
)
UnmarshalJSON
(
data
[]
byte
)
error
{
ipc
:=
ipConfig
{}
if
err
:=
json
.
Unmarshal
(
data
,
&
ipc
);
err
!=
nil
{
return
err
}
c
.
IP
=
net
.
IPNet
(
ipc
.
IP
)
c
.
Gateway
=
ipc
.
Gateway
c
.
Routes
=
ipc
.
Routes
return
nil
}
vendor/github.com/containernetworking/cni/pkg/types/current/types.go
0 → 100644
View file @
8963dd1b
// 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"
"net"
"os"
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/cni/pkg/types/020"
)
const
implementedSpecVersion
string
=
"0.3.1"
var
SupportedVersions
=
[]
string
{
"0.3.0"
,
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
{
DNS
:
oldResult
.
DNS
,
Routes
:
[]
*
types
.
Route
{},
}
if
oldResult
.
IP4
!=
nil
{
newResult
.
IPs
=
append
(
newResult
.
IPs
,
&
IPConfig
{
Version
:
"4"
,
Interface
:
-
1
,
Address
:
oldResult
.
IP4
.
IP
,
Gateway
:
oldResult
.
IP4
.
Gateway
,
})
for
_
,
route
:=
range
oldResult
.
IP4
.
Routes
{
gw
:=
route
.
GW
if
gw
==
nil
{
gw
=
oldResult
.
IP4
.
Gateway
}
newResult
.
Routes
=
append
(
newResult
.
Routes
,
&
types
.
Route
{
Dst
:
route
.
Dst
,
GW
:
gw
,
})
}
}
if
oldResult
.
IP6
!=
nil
{
newResult
.
IPs
=
append
(
newResult
.
IPs
,
&
IPConfig
{
Version
:
"6"
,
Interface
:
-
1
,
Address
:
oldResult
.
IP6
.
IP
,
Gateway
:
oldResult
.
IP6
.
Gateway
,
})
for
_
,
route
:=
range
oldResult
.
IP6
.
Routes
{
gw
:=
route
.
GW
if
gw
==
nil
{
gw
=
oldResult
.
IP6
.
Gateway
}
newResult
.
Routes
=
append
(
newResult
.
Routes
,
&
types
.
Route
{
Dst
:
route
.
Dst
,
GW
:
gw
,
})
}
}
if
len
(
newResult
.
IPs
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"cannot convert: no valid IP addresses"
)
}
return
newResult
,
nil
}
func
convertFrom030
(
result
types
.
Result
)
(
*
Result
,
error
)
{
newResult
,
ok
:=
result
.
(
*
Result
)
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"failed to convert result"
)
}
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
{
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
{
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"
,
implementedSpecVersion
:
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
{
data
,
err
:=
json
.
MarshalIndent
(
r
,
""
,
" "
)
if
err
!=
nil
{
return
err
}
_
,
err
=
os
.
Stdout
.
Write
(
data
)
return
err
}
// String returns a formatted string in the form of "[Interfaces: $1,][ IP: $2,] DNS: $3" where
// $1 represents the receiver's Interfaces, $2 represents the receiver's IP addresses and $3 the
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
func
(
r
*
Result
)
String
()
string
{
var
str
string
if
len
(
r
.
Interfaces
)
>
0
{
str
+=
fmt
.
Sprintf
(
"Interfaces:%+v, "
,
r
.
Interfaces
)
}
if
len
(
r
.
IPs
)
>
0
{
str
+=
fmt
.
Sprintf
(
"IP:%+v, "
,
r
.
IPs
)
}
if
len
(
r
.
Routes
)
>
0
{
str
+=
fmt
.
Sprintf
(
"Routes:%+v, "
,
r
.
Routes
)
}
return
fmt
.
Sprintf
(
"%sDNS:%+v"
,
str
,
r
.
DNS
)
}
// 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
)
}
// 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
}
vendor/github.com/containernetworking/cni/pkg/types/types.go
View file @
8963dd1b
...
...
@@ -16,6 +16,7 @@ package types
import
(
"encoding/json"
"errors"
"fmt"
"net"
"os"
...
...
@@ -57,44 +58,50 @@ func (n *IPNet) UnmarshalJSON(data []byte) error {
// NetConf describes a network.
type
NetConf
struct
{
Name
string
`json:"name,omitempty"`
Type
string
`json:"type,omitempty"`
IPAM
struct
{
CNIVersion
string
`json:"cniVersion,omitempty"`
Name
string
`json:"name,omitempty"`
Type
string
`json:"type,omitempty"`
Capabilities
map
[
string
]
bool
`json:"capabilities,omitempty"`
IPAM
struct
{
Type
string
`json:"type,omitempty"`
}
`json:"ipam,omitempty"`
DNS
DNS
`json:"dns"`
}
// Result is what gets returned from the plugin (via stdout) to the caller
type
Result
struct
{
IP4
*
IPConfig
`json:"ip4,omitempty"`
IP6
*
IPConfig
`json:"ip6,omitempty"`
DNS
DNS
`json:"dns,omitempty"`
}
// NetConfList describes an ordered list of networks.
type
NetConfList
struct
{
CNIVersion
string
`json:"cniVersion,omitempty"`
func
(
r
*
Result
)
Print
()
error
{
return
prettyPrint
(
r
)
Name
string
`json:"name,omitempty"`
Plugins
[]
*
NetConf
`json:"plugins,omitempty"`
}
// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where
// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
func
(
r
*
Result
)
String
()
string
{
var
str
string
if
r
.
IP4
!=
nil
{
str
=
fmt
.
Sprintf
(
"IP4:%+v, "
,
*
r
.
IP4
)
}
if
r
.
IP6
!=
nil
{
str
+=
fmt
.
Sprintf
(
"IP6:%+v, "
,
*
r
.
IP6
)
}
return
fmt
.
Sprintf
(
"%sDNS:%+v"
,
str
,
r
.
DNS
)
type
ResultFactoryFunc
func
([]
byte
)
(
Result
,
error
)
// Result is an interface that provides the result of plugin execution
type
Result
interface
{
// The highest CNI specification result verison the result supports
// without having to convert
Version
()
string
// Returns the result converted into the requested CNI specification
// result version, or an error if conversion failed
GetAsVersion
(
version
string
)
(
Result
,
error
)
// Prints the result in JSON format to stdout
Print
()
error
// Returns a JSON string representation of the result
String
()
string
}
// IPConfig contains values necessary to configure an interface
type
IPConfig
struct
{
IP
net
.
IPNet
Gateway
net
.
IP
Routes
[]
Route
func
PrintResult
(
result
Result
,
version
string
)
error
{
newResult
,
err
:=
result
.
GetAsVersion
(
version
)
if
err
!=
nil
{
return
err
}
return
newResult
.
Print
()
}
// DNS contains values interesting for DNS resolvers
...
...
@@ -110,6 +117,18 @@ type Route struct {
GW
net
.
IP
}
func
(
r
*
Route
)
String
()
string
{
return
fmt
.
Sprintf
(
"%+v"
,
*
r
)
}
// Well known error codes
// see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes
const
(
ErrUnknown
uint
=
iota
// 0
ErrIncompatibleCNIVersion
// 1
ErrUnsupportedField
// 2
)
type
Error
struct
{
Code
uint
`json:"code"`
Msg
string
`json:"msg"`
...
...
@@ -128,39 +147,11 @@ func (e *Error) Print() error {
// for our custom IPNet type
// JSON (un)marshallable types
type
ipConfig
struct
{
IP
IPNet
`json:"ip"`
Gateway
net
.
IP
`json:"gateway,omitempty"`
Routes
[]
Route
`json:"routes,omitempty"`
}
type
route
struct
{
Dst
IPNet
`json:"dst"`
GW
net
.
IP
`json:"gw,omitempty"`
}
func
(
c
*
IPConfig
)
MarshalJSON
()
([]
byte
,
error
)
{
ipc
:=
ipConfig
{
IP
:
IPNet
(
c
.
IP
),
Gateway
:
c
.
Gateway
,
Routes
:
c
.
Routes
,
}
return
json
.
Marshal
(
ipc
)
}
func
(
c
*
IPConfig
)
UnmarshalJSON
(
data
[]
byte
)
error
{
ipc
:=
ipConfig
{}
if
err
:=
json
.
Unmarshal
(
data
,
&
ipc
);
err
!=
nil
{
return
err
}
c
.
IP
=
net
.
IPNet
(
ipc
.
IP
)
c
.
Gateway
=
ipc
.
Gateway
c
.
Routes
=
ipc
.
Routes
return
nil
}
func
(
r
*
Route
)
UnmarshalJSON
(
data
[]
byte
)
error
{
rt
:=
route
{}
if
err
:=
json
.
Unmarshal
(
data
,
&
rt
);
err
!=
nil
{
...
...
@@ -189,3 +180,6 @@ func prettyPrint(obj interface{}) error {
_
,
err
=
os
.
Stdout
.
Write
(
data
)
return
err
}
// NotImplementedError is used to indicate that a method is not implemented for the given platform
var
NotImplementedError
=
errors
.
New
(
"Not Implemented"
)
vendor/github.com/containernetworking/cni/pkg/version/conf.go
0 → 100644
View file @
8963dd1b
// 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
version
import
(
"encoding/json"
"fmt"
)
// ConfigDecoder can decode the CNI version available in network config data
type
ConfigDecoder
struct
{}
func
(
*
ConfigDecoder
)
Decode
(
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: %s"
,
err
)
}
if
conf
.
CNIVersion
==
""
{
return
"0.1.0"
,
nil
}
return
conf
.
CNIVersion
,
nil
}
vendor/github.com/containernetworking/cni/pkg/version/plugin.go
0 → 100644
View file @
8963dd1b
// 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
version
import
(
"encoding/json"
"fmt"
"io"
)
// PluginInfo reports information about CNI versioning
type
PluginInfo
interface
{
// SupportedVersions returns one or more CNI spec versions that the plugin
// supports. If input is provided in one of these versions, then the plugin
// promises to use the same CNI version in its response
SupportedVersions
()
[]
string
// Encode writes this CNI version information as JSON to the given Writer
Encode
(
io
.
Writer
)
error
}
type
pluginInfo
struct
{
CNIVersion_
string
`json:"cniVersion"`
SupportedVersions_
[]
string
`json:"supportedVersions,omitempty"`
}
// pluginInfo implements the PluginInfo interface
var
_
PluginInfo
=
&
pluginInfo
{}
func
(
p
*
pluginInfo
)
Encode
(
w
io
.
Writer
)
error
{
return
json
.
NewEncoder
(
w
)
.
Encode
(
p
)
}
func
(
p
*
pluginInfo
)
SupportedVersions
()
[]
string
{
return
p
.
SupportedVersions_
}
// PluginSupports returns a new PluginInfo that will report the given versions
// as supported
func
PluginSupports
(
supportedVersions
...
string
)
PluginInfo
{
if
len
(
supportedVersions
)
<
1
{
panic
(
"programmer error: you must support at least one version"
)
}
return
&
pluginInfo
{
CNIVersion_
:
Current
(),
SupportedVersions_
:
supportedVersions
,
}
}
// PluginDecoder can decode the response returned by a plugin's VERSION command
type
PluginDecoder
struct
{}
func
(
*
PluginDecoder
)
Decode
(
jsonBytes
[]
byte
)
(
PluginInfo
,
error
)
{
var
info
pluginInfo
err
:=
json
.
Unmarshal
(
jsonBytes
,
&
info
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"decoding version info: %s"
,
err
)
}
if
info
.
CNIVersion_
==
""
{
return
nil
,
fmt
.
Errorf
(
"decoding version info: missing field cniVersion"
)
}
if
len
(
info
.
SupportedVersions_
)
==
0
{
if
info
.
CNIVersion_
==
"0.2.0"
{
return
PluginSupports
(
"0.1.0"
,
"0.2.0"
),
nil
}
return
nil
,
fmt
.
Errorf
(
"decoding version info: missing field supportedVersions"
)
}
return
&
info
,
nil
}
vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
0 → 100644
View file @
8963dd1b
// 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
version
import
"fmt"
type
ErrorIncompatible
struct
{
Config
string
Supported
[]
string
}
func
(
e
*
ErrorIncompatible
)
Details
()
string
{
return
fmt
.
Sprintf
(
"config is %q, plugin supports %q"
,
e
.
Config
,
e
.
Supported
)
}
func
(
e
*
ErrorIncompatible
)
Error
()
string
{
return
fmt
.
Sprintf
(
"incompatible CNI versions: %s"
,
e
.
Details
())
}
type
Reconciler
struct
{}
func
(
r
*
Reconciler
)
Check
(
configVersion
string
,
pluginInfo
PluginInfo
)
*
ErrorIncompatible
{
return
r
.
CheckRaw
(
configVersion
,
pluginInfo
.
SupportedVersions
())
}
func
(
*
Reconciler
)
CheckRaw
(
configVersion
string
,
supportedVersions
[]
string
)
*
ErrorIncompatible
{
for
_
,
supportedVersion
:=
range
supportedVersions
{
if
configVersion
==
supportedVersion
{
return
nil
}
}
return
&
ErrorIncompatible
{
Config
:
configVersion
,
Supported
:
supportedVersions
,
}
}
vendor/github.com/containernetworking/cni/pkg/version/version.go
0 → 100644
View file @
8963dd1b
// 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
version
import
(
"fmt"
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/cni/pkg/types/020"
"github.com/containernetworking/cni/pkg/types/current"
)
// Current reports the version of the CNI spec implemented by this library
func
Current
()
string
{
return
"0.3.1"
}
// Legacy PluginInfo describes a plugin that is backwards compatible with the
// CNI spec version 0.1.0. In particular, a runtime compiled against the 0.1.0
// library ought to work correctly with a plugin that reports support for
// Legacy versions.
//
// Any future CNI spec versions which meet this definition should be added to
// this list.
var
Legacy
=
PluginSupports
(
"0.1.0"
,
"0.2.0"
)
var
All
=
PluginSupports
(
"0.1.0"
,
"0.2.0"
,
"0.3.0"
,
"0.3.1"
)
var
resultFactories
=
[]
struct
{
supportedVersions
[]
string
newResult
types
.
ResultFactoryFunc
}{
{
current
.
SupportedVersions
,
current
.
NewResult
},
{
types020
.
SupportedVersions
,
types020
.
NewResult
},
}
// 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.
func
NewResult
(
version
string
,
resultBytes
[]
byte
)
(
types
.
Result
,
error
)
{
reconciler
:=
&
Reconciler
{}
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
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment