Merge "Add Salt 2018.3 tests"
diff --git a/README.rst b/README.rst
index 5612133..ba0d7b4 100644
--- a/README.rst
+++ b/README.rst
@@ -129,6 +129,11 @@
           members:
           - host: 127.0.0.1
             port: 9160
+        message_queue:
+          members:
+          - host: 127.0.0.1
+          - host: 127.0.0.1
+          - host: 127.0.0.1
       database:
         version: 2.2
         cassandra:
@@ -286,6 +291,11 @@
             port: 9160
           - host: 127.0.0.1
             port: 9160
+        message_queue:
+          members:
+          - host: 127.0.0.1
+          - host: 127.0.0.1
+          - host: 127.0.0.1
       database:
         version: 2.2
         cassandra:
@@ -518,6 +528,11 @@
             port: 9160
           - host: 127.0.0.1
             port: 9160
+        message_queue:
+          members:
+          - host: 127.0.0.1
+          - host: 127.0.0.1
+          - host: 127.0.0.1
       database:
         version: 2.2
         cassandra:
@@ -880,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
 ------------------------------------
 
@@ -1098,7 +1124,7 @@
         vip: -1
 
 Enforcing physical routers
-h
+
 .. code-block:: yaml
 
   opencontrail:
@@ -1257,6 +1283,39 @@
         - 8.8.4.4
       ....
 
+Contrail IF-MAP server configuration
+------------------------------------
+
+Contrail 3.2 contains internal IF-MAP server implementation. This implementation can be enabled
+by setting ``config:ifmap:engine`` to internal. Currently supported engines are ``internal`` and
+``irond`` (default). The ``internal`` will configure contrail-api to run as a IF-MAP server in the
+same process as contrail-api and will generate security certificates in specified folder.
+
+.. code-block:: yaml
+
+    config:
+      ....
+      ifmap:
+        engine: internal
+        cert_dir: /etc/contrail/ssl/certs/    # default
+        basename_cert: ifmap.crt              # default
+        basename_key: ifmap.key               # default
+      ....
+
+To set static configuration of the IF-MAP server for contrail-control instead of using
+discovery service, you can use ``control:ifmap:bind:host`` and ``port``. The static configuration
+is triggered by existence of non-empty value of ``control:ifmap:bind`` key.
+
+.. code-block:: yaml
+    control:
+      ....
+      ifmap
+        bind:
+          host: 127.0.0.1
+          port: 8443
+      ....
+
+
 
 Usage
 =====
diff --git a/opencontrail/common.sls b/opencontrail/common.sls
index b3ae6a7..e2f6608 100644
--- a/opencontrail/common.sls
+++ b/opencontrail/common.sls
@@ -42,9 +42,14 @@
   sysctl.present:
     - value: 1
 
+{% if salt['pkg.version_cmp'](grains['kernelrelease'], '4.12') < 0 %}
+# This param is missing from kernel version 4.12
+# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc
+# TODO: Remove this for Ubuntu Bionic (4.15 is the default kernel)
 net.ipv4.tcp_tw_recycle:
   sysctl.present:
     - value: 1
+{% endif %}
 
 net.ipv4.tcp_tw_reuse:
   sysctl.present:
diff --git a/opencontrail/config.sls b/opencontrail/config.sls
index ea996df..d580a1e 100644
--- a/opencontrail/config.sls
+++ b/opencontrail/config.sls
@@ -61,6 +61,29 @@
   - require:
     - pkg: opencontrail_config_packages
 
+{% set ifmap = config.get('ifmap', {}) %}
+{% if ifmap.get('engine', 'irond') != 'irond' %}
+irond_stop_and_disable:
+  service.dead:
+  - name: ifmap-server
+  - enable: False
+  - watch_in:
+    - service: opencontrail_config_services
+
+{% if ifmap.get('engine', 'irond') == 'internal' %}
+internal_ifmap_ssl_dir:
+  file.directory:
+    - name: {{ ifmap.get('cert_dir', '/etc/contrail/ssl/certs/') }}
+    - makedirs: True
+    - dir_mode: 750
+    - require:
+      - pkg: opencontrail_config_packages
+    - watch_in:
+      - service: opencontrail_config_services
+{% endif %}
+
+{% endif %}
+
 {%- if grains.get('init') != 'systemd' %}
 
 /etc/contrail/supervisord_config_files/contrail-discovery.ini:
@@ -91,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/control.sls b/opencontrail/control.sls
index 988eb0c..3727517 100644
--- a/opencontrail/control.sls
+++ b/opencontrail/control.sls
@@ -64,6 +64,13 @@
   - source: salt://opencontrail/files/{{ control.version }}/control/contrail-rndc.conf
   - makedirs: True
 
+{%- if control.version >= 4.0 %}
+/etc/contrail/contrail-issu.conf:
+  file.managed:
+  - source: salt://opencontrail/files/{{ control.version }}/contrail-issu.conf
+  - template: jinja
+{%- endif %}
+
 {%- if control.version == 3.0 and control.get('dns', {}).get('forwarders', False) %}
 contrail_control_resolv:
   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/basicauthusers.properties b/opencontrail/files/3.0/basicauthusers.properties
index 33fb3ca..66cb6e6 100644
--- a/opencontrail/files/3.0/basicauthusers.properties
+++ b/opencontrail/files/3.0/basicauthusers.properties
@@ -40,7 +40,7 @@
 #10.0.102.33:10.0.102.33
 #10.0.102.33.dns:10.0.102.33.dns
 {%- if config.ifmap is defined %}
-{%- for member in config.ifmap.members %}
+{%- for member in config.ifmap.get('members', []) %}
 {{ member.user }}:{{ member.password }}
 {{ member.user }}.dns:{{ member.password }}.dns
 {%- endfor %}
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-alarm-gen.conf b/opencontrail/files/3.0/contrail-alarm-gen.conf
index 1da7577..6ebc244 100644
--- a/opencontrail/files/3.0/contrail-alarm-gen.conf
+++ b/opencontrail/files/3.0/contrail-alarm-gen.conf
@@ -1,4 +1,4 @@
-{%- from "opencontrail/map.jinja" import collector with context %}
+{%- from "opencontrail/map.jinja" import collector,common with context %}
 [DEFAULTS]
 host_ip = {{ collector.bind.address }}
 #collectors = 127.0.0.1:8086
@@ -12,10 +12,31 @@
 log_file = /var/log/contrail/contrail-alarm-gen.log
 kafka_broker_list = {% for member in collector.database.members %}{{ member.host }}:9092 {% endfor %}
 zk_list = {% for member in collector.database.members %}{{ member.host }}:2181{% if not loop.last %},{% endif %}{% endfor %}
+{%- if collector.message_queue.members is defined %}
+rabbitmq_server_list={{ collector.message_queue.members|join(',',attribute='host') }}
+rabbitmq_ha_mode=True
+{%- else %}
+rabbitmq_server_list={{ collector.message_queue.host }}
+{%- endif %}
+rabbitmq_port={{ collector.get('message_queue', {}).get('port', 5672) }}
 
 [DISCOVERY]
 disc_server_ip = {{ collector.discovery.host }}
 disc_server_port = 5998
 
+[API_SERVER]
+api_server_list={{ collector.discovery.host }}:8082
+api_server_use_ssl=False
+
+{%- if common.identity.engine == "keystone" and not common.get('k8s_enabled', False) %}
+[KEYSTONE]
+auth_host={{ common.identity.host }}
+auth_protocol=http
+auth_port={{ common.identity.port }}
+admin_user={{ common.identity.get('user', "admin") }}
+admin_password={{ common.identity.password }}
+admin_tenant_name={{ common.identity.get('tenant', "admin") }}
+{%- endif %}
+
 [REDIS]
 #redis_server_port=6379
diff --git a/opencontrail/files/3.0/contrail-api.conf b/opencontrail/files/3.0/contrail-api.conf
index 0e2e097..9664de1 100644
--- a/opencontrail/files/3.0/contrail-api.conf
+++ b/opencontrail/files/3.0/contrail-api.conf
@@ -1,9 +1,12 @@
 {%- from "opencontrail/map.jinja" import config with context %}
+{%- set ifmap = config.get('ifmap', {}) -%}
 [DEFAULTS]
 ifmap_server_ip={{ config.bind.address }}
 ifmap_server_port=8443
+{% if ifmap.get('engine', 'irond') != 'internal' -%}
 ifmap_username=api-server
 ifmap_password=api-server
+{% endif -%}
 cassandra_server_list={% for member in config.database.members %}{{ member.host }}:9160 {% endfor %}
 listen_ip_addr=0.0.0.0
 listen_port={{ config.bind.get('api_port', '8082') }}
@@ -94,6 +97,14 @@
 {%- endif %}
 {%- endif %}
 
+{% if ifmap.get('engine', 'irond') == 'internal' %}
+[IFMAP_SERVER]
+ifmap_listen_ip={{ ifmap.get('bind', {}).get('host', '0.0.0.0') }}
+ifmap_listen_port={{ ifmap.get('bind', {}).get('port', 8443) }}
+ifmap_credentials=test:test test2:test2 test3:test3 api-server:api-server schema-transformer:schema-transformer svc-monitor:svc-monitor control-user:control-user-passwd control-node-0:control-node-0 control-node-1:control-node-1 control-node-2:control-node-2 control-node-3:control-node-3 control-node-4:control-node-4 control-node-5:control-node-5 control-node-6:control-node-6 control-node-7:control-node-7 control-node-8:control-node-8 control-node-9:control-node-9 control-node-10:control-node-10 control-node-1.dns:control-node-1.dns control-node-2.dns:control-node-2.dns control-node-3.dns:control-node-3.dns control-node-4.dns:control-node-4.dns control-node-5.dns:control-node-5.dns dhcp:dhcp visual:visual sensor:sensor mapclient:mapclient helper:mapclient reader:reader {% for member in ifmap.get('members', []) %}{{ member.user }}:{{ member.password }} {{ member.user }}.dns:{{ member.password }}.dns {% endfor %}
+ifmap_key_path={{ ifmap.get('cert_dir', '/etc/contrail/ssl/certs/') }}{{ ifmap.get('basename_key', 'ifmap.key') }}
+ifmap_cert_path={{ ifmap.get('cert_dir', '/etc/contrail/ssl/certs/') }}{{ ifmap.get('basename_crt', 'ifmap.crt') }}
+{%- endif %}
+
 [KEYSTONE]
 keystone_sync_on_demand={{ config.identity.get('sync_on_demand', 'true') }}
-
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/3.0/contrail-control.conf b/opencontrail/files/3.0/contrail-control.conf
index 58154c1..ef85dc4 100644
--- a/opencontrail/files/3.0/contrail-control.conf
+++ b/opencontrail/files/3.0/contrail-control.conf
@@ -43,4 +43,6 @@
 # server_url= # Provided by discovery server, e.g. https://127.0.0.1:8443
 {%- if grains.get('virtual_subtype', None) == "Docker" %}
   server_url=https://{{ control.discovery.host }}:8443
+{%- elif control.get('ifmap', {}).get('bind') %}
+  server_url=https://{{ control.ifmap.bind.get('host', '127.0.0.1') }}:{{ control.ifmap.bind.get('port', 8443) }}
 {%- endif %}
diff --git a/opencontrail/files/4.0/config.global.js b/opencontrail/files/4.0/config.global.js
index dcbd92f..47b1dfc 100644
--- a/opencontrail/files/4.0/config.global.js
+++ b/opencontrail/files/4.0/config.global.js
@@ -73,7 +73,10 @@
  *
  ****************************************************************************/
 config.regions = {};
+
+{%- if web.identity.engine != "none" %}
 config.regions.RegionOne = 'http://{{ web.identity.host }}:5000/v{{ web.identity.version }}';
+{%- endif %}
 
 /****************************************************************************
  * This boolean flag indicates if serviceEndPointFromConfig is set as false,
@@ -281,10 +284,10 @@
 config.insecure_access = false;
 
 // HTTP port for NodeJS Server.
-config.http_port = '8080';
+config.http_port = '{{ web.get("http",{}).get("port","8080") }}';
 
 // HTTPS port for NodeJS Server.
-config.https_port = '8143';
+config.https_port = '{{ web.get("https",{}).get("port","8143") }}';
 
 // Activate/Deactivate Login.
 config.require_auth = false;
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-issu.conf b/opencontrail/files/4.0/contrail-issu.conf
index e69de29..abf9fd7 100644
--- a/opencontrail/files/4.0/contrail-issu.conf
+++ b/opencontrail/files/4.0/contrail-issu.conf
@@ -0,0 +1 @@
+[DEFAULTS]
\ No newline at end of file
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/files/4.0/contrail-svc-monitor.conf b/opencontrail/files/4.0/contrail-svc-monitor.conf
index 3078cc3..8d6fb7a 100644
--- a/opencontrail/files/4.0/contrail-svc-monitor.conf
+++ b/opencontrail/files/4.0/contrail-svc-monitor.conf
@@ -36,8 +36,11 @@
 # Driver to use for scheduling virtual machine of a NetNS service instance to a
 # vrouter agent
 # si_netns_scheduler_driver = svc_monitor.scheduler.vrouter_scheduler.RandomScheduler
+{%- if config.identity.engine == "none" %}
+aaa_mode=no-auth
+{%- endif %}
 
-[KEYSTONE]
+#[KEYSTONE]
 #auth_host=127.0.0.1
 #admin_user=
 #admin_password=
diff --git a/opencontrail/files/4.0/doctrail b/opencontrail/files/4.0/doctrail
index e40f76c..eaba912 100644
--- a/opencontrail/files/4.0/doctrail
+++ b/opencontrail/files/4.0/doctrail
@@ -27,11 +27,20 @@
   if [ "$CORRECT" -gt 0 ] && [ "$1" != "all" ]; then
     if [ "$2" == "console" ]; then
       echo "Starting console:"
-      NODE=$(docker ps | grep _$1_ | awk '{print $1}')
-      docker exec -it $NODE bash
+      NODE=$(docker ps | grep "opencontrail.$1[-_]" | awk '{print $1}')
+      if [[ $NODE =~ ^[0-9a-fA-F]+$ ]]; then
+        docker exec -it $NODE bash
+      else
+        echo "Unknow container name, please use -h paramater for help."
+      fi
     else
-      NODE=$(docker ps | grep _$1_ | awk '{print $1}')
-      docker exec $NODE ${@:2}
+      NODE=$(docker ps | grep "opencontrail.$1[-_]" | awk '{print $1}')
+      if [[ $NODE =~ ^[0-9a-fA-F]+$ ]]; then
+        docker exec $NODE ${@:2}
+      else
+        echo "Unknow container name, please use -h paramater for help."
+      fi
+
     fi
   else
     echo "Unknow target, use -h or --help paramater for help"
diff --git a/opencontrail/map.jinja b/opencontrail/map.jinja
index a54a124..89c7bc1 100644
--- a/opencontrail/map.jinja
+++ b/opencontrail/map.jinja
@@ -1,5 +1,6 @@
 {%- set vendor = salt['pillar.get']('opencontrail:common:vendor', 'opencontrail') %}
 {%- set version = salt['pillar.get']('opencontrail:common:version') %}
+{%- set ifmap = salt['pillar.get']('opencontrail:config:ifmap:engine', 'irond') %}
 
 {%- load_yaml as base_defaults %}
 {%- if vendor in ['opencontrail'] %}
@@ -69,10 +70,14 @@
 config:
   Debian:
     pkgs:
-        ['contrail-config-openstack', 'ifmap-server']
+    - 'contrail-config-openstack'
+    - 'ifmap-server'
     services:
     {%- if version < 4.0 %}
-        ['ifmap-server', 'supervisor-config']
+    {%- if ifmap == 'irond' %}
+    - 'ifmap-server'
+    {%- endif %}
+    - 'supervisor-config'
     {%- else %}
         ['contrail-api', 'contrail-schema', 'contrail-svc-monitor', 'contrail-device-manager', 'contrail-config-nodemgr']
     {%- endif %}
diff --git a/opencontrail/meta/collectd.yml b/opencontrail/meta/collectd.yml
index fd5deb9..1e94d6e 100644
--- a/opencontrail/meta/collectd.yml
+++ b/opencontrail/meta/collectd.yml
@@ -184,10 +184,12 @@
         match: 'python.*contrail-discovery'
       contrail-dns:
         match: 'contrail-dns'
+    {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
       contrail-ifmap-server:
         match: 'sh.*ifmap-server'
       contrail-irond:
         match: 'java.*irond'
+    {%- endif %}
       contrail-job-server:
         match: 'node.*jobServerStart'
       contrail-named:
diff --git a/opencontrail/meta/heka.yml b/opencontrail/meta/heka.yml
index 43bf89b..08f1937 100644
--- a/opencontrail/meta/heka.yml
+++ b/opencontrail/meta/heka.yml
@@ -15,12 +15,15 @@
   {%- if control.get('enabled', False) %}
     {%- set control_processes = (
         'contrail-api', 'contrail-control', 'contrail-device-manager',
-        'contrail-discovery', 'contrail-dns', 'contrail-ifmap-server',
-        'contrail-irond', 'contrail-job-server', 'contrail-named',
-        'contrail-nodemgr-config', 'contrail-nodemgr-control',
-        'contrail-schema', 'contrail-supervisord-config',
-        'contrail-supervisord-control', 'contrail-svc-monitor',
+        'contrail-discovery', 'contrail-dns', 'contrail-job-server',
+        'contrail-named', 'contrail-nodemgr-config',
+        'contrail-nodemgr-control', 'contrail-schema',
+        'contrail-supervisord-config', 'contrail-supervisord-control',
+        'contrail-svc-monitor',
         ) %}
+    {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
+      {%- set control_processes = control_processes + ('contrail-ifmap-server', 'contrail-irond',) %}
+    {%- endif %}
   {%- endif %}
   {%- if database.get('enabled', False) %}
     {%- set database_processes = (
diff --git a/opencontrail/meta/prometheus.yml b/opencontrail/meta/prometheus.yml
index 46782c0..72a87d0 100644
--- a/opencontrail/meta/prometheus.yml
+++ b/opencontrail/meta/prometheus.yml
@@ -38,14 +38,19 @@
 
   {%- if control.get('enabled', False) %}
     {%- set control_apis = ( 'contrail.api', 'contrail.discovery' ) %}
+
     {%- set control_processes = (
-        'contrail-api', 'contrail-control', 'contrail-device-manager',
-        'contrail-discovery', 'contrail-dns', 'contrail-ifmap-server',
-        'contrail-irond', 'contrail-job-server', 'contrail-named',
-        'contrail-nodemgr-config', 'contrail-nodemgr-control',
-        'contrail-schema', 'contrail-supervisord-config',
-        'contrail-supervisord-control', 'contrail-svc-monitor',
-        ) %}
+    'contrail-api', 'contrail-control', 'contrail-device-manager',
+    'contrail-discovery', 'contrail-dns', 'contrail-job-server',
+    'contrail-named', 'contrail-nodemgr-config',
+    'contrail-nodemgr-control', 'contrail-schema',
+    'contrail-supervisord-config', 'contrail-supervisord-control',
+    'contrail-svc-monitor',
+    ) %}
+
+    {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
+      {%- set control_processes = control_processes + ('contrail-ifmap-server', 'contrail-irond',) %}
+    {%- endif %}
 
     {%- for api in control_apis %}
       {% do all_contrail_apis.append(api) %}
@@ -514,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/opencontrail/meta/telegraf.yml b/opencontrail/meta/telegraf.yml
index 51f7a40..0e2e342 100644
--- a/opencontrail/meta/telegraf.yml
+++ b/opencontrail/meta/telegraf.yml
@@ -47,10 +47,12 @@
           pattern: 'python.*contrail-discovery'
         contrail-dns:
           pattern: 'contrail-dns'
+    {%- if config.get('ifmap', {}).get('engine', 'irond') == 'irond' %}
         contrail-ifmap-server:
           pattern: 'sh.*ifmap-server'
         contrail-irond:
           pattern: 'java.*irond'
+    {%- endif %}
         contrail-job-server:
           pattern: 'node.*jobServerStart'
         contrail-named:
diff --git a/tests/pillar/analytics3.sls b/tests/pillar/analytics3.sls
index 1a5e861..2afcd1c 100644
--- a/tests/pillar/analytics3.sls
+++ b/tests/pillar/analytics3.sls
@@ -32,6 +32,12 @@
         port: 9160
       - host: 127.0.0.1
         port: 9160
+    message_queue:
+      host: 127.0.0.1
+      members:
+      - host: 127.0.0.1
+      - host: 127.0.0.1
+      - host: 127.0.0.1
   database:
     version: 3.0
     cassandra:
diff --git a/tests/pillar/cluster3.sls b/tests/pillar/cluster3.sls
index 1f97957..54c9d41 100644
--- a/tests/pillar/cluster3.sls
+++ b/tests/pillar/cluster3.sls
@@ -104,6 +104,12 @@
         port: 9160
       - host: 127.0.0.1
         port: 9160
+    message_queue:
+      host: 127.0.0.1
+      members:
+      - host: 127.0.0.1
+      - host: 127.0.0.1
+      - host: 127.0.0.1
   database:
     version: 3.0
     cassandra:
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
diff --git a/tests/pillar/single3.sls b/tests/pillar/single3.sls
index 859caf7..43f6dd6 100644
--- a/tests/pillar/single3.sls
+++ b/tests/pillar/single3.sls
@@ -80,6 +80,12 @@
       members:
       - host: 127.0.0.1
         port: 9160
+    message_queue:
+      host: 127.0.0.1
+      members:
+      - host: 127.0.0.1
+      - host: 127.0.0.1
+      - host: 127.0.0.1
   database:
     version: 3.0
     cassandra: