Merge "[ovn] Start openvswitch service explicitly"
diff --git a/neutron/compute.sls b/neutron/compute.sls
index af5637f..5e61e6e 100644
--- a/neutron/compute.sls
+++ b/neutron/compute.sls
@@ -1,9 +1,9 @@
 {% from "neutron/map.jinja" import compute, fwaas with context %}
 {%- if compute.enabled %}
 
-{% if compute.backend.engine == "ml2" %}
+  {% if compute.backend.engine == "ml2" %}
 
-{% if compute.get('dhcp_agent_enabled', False) %}
+    {% if compute.get('dhcp_agent_enabled', False) %}
 neutron_dhcp_agent_packages:
   pkg.installed:
   - names:
@@ -27,248 +27,21 @@
   - require:
     - pkg: neutron_dhcp_agent_packages
 
-{% endif %}
+    {% endif %}
 
-{%- if compute.opendaylight is defined %}
-{%- include "neutron/opendaylight/client.sls" %}
-{%- else %}
-neutron_compute_packages:
-  pkg.installed:
-  - names: {{ compute.pkgs }}
-
-{% if compute.get('bgp_vpn', {}).get('enabled', False) and compute.bgp_vpn.driver == "bagpipe" %}
-{%- include "neutron/services/_bagpipe.sls" %}
-{% endif %}
-
-/etc/neutron/neutron.conf:
-  file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/neutron-generic.conf.{{ grains.os_family }}
-  - template: jinja
-  - require:
-    - pkg: neutron_compute_packages
-
-{% if compute.backend.sriov is defined %}
-
-neutron_sriov_package:
-  pkg.installed:
-  - name: neutron-sriov-agent
-
-/etc/neutron/plugins/ml2/sriov_agent.ini:
-  file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/sriov_agent.ini
-  - template: jinja
-  - watch_in:
-    - service: neutron_compute_services
-  - require:
-    - pkg: neutron_compute_packages
-    - pkg: neutron_sriov_package
-
-neutron_sriov_service:
-  service.running:
-  - name: neutron-sriov-agent
-  - enable: true
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - watch_in:
-    - service: neutron_compute_services
-  - watch:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
-    - file: /etc/neutron/plugins/ml2/sriov_agent.ini
-    {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
-    - file: rabbitmq_ca_neutron_compute
+    {%- if compute.opendaylight is defined %}
+      {%- include "neutron/opendaylight/client.sls" %}
+    {%- else %}
+      {%- include "neutron/ml2_ovs/init.sls" %}
     {%- endif %}
 
-{% endif %}
-
-{% if compute.dvr %}
-
-{%- if fwaas.get('enabled', False) %}
-include:
-- neutron.fwaas
-{%- endif %}
-
-{%- if not grains.get('noservices', False) and pillar.haproxy is not defined %}
-# NOTE(mpolenchuk): haproxy is used as a replacement for
-# neutron-ns-metadata-proxy Python implementation starting from Pike
-haproxy:
-  service.dead:
-  - enable: False
-  - require:
-    - pkg: neutron_dvr_packages
-{%- if compute.get('dhcp_agent_enabled', False) %}
-    - pkg: neutron_dhcp_agent_packages
-{%- endif %}
-{%- endif %}
-
-neutron_dvr_packages:
-  pkg.installed:
-  - names:
-    - neutron-l3-agent
-    - neutron-metadata-agent
-
-neutron_dvr_agents:
-  service.running:
-    - enable: true
-    - names:
-      - neutron-l3-agent
-      - neutron-metadata-agent
-    - watch:
-      - file: /etc/neutron/neutron.conf
-      - file: /etc/neutron/l3_agent.ini
-      - file: /etc/neutron/metadata_agent.ini
-      {%- if fwaas.get('enabled', False) %}
-      - file: /etc/neutron/fwaas_driver.ini
-      {% endif %}
-      {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
-      - file: rabbitmq_ca_neutron_compute
-      {%- endif %}
-    - require:
-      - pkg: neutron_dvr_packages
-
-/etc/neutron/l3_agent.ini:
-  file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/l3_agent.ini
-  - template: jinja
-  - watch_in:
-    - service: neutron_compute_services
-  - require:
-    - pkg: neutron_dvr_packages
-
-/etc/neutron/metadata_agent.ini:
-  file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/metadata_agent.ini
-  - template: jinja
-  - watch_in:
-    - service: neutron_compute_services
-  - require:
-    - pkg: neutron_dvr_packages
-
-{% endif %}
-
-/etc/neutron/plugins/ml2/openvswitch_agent.ini:
-  file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/openvswitch_agent.ini
-  - template: jinja
-  - require:
-    - pkg: neutron_compute_packages
-
-neutron_compute_services:
-  service.running:
-  - names: {{ compute.services }}
-  - enable: true
-  - watch:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
-    {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
-    - file: rabbitmq_ca_neutron_compute
-    {%- endif %}
-
-{%- set neutron_compute_services_list = compute.services %}
-{%- if compute.backend.sriov is defined %}
-  {%- do neutron_compute_services_list.append('neutron-sriov-agent') %}
-{%- endif %}
-{%- if compute.dvr %}
-  {%- do neutron_compute_services_list.extend(['neutron-l3-agent', 'neutron-metadata-agent']) %}
-{%- endif %}
-{%- if compute.get('dhcp_agent_enabled', False) %}
-  {%- do neutron_compute_services_list.append('neutron-dhcp-agent') %}
-{%- endif %}
-
-{%- for service_name in neutron_compute_services_list %}
-{{ service_name }}_default:
-  file.managed:
-    - name: /etc/default/{{ service_name }}
-    - source: salt://neutron/files/default
-    - template: jinja
-    - defaults:
-        service_name: {{ service_name }}
-        values: {{ compute }}
-    - require:
-      - pkg: neutron_compute_packages
-{% if compute.backend.sriov is defined %}
-      - pkg: neutron_sriov_package
-{% endif %}
-{% if compute.dvr %}
-      - pkg: neutron_dvr_packages
-{% endif %}
-    - watch_in:
-      - service: neutron_compute_services
-{% if compute.backend.sriov is defined %}
-      - service: neutron_sriov_service
-{% endif %}
-{% if compute.dvr %}
-      - service: neutron_dvr_agents
-{% endif %}
-{% endfor %}
-
-{%- if compute.logging.log_appender %}
-
-{%- if compute.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
-neutron_compute_fluentd_logger_package:
-  pkg.installed:
-    - name: python-fluent-logger
-{%- endif %}
-
-{% for service_name in neutron_compute_services_list %}
-{{ service_name }}_logging_conf:
-  file.managed:
-    - name: /etc/neutron/logging/logging-{{ service_name }}.conf
-    - source: salt://oslo_templates/files/logging/_logging.conf
-    - template: jinja
-    - makedirs: True
-    - user: neutron
-    - group: neutron
-    - defaults:
-        service_name: {{ service_name }}
-        _data: {{ compute.logging }}
-    - require:
-      - pkg: neutron_compute_packages
-{% if compute.backend.sriov is defined %}
-      - pkg: neutron_sriov_package
-{% endif %}
-{% if compute.dvr %}
-      - pkg: neutron_dvr_packages
-{% endif %}
-{%- if compute.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
-      - pkg: neutron_compute_fluentd_logger_package
-{%- endif %}
-    - watch_in:
-      - service: neutron_compute_services
-{% if compute.backend.sriov is defined %}
-      - service: neutron_sriov_service
-{% endif %}
-{% if compute.dvr %}
-      - service: neutron_dvr_agents
-{% endif %}
-{% endfor %}
-
-{% endif %}
-
-{%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
-rabbitmq_ca_neutron_compute:
-{%- if compute.message_queue.ssl.cacert is defined %}
-  file.managed:
-    - name: {{ compute.message_queue.ssl.cacert_file }}
-    - contents_pillar: neutron:compute:message_queue:ssl:cacert
-    - mode: 0444
-    - makedirs: true
-{%- else %}
-  file.exists:
-   - name: {{ compute.message_queue.ssl.get('cacert_file', compute.cacert_file) }}
-{%- endif %}
-{%- endif %}
-
-{%- endif %}{# !OpenDaylight #}
-
-{%- elif compute.backend.engine == "ovn" %}
+  {%- elif compute.backend.engine == "ovn" %}
 
 ovn_packages:
   pkg.installed:
   - names: {{ compute.pkgs_ovn }}
 
-{%- if not grains.get('noservices', False) %}
+    {%- if not grains.get('noservices', False) %}
 
 remote_ovsdb_access:
   cmd.run:
@@ -284,7 +57,7 @@
   - name: "ovs-vsctl set open .
   external-ids:ovn-encap-ip={{ compute.local_ip }}"
 
-{%- if compute.get('external_access', True) %}
+      {%- if compute.get('external_access', True) %}
 
 set_bridge_external_id:
   cmd.run:
@@ -296,18 +69,20 @@
   - name: "ovs-vsctl set open .
    external-ids:ovn-bridge-mappings=physnet1:{{ compute.external_bridge }}"
 
-{%- endif %}
+      {%- endif %}
 
 ovn_services:
   service.running:
   - names: {{ compute.services_ovn }}
   - enable: true
-  {%- if grains.get('noservices') %}
+      {%- if grains.get('noservices') %}
   - onlyif: /bin/false
-  {%- endif %}
+      {%- endif %}
   - require:
     - pkg: ovn_packages
 
-{%- endif %}
-{%- endif %}
+    {%- endif %}
+
+  {%- endif %}
+
 {%- endif %}
diff --git a/neutron/ml2_ovs/init.sls b/neutron/ml2_ovs/init.sls
new file mode 100644
index 0000000..f1fcdda
--- /dev/null
+++ b/neutron/ml2_ovs/init.sls
@@ -0,0 +1,236 @@
+{% from "neutron/map.jinja" import compute, fwaas with context %}
+{%- if compute.enabled %}
+
+  {% if compute.backend.engine == "ml2" %}
+
+neutron_compute_packages:
+  pkg.installed:
+  - names: {{ compute.pkgs }}
+
+    {% if compute.get('bgp_vpn', {}).get('enabled', False) and compute.bgp_vpn.driver == "bagpipe" %}
+      {%- include "neutron/services/_bagpipe.sls" %}
+    {% endif %}
+
+/etc/neutron/neutron.conf:
+  file.managed:
+  - source: salt://neutron/files/{{ compute.version }}/neutron-generic.conf.{{ grains.os_family }}
+  - template: jinja
+  - require:
+    - pkg: neutron_compute_packages
+
+    {% if compute.backend.sriov is defined %}
+
+neutron_sriov_package:
+  pkg.installed:
+  - name: neutron-sriov-agent
+
+/etc/neutron/plugins/ml2/sriov_agent.ini:
+  file.managed:
+  - source: salt://neutron/files/{{ compute.version }}/sriov_agent.ini
+  - template: jinja
+  - watch_in:
+    - service: neutron_compute_services
+  - require:
+    - pkg: neutron_compute_packages
+    - pkg: neutron_sriov_package
+
+neutron_sriov_service:
+  service.running:
+  - name: neutron-sriov-agent
+  - enable: true
+      {%- if grains.get('noservices') %}
+  - onlyif: /bin/false
+      {%- endif %}
+  - watch_in:
+    - service: neutron_compute_services
+  - watch:
+    - file: /etc/neutron/neutron.conf
+    - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
+    - file: /etc/neutron/plugins/ml2/sriov_agent.ini
+      {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
+    - file: rabbitmq_ca_neutron_compute
+      {%- endif %}
+
+    {% endif %}
+
+    {% if compute.dvr %}
+
+      {%- if fwaas.get('enabled', False) %}
+include:
+- neutron.fwaas
+      {%- endif %}
+
+      {%- if not grains.get('noservices', False) and pillar.haproxy is not defined %}
+# NOTE(mpolenchuk): haproxy is used as a replacement for
+# neutron-ns-metadata-proxy Python implementation starting from Pike
+haproxy:
+  service.dead:
+  - enable: False
+  - require:
+    - pkg: neutron_dvr_packages
+        {%- if compute.get('dhcp_agent_enabled', False) %}
+    - pkg: neutron_dhcp_agent_packages
+        {%- endif %}
+      {%- endif %}
+
+neutron_dvr_packages:
+  pkg.installed:
+  - names:
+    - neutron-l3-agent
+    - neutron-metadata-agent
+
+neutron_dvr_agents:
+  service.running:
+    - enable: true
+    - names:
+      - neutron-l3-agent
+      - neutron-metadata-agent
+    - watch:
+      - file: /etc/neutron/neutron.conf
+      - file: /etc/neutron/l3_agent.ini
+      - file: /etc/neutron/metadata_agent.ini
+      {%- if fwaas.get('enabled', False) %}
+      - file: /etc/neutron/fwaas_driver.ini
+      {% endif %}
+      {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
+      - file: rabbitmq_ca_neutron_compute
+      {%- endif %}
+    - require:
+      - pkg: neutron_dvr_packages
+
+/etc/neutron/l3_agent.ini:
+  file.managed:
+  - source: salt://neutron/files/{{ compute.version }}/l3_agent.ini
+  - template: jinja
+  - watch_in:
+    - service: neutron_compute_services
+  - require:
+    - pkg: neutron_dvr_packages
+
+/etc/neutron/metadata_agent.ini:
+  file.managed:
+  - source: salt://neutron/files/{{ compute.version }}/metadata_agent.ini
+  - template: jinja
+  - watch_in:
+    - service: neutron_compute_services
+  - require:
+    - pkg: neutron_dvr_packages
+
+    {% endif %}
+
+/etc/neutron/plugins/ml2/openvswitch_agent.ini:
+  file.managed:
+  - source: salt://neutron/files/{{ compute.version }}/openvswitch_agent.ini
+  - template: jinja
+  - require:
+    - pkg: neutron_compute_packages
+
+neutron_compute_services:
+  service.running:
+  - names: {{ compute.services }}
+  - enable: true
+  - watch:
+    - file: /etc/neutron/neutron.conf
+    - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
+    {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
+    - file: rabbitmq_ca_neutron_compute
+    {%- endif %}
+
+    {%- set neutron_compute_services_list = compute.services %}
+    {%- if compute.backend.sriov is defined %}
+      {%- do neutron_compute_services_list.append('neutron-sriov-agent') %}
+    {%- endif %}
+    {%- if compute.dvr %}
+      {%- do neutron_compute_services_list.extend(['neutron-l3-agent', 'neutron-metadata-agent']) %}
+    {%- endif %}
+    {%- if compute.get('dhcp_agent_enabled', False) %}
+      {%- do neutron_compute_services_list.append('neutron-dhcp-agent') %}
+    {%- endif %}
+
+    {%- for service_name in neutron_compute_services_list %}
+{{ service_name }}_default:
+  file.managed:
+    - name: /etc/default/{{ service_name }}
+    - source: salt://neutron/files/default
+    - template: jinja
+    - defaults:
+        service_name: {{ service_name }}
+        values: {{ compute }}
+    - require:
+      - pkg: neutron_compute_packages
+      {% if compute.backend.sriov is defined %}
+      - pkg: neutron_sriov_package
+      {% endif %}
+      {% if compute.dvr %}
+      - pkg: neutron_dvr_packages
+      {% endif %}
+    - watch_in:
+      - service: neutron_compute_services
+      {% if compute.backend.sriov is defined %}
+      - service: neutron_sriov_service
+      {% endif %}
+      {% if compute.dvr %}
+      - service: neutron_dvr_agents
+      {% endif %}
+    {% endfor %}
+
+    {%- if compute.logging.log_appender %}
+
+      {%- if compute.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
+neutron_compute_fluentd_logger_package:
+  pkg.installed:
+    - name: python-fluent-logger
+      {%- endif %}
+
+      {% for service_name in neutron_compute_services_list %}
+{{ service_name }}_logging_conf:
+  file.managed:
+    - name: /etc/neutron/logging/logging-{{ service_name }}.conf
+    - source: salt://oslo_templates/files/logging/_logging.conf
+    - template: jinja
+    - makedirs: True
+    - user: neutron
+    - group: neutron
+    - defaults:
+        service_name: {{ service_name }}
+        _data: {{ compute.logging }}
+    - require:
+      - pkg: neutron_compute_packages
+        {% if compute.backend.sriov is defined %}
+      - pkg: neutron_sriov_package
+        {% endif %}
+        {% if compute.dvr %}
+      - pkg: neutron_dvr_packages
+        {% endif %}
+        {%- if compute.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
+      - pkg: neutron_compute_fluentd_logger_package
+        {%- endif %}
+    - watch_in:
+      - service: neutron_compute_services
+        {% if compute.backend.sriov is defined %}
+      - service: neutron_sriov_service
+        {% endif %}
+        {% if compute.dvr %}
+      - service: neutron_dvr_agents
+        {% endif %}
+      {% endfor %}
+
+    {% endif %}
+
+    {%- if compute.message_queue.get('ssl',{}).get('enabled', False) %}
+rabbitmq_ca_neutron_compute:
+      {%- if compute.message_queue.ssl.cacert is defined %}
+  file.managed:
+    - name: {{ compute.message_queue.ssl.cacert_file }}
+    - contents_pillar: neutron:compute:message_queue:ssl:cacert
+    - mode: 0444
+    - makedirs: true
+      {%- else %}
+  file.exists:
+   - name: {{ compute.message_queue.ssl.get('cacert_file', compute.cacert_file) }}
+      {%- endif %}
+    {%- endif %}
+
+  {%- endif %}
+
+{%- endif %}