2 Commits

Author SHA1 Message Date
dougbtv
ecc474a264 Skips binary copy in entrypoint with new parameter 2019-11-07 23:24:04 +08:00
Dan Williams
c7f957194b multus: print pod namespace/name in cmdAdd/cmdDel error messages
Signed-off-by: Dan Williams <dcbw@redhat.com>
2019-11-06 10:04:47 -05:00
3 changed files with 40 additions and 18 deletions

View File

@@ -615,3 +615,7 @@ Additionally when using CRIO, you may wish to have the CNI config file that's us
When using `--multus-conf-file=auto` you may also care to specify a `binDir` in the configuration, this can be accomplished using the `--additional-bin-dir` option. When using `--multus-conf-file=auto` you may also care to specify a `binDir` in the configuration, this can be accomplished using the `--additional-bin-dir` option.
--additional-bin-dir=/opt/multus/bin --additional-bin-dir=/opt/multus/bin
Sometimes, you may wish to not have the entrypoint copy the binary file onto the host. Potentially, you have another way to copy in a specific version of Multus, for example. By default, it's always copied, but you may disable the copy with:
--skip-multus-binary-copy=true

View File

@@ -33,6 +33,7 @@ MULTUS_CLEANUP_CONFIG_ON_EXIT=false
RESTART_CRIO=false RESTART_CRIO=false
CRIO_RESTARTED_ONCE=false CRIO_RESTARTED_ONCE=false
RENAME_SOURCE_CONFIG_FILE=false RENAME_SOURCE_CONFIG_FILE=false
SKIP_BINARY_COPY=false
# Give help text for parameters. # Give help text for parameters.
function usage() function usage()
@@ -51,6 +52,7 @@ function usage()
echo -e "\t--cni-version=<cniVersion (e.g. 0.3.1)>" echo -e "\t--cni-version=<cniVersion (e.g. 0.3.1)>"
echo -e "\t--multus-conf-file=$MULTUS_CONF_FILE" echo -e "\t--multus-conf-file=$MULTUS_CONF_FILE"
echo -e "\t--multus-bin-file=$MULTUS_BIN_FILE" echo -e "\t--multus-bin-file=$MULTUS_BIN_FILE"
echo -e "\t--skip-multus-binary-copy=$SKIP_BINARY_COPY"
echo -e "\t--multus-kubeconfig-file-host=$MULTUS_KUBECONFIG_FILE_HOST" echo -e "\t--multus-kubeconfig-file-host=$MULTUS_KUBECONFIG_FILE_HOST"
echo -e "\t--namespace-isolation=$MULTUS_NAMESPACE_ISOLATION" echo -e "\t--namespace-isolation=$MULTUS_NAMESPACE_ISOLATION"
echo -e "\t--multus-autoconfig-dir=$MULTUS_AUTOCONF_DIR (used only with --multus-conf-file=auto)" echo -e "\t--multus-autoconfig-dir=$MULTUS_AUTOCONF_DIR (used only with --multus-conf-file=auto)"
@@ -132,6 +134,9 @@ while [ "$1" != "" ]; do
--additional-bin-dir) --additional-bin-dir)
ADDITIONAL_BIN_DIR=$VALUE ADDITIONAL_BIN_DIR=$VALUE
;; ;;
--skip-multus-binary-copy)
SKIP_BINARY_COPY=$VALUE
;;
*) *)
warn "unknown parameter \"$PARAM\"" warn "unknown parameter \"$PARAM\""
;; ;;
@@ -157,8 +162,13 @@ do
done done
# Copy files into place and atomically move into final binary name # Copy files into place and atomically move into final binary name
cp -f $MULTUS_BIN_FILE $CNI_BIN_DIR/_multus if [ "$SKIP_BINARY_COPY" = false ]; then
mv -f $CNI_BIN_DIR/_multus $CNI_BIN_DIR/multus cp -f $MULTUS_BIN_FILE $CNI_BIN_DIR/_multus
mv -f $CNI_BIN_DIR/_multus $CNI_BIN_DIR/multus
else
log "Entrypoint skipped copying Multus binary."
fi
if [ "$MULTUS_CONF_FILE" != "auto" ]; then if [ "$MULTUS_CONF_FILE" != "auto" ]; then
cp -f $MULTUS_CONF_FILE $CNI_CONF_DIR cp -f $MULTUS_CONF_FILE $CNI_CONF_DIR
fi fi

View File

@@ -359,16 +359,24 @@ func delPlugins(exec invoke.Exec, argIfname string, delegates []*types.DelegateN
return nil return nil
} }
func cmdErr(k8sArgs *types.K8sArgs, format string, args ...interface{}) error {
prefix := "Multus: "
if k8sArgs != nil {
prefix += fmt.Sprintf("[%s/%s]: ", k8sArgs.K8S_POD_NAMESPACE, k8sArgs.K8S_POD_NAME)
}
return logging.Errorf(prefix+format, args...)
}
func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) { func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) {
n, err := types.LoadNetConf(args.StdinData) n, err := types.LoadNetConf(args.StdinData)
logging.Debugf("cmdAdd: %v, %v, %v", args, exec, kubeClient) logging.Debugf("cmdAdd: %v, %v, %v", args, exec, kubeClient)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: error loading netconf: %v", err) return nil, cmdErr(nil, "error loading netconf: %v", err)
} }
k8sArgs, err := k8s.GetK8sArgs(args) k8sArgs, err := k8s.GetK8sArgs(args)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: error getting k8s args: %v", err) return nil, cmdErr(nil, "error getting k8s args: %v", err)
} }
wait.ExponentialBackoff(defaultReadinessBackoff, func() (bool, error) { wait.ExponentialBackoff(defaultReadinessBackoff, func() (bool, error) {
@@ -384,7 +392,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
if n.ClusterNetwork != "" { if n.ClusterNetwork != "" {
err = k8s.GetDefaultNetworks(k8sArgs, n, kubeClient) err = k8s.GetDefaultNetworks(k8sArgs, n, kubeClient)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: failed to get clusterNetwork/defaultNetworks: %v", err) return nil, cmdErr(k8sArgs, "failed to get clusterNetwork/defaultNetworks: %v", err)
} }
// First delegate is always the master plugin // First delegate is always the master plugin
n.Delegates[0].MasterPlugin = true n.Delegates[0].MasterPlugin = true
@@ -392,12 +400,12 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
_, kc, err := k8s.TryLoadPodDelegates(k8sArgs, n, kubeClient) _, kc, err := k8s.TryLoadPodDelegates(k8sArgs, n, kubeClient)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: error loading k8s delegates k8s args: %v", err) return nil, cmdErr(k8sArgs, "error loading k8s delegates k8s args: %v", err)
} }
// cache the multus config // cache the multus config
if err := saveDelegates(args.ContainerID, n.CNIDir, n.Delegates); err != nil { if err := saveDelegates(args.ContainerID, n.CNIDir, n.Delegates); err != nil {
return nil, logging.Errorf("Multus: error saving the delegates: %v", err) return nil, cmdErr(k8sArgs, "error saving the delegates: %v", err)
} }
var result, tmpResult cnitypes.Result var result, tmpResult cnitypes.Result
@@ -417,7 +425,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
} }
// Ignore errors; DEL must be idempotent anyway // Ignore errors; DEL must be idempotent anyway
_ = delPlugins(exec, args.IfName, n.Delegates, idx, rt, n.BinDir) _ = delPlugins(exec, args.IfName, n.Delegates, idx, rt, n.BinDir)
return nil, logging.Errorf("Multus: error adding pod to network %q: %v", netName, err) return nil, cmdErr(k8sArgs, "error adding container to network %q: %v", netName, err)
} }
// Remove gateway from routing table if the gateway is not used // Remove gateway from routing table if the gateway is not used
@@ -438,7 +446,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
if deletegateway { if deletegateway {
tmpResult, err = netutils.DeleteDefaultGW(args, ifName, &tmpResult) tmpResult, err = netutils.DeleteDefaultGW(args, ifName, &tmpResult)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: Err in deleting gateway: %v", err) return nil, cmdErr(k8sArgs, "error deleting default gateway: %v", err)
} }
} }
@@ -446,7 +454,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
if adddefaultgateway { if adddefaultgateway {
tmpResult, err = netutils.SetDefaultGW(args, ifName, delegate.GatewayRequest, &tmpResult) tmpResult, err = netutils.SetDefaultGW(args, ifName, delegate.GatewayRequest, &tmpResult)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: Err in setting default gateway: %v", err) return nil, cmdErr(k8sArgs, "error setting default gateway: %v", err)
} }
} }
@@ -460,7 +468,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) { if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) {
delegateNetStatus, err := types.LoadNetworkStatus(tmpResult, delegate.Conf.Name, delegate.MasterPlugin) delegateNetStatus, err := types.LoadNetworkStatus(tmpResult, delegate.Conf.Name, delegate.MasterPlugin)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: error setting network status: %v", err) return nil, cmdErr(k8sArgs, "error setting network status: %v", err)
} }
netStatus = append(netStatus, delegateNetStatus) netStatus = append(netStatus, delegateNetStatus)
@@ -473,7 +481,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cn
if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) { if !types.CheckSystemNamespaces(kc.Podnamespace, n.SystemNamespaces) {
err = k8s.SetNetworkStatus(kubeClient, k8sArgs, netStatus, n) err = k8s.SetNetworkStatus(kubeClient, k8sArgs, netStatus, n)
if err != nil { if err != nil {
return nil, logging.Errorf("Multus: error setting the networks status: %v", err) return nil, cmdErr(k8sArgs, "error setting the networks status: %v", err)
} }
} }
} }
@@ -511,7 +519,7 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
netnsfound = false netnsfound = false
logging.Debugf("cmdDel: WARNING netns may not exist, netns: %s, err: %s", args.Netns, err) logging.Debugf("cmdDel: WARNING netns may not exist, netns: %s, err: %s", args.Netns, err)
} else { } else {
return logging.Errorf("Multus: failed to open netns %q: %v", netns, err) return cmdErr(nil, "failed to open netns %q: %v", netns, err)
} }
} }
@@ -521,7 +529,7 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
k8sArgs, err := k8s.GetK8sArgs(args) k8sArgs, err := k8s.GetK8sArgs(args)
if err != nil { if err != nil {
return logging.Errorf("Multus: error getting k8s args: %v", err) return cmdErr(nil, "error getting k8s args: %v", err)
} }
// Read the cache to get delegates json for the pod // Read the cache to get delegates json for the pod
@@ -532,7 +540,7 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
if in.ClusterNetwork != "" { if in.ClusterNetwork != "" {
err = k8s.GetDefaultNetworks(k8sArgs, in, kubeClient) err = k8s.GetDefaultNetworks(k8sArgs, in, kubeClient)
if err != nil { if err != nil {
return logging.Errorf("Multus: failed to get clusterNetwork/defaultNetworks: %v", err) return cmdErr(k8sArgs, "failed to get clusterNetwork/defaultNetworks: %v", err)
} }
// First delegate is always the master plugin // First delegate is always the master plugin
in.Delegates[0].MasterPlugin = true in.Delegates[0].MasterPlugin = true
@@ -543,18 +551,18 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) err
if err != nil { if err != nil {
if len(in.Delegates) == 0 { if len(in.Delegates) == 0 {
// No delegate available so send error // No delegate available so send error
return logging.Errorf("Multus: failed to get delegates: %v", err) return cmdErr(k8sArgs, "failed to get delegates: %v", err)
} }
// Get clusterNetwork before, so continue to delete // Get clusterNetwork before, so continue to delete
logging.Errorf("Multus: failed to get delegates: %v, but continue to delete clusterNetwork", err) logging.Errorf("Multus: failed to get delegates: %v, but continue to delete clusterNetwork", err)
} }
} else { } else {
return logging.Errorf("Multus: error reading the delegates: %v", err) return cmdErr(k8sArgs, "error reading the delegates: %v", err)
} }
} else { } else {
defer os.Remove(path) defer os.Remove(path)
if err := json.Unmarshal(netconfBytes, &in.Delegates); err != nil { if err := json.Unmarshal(netconfBytes, &in.Delegates); err != nil {
return logging.Errorf("Multus: failed to load netconf: %v", err) return cmdErr(k8sArgs, "failed to load netconf: %v", err)
} }
// check plugins field and enable ConfListPlugin if there is // check plugins field and enable ConfListPlugin if there is
for _, v := range in.Delegates { for _, v := range in.Delegates {