|
- {%- from "linux/map.jinja" import network with context %}
- {%- from "linux/map.jinja" import system with context %}
- {%- if network.enabled %}
-
- {%- set dpdk_enabled = network.get('dpdk', {}).get('enabled', False) %}
- {%- if dpdk_enabled %}
- include:
- - linux.network.dpdk
- {%- endif %}
-
- {%- macro set_param(param_name, param_dict) -%}
- {%- if param_dict.get(param_name, False) -%}
- - {{ param_name }}: {{ param_dict[param_name] }}
- {%- endif -%}
- {%- endmacro -%}
-
- {%- if network.bridge != 'none' %}
-
- linux_network_bridge_pkgs:
- pkg.installed:
- {%- if network.bridge == 'openvswitch' %}
- - pkgs: {{ network.ovs_pkgs | json }}
- {%- else %}
- - pkgs: {{ network.bridge_pkgs | json }}
- {%- endif %}
-
- {%- endif %}
-
- {%- for f in network.get('concat_iface_files', []) %}
-
- {%- if salt['file.file_exists'](f.src) %}
-
- append_{{ f.src }}_{{ f.dst }}:
- file.append:
- - name: {{ f.dst }}
- - source: {{ f.src }}
-
- remove_appended_{{ f.src }}:
- file.absent:
- - name: {{ f.src }}
-
- {%- endif %}
-
- {%- endfor %}
-
- {%- for f in network.get('remove_iface_files', []) %}
-
- remove_iface_file_{{ f }}:
- file.absent:
- - name: {{ f }}
-
- {%- endfor %}
-
- {%- if network.interface is defined %}
-
- remove_cloud_init_file:
- file.absent:
- - name: /etc/network/interfaces.d/50-cloud-init.cfg
-
- {%- endif %}
-
- {%- for interface_name, interface in network.interface.items() %}
-
- {%- set interface_name = interface.get('name', interface_name) %}
-
- {# add linux network interface into OVS dpdk bridge #}
-
- {%- if interface.type == 'dpdk_ovs_bridge' %}
-
- {%- for int_name, int in network.interface.items() %}
-
- {%- set int_name = int.get('name', int_name) %}
-
- {%- if int.ovs_bridge is defined and interface_name == int.ovs_bridge %}
-
- add_int_{{ int_name }}_to_ovs_dpdk_bridge_{{ interface_name }}:
- cmd.run:
- - unless: ovs-vsctl show | grep -w {{ int_name }}
- - name: ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-port {{ interface_name }} {{ int_name }}
- {%- endif %}
- {%- endfor %}
-
- linux_interfaces_include_{{ interface_name }}:
- file.prepend:
- - name: /etc/network/interfaces
- - text: |
- source /etc/network/interfaces.d/*
- # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
- source /etc/network/interfaces.u/*
-
- {# create override for openvswitch dependency for dpdk br-prv #}
- /etc/systemd/system/ifup@{{ interface_name }}.service.d/override.conf:
- file.managed:
- - makedirs: true
- - require:
- - cmd: linux_network_dpdk_bridge_interface_{{ interface_name }}
- - contents: |
- [Unit]
- Requires=openvswitch-switch.service
- After=openvswitch-switch.service
-
- dpdk_ovs_bridge_{{ interface_name }}:
- file.managed:
- - name: /etc/network/interfaces.u/ifcfg-{{ interface_name }}
- - makedirs: True
- - source: salt://linux/files/ovs_bridge
- - defaults:
- bridge: {{ interface|yaml }}
- bridge_name: {{ interface_name }}
- - template: jinja
-
- dpdk_ovs_bridge_up_{{ interface_name }}:
- cmd.run:
- - name: ifup {{ interface_name }}
- - require:
- - file: dpdk_ovs_bridge_{{ interface_name }}
- - file: linux_interfaces_final_include
-
- {%- endif %}
-
- {# it is not used for any interface with type preffix dpdk,eg. dpdk_ovs_port #}
- {%- if interface.get('managed', True) and not 'dpdk' in interface.type %}
-
- {%- if grains.os_family in ['RedHat', 'Debian'] %}
-
- {%- if interface.type == 'ovs_bridge' %}
-
- ovs_bridge_{{ interface_name }}_present:
- openvswitch_bridge.present:
- - name: {{ interface_name }}
-
- {# add linux network interface into OVS bridge #}
- {%- for int_name, int in network.interface.items() %}
-
- {%- set int_name = int.get('name', int_name) %}
-
- {%- if int.ovs_bridge is defined and interface_name == int.ovs_bridge %}
-
- add_int_{{ int_name }}_to_ovs_bridge_{{ interface_name }}:
- cmd.run:
- - unless: ovs-vsctl show | grep {{ int_name }}
- - name: ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-port {{ interface_name }} {{ int_name }}
- {%- endif %}
- {%- endfor %}
-
- linux_interfaces_include_{{ interface_name }}:
- file.prepend:
- - name: /etc/network/interfaces
- - text: |
- source /etc/network/interfaces.d/*
- # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
- source /etc/network/interfaces.u/*
-
- ovs_bridge_{{ interface_name }}:
- file.managed:
- - name: /etc/network/interfaces.u/ifcfg-{{ interface_name }}
- - makedirs: True
- - source: salt://linux/files/ovs_bridge
- - defaults:
- bridge: {{ interface|yaml }}
- bridge_name: {{ interface_name }}
- - template: jinja
-
- ovs_bridge_up_{{ interface_name }}:
- cmd.run:
- - name: ifup {{ interface_name }}
- - require:
- - file: ovs_bridge_{{ interface_name }}
- - file: linux_interfaces_final_include
-
- {%- elif interface.type == 'ovs_bond' %}
- ovs_bond_{{ interface_name }}:
- cmd.run:
- - name: ovs-vsctl add-bond {{ interface.bridge }} {{ interface_name }} {{ interface.slaves }} bond_mode={{ interface.mode }}
- - unless: ovs-vsctl show | grep -A 2 'Port.*{{ interface_name }}.'
- - require:
- - ovs_bridge_{{ interface.bridge }}_present
-
- {%- elif interface.type == 'ovs_port' %}
-
- {%- if interface.get('port_type','internal') == 'patch' %}
-
- ovs_port_{{ interface_name }}_present:
- openvswitch_port.present:
- - name: {{ interface_name }}
- - bridge: {{ interface.bridge }}
- - require:
- {%- if dpdk_enabled and network.interface.get(interface.bridge, {}).get('type', 'ovs_bridge') == 'dpdk_ovs_bridge' %}
- - cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}
- {%- else %}
- - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}_present
- {%- endif %}
-
- ovs_port_set_type_{{ interface_name }}:
- cmd.run:
- - name: ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set interface {{ interface_name }} type=patch
- - unless: ovs-vsctl show | grep -A 1 'Interface {{ interface_name }}' | grep patch
-
- ovs_port_set_peer_{{ interface_name }}:
- cmd.run:
- - name: ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set interface {{ interface_name }} options:peer={{ interface.peer }}
- - unless: ovs-vsctl show | grep -A 2 'Interface {{ interface_name }}' | grep {{ interface.peer }}
-
- {% if interface.tag is defined %}
- ovs_port_set_tag_{{ interface_name }}:
- cmd.run:
- - name: ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set port {{ interface_name }} tag={{ interface.tag }}
- - unless: ovs-vsctl get Port {{ interface_name }} tag | grep -Fx {{ interface.tag }}
- {%- endif %}
-
- {%- else %}
-
- linux_interfaces_include_{{ interface_name }}:
- file.prepend:
- - name: /etc/network/interfaces
- - text: |
- source /etc/network/interfaces.d/*
- # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
- source /etc/network/interfaces.u/*
-
- ovs_port_{{ interface_name }}:
- file.managed:
- - name: /etc/network/interfaces.u/ifcfg-{{ interface_name }}
- - makedirs: True
- - source: salt://linux/files/ovs_port
- - defaults:
- port: {{ interface|yaml }}
- port_name: {{ interface_name }}
- auto: ""
- iface_inet: ""
- - template: jinja
-
- ovs_port_up_{{ interface_name }}:
- cmd.run:
- - name: ifup {{ interface_name }}
- - require:
- - file: ovs_port_{{ interface_name }}
- - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}_present
- - file: linux_interfaces_final_include
-
- {%- endif %}
-
- {%- else %}
-
- linux_interface_{{ interface_name }}:
- network.managed:
- - enabled: {{ interface.enabled }}
- - name: {{ interface_name }}
- - type: {{ interface.type }}
- {%- if interface.address is defined %}
- {%- if grains.os_family == 'Debian' %}
- - proto: {{ interface.get('proto', 'static') }}
- {% endif %}
- {%- if grains.os_family == 'RedHat' %}
- {%- if interface.get('proto', 'none') == 'manual' %}
- - proto: 'none'
- {%- else %}
- - proto: {{ interface.get('proto', 'none') }}
- {%- endif %}
- {% endif %}
- - ipaddr: {{ interface.address }}
- - netmask: {{ interface.netmask }}
- {%- else %}
- - proto: {{ interface.get('proto', 'dhcp') }}
- {%- endif %}
- {%- if interface.type == 'slave' %}
- - master: {{ interface.master }}
- {%- endif %}
- {%- if interface.name_servers is defined %}
- - dns: {{ interface.name_servers }}
- {%- endif %}
- {%- if interface.wireless is defined and grains.os_family == 'Debian' %}
- {%- if interface.wireless.security == "wpa" %}
- - wpa-ssid: {{ interface.wireless.essid }}
- - wpa-psk: {{ interface.wireless.key }}
- {%- else %}
- - wireless-ssid: {{ interface.wireless.essid }}
- - wireless-psk: {{ interface.wireless.key }}
- {%- endif %}
- {%- endif %}
- {%- if pillar.linux.network.noifupdown is defined %}
- - noifupdown: {{ pillar.linux.network.noifupdown }}
- {%- endif %}
- {%- for param in network.interface_params %}
- {{ set_param(param, interface) }}
- {%- endfor %}
- {%- if interface.require_interfaces is defined %}
- - require:
- {%- for netif in interface.get('require_interfaces', []) %}
- - network: linux_interface_{{ netif }}
- {%- endfor %}
- {%- for network in interface.get('use_ovs_ports', []) %}
- - cmd: ovs_port_up_{{ network }}
- {%- endfor %}
- {%- endif %}
- {%- if interface.type == 'bridge' %}
- - bridge: {{ interface_name }}
- - delay: 0
- - bypassfirewall: True
- - use:
- {%- for network in interface.use_interfaces %}
- - network: linux_interface_{{ network }}
- {%- endfor %}
- - ports: {% for network in interface.get('use_interfaces', []) %}{{ network }} {% endfor %}{% for network in interface.get('use_ovs_ports', []) %}{{ network }} {% endfor %}
- - require:
- {%- for network in interface.get('use_interfaces', []) %}
- - network: linux_interface_{{ network }}
- {%- endfor %}
- {%- for network in interface.get('use_ovs_ports', []) %}
- - cmd: ovs_port_up_{{ network }}
- {%- endfor %}
- {%- endif %}
- {%- if interface.type == 'bond' %}
- - slaves: {{ interface.slaves }}
- - mode: {{ interface.mode }}
- {%- endif %}
-
-
- {%- if salt['grains.get']('saltversion') < '2017.7' %}
- # TODO(ddmitriev): Remove this 'if .. endif' block completely when
- # switched to salt version 2017.7 that has the same functionality.
- {%- if interface.type == 'bond' and interface.enabled == True %}
- linux_bond_interface_{{ interface_name }}:
- cmd.run:
- - name: ifenslave {{ interface_name }} {{ interface.slaves }}
- - require:
- - network: linux_interface_{{ interface_name }}
- - onchanges:
- - network: linux_interface_{{ interface_name }}
- {%- for network in interface.slaves.split() %}
- - network: linux_interface_{{ network }}
- {%- endfor %}
- {%- endif %}
- {%- endif %}
-
- {%- for network in interface.get('use_ovs_ports', []) %}
-
- remove_interface_{{ network }}_line1:
- file.replace:
- - name: /etc/network/interfaces
- - pattern: auto {{ network }}$
- - repl: ""
-
- remove_interface_{{ network }}_line2:
- file.replace:
- - name: /etc/network/interfaces
- - pattern: iface {{ network }} inet manual
- - repl: ""
-
- {%- endfor %}
-
- {%- if interface.gateway is defined %}
-
- linux_system_network:
- network.system:
- - enabled: {{ interface.enabled }}
- - hostname: {{ network.fqdn }}
- {%- if interface.gateway is defined %}
- - gateway: {{ interface.gateway }}
- - gatewaydev: {{ interface_name }}
- {%- endif %}
- - nozeroconf: True
- - nisdomain: {{ system.domain }}
- - require_reboot: True
-
- {%- endif %}
-
- {%- endif %}
-
- {%- endif %}
-
- {%- if interface.wireless is defined %}
-
- {%- if grains.os_family == 'Arch' %}
-
- linux_network_packages:
- pkg.installed:
- - pkgs: {{ network.pkgs | json }}
-
- /etc/netctl/network_{{ interface.wireless.essid }}:
- file.managed:
- - source: salt://linux/files/wireless
- - mode: 755
- - template: jinja
- - require:
- - pkg: linux_network_packages
- - defaults:
- interface_name: {{ interface_name }}
-
- switch_profile_{{ interface.wireless.essid }}:
- cmd.run:
- - name: netctl switch-to network_{{ interface.wireless.essid }}
- - cwd: /root
- - unless: "iwconfig {{ interface_name }} | grep -e 'ESSID:\"{{ interface.wireless.essid }}\"'"
- - require:
- - file: /etc/netctl/network_{{ interface.wireless.essid }}
-
- enable_profile_{{ interface.wireless.essid }}:
- cmd.run:
- - name: netctl enable network_{{ interface.wireless.essid }}
- - cwd: /root
- - unless: test -e /etc/systemd/system/multi-user.target.wants/netctl@network_{{ interface.wireless.essid }}.service
- - require:
- - file: /etc/netctl/network_{{ interface.wireless.essid }}
-
- {%- endif %}
-
- {%- endif %}
-
- {%- endif %}
-
- {%- if interface.route is defined %}
-
- linux_network_{{ interface_name }}_routes:
- network.routes:
- - name: {{ interface_name }}
- - routes:
- {%- for route_name, route in interface.route.items() %}
- - name: {{ route_name }}
- ipaddr: {{ route.address }}
- netmask: {{ route.netmask }}
- {%- if route.gateway is defined %}
- gateway: {{ route.gateway }}
- {%- endif %}
- {%- endfor %}
- {%- if interface.noifupdown is defined %}
- - require_reboot: {{ interface.noifupdown }}
- {%- endif %}
-
- {%- endif %}
-
- {%- if interface.type in ('eth','ovs_port') %}
- {%- if interface.get('ipflush_onchange', False) %}
-
- linux_interface_ipflush_onchange_{{ interface_name }}:
- cmd.run:
- - name: "/sbin/ip address flush dev {{ interface_name }}"
- {%- if interface.type == 'eth' %}
- - onchanges:
- - network: linux_interface_{{ interface_name }}
- {%- elif interface.type == 'ovs_port' %}
- - onchanges:
- - file: ovs_port_{{ interface_name }}
- {%- endif %}
-
- {%- if interface.get('restart_on_ipflush', False) %}
-
- linux_interface_restart_on_ipflush_{{ interface_name }}:
- cmd.run:
- - name: "ifdown {{ interface_name }}; ifup {{ interface_name }};"
- - onchanges:
- - cmd: linux_interface_ipflush_onchange_{{ interface_name }}
-
- {%- endif %}
-
- {%- endif %}
-
- {%- endif %}
-
- {%- endfor %}
-
- {%- if network.bridge != 'none' %}
-
- linux_interfaces_final_include:
- file.prepend:
- - name: /etc/network/interfaces
- - text: |
- source /etc/network/interfaces.d/*
- # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
- source /etc/network/interfaces.u/*
-
- linux_interfaces_final_include_no_requisite:
- file.prepend:
- - name: /etc/network/interfaces
- - text: |
- source /etc/network/interfaces.d/*
- # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
- source /etc/network/interfaces.u/*
-
- {%- endif %}
-
- {%- endif %}
-
- {%- if network.network_manager.disable is defined and network.network_manager.disable == True %}
-
- NetworkManager:
- service.dead:
- - enable: false
-
- {%- endif %}
-
- {%- if network.tap_custom_txqueuelen is defined %}
-
- /etc/udev/rules.d/60-net-txqueue.rules:
- file.managed:
- - source: salt://linux/files/60-net-txqueue.rules
- - mode: 755
- - template: jinja
- - defaults:
- tap_custom_txqueuelen: {{ network.tap_custom_txqueuelen }}
-
- udev_reload_rules:
- cmd.run:
- - name: "/bin/udevadm control --reload-rules"
- - onchanges:
- - file: /etc/udev/rules.d/60-net-txqueue.rules
-
- udev_retrigger:
- cmd.run:
- - name: "/bin/udevadm trigger --attr-match=subsystem=net"
- - onchanges:
- - udev_reload_rules
-
- {%- endif %}
|