@@ -47,6 +47,10 @@ const (
4747 ioPrioKey = "io-priority.noderesource.dev"
4848 // Deprecated: Prefix of the key used for I/O priority adjustment.
4949 oldIoPrioKey = "io-priority.nri.io"
50+ // Prefix of the key used for network device injection.
51+ netDeviceKey = "network-devices.noderesource.dev"
52+ // Deprecated: Prefix of the key used for network device injection.
53+ oldNetDeviceKey = "network-devices.nri.io"
5054)
5155
5256var (
@@ -79,6 +83,12 @@ type ioPrio struct {
7983 Priority int32 `json:"priority"`
8084}
8185
86+ // a network device to inject
87+ type netDevice struct {
88+ HostIf string `json:"hostIf"`
89+ Name string `json:"name"`
90+ }
91+
8292// our injector plugin
8393type plugin struct {
8494 stub stub.Stub
@@ -108,6 +118,10 @@ func (p *plugin) CreateContainer(_ context.Context, pod *api.PodSandbox, ctr *ap
108118 return nil , nil , err
109119 }
110120
121+ if err := injectNetDevices (pod , ctr , adjust ); err != nil {
122+ return nil , nil , err
123+ }
124+
111125 if verbose {
112126 dump (containerName (pod , ctr ), "ContainerAdjustment" , adjust )
113127 }
@@ -286,6 +300,51 @@ func parseIOPriority(ctr string, annotations map[string]string) (*ioPrio, error)
286300 return priority , nil
287301}
288302
303+ func injectNetDevices (pod * api.PodSandbox , ctr * api.Container , a * api.ContainerAdjustment ) error {
304+ devices , err := parseNetDevices (ctr .Name , pod .Annotations )
305+ if err != nil {
306+ return err
307+ }
308+
309+ if len (devices ) == 0 {
310+ log .Debugf ("%s: no network devices annotated..." , containerName (pod , ctr ))
311+ return nil
312+ }
313+
314+ if verbose {
315+ dump (containerName (pod , ctr ), "annotated network devices" , devices )
316+ }
317+
318+ for _ , d := range devices {
319+ a .AddLinuxNetDevice (d .HostIf , & api.LinuxNetDevice {
320+ Name : d .Name ,
321+ })
322+ if ! verbose {
323+ log .Infof ("%s: injected network device %q -> %q..." , containerName (pod , ctr ),
324+ d .HostIf , d .Name )
325+ }
326+ }
327+
328+ return nil
329+ }
330+
331+ func parseNetDevices (ctr string , annotations map [string ]string ) ([]* netDevice , error ) {
332+ var (
333+ devices []* netDevice
334+ )
335+
336+ annotation := getAnnotation (annotations , netDeviceKey , oldNetDeviceKey , ctr )
337+ if annotation == nil {
338+ return nil , nil
339+ }
340+
341+ if err := yaml .Unmarshal (annotation , & devices ); err != nil {
342+ return nil , fmt .Errorf ("invalid net device annotation %q: %w" , string (annotation ), err )
343+ }
344+
345+ return devices , nil
346+ }
347+
289348func getAnnotation (annotations map [string ]string , mainKey , oldKey , ctr string ) []byte {
290349 for _ , key := range []string {
291350 mainKey + "/container." + ctr ,
0 commit comments