Merge pull request #215 from mheon/update_cni

Update OCICNI vendor and plugin directories
This commit is contained in:
Daniel J Walsh
2018-01-12 10:14:44 -05:00
committed by GitHub
6 changed files with 41 additions and 66 deletions

View File

@ -38,7 +38,8 @@ func (r *Runtime) createNetNS(ctr *Container) (err error) {
podNetwork := getPodNetwork(ctr.ID(), ctr.Name(), ctrNS.Path(), ctr.config.PortMappings) podNetwork := getPodNetwork(ctr.ID(), ctr.Name(), ctrNS.Path(), ctr.config.PortMappings)
if err := r.netPlugin.SetUpPod(podNetwork); err != nil { _, err = r.netPlugin.SetUpPod(podNetwork)
if err != nil {
return errors.Wrapf(err, "error configuring network namespace for container %s", ctr.ID()) return errors.Wrapf(err, "error configuring network namespace for container %s", ctr.ID())
} }

View File

@ -275,7 +275,7 @@ func WithCNIPluginDir(dir string) RuntimeOption {
return ErrRuntimeFinalized return ErrRuntimeFinalized
} }
rt.config.CNIPluginDir = dir rt.config.CNIPluginDir = []string{dir}
return nil return nil
} }

View File

@ -51,7 +51,7 @@ type RuntimeConfig struct {
MaxLogSize int64 MaxLogSize int64
NoPivotRoot bool NoPivotRoot bool
CNIConfigDir string CNIConfigDir string
CNIPluginDir string CNIPluginDir []string
} }
var ( var (
@ -73,7 +73,7 @@ var (
MaxLogSize: -1, MaxLogSize: -1,
NoPivotRoot: false, NoPivotRoot: false,
CNIConfigDir: "/etc/cni/net.d/", CNIConfigDir: "/etc/cni/net.d/",
CNIPluginDir: "/usr/libexec/cni", CNIPluginDir: []string{"/usr/libexec/cni", "/opt/cni/bin"},
} }
) )
@ -173,7 +173,7 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
} }
// Set up the CNI net plugin // Set up the CNI net plugin
netPlugin, err := ocicni.InitCNI(runtime.config.CNIConfigDir, runtime.config.CNIPluginDir) netPlugin, err := ocicni.InitCNI(runtime.config.CNIConfigDir, runtime.config.CNIPluginDir...)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "error configuring CNI network plugin") return nil, errors.Wrapf(err, "error configuring CNI network plugin")
} }

View File

@ -1,24 +0,0 @@
package ocicni
type cniNoOp struct {
}
func (noop *cniNoOp) Name() string {
return "CNINoOp"
}
func (noop *cniNoOp) SetUpPod(network PodNetwork) error {
return nil
}
func (noop *cniNoOp) TearDownPod(network PodNetwork) error {
return nil
}
func (noop *cniNoOp) GetPodNetworkStatus(network PodNetwork) (string, error) {
return "", nil
}
func (noop *cniNoOp) Status() error {
return nil
}

View File

@ -3,6 +3,7 @@ package ocicni
import ( import (
"errors" "errors"
"fmt" "fmt"
"os"
"os/exec" "os/exec"
"sort" "sort"
"strings" "strings"
@ -139,33 +140,11 @@ func (plugin *cniNetworkPlugin) monitorNetDir() {
<-plugin.monitorNetDirChan <-plugin.monitorNetDirChan
} }
// InitCNI takes the plugin directory and cni directories where the cni files should be searched for // InitCNI takes the plugin directory and CNI directories where the CNI config
// Returns a valid plugin object and any error // files should be searched for. If no valid CNI configs exist, network requests
// will fail until valid CNI config files are present in the config directory.
func InitCNI(pluginDir string, cniDirs ...string) (CNIPlugin, error) { func InitCNI(pluginDir string, cniDirs ...string) (CNIPlugin, error) {
plugin := probeNetworkPluginsWithVendorCNIDirPrefix(pluginDir, cniDirs, "") vendorCNIDirPrefix := ""
var err error
plugin.nsenterPath, err = exec.LookPath("nsenter")
if err != nil {
return nil, err
}
// check if a default network exists, otherwise dump the CNI search and return a noop plugin
_, err = getDefaultCNINetwork(plugin.pluginDir, plugin.cniDirs, plugin.vendorCNIDirPrefix)
if err != nil {
if err != errMissingDefaultNetwork {
logrus.Warningf("Error in finding usable CNI plugin - %v", err)
// create a noop plugin instead
return &cniNoOp{}, nil
}
// We do not have a default network, we start the monitoring thread.
go plugin.monitorNetDir()
}
return plugin, nil
}
func probeNetworkPluginsWithVendorCNIDirPrefix(pluginDir string, cniDirs []string, vendorCNIDirPrefix string) *cniNetworkPlugin {
plugin := &cniNetworkPlugin{ plugin := &cniNetworkPlugin{
defaultNetwork: nil, defaultNetwork: nil,
loNetwork: getLoNetwork(cniDirs, vendorCNIDirPrefix), loNetwork: getLoNetwork(cniDirs, vendorCNIDirPrefix),
@ -176,11 +155,26 @@ func probeNetworkPluginsWithVendorCNIDirPrefix(pluginDir string, cniDirs []strin
pods: make(map[string]*podLock), pods: make(map[string]*podLock),
} }
// sync NetworkConfig in best effort during probing. var err error
if err := plugin.syncNetworkConfig(); err != nil { plugin.nsenterPath, err = exec.LookPath("nsenter")
logrus.Error(err) if err != nil {
return nil, err
} }
return plugin
// Fail loudly if plugin directory doesn't exist, because fsnotify watcher
// won't be able to watch it.
if _, err := os.Stat(pluginDir); err != nil {
return nil, err
}
if err := plugin.syncNetworkConfig(); err != nil {
// We do not have a valid default network, so start the
// monitoring thread. Network setup/teardown requests
// will fail until we have a valid default network.
go plugin.monitorNetDir()
}
return plugin, nil
} }
func getDefaultCNINetwork(pluginDir string, cniDirs []string, vendorCNIDirPrefix string) (*cniNetwork, error) { func getDefaultCNINetwork(pluginDir string, cniDirs []string, vendorCNIDirPrefix string) (*cniNetwork, error) {
@ -308,9 +302,9 @@ func (plugin *cniNetworkPlugin) Name() string {
return CNIPluginName return CNIPluginName
} }
func (plugin *cniNetworkPlugin) SetUpPod(podNetwork PodNetwork) error { func (plugin *cniNetworkPlugin) SetUpPod(podNetwork PodNetwork) (cnitypes.Result, error) {
if err := plugin.checkInitialized(); err != nil { if err := plugin.checkInitialized(); err != nil {
return err return nil, err
} }
plugin.podLock(podNetwork).Lock() plugin.podLock(podNetwork).Lock()
@ -319,16 +313,16 @@ func (plugin *cniNetworkPlugin) SetUpPod(podNetwork PodNetwork) error {
_, err := plugin.loNetwork.addToNetwork(podNetwork) _, err := plugin.loNetwork.addToNetwork(podNetwork)
if err != nil { if err != nil {
logrus.Errorf("Error while adding to cni lo network: %s", err) logrus.Errorf("Error while adding to cni lo network: %s", err)
return err return nil, err
} }
_, err = plugin.getDefaultNetwork().addToNetwork(podNetwork) result, err := plugin.getDefaultNetwork().addToNetwork(podNetwork)
if err != nil { if err != nil {
logrus.Errorf("Error while adding to cni network: %s", err) logrus.Errorf("Error while adding to cni network: %s", err)
return err return nil, err
} }
return err return result, err
} }
func (plugin *cniNetworkPlugin) TearDownPod(podNetwork PodNetwork) error { func (plugin *cniNetworkPlugin) TearDownPod(podNetwork PodNetwork) error {

View File

@ -1,5 +1,9 @@
package ocicni package ocicni
import (
"github.com/containernetworking/cni/pkg/types"
)
const ( const (
// DefaultInterfaceName is the string to be used for the interface name inside the net namespace // DefaultInterfaceName is the string to be used for the interface name inside the net namespace
DefaultInterfaceName = "eth0" DefaultInterfaceName = "eth0"
@ -49,7 +53,7 @@ type CNIPlugin interface {
// SetUpPod is the method called after the sandbox container of // SetUpPod is the method called after the sandbox container of
// the pod has been created but before the other containers of the // the pod has been created but before the other containers of the
// pod are launched. // pod are launched.
SetUpPod(network PodNetwork) error SetUpPod(network PodNetwork) (types.Result, error)
// TearDownPod is the method called before a pod's sandbox container will be deleted // TearDownPod is the method called before a pod's sandbox container will be deleted
TearDownPod(network PodNetwork) error TearDownPod(network PodNetwork) error