Merge "Update Gemfile and Makefile configuration   - One Gemfile for all formulas tests   - Update Makefile for OpenStack tests"
diff --git a/linux/files/ovs_bridge b/linux/files/ovs_bridge
new file mode 100644
index 0000000..bf9b74f
--- /dev/null
+++ b/linux/files/ovs_bridge
@@ -0,0 +1,14 @@
+auto {{ bridge_name }}
+iface {{ bridge_name }} inet {{ bridge.get('proto', 'static' if bridge.address is defined else 'manual') }}
+ovs_type {{ bridge.get('ovs_bridge_type', 'OVSBridge') }}
+mtu {{ bridge.get('mtu', '1500') }}
+{%- if bridge.address is defined %}
+address {{ bridge.address }}
+netmask {{ bridge.netmask }}
+{%- endif %}
+{%- if bridge.gateway is defined %}
+gateway {{ bridge.gateway }}
+{%- endif %}
+{%- if bridge.ovs_options is defined %}
+ovs_options {{ bridge.ovs_options }}
+{%- endif %}
diff --git a/linux/network/dpdk.sls b/linux/network/dpdk.sls
index 786f7c8..7cc4102 100644
--- a/linux/network/dpdk.sls
+++ b/linux/network/dpdk.sls
@@ -143,37 +143,6 @@
     - name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-br {{ interface_name }} -- set bridge {{ interface_name }} datapath_type=netdev{% if interface.tag is defined %} -- set port {{ interface_name }} tag={{ interface.tag }}{% endif %}"
     - unless: "ovs-vsctl show | grep {{ interface_name }}"
 
-    {# OVS dpdk needs ip address for vxlan termination on bridge br-prv #}
-    {%- if interface.address is defined %}
-
-{# 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
-
-{# enforce ip address and mtu for ovs dpdk br-prv #}
-/etc/network/interfaces.u/ifcfg-{{ interface_name }}:
-  file.managed:
-    - contents: |
-        auto {{ interface_name }}
-        iface {{ interface_name }} inet static
-        address {{ interface.address }}
-        netmask {{ interface.netmask }}
-        {%- if interface.mtu is defined %}
-        mtu {{ interface.mtu }}
-        {%- endif %}
-    - makedirs: True
-    - require:
-      - file: /etc/systemd/system/ifup@{{ interface_name }}.service.d/override.conf
-
-    {%- endif %}
-
   {%- elif interface.type == 'dpdk_ovs_port' and interface.bridge is defined %}
 
 linux_network_dpdk_bridge_port_interface_{{ interface_name }}:
diff --git a/linux/network/interface.sls b/linux/network/interface.sls
index 34b8485..6086957 100644
--- a/linux/network/interface.sls
+++ b/linux/network/interface.sls
@@ -77,9 +77,45 @@
   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 #}
@@ -89,7 +125,7 @@
 
 {%- if interface.type == 'ovs_bridge' %}
 
-ovs_bridge_{{ interface_name }}:
+ovs_bridge_{{ interface_name }}_present:
   openvswitch_bridge.present:
   - name: {{ interface_name }}
 
@@ -104,16 +140,41 @@
   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_port' %}
 
 {%- if interface.get('port_type','internal') == 'patch' %}
 
-ovs_port_{{ interface_name }}:
+ovs_port_{{ interface_name }}_present:
   openvswitch_port.present:
   - name: {{ interface_name }}
   - bridge: {{ interface.bridge }}
@@ -121,7 +182,7 @@
     {%- 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 }}
+    - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}_present
     {%- endif %}
 
 ovs_port_set_type_{{ interface_name }}:
@@ -159,28 +220,16 @@
   - defaults:
       port: {{ interface|yaml }}
       port_name: {{ interface_name }}
+      auto: ""
+      iface_inet: ""
   - template: jinja
 
-ovs_port_{{ interface_name }}_line1:
-  file.replace:
-  - name: /etc/network/interfaces
-  - pattern: auto {{ interface_name }}$
-  - repl: ""
-
-ovs_port_{{ interface_name }}_line2:
-  file.replace:
-  - name: /etc/network/interfaces
-  - pattern: 'iface {{ interface_name }} inet .*'
-  - repl: ""
-
 ovs_port_up_{{ interface_name }}:
   cmd.run:
   - name: ifup {{ interface_name }}
   - require:
     - file: ovs_port_{{ interface_name }}
-    - file: ovs_port_{{ interface_name }}_line1
-    - file: ovs_port_{{ interface_name }}_line2
-    - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}
+    - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}_present
     - file: linux_interfaces_final_include
 
 {%- endif %}
diff --git a/linux/system/repo.sls b/linux/system/repo.sls
index dd41afe..03bb72d 100644
--- a/linux/system/repo.sls
+++ b/linux/system/repo.sls
@@ -1,5 +1,10 @@
 {%- from "linux/map.jinja" import system with context %}
 {%- if system.enabled %}
+{%- if grains['saltversioninfo'] < [2018, 3] %}
+{%- set refresh_cmd = 'refresh_db' %}
+{%- else %}
+{%- set refresh_cmd = 'refresh' %}
+{%- endif %}
 
   {% if system.pkgs %}
 linux_repo_prereq_pkgs:
@@ -113,7 +118,7 @@
         {%- if repo.get('enabled', True) %}
 linux_repo_{{ name }}:
   pkgrepo.managed:
-  - refresh_db: False
+  - {{ refresh_cmd }}: False
   - require_in:
     - refresh_db
           {%- if repo.ppa is defined %}
@@ -146,7 +151,7 @@
         {%- else %}
 linux_repo_{{ name }}:
   pkgrepo.absent:
-    - refresh_db: False
+    - {{ refresh_cmd }}: False
     - require:
       - file: /etc/apt/apt.conf.d/99proxies-salt-{{ name }}
     - require_in:
@@ -177,7 +182,7 @@
         {%- if not repo.get('default', False) %}
 linux_repo_{{ name }}:
   pkgrepo.managed:
-  - refresh_db: False
+  - {{ refresh_cmd }}: False
   - require_in:
     - refresh_db
   - name: {{ name }}
@@ -194,7 +199,7 @@
         {%- endif %}
       {%- else %}
   pkgrepo.absent:
-    - refresh_db: False
+    - {{ refresh_cmd }}: False
     - require_in:
       - refresh_db
     - name: {{ repo.source }}