Allow to set workers for neutron

This change adds ability to set custom workers number for neutron
(rpc and metdata workers), in the same time if workers parameters aren't
defined in pillar, backward compatibility is kept and hardcoded values
from template will be used.

Change-Id: I4bc91b669a465b73ef610b53fbe960cae3911bdb
Related-Prod: https://mirantis.jira.com/browse/PROD-16465
diff --git a/README.rst b/README.rst
index c8ff890..1b16af4 100644
--- a/README.rst
+++ b/README.rst
@@ -23,6 +23,9 @@
         version: mitaka
         allow_pagination: true
         pagination_max_limit: 100
+        api_workers: 2
+        rpc_workers: 2
+        rpc_state_report_workers: 2
         bind:
           address: 172.20.0.1
           port: 9696
@@ -52,6 +55,7 @@
           host: 127.0.0.1
           port: 8775
           password: pass
+          workers: 2
         audit:
           enabled: false
 
diff --git a/neutron/files/liberty/neutron-server.conf.Debian b/neutron/files/liberty/neutron-server.conf.Debian
index 5e30e61..c374b9d 100644
--- a/neutron/files/liberty/neutron-server.conf.Debian
+++ b/neutron/files/liberty/neutron-server.conf.Debian
@@ -308,6 +308,9 @@
 # worker thread in the current process.  Greater than 0 launches that number of
 # child processes as workers.  The parent process manages them.
 # api_workers = 0
+{%- if server.api_workers is defined %}
+api_workers = {{ server.api_workers }}
+{%- endif %}
 
 # Number of separate RPC worker processes to spawn.  The default, 0, runs the
 # worker thread in the current process.  Greater than 0 launches that number of
@@ -315,6 +318,9 @@
 # This feature is experimental until issues are addressed and testing has been
 # enabled for various plugins for compatibility.
 # rpc_workers = 0
+{%- if server.rpc_workers is defined %}
+rpc_workers = {{ server.rpc_workers }}
+{%- endif %}
 
 # Timeout for client connections socket operations. If an
 # incoming connection is idle for this number of seconds it
diff --git a/neutron/files/liberty/neutron-server.conf.RedHat b/neutron/files/liberty/neutron-server.conf.RedHat
index cba51e2..2aefb45 100644
--- a/neutron/files/liberty/neutron-server.conf.RedHat
+++ b/neutron/files/liberty/neutron-server.conf.RedHat
@@ -304,6 +304,9 @@
 # worker thread in the current process.  Greater than 0 launches that number of
 # child processes as workers.  The parent process manages them.
 # api_workers = 0
+{%- if server.api_workers is defined %}
+api_workers = {{ server.api_workers }}
+{%- endif %}
 
 # Number of separate RPC worker processes to spawn.  The default, 0, runs the
 # worker thread in the current process.  Greater than 0 launches that number of
@@ -311,6 +314,9 @@
 # This feature is experimental until issues are addressed and testing has been
 # enabled for various plugins for compatibility.
 # rpc_workers = 0
+{%- if server.rpc_workers is defined %}
+rpc_workers = {{ server.rpc_workers }}
+{%- endif %}
 
 # Timeout for client connections socket operations. If an
 # incoming connection is idle for this number of seconds it
diff --git a/neutron/files/mitaka/metadata_agent.ini b/neutron/files/mitaka/metadata_agent.ini
index 15c21ac..ccbb827 100644
--- a/neutron/files/mitaka/metadata_agent.ini
+++ b/neutron/files/mitaka/metadata_agent.ini
@@ -58,6 +58,9 @@
 
 # Number of separate worker processes for metadata server (defaults to half of the number of CPUs) (integer value)
 #metadata_workers = 4
+{%- if neutron.metadata.workers is defined %}
+metadata_workers = {{ neutron.metadata.workers }}
+{%- endif %}
 
 # Number of backlog requests to configure the metadata server socket with (integer value)
 #metadata_backlog = 4096
diff --git a/neutron/files/mitaka/neutron-server.conf.Debian b/neutron/files/mitaka/neutron-server.conf.Debian
index a3dcdc1..8350857 100644
--- a/neutron/files/mitaka/neutron-server.conf.Debian
+++ b/neutron/files/mitaka/neutron-server.conf.Debian
@@ -215,15 +215,26 @@
 # default is equal to the number of CPUs available for best performance.
 # (integer value)
 #api_workers = <None>
+{%- if server.api_workers is defined %}
+api_workers = {{ server.api_workers }}
+{%- endif %}
 
 # Number of RPC worker processes for service (integer value)
 #rpc_workers = 1
+{%- if server.rpc_workers is defined %}
+rpc_workers = {{ server.rpc_workers }}
+{%- else %}
 rpc_workers = {{ grains.num_cpus }}
+{%- endif %}
 
 # Number of RPC worker processes dedicated to state reports queue (integer
 # value)
 #rpc_state_report_workers = 1
+{%- if server.rpc_state_report_workers is defined %}
+rpc_state_report_workers = {{ server.rpc_state_report_workers }}
+{%- else %}
 rpc_state_report_workers = 4
+{%- endif %}
 
 # Range of seconds to randomly delay when starting the periodic task scheduler
 # to reduce stampeding. (Disable by setting to 0) (integer value)
diff --git a/neutron/files/newton/metadata_agent.ini b/neutron/files/newton/metadata_agent.ini
index 15c21ac..ccbb827 100644
--- a/neutron/files/newton/metadata_agent.ini
+++ b/neutron/files/newton/metadata_agent.ini
@@ -58,6 +58,9 @@
 
 # Number of separate worker processes for metadata server (defaults to half of the number of CPUs) (integer value)
 #metadata_workers = 4
+{%- if neutron.metadata.workers is defined %}
+metadata_workers = {{ neutron.metadata.workers }}
+{%- endif %}
 
 # Number of backlog requests to configure the metadata server socket with (integer value)
 #metadata_backlog = 4096
diff --git a/neutron/files/newton/neutron-server.conf.Debian b/neutron/files/newton/neutron-server.conf.Debian
index fc763eb..8ef08e1 100644
--- a/neutron/files/newton/neutron-server.conf.Debian
+++ b/neutron/files/newton/neutron-server.conf.Debian
@@ -214,15 +214,26 @@
 # default is equal to the number of CPUs available for best performance.
 # (integer value)
 #api_workers = <None>
+{%- if server.api_workers is defined %}
+api_workers = {{ server.api_workers }}
+{%- endif %}
 
 # Number of RPC worker processes for service (integer value)
 #rpc_workers = 1
+{%- if server.rpc_workers is defined %}
+rpc_workers = {{ server.rpc_workers }}
+{%- else %}
 rpc_workers = {{ grains.num_cpus }}
+{%- endif %}
 
 # Number of RPC worker processes dedicated to state reports queue (integer
 # value)
 #rpc_state_report_workers = 1
+{%- if server.rpc_state_report_workers is defined %}
+rpc_state_report_workers = {{ server.rpc_state_report_workers }}
+{%- else %}
 rpc_state_report_workers = 4
+{%- endif %}
 
 # Range of seconds to randomly delay when starting the periodic task scheduler
 # to reduce stampeding. (Disable by setting to 0) (integer value)
diff --git a/neutron/files/ocata/metadata_agent.ini b/neutron/files/ocata/metadata_agent.ini
index 9772781..082da7b 100644
--- a/neutron/files/ocata/metadata_agent.ini
+++ b/neutron/files/ocata/metadata_agent.ini
@@ -67,6 +67,9 @@
 # Number of separate worker processes for metadata server (defaults to half of
 # the number of CPUs) (integer value)
 #metadata_workers = 2
+{%- if neutron.metadata.workers is defined %}
+metadata_workers = {{ neutron.metadata.workers }}
+{%- endif %}
 
 # Number of backlog requests to configure the metadata server socket with
 # (integer value)
diff --git a/neutron/files/ocata/neutron-server.conf.Debian b/neutron/files/ocata/neutron-server.conf.Debian
index 79376a2..c8cdb6b 100644
--- a/neutron/files/ocata/neutron-server.conf.Debian
+++ b/neutron/files/ocata/neutron-server.conf.Debian
@@ -187,15 +187,27 @@
 # default is equal to the number of CPUs available for best performance.
 # (integer value)
 #api_workers = <None>
+{%- if server.api_workers is defined %}
+api_workers = {{ server.api_workers }}
+{%- endif %}
 
 # Number of RPC worker processes for service. (integer value)
 #rpc_workers = 1
+{%- if server.rpc_workers is defined %}
+rpc_workers = {{ server.rpc_workers }}
+{%- else %}
 rpc_workers = {{ grains.num_cpus }}
+{%- endif %}
+
 
 # Number of RPC worker processes dedicated to state reports queue. (integer
 # value)
 #rpc_state_report_workers = 1
+{%- if server.rpc_state_report_workers is defined %}
+rpc_state_report_workers = {{ server.rpc_state_report_workers }}
+{%- else %}
 rpc_state_report_workers = 4
+{%- endif %}
 
 # Range of seconds to randomly delay when starting the periodic task scheduler
 # to reduce stampeding. (Disable by setting to 0) (integer value)
diff --git a/tests/pillar/compute_dpdk.sls b/tests/pillar/compute_dpdk.sls
index c56fb81..dfaf10f 100644
--- a/tests/pillar/compute_dpdk.sls
+++ b/tests/pillar/compute_dpdk.sls
@@ -22,4 +22,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
diff --git a/tests/pillar/compute_dvr.sls b/tests/pillar/compute_dvr.sls
index 8d5f7d5..f172d70 100644
--- a/tests/pillar/compute_dvr.sls
+++ b/tests/pillar/compute_dvr.sls
@@ -21,4 +21,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
\ No newline at end of file
diff --git a/tests/pillar/compute_dvr_fwaas_v1.sls b/tests/pillar/compute_dvr_fwaas_v1.sls
index a4b86d2..e1a61a5 100644
--- a/tests/pillar/compute_dvr_fwaas_v1.sls
+++ b/tests/pillar/compute_dvr_fwaas_v1.sls
@@ -21,6 +21,7 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: ocata
   fwaas:
     enabled: true
diff --git a/tests/pillar/compute_legacy.sls b/tests/pillar/compute_legacy.sls
index 154af25..943b35c 100644
--- a/tests/pillar/compute_legacy.sls
+++ b/tests/pillar/compute_legacy.sls
@@ -21,4 +21,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
diff --git a/tests/pillar/compute_nonexternal_dvr.sls b/tests/pillar/compute_nonexternal_dvr.sls
index 8ce0da1..30c6f07 100644
--- a/tests/pillar/compute_nonexternal_dvr.sls
+++ b/tests/pillar/compute_nonexternal_dvr.sls
@@ -21,4 +21,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
diff --git a/tests/pillar/compute_qos.sls b/tests/pillar/compute_qos.sls
index fdb3beb..9c2b60d 100644
--- a/tests/pillar/compute_qos.sls
+++ b/tests/pillar/compute_qos.sls
@@ -24,4 +24,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: ocata
diff --git a/tests/pillar/compute_qos_sriov.sls b/tests/pillar/compute_qos_sriov.sls
index 7d4d4ab..34ee962 100644
--- a/tests/pillar/compute_qos_sriov.sls
+++ b/tests/pillar/compute_qos_sriov.sls
@@ -26,4 +26,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: ocata
diff --git a/tests/pillar/compute_sriov.sls b/tests/pillar/compute_sriov.sls
index f5a106f..a080511 100644
--- a/tests/pillar/compute_sriov.sls
+++ b/tests/pillar/compute_sriov.sls
@@ -25,4 +25,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
diff --git a/tests/pillar/control_cluster.sls b/tests/pillar/control_cluster.sls
index bebff8c..2b4e2af 100644
--- a/tests/pillar/control_cluster.sls
+++ b/tests/pillar/control_cluster.sls
@@ -6,6 +6,8 @@
     dns_domain: novalocal
     tunnel_type: vxlan
     version: liberty
+    api_workers: 2
+    rpc_workers: 2
     backend:
       engine: contrail
       #contrail_discovery_host
diff --git a/tests/pillar/control_dns.sls b/tests/pillar/control_dns.sls
index d8167fa..5504798 100644
--- a/tests/pillar/control_dns.sls
+++ b/tests/pillar/control_dns.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_dvr.sls b/tests/pillar/control_dvr.sls
index 5031810..1bf7b7a 100644
--- a/tests/pillar/control_dvr.sls
+++ b/tests/pillar/control_dvr.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_fwaas_v1.sls b/tests/pillar/control_fwaas_v1.sls
index c39f05c..2ca5e0d 100644
--- a/tests/pillar/control_fwaas_v1.sls
+++ b/tests/pillar/control_fwaas_v1.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_lbaas_octavia.sls b/tests/pillar/control_lbaas_octavia.sls
index 65b0318..cf4710c 100644
--- a/tests/pillar/control_lbaas_octavia.sls
+++ b/tests/pillar/control_lbaas_octavia.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_nodvr.sls b/tests/pillar/control_nodvr.sls
index 9597eee..1000769 100644
--- a/tests/pillar/control_nodvr.sls
+++ b/tests/pillar/control_nodvr.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_ovn.sls b/tests/pillar/control_ovn.sls
index cd79174..0dc9e22 100644
--- a/tests/pillar/control_ovn.sls
+++ b/tests/pillar/control_ovn.sls
@@ -2,6 +2,9 @@
   server:
     enabled: true
     version: ocata
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ovn
       external_mtu: 1500
diff --git a/tests/pillar/control_qos.sls b/tests/pillar/control_qos.sls
index e1a8f6f..ffc198f 100644
--- a/tests/pillar/control_qos.sls
+++ b/tests/pillar/control_qos.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     backend:
       engine: ml2
       external_mtu: 1500
diff --git a/tests/pillar/control_single.sls b/tests/pillar/control_single.sls
index d59669b..8c7821e 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -1,5 +1,8 @@
 neutron:
   server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
     enabled: true
     backend:
       external_mtu: 1500
diff --git a/tests/pillar/gateway_dvr.sls b/tests/pillar/gateway_dvr.sls
index 2c47529..fb3acd6 100644
--- a/tests/pillar/gateway_dvr.sls
+++ b/tests/pillar/gateway_dvr.sls
@@ -21,4 +21,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
\ No newline at end of file
diff --git a/tests/pillar/gateway_legacy.sls b/tests/pillar/gateway_legacy.sls
index d9b7ef8..66e99fa 100644
--- a/tests/pillar/gateway_legacy.sls
+++ b/tests/pillar/gateway_legacy.sls
@@ -21,4 +21,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: mitaka
diff --git a/tests/pillar/gateway_legacy_fwaas_v1.sls b/tests/pillar/gateway_legacy_fwaas_v1.sls
index 34e921c..8b52f6d 100644
--- a/tests/pillar/gateway_legacy_fwaas_v1.sls
+++ b/tests/pillar/gateway_legacy_fwaas_v1.sls
@@ -21,6 +21,7 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: ocata
   fwaas:
     enabled: true
diff --git a/tests/pillar/gateway_qos.sls b/tests/pillar/gateway_qos.sls
index f816c94..1f9756d 100644
--- a/tests/pillar/gateway_qos.sls
+++ b/tests/pillar/gateway_qos.sls
@@ -24,4 +24,5 @@
     metadata:
       host: 127.0.0.1
       password: password
+      workers: 2
     version: ocata