diff --git a/pkg/dra/driver.go b/pkg/dra/driver.go index 699283c..0a3e0a2 100644 --- a/pkg/dra/driver.go +++ b/pkg/dra/driver.go @@ -188,6 +188,19 @@ func (np *NetworkPlugin) RunPodSandbox(_ context.Context, pod *api.PodSandbox) e klog.Infof("RunPodSandbox error moving device %s to namespace %s: %v", result.Device, ns, err) return err } + rdmaDev, err := rdmamap.GetRdmaDeviceForNetdevice(result.Device) + if err != nil { + klog.Infof("RunPodSandbox error getting RDMA device %s to namespace %s: %v", result.Device, ns, err) + continue + } + // TODO signal this via DRA + if rdmaDev != "" { + err = hostdevice.MoveRDMALinkIn(rdmaDev, ns) + if err != nil { + klog.Infof("RunPodSandbox error getting RDMA device %s to namespace %s: %v", result.Device, ns, err) + continue + } + } } return nil } @@ -234,6 +247,18 @@ func (np *NetworkPlugin) StopPodSandbox(ctx context.Context, pod *api.PodSandbox klog.V(2).Infof("StopPodSandbox pod %s/%s failed to deallocate interface", pod.Namespace, pod.Name) return nil } + rdmaDev, err := rdmamap.GetRdmaDeviceForNetdevice(result.Device) + if err != nil { + klog.Infof("RunPodSandbox error getting RDMA device %s to namespace %s: %v", result.Device, ns, err) + continue + } + if rdmaDev != "" { + err = hostdevice.MoveRDMALinkIn(rdmaDev, ns) + if err != nil { + klog.Infof("RunPodSandbox error getting RDMA device %s to namespace %s: %v", result.Device, ns, err) + continue + } + } } return nil } diff --git a/pkg/hostdevice/rdmadevice.go b/pkg/hostdevice/rdmadevice.go new file mode 100644 index 0000000..cb0e584 --- /dev/null +++ b/pkg/hostdevice/rdmadevice.go @@ -0,0 +1,58 @@ +package hostdevice + +import ( + "fmt" + + "github.com/containernetworking/plugins/pkg/ns" + "github.com/vishvananda/netlink" +) + +// Based on existing RDMA CNI plugin +// https://github.com/k8snetworkplumbingwg/rdma-cni + +func MoveRDMALinkIn(hostIfName string, containerNsPAth string) error { + containerNs, err := ns.GetNS(containerNsPAth) + if err != nil { + return err + } + hostDev, err := netlink.RdmaLinkByName(hostIfName) + if err != nil { + return err + } + + if err = netlink.RdmaLinkSetNsFd(hostDev, uint32(containerNs.Fd())); err != nil { + return fmt.Errorf("failed to move %q to container ns: %v", hostDev.Attrs.Name, err) + } + + return nil +} + +func MoveRDMALinkOut(containerNsPAth string, ifName string) error { + containerNs, err := ns.GetNS(containerNsPAth) + if err != nil { + return err + } + defaultNs, err := ns.GetCurrentNS() + if err != nil { + return err + } + defer defaultNs.Close() + + err = containerNs.Do(func(_ ns.NetNS) error { + dev, err := netlink.RdmaLinkByName(ifName) + if err != nil { + return fmt.Errorf("failed to find %q: %v", ifName, err) + } + + if err = netlink.RdmaLinkSetNsFd(dev, uint32(defaultNs.Fd())); err != nil { + return fmt.Errorf("failed to move %q to host netns: %v", dev.Attrs.Name, err) + } + return nil + }) + + if err != nil { + return err + } + + return nil +}