summaryrefslogtreecommitdiffstats
path: root/manifests/host/sriov/numvfs_persistence.pp
blob: ec8c875700b7689c3c299813253a2520305ab5cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#
# tripleo::host::sriov::numvfs_persistence used by tripleo::host::sriov
#
# === Parameters:
#
# [*vf_defs*]
#   (required) Array of of <physical_interface>:<numvfs>.
#   Example: ['eth1:10','eth2:8']
#
# [*content_string*]
#   (required) String which shall be written to the script file.
#
# [*udev_rules*]
#   (required) String of lines to write to udev rules to ensure
#   VFs are reconfigured if the PCI devices are removed and
#   readded without rebooting (e.g. when physical functions were
#   allocated to VMs)
#
define tripleo::host::sriov::numvfs_persistence(
  $vf_defs,
  $content_string,
  $udev_rules
){
  # Since reduce isn't available, we use recursion to iterate each entries of
  # "physical_interface:vfs" and accumulate the content that needs to be
  # written to the script file.
  include ::stdlib

  if empty($vf_defs) {
    file { '/etc/sysconfig/allocate_vfs':
      ensure  => file,
      content => $content_string,
      group   => 'root',
      mode    => '0755',
      owner   => 'root',
    }

    file { '/sbin/ifup-local':
      group   => 'root',
      mode    => '0755',
      owner   => 'root',
      content => '#!/bin/bash',
      replace => false
    }

    file { '/etc/udev/rules.d/70-tripleo-reset-sriov.rules':
      ensure  => file,
      group   => 'root',
      mode    => '0755',
      owner   => 'root',
      content => $udev_rules,
      replace => true,
    }


    file_line { 'call_ifup-local':
      path    => '/sbin/ifup-local',
      line    => '/etc/sysconfig/allocate_vfs $1',
      require => File['/sbin/ifup-local'],
    }
  } else {
    $vfspec = split($vf_defs[0], ':')
    $interface = $vfspec[0]
    $count = $vfspec[1]
    $vfdef_str = "${content_string}[ \"${interface}\" == \"\$1\" ] && echo ${count} > /sys/class/net/${interface}/device/sriov_numvfs\n"
    $udev_str = "${udev_rules}KERNEL==\"${interface}\", RUN+=\"/etc/sysconfig/allocate_vfs %k\"\n"
    tripleo::host::sriov::numvfs_persistence{"mapped ${interface}":
      vf_defs        => delete_at($vf_defs, 0),
      content_string => $vfdef_str,
      udev_rules     => $udev_str
    }
  }
}