Run dbsync on primary node only

Move dbsync to separate file.
Run only on primary node.
Do not run redundant versioned dbsyncs.
Run online dbsync when services are online.

Change-Id: I0a20f7e507f0cdf6f58982d5992224d65a5931ce
Related-Prod: PROD-21267
diff --git a/.travis.yml b/.travis.yml
index 0ec0a3d..f58cc31 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,23 +17,23 @@
   - bundle install
 
 env:
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-dpdk
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-legacy
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-sriov
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-qos
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-cluster
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-nodvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-lbaas-octavia
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-fwaas-v1
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-l2gw
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-opendaylight
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-ovn
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-fwaas-v1
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-l2gw
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-opendaylight
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-dpdk
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-dvr
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-legacy
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-sriov
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=compute-qos
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-cluster
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-nodvr
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-lbaas-octavia
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-fwaas-v1
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-l2gw
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-opendaylight
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=control-ovn
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-dvr
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-fwaas-v1
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-l2gw
+    - PLATFORM=epcim/salt-formulas:saltstack-ubuntu-xenial-salt-2016.3 SUITE=gateway-legacy-opendaylight
     - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-dpdk
     - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-dvr-fwaas-v1
     - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-nonexternal-dvr
diff --git a/neutron/db/offline_sync.sls b/neutron/db/offline_sync.sls
new file mode 100644
index 0000000..a646814
--- /dev/null
+++ b/neutron/db/offline_sync.sls
@@ -0,0 +1,26 @@
+{%- from "neutron/map.jinja" import server, fwaas with context %}
+
+include:
+ - neutron.db.plugins.midonet
+ - neutron.db.plugins.service.bgpvpn
+
+{#- TODO(vsaienko): move this to map.jinja or pillars that should be included for specific plugins #}
+{%- set config_files = ['/etc/neutron/neutron.conf'] %}
+{%- if server.backend.engine in ["ml2", "ovn"] %}
+{%- do config_files.append('/etc/neutron/plugins/ml2/ml2_conf.ini') %}
+{%- elif server.backend.engine == "midonet" %}
+{%- do config_files.append('/etc/neutron/plugins/midonet/midonet.ini') %}
+{%- elif server.backend.engine == "vmware" %}
+{%- do config_files.append('/etc/neutron/plugins/vmware/nsx.ini') %}
+{%- endif %}
+
+
+neutron_db_manage:
+  cmd.run:
+  - name: neutron-db-manage --config-file {{ ' --config-file '.join(config_files) }} upgrade head
+  {%- if grains.get('noservices') or server.get('role', 'primary') == 'secondary' %}
+  - onlyif: /bin/false
+  {%- endif %}
+  - require_in:
+    - sls: neutron.db.plugins.service.bgpvpn
+    - sls: neutron.db.plugins.midonet
diff --git a/neutron/db/plugins/midonet.sls b/neutron/db/plugins/midonet.sls
new file mode 100644
index 0000000..e7087a2
--- /dev/null
+++ b/neutron/db/plugins/midonet.sls
@@ -0,0 +1,22 @@
+{%- from "neutron/map.jinja" import server with context %}
+
+{%- set should_run = '/bin/false' %}
+{%- if not grains.get('noservices') and server.get('role', 'primary') == 'primary' and server.backend.engine == "midonet" %}
+  {%- set should_run = '/bin/true' %}
+{%- endif %}
+
+  {%- if server.version == "kilo" %}
+
+midonet-db-manage:
+  cmd.run:
+  - name: midonet-db-manage upgrade head
+  - onlyif: {{ should_run }}
+
+  {%- else %}
+
+midonet-db-manage:
+  cmd.run:
+  - name: neutron-db-manage --subproject networking-midonet upgrade head
+  - onlyif: {{ should_run }}
+
+  {%- endif %}
diff --git a/neutron/db/plugins/service/bgpvpn.sls b/neutron/db/plugins/service/bgpvpn.sls
new file mode 100644
index 0000000..4441ce8
--- /dev/null
+++ b/neutron/db/plugins/service/bgpvpn.sls
@@ -0,0 +1,11 @@
+{%- from "neutron/map.jinja" import server with context %}
+
+{%- set should_run = '/bin/false' %}
+{%- if not grains.get('noservices') and server.get('role', 'primary') == 'primary' and server.get('bgp_vpn', {}).get('enabled', False) %}
+{%- set should_run = '/bin/true' %}
+{%- endif %}
+
+bgpvpn_db_manage:
+  cmd.run:
+  - name: neutron-db-manage --config-file /etc/neutron/neutron.conf --subproject networking-bgpvpn upgrade head
+  - onlyif: {{ should_run }}
diff --git a/neutron/server.sls b/neutron/server.sls
index 0b4c877..fa115d2 100644
--- a/neutron/server.sls
+++ b/neutron/server.sls
@@ -1,9 +1,8 @@
 {%- from "neutron/map.jinja" import server, fwaas with context %}
 
-{%- if fwaas.get('enabled', False) %}
 include:
-- neutron.fwaas
-{%- endif %}
+ - neutron.db.offline_sync
+ - neutron.fwaas
 
 {%- if server.get('enabled', False) %}
 {% if grains.os_family == 'Debian' %}
@@ -88,6 +87,8 @@
   - require:
     - pkg: neutron_server_packages
     - pkg: ml2_packages
+  - require_in:
+    - sls: neutron.db.offline_sync
   - watch_in:
     - service: neutron_server_services
 
@@ -99,16 +100,6 @@
   - require:
     - file: /etc/neutron/plugins/ml2/ml2_conf.ini
 
-neutron_db_manage:
-  cmd.run:
-  - name: neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - require:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/ml2/ml2_conf.ini
-
 {%- endif %}
 
 {%- if server.l2gw is defined %}
@@ -131,6 +122,8 @@
     {%- if server.database.get('ssl',{}).get('enabled', False) %}
     - file: mysql_ca_neutron_server
     {%- endif %}
+  - require_in:
+    - sls: neutron.db.offline_sync
 
 /etc/neutron/api-paste.ini:
   file.managed:
@@ -230,7 +223,7 @@
   pkg.installed:
   - names: {{ server.pkgs_ovn }}
   - require_in:
-    - cmd: neutron_db_manage
+    - sls: neutron.db.offline_sync
 
 {%- if not grains.get('noservices', False) %}
 
@@ -282,16 +275,8 @@
     - makedirs: true
     - dir_mode: 755
     - template: jinja
-
-neutron_db_manage:
-  cmd.run:
-  - name: neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/midonet/midonet.ini upgrade head
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - require:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/midonet/midonet.ini
+    - require_in:
+      - sls: neutron.db.offline_sync
 
 {%- if server.version == "kilo" %}
 
@@ -301,10 +286,6 @@
     - python-neutron-plugin-midonet
     - python-neutron-lbaas
 
-midonet-db-manage:
-  cmd.run:
-  - name: midonet-db-manage upgrade head
-
 {%- else %}
 
 midonet_neutron_packages:
@@ -314,16 +295,6 @@
     - python-neutron-lbaas
     - python-neutron-fwaas
 
-neutron_db_manage:
-  cmd.run:
-  - name: neutron-db-manage --subproject networking-midonet upgrade head
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - require:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/midonet/midonet.ini
-
 {%- endif %}
 {%- endif %}
 
@@ -345,16 +316,8 @@
     - template: jinja
     - require:
       - pkg: vmware_neutron_packages
-
-neutron_db_manage:
-  cmd.run:
-  - name: neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/vmware/nsx.ini upgrade head
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - require:
-    - file: /etc/neutron/neutron.conf
-    - file: /etc/neutron/plugins/vmware/nsx.ini
+    - require_in:
+      - sls: neutron.db.offline_sync
 
 {%- endif %}
 
@@ -364,13 +327,6 @@
   pkg.installed:
   - names: {{ server.pkgs_bgpvpn }}
 
-bgpvpn_db_manage:
-  cmd.run:
-  - name: neutron-db-manage --config-file /etc/neutron/neutron.conf --subproject networking-bgpvpn upgrade head
-  - require:
-    - file: /etc/neutron/neutron.conf
-    - pkg: bgpvpn_packages
-
 {% if server.bgp_vpn.driver == "bagpipe" %}
 
 bagpipe_packages: