Merge "Add more parameters to alarm-gen config"
diff --git a/README.rst b/README.rst
index b80b23e..ba0d7b4 100644
--- a/README.rst
+++ b/README.rst
@@ -895,6 +895,17 @@
           pci: 0000:81:00.1
       ...
 
+Increase number of contrail-api workers
+---------------------------------------
+
+.. code-block:: yaml
+
+    opencontrail:
+      ...
+      config:
+        api_workers: 3
+      ...
+
 Increase number of alarm-gen workers
 ------------------------------------
 
diff --git a/opencontrail/config.sls b/opencontrail/config.sls
index 50e4901..d580a1e 100644
--- a/opencontrail/config.sls
+++ b/opencontrail/config.sls
@@ -114,8 +114,13 @@
 
 /etc/contrail/supervisord_config_files/contrail-api.ini:
   file.managed:
-  - source: salt://opencontrail/files/{{ config.version }}/config/contrail-api.ini
+  - source: salt://opencontrail/files/{{ config.version }}/contrail-api.ini
+  - template: jinja
   - makedirs: true
+{%- if config.get('config_only', False) %}
+  - watch_in:
+    - service: opencontrail_config_services
+{%- endif %}
 
 /etc/init.d/contrail-api:
   file.managed:
diff --git a/opencontrail/files/2.2/config/contrail-api.ini b/opencontrail/files/2.2/contrail-api.ini
similarity index 86%
rename from opencontrail/files/2.2/config/contrail-api.ini
rename to opencontrail/files/2.2/contrail-api.ini
index 673529c..fd05496 100644
--- a/opencontrail/files/2.2/config/contrail-api.ini
+++ b/opencontrail/files/2.2/contrail-api.ini
@@ -1,4 +1,4 @@
-
+{%- from "opencontrail/map.jinja" import config with context -%}
 [program:contrail-api]
 command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s
 numprocs=1
diff --git a/opencontrail/files/3.0/config/contrail-api.ini b/opencontrail/files/3.0/config/contrail-api.ini
deleted file mode 100644
index 673529c..0000000
--- a/opencontrail/files/3.0/config/contrail-api.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-
-[program:contrail-api]
-command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s
-numprocs=1
-process_name=%(process_num)s
-redirect_stderr=true
-stdout_logfile= /var/log/contrail/contrail-api-%(process_num)s-stdout.log
-stderr_logfile=/dev/null
-priority=440
-autostart=true
-killasgroup=true
-stopsignal=KILL
-exitcodes=0
-
diff --git a/opencontrail/files/3.0/contrail-api.ini b/opencontrail/files/3.0/contrail-api.ini
new file mode 100644
index 0000000..4caaeb3
--- /dev/null
+++ b/opencontrail/files/3.0/contrail-api.ini
@@ -0,0 +1,19 @@
+{%- from "opencontrail/map.jinja" import config with context -%}
+[program:contrail-api]
+{%- if config.get('api_workers', 1) < 2 %}
+command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s
+numprocs=1
+{%- else %}
+command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s --listen_port 910%(process_num)s --admin_port 819%(process_num)s --http_server_port 828%(process_num)s --log_file /var/log/contrail/contrail-api-%(process_num)s.log
+numprocs={{ config.api_workers }}
+{%- endif %}
+process_name=%(process_num)s
+redirect_stderr=true
+stdout_logfile= /var/log/contrail/contrail-api-%(process_num)s-stdout.log
+stderr_logfile=/dev/null
+priority=440
+autostart=true
+killasgroup=true
+stopsignal=KILL
+exitcodes=0
+
diff --git a/opencontrail/files/4.0/config/contrail-api.ini b/opencontrail/files/4.0/config/contrail-api.ini
deleted file mode 100644
index 673529c..0000000
--- a/opencontrail/files/4.0/config/contrail-api.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-
-[program:contrail-api]
-command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s
-numprocs=1
-process_name=%(process_num)s
-redirect_stderr=true
-stdout_logfile= /var/log/contrail/contrail-api-%(process_num)s-stdout.log
-stderr_logfile=/dev/null
-priority=440
-autostart=true
-killasgroup=true
-stopsignal=KILL
-exitcodes=0
-
diff --git a/opencontrail/files/4.0/contrail-api.conf b/opencontrail/files/4.0/contrail-api.conf
index ad6962c..8ccb5c1 100644
--- a/opencontrail/files/4.0/contrail-api.conf
+++ b/opencontrail/files/4.0/contrail-api.conf
@@ -1,4 +1,10 @@
 {%- from "opencontrail/map.jinja" import config with context %}
+
+{%- if config.identity.engine == "none" %}
+[DEFAULT]
+aaa_mode=no-auth
+{%- endif %}
+
 [DEFAULTS]
 collectors = {% for member in config.analytics.members %}{{ member.host }}:8086 {% endfor %}
 cassandra_server_list={% for member in config.database.members %}{{ member.host }}:9161 {% endfor %}
diff --git a/opencontrail/files/4.0/contrail-api.ini b/opencontrail/files/4.0/contrail-api.ini
new file mode 100644
index 0000000..4caaeb3
--- /dev/null
+++ b/opencontrail/files/4.0/contrail-api.ini
@@ -0,0 +1,19 @@
+{%- from "opencontrail/map.jinja" import config with context -%}
+[program:contrail-api]
+{%- if config.get('api_workers', 1) < 2 %}
+command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s
+numprocs=1
+{%- else %}
+command=/usr/bin/contrail-api --conf_file /etc/contrail/contrail-api.conf --conf_file /etc/contrail/contrail-keystone-auth.conf --worker_id %(process_num)s --listen_port 910%(process_num)s --admin_port 819%(process_num)s --http_server_port 828%(process_num)s --log_file /var/log/contrail/contrail-api-%(process_num)s.log
+numprocs={{ config.api_workers }}
+{%- endif %}
+process_name=%(process_num)s
+redirect_stderr=true
+stdout_logfile= /var/log/contrail/contrail-api-%(process_num)s-stdout.log
+stderr_logfile=/dev/null
+priority=440
+autostart=true
+killasgroup=true
+stopsignal=KILL
+exitcodes=0
+
diff --git a/opencontrail/files/4.0/contrail-keystone-auth.conf b/opencontrail/files/4.0/contrail-keystone-auth.conf
index 8b37f27..4c32311 100644
--- a/opencontrail/files/4.0/contrail-keystone-auth.conf
+++ b/opencontrail/files/4.0/contrail-keystone-auth.conf
@@ -1,4 +1,6 @@
 {%- from "opencontrail/map.jinja" import config with context -%}
+{%- if config.identity.engine != "none" %}
+
 [KEYSTONE]
 auth_host={{ config.identity.host }}
 auth_protocol=http
@@ -18,3 +20,5 @@
 {%- else %}
 auth_url=http://{{ config.identity.host }}:{{ config.identity.port }}/v2.0
 {%- endif %}
+
+{%- endif %}
\ No newline at end of file
diff --git a/opencontrail/meta/heka.yml b/opencontrail/meta/heka.yml
index 0667088..08f1937 100644
--- a/opencontrail/meta/heka.yml
+++ b/opencontrail/meta/heka.yml
@@ -22,7 +22,7 @@
         'contrail-svc-monitor',
         ) %}
     {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
-    {%- set control_processes += ('contrail-ifmap-server', 'contrail-irond',) %}
+      {%- set control_processes = control_processes + ('contrail-ifmap-server', 'contrail-irond',) %}
     {%- endif %}
   {%- endif %}
   {%- if database.get('enabled', False) %}
diff --git a/opencontrail/meta/prometheus.yml b/opencontrail/meta/prometheus.yml
index ab254af..72a87d0 100644
--- a/opencontrail/meta/prometheus.yml
+++ b/opencontrail/meta/prometheus.yml
@@ -49,7 +49,7 @@
     ) %}
 
     {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
-    {%- set control_processes += ('contrail-ifmap-server', 'contrail-irond',) %}
+      {%- set control_processes = control_processes + ('contrail-ifmap-server', 'contrail-irond',) %}
     {%- endif %}
 
     {%- for api in control_apis %}
@@ -519,46 +519,56 @@
     {%- endif %}
 
     {%- if database.get('enabled', False) %}
-    ZookeeperInfo:
+    ZookeeperServiceDown:
       if: >-
-        zookeeper_up != 1
+        zookeeper_up == 0
       for: 2m
       labels:
-        severity: info
+        severity: minor
         service: zookeeper
       annotations:
-        summary: 'Zookeeper service down'
-        description: 'Zookeeper service is down on node {% raw %}{{ $labels.host }}{% endraw %}.'
-    ZookeeperWarning:
+        summary: "Zookeeper service is down"
+        description: "The Zookeeper service on the {% raw %}{{ $labels.host }}{% endraw %} node is down for at least 2 minutes."
+    ZookeeperServiceError:
       if: >-
-        count(zookeeper_up == 0) >= count(zookeeper_up) * {{ monitoring.services_failed_warning_threshold_percent }}
+        zookeeper_service_health == 0
       for: 2m
       labels:
         severity: warning
         service: zookeeper
       annotations:
-        summary: "More than {{monitoring.services_failed_warning_threshold_percent*100}}% of Zookeeper services are down"
-        description: "More than {{monitoring.services_failed_warning_threshold_percent*100}}% of Zookeeper services are down"
-    ZookeeperCritical:
+        summary: "Zookeeper service error"
+        description: "The Zookeeper service on the {% raw %}{{ $labels.host }}{% endraw %} node is not responding for at least 2 minutes."
+    ZookeeperServicesDownMinor:
+      if: >-
+        count(zookeeper_up == 0) >= count(zookeeper_up) * {{ monitoring.services_failed_warning_threshold_percent }}
+      for: 2m
+      labels:
+        severity: minor
+        service: zookeeper
+      annotations:
+        summary: "{{ monitoring.services_failed_warning_threshold_percent*100 }}% of Zookeeper services are down"
+        description: "{% raw %}{{ $value }}{% endraw %} Zookeeper services are down (at least {{ monitoring.services_failed_warning_threshold_percent*100 }}%) for at least 2 minutes."
+    ZookeeperServicesDownMajor:
       if: >-
         count(zookeeper_up == 0) >= count(zookeeper_up) * {{ monitoring.services_failed_critical_threshold_percent }}
       for: 2m
       labels:
+        severity: major
+        service: zookeeper
+      annotations:
+        summary: "{{ monitoring.services_failed_critical_threshold_percent*100 }}% of Zookeeper services are down"
+        description: "{% raw %}{{ $value }}{% endraw %} Zookeeper services are down (at least {{ monitoring.services_failed_critical_threshold_percent*100 }}%) for at least 2 minutes."
+    ZookeeperServiceOutage:
+      if: >-
+        count(zookeeper_up == 0) == count(zookeeper_up)
+      for: 2m
+      labels:
         severity: critical
         service: zookeeper
       annotations:
-        summary: "More than {{monitoring.services_failed_critical_threshold_percent*100}}% of Zookeeper services are down"
-        description: "More than {{monitoring.services_failed_critical_threshold_percent*100}}% of Zookeeper services are down"
-    ZookeeperDown:
-      if: >-
-        count(zookeeper_up == 0) == count(zookeeper_up)
-      for: 2m
-      labels:
-        severity: down
-        service: zookeeper
-      annotations:
-        summary: 'All Zookeeper services are down'
-        description: 'All Zookeeper services are down'
+        summary: "Zookeeper service outage"
+        description: "All Zookeeper services are down for at least 2 minutes."
     {%- endif %}
 
     {%- if exporters is defined %}
diff --git a/tests/pillar/control3.sls b/tests/pillar/control3.sls
index 2587f2a..7492795 100644
--- a/tests/pillar/control3.sls
+++ b/tests/pillar/control3.sls
@@ -17,6 +17,7 @@
     multi_tenancy: false
     aaa_mode: rbac
     global_read_only_role: demo
+    api_workers: 3
     network:
       engine: neutron
       host: 127.0.0.1