forked from github/multus-cni
multus/k8s: allow faking k8s client for unit tests
This commit is contained in:
committed by
Kuralamudhan Ramakrishnan
parent
f4f6a6cbed
commit
ac9e46f712
@@ -23,6 +23,7 @@ import (
|
||||
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
v1 "k8s.io/client-go/pkg/api/v1"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
|
||||
"github.com/containernetworking/cni/libcni"
|
||||
@@ -38,8 +39,22 @@ type NoK8sNetworkError struct {
|
||||
|
||||
func (e *NoK8sNetworkError) Error() string { return string(e.message) }
|
||||
|
||||
func createK8sClient(kubeconfig string) (*kubernetes.Clientset, error) {
|
||||
type defaultKubeClient struct {
|
||||
client kubernetes.Interface
|
||||
}
|
||||
|
||||
// defaultKubeClient implements KubeClient
|
||||
var _ KubeClient = &defaultKubeClient{}
|
||||
|
||||
func (d *defaultKubeClient) GetRawWithPath(path string) ([]byte, error) {
|
||||
return d.client.ExtensionsV1beta1().RESTClient().Get().AbsPath(path).DoRaw()
|
||||
}
|
||||
|
||||
func (d *defaultKubeClient) GetPod(namespace, name string) (*v1.Pod, error) {
|
||||
return d.client.Core().Pods(namespace).Get(name, metav1.GetOptions{})
|
||||
}
|
||||
|
||||
func createK8sClient(kubeconfig string) (KubeClient, error) {
|
||||
// uses the current context in kubeconfig
|
||||
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
|
||||
if err != nil {
|
||||
@@ -47,14 +62,19 @@ func createK8sClient(kubeconfig string) (*kubernetes.Clientset, error) {
|
||||
}
|
||||
|
||||
// creates the clientset
|
||||
return kubernetes.NewForConfig(config)
|
||||
client, err := kubernetes.NewForConfig(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &defaultKubeClient{client: client}, nil
|
||||
}
|
||||
|
||||
func getPodNetworkAnnotation(client *kubernetes.Clientset, k8sArgs types.K8sArgs) (string, error) {
|
||||
func getPodNetworkAnnotation(client KubeClient, k8sArgs types.K8sArgs) (string, error) {
|
||||
var annot string
|
||||
var err error
|
||||
|
||||
pod, err := client.Pods(string(k8sArgs.K8S_POD_NAMESPACE)).Get(fmt.Sprintf("%s", string(k8sArgs.K8S_POD_NAME)), metav1.GetOptions{})
|
||||
pod, err := client.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME))
|
||||
if err != nil {
|
||||
return annot, fmt.Errorf("getPodNetworkAnnotation: failed to query the pod %v in out of cluster comm: %v", string(k8sArgs.K8S_POD_NAME), err)
|
||||
}
|
||||
@@ -268,7 +288,7 @@ func getNetObject(net types.Network, primary bool, ifname string, confdir string
|
||||
return config, nil
|
||||
}
|
||||
|
||||
func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface{}, primary bool, confdir string) (string, error) {
|
||||
func getnetplugin(client KubeClient, networkinfo map[string]interface{}, primary bool, confdir string) (string, error) {
|
||||
networkname := networkinfo["name"].(string)
|
||||
if networkname == "" {
|
||||
return "", fmt.Errorf("getnetplugin: network name can't be empty")
|
||||
@@ -281,7 +301,7 @@ func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface
|
||||
|
||||
tprclient := fmt.Sprintf("/apis/kubernetes.cni.cncf.io/v1/namespaces/%s/networks/%s", netNsName, networkname)
|
||||
|
||||
netobjdata, err := client.ExtensionsV1beta1().RESTClient().Get().AbsPath(tprclient).DoRaw()
|
||||
netobjdata, err := client.GetRawWithPath(tprclient)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("getnetplugin: failed to get CRD (result: %s), refer Multus README.md for the usage guide: %v", netobjdata, err)
|
||||
}
|
||||
@@ -304,7 +324,7 @@ func getnetplugin(client *kubernetes.Clientset, networkinfo map[string]interface
|
||||
return netargs, nil
|
||||
}
|
||||
|
||||
func getPodNetworkObj(client *kubernetes.Clientset, netObjs []map[string]interface{}, confdir string) (string, error) {
|
||||
func getPodNetworkObj(client KubeClient, netObjs []map[string]interface{}, confdir string) (string, error) {
|
||||
|
||||
var np string
|
||||
var err error
|
||||
@@ -352,7 +372,12 @@ func getMultusDelegates(delegate string) ([]*types.DelegateNetConf, error) {
|
||||
return n.Delegates, nil
|
||||
}
|
||||
|
||||
func GetK8sNetwork(args *skel.CmdArgs, kubeconfig, confdir string) ([]*types.DelegateNetConf, error) {
|
||||
type KubeClient interface {
|
||||
GetRawWithPath(path string) ([]byte, error)
|
||||
GetPod(namespace, name string) (*v1.Pod, error)
|
||||
}
|
||||
|
||||
func GetK8sNetwork(args *skel.CmdArgs, kubeconfig string, k8sclient KubeClient, confdir string) ([]*types.DelegateNetConf, error) {
|
||||
k8sArgs := types.K8sArgs{}
|
||||
|
||||
err := cnitypes.LoadArgs(args.Args, &k8sArgs)
|
||||
@@ -360,9 +385,11 @@ func GetK8sNetwork(args *skel.CmdArgs, kubeconfig, confdir string) ([]*types.Del
|
||||
return nil, err
|
||||
}
|
||||
|
||||
k8sclient, err := createK8sClient(kubeconfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if k8sclient == nil {
|
||||
k8sclient, err = createK8sClient(kubeconfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
netAnnot, err := getPodNetworkAnnotation(k8sclient, k8sArgs)
|
||||
|
@@ -148,7 +148,7 @@ func delPlugins(exec invoke.Exec, argIfname string, delegates []*types.DelegateN
|
||||
return nil
|
||||
}
|
||||
|
||||
func cmdAdd(args *skel.CmdArgs, exec invoke.Exec) (cnitypes.Result, error) {
|
||||
func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) {
|
||||
var nopodnet bool
|
||||
n, err := types.LoadNetConf(args.StdinData)
|
||||
if err != nil {
|
||||
@@ -156,7 +156,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec) (cnitypes.Result, error) {
|
||||
}
|
||||
|
||||
if n.Kubeconfig != "" {
|
||||
delegates, err := k8s.GetK8sNetwork(args, n.Kubeconfig, n.ConfDir)
|
||||
delegates, err := k8s.GetK8sNetwork(args, n.Kubeconfig, kubeClient, n.ConfDir)
|
||||
if err != nil {
|
||||
if _, ok := err.(*k8s.NoK8sNetworkError); ok {
|
||||
nopodnet = true
|
||||
@@ -201,7 +201,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec) (cnitypes.Result, error) {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func cmdGet(args *skel.CmdArgs, exec invoke.Exec) (cnitypes.Result, error) {
|
||||
func cmdGet(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) (cnitypes.Result, error) {
|
||||
in, err := types.LoadNetConf(args.StdinData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -212,7 +212,7 @@ func cmdGet(args *skel.CmdArgs, exec invoke.Exec) (cnitypes.Result, error) {
|
||||
return in.PrevResult, nil
|
||||
}
|
||||
|
||||
func cmdDel(args *skel.CmdArgs, exec invoke.Exec) error {
|
||||
func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient k8s.KubeClient) error {
|
||||
var nopodnet bool
|
||||
|
||||
in, err := types.LoadNetConf(args.StdinData)
|
||||
@@ -221,12 +221,12 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec) error {
|
||||
}
|
||||
|
||||
if in.Kubeconfig != "" {
|
||||
delegates, r := k8s.GetK8sNetwork(args, in.Kubeconfig, in.ConfDir)
|
||||
if r != nil {
|
||||
if _, ok := r.(*k8s.NoK8sNetworkError); ok {
|
||||
delegates, err := k8s.GetK8sNetwork(args, in.Kubeconfig, kubeClient, in.ConfDir)
|
||||
if err != nil {
|
||||
if _, ok := err.(*k8s.NoK8sNetworkError); ok {
|
||||
nopodnet = true
|
||||
} else {
|
||||
return fmt.Errorf("Multus: Err in getting k8s network from pod: %v", r)
|
||||
return fmt.Errorf("Multus: Err in getting k8s network from pod: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,19 +256,19 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec) error {
|
||||
func main() {
|
||||
skel.PluginMain(
|
||||
func(args *skel.CmdArgs) error {
|
||||
result, err := cmdAdd(args, nil)
|
||||
result, err := cmdAdd(args, nil, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return result.Print()
|
||||
},
|
||||
func(args *skel.CmdArgs) error {
|
||||
result, err := cmdGet(args, nil)
|
||||
result, err := cmdGet(args, nil, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return result.Print()
|
||||
},
|
||||
func(args *skel.CmdArgs) error { return cmdDel(args, nil) },
|
||||
func(args *skel.CmdArgs) error { return cmdDel(args, nil, nil) },
|
||||
version.All, "meta-plugin that delegates to other CNI plugins")
|
||||
}
|
||||
|
Reference in New Issue
Block a user