Add slave interfaces to bond master after bond was created/set up

This workaround is required until salt with the patch [1] is not
used.

- use 'ifenslave' tool to enslave necessary interfaces only if bond
  interface has been changed
- install package that provides 'ifenslave' tool

[1] https://github.com/saltstack/salt/pull/39912

Change-Id: I65b607f26cf7319efb60f154951855d1334e1640
diff --git a/linux/map.jinja b/linux/map.jinja
index d6ffc4f..04b6441 100644
--- a/linux/map.jinja
+++ b/linux/map.jinja
@@ -117,7 +117,7 @@
 
 {% set network = salt['grains.filter_by']({
     'Arch': {
-        'pkgs': ['wpa_supplicant', 'dhclient', 'wireless_tools'],
+        'pkgs': ['wpa_supplicant', 'dhclient', 'wireless_tools', 'ifenslave'],
         'bridge_pkgs': ['bridge-utils'],
         'ovs_pkgs': ['openvswitch-switch'],
         'hostname_file': '/etc/hostname',
@@ -134,6 +134,7 @@
         'dhclient_config': '/etc/dhcp/dhclient.conf',
     },
     'Debian': {
+        'pkgs': ['ifenslave'],
         'hostname_file': '/etc/hostname',
         'bridge_pkgs': ['bridge-utils'],
         'ovs_pkgs': ['openvswitch-switch', 'bridge-utils'],
@@ -151,6 +152,7 @@
         'dhclient_config': '/etc/dhcp/dhclient.conf',
     },
     'RedHat': {
+        'pkgs': ['iputils'],
         'bridge_pkgs': ['bridge-utils'],
         'ovs_pkgs': ['openvswitch-switch', 'bridge-utils'],
         'hostname_file': '/etc/sysconfig/network',
diff --git a/linux/network/interface.sls b/linux/network/interface.sls
index 311f852..6f37348 100644
--- a/linux/network/interface.sls
+++ b/linux/network/interface.sls
@@ -224,6 +224,23 @@
 
 {%- 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: