Puppet Function: nomad_cni::host_network_v4

Defined in:
lib/puppet/functions/nomad_cni/host_network_v4.rb
Function type:
Ruby 4.x API

Overview

nomad_cni::host_network_v4(String $iface, Optional[Variant[String, Undef]] $ip_type)Variant[Array[0, 0], Array[Hash]]

]

Parameters:

  • iface (String)
  • ip_type (Optional[Variant[String, Undef]])

Returns:

  • (Variant[Array[0, 0], Array[Hash]])


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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/puppet/functions/nomad_cni/host_network_v4.rb', line 50

Puppet::Functions.create_function(:'nomad_cni::host_network_v4') do
  dispatch :calculate_host_network_v4 do
    param 'String', :iface
    optional_param 'Variant[String, Undef]', :ip_type
    return_type 'Variant[Array[0, 0], Array[Hash]]'
  end

  def calculate_host_network_v4(iface, ip_type = 'v4')
    if ip_type == 'v4'
      ip = call_function('fact', "networking.interfaces.#{iface}.ip")
      netmask = call_function('fact', "networking.interfaces.#{iface}.netmask")
      cidr = IPAddr.new(netmask).to_i.to_s(2).count('1')
      network_addr = IPAddr.new(ip).mask(netmask).to_s + "/#{cidr}"
      public_network = [{ 'public_v4' => { 'cidr' => network_addr, 'interface' => iface } }]
    elsif ip_type == 'v6'
      ip = call_function('fact', "networking.interfaces.#{iface}.ip6")
      netmask = call_function('fact', "networking.interfaces.#{iface}.netmask6")
      cidr = IPAddr.new(netmask).to_i.to_s(2).count('1')
      network_addr = IPAddr.new(ip).mask(netmask).to_s + "/#{cidr}"
      public_network = [{ 'public_v6' => { 'cidr' => network_addr, 'interface' => iface } }]
    elsif ip_type == 'any'
      ip = call_function('fact', "networking.interfaces.#{iface}.ip")
      netmask = call_function('fact', "networking.interfaces.#{iface}.netmask")
      cidr = IPAddr.new(netmask).to_i.to_s(2).count('1')
      ip_six = call_function('fact', "networking.interfaces.#{iface}.ip6")
      netmask_six = call_function('fact', "networking.interfaces.#{iface}.netmask6")
      cidr_six = IPAddr.new(netmask_six).to_i.to_s(2).count('1')
      network_addr = IPAddr.new(ip).mask(netmask).to_s + "/#{cidr}"
      network_addr_six = IPAddr.new(ip_six).mask(netmask_six).to_s + "/#{cidr_six}"
      public_network = [
        { 'public_v4' => { 'cidr' => network_addr_six, 'interface' => iface } },
        { 'public_v6' => { 'cidr' => network_addr_six, 'interface' => iface } },
      ]
    else
      raise ArgumentError, "Invalid IP type: #{ip_type}. It must be 'v4' or 'v6' 'any' or undef. if undef, it defaults to 'v4'"
    end
    cni_hash = call_function('fact', 'nomad_cni_hash')

    if cni_hash.empty?
      cni_host_network = []
    else
      cni_names = cni_hash.keys
      cni_host_network = cni_names.map do |cni|
        ip_addr, subnet_addr = cni_hash[cni]['network'].split('/')
        network_addr = IPAddr.new(ip_addr).mask(subnet_addr).to_s + "/#{subnet_addr}"
        {
          cni => { 'cidr' => network_addr, 'interface' => "br#{cni_hash[cni]['id']}" }
        }
      end
    end
    cni_host_network + public_network
  end
end