Merge "Add Salt 2018.3 tests"
diff --git a/README.rst b/README.rst
index 09bcdd7..1be4d81 100644
--- a/README.rst
+++ b/README.rst
@@ -209,6 +209,83 @@
                 port: 5000
                 params: check
 
+Sample pillar with port range and port offset
+
+This is usefull in listen blocks for definition of multiple servers
+that differs only by port number in port range block. This situation
+can be result of multiple single-thread servers deployed in multi-core
+environment to better utilize the available cores.
+
+For example five contrail-api workers occupy ports ``9100-9104``.
+This can be achieved by using ``port_range_length`` in the pillar,
+``port_range_length: 5`` in this case.
+For skipping first worker (``worker_id 0``), because it has other
+responsibilities and to avoid overloading it by http requests
+use the ``port_range_start_offset`` in the pillar,
+``port_range_start_offset: 1`` in this case, it will only use ports
+9101-9104 (skipping 9100).
+
+- ``port_range_length`` parameter is used to calculate port range end
+- ``port_range_start_offset`` will skip first n ports in port range
+
+For backward compatibility, the name of the first server in port range
+has no ``pN`` suffix.
+
+The following sample will result in
+
+.. code-block:: text
+
+    listen contrail_api
+      bind 172.16.10.252:8082
+      option nolinger
+      balance leastconn
+      server ntw01p1 172.16.10.95:9101 check inter 2000 rise 2 fall 3
+      server ntw01p2 172.16.10.95:9102 check inter 2000 rise 2 fall 3
+      server ntw01p3 172.16.10.95:9103 check inter 2000 rise 2 fall 3
+      server ntw01p4 172.16.10.95:9104 check inter 2000 rise 2 fall 3
+      server ntw02 172.16.10.96:9100 check inter 2000 rise 2 fall 3
+      server ntw02p1 172.16.10.96:9101 check inter 2000 rise 2 fall 3
+      server ntw02p2 172.16.10.96:9102 check inter 2000 rise 2 fall 3
+      server ntw02p3 172.16.10.96:9103 check inter 2000 rise 2 fall 3
+      server ntw02p4 172.16.10.96:9104 check inter 2000 rise 2 fall 3
+      server ntw03 172.16.10.94:9100 check inter 2000 rise 2 fall 3
+      server ntw03p1 172.16.10.94:9101 check inter 2000 rise 2 fall 3
+      server ntw03p2 172.16.10.94:9102 check inter 2000 rise 2 fall 3
+      server ntw03p3 172.16.10.94:9103 check inter 2000 rise 2 fall 3
+      server ntw03p4 172.16.10.94:9104 check inter 2000 rise 2 fall 3
+
+.. code-block:: yaml
+
+    haproxy:
+      proxy:
+        listen:
+          contrail_api:
+            type: contrail-api
+            service_name: contrail
+            balance: leastconn
+            binds:
+            - address: 10.10.10.10
+              port: 8082
+            servers:
+            - name: ntw01
+              host: 10.10.10.11
+              port: 9100
+              port_range_length: 5
+              port_range_start_offset: 1
+              params: check inter 2000 rise 2 fall 3
+            - name: ntw02
+              host: 10.10.10.12
+              port: 9100
+              port_range_length: 5
+              port_range_start_offset: 0
+              params: check inter 2000 rise 2 fall 3
+            - name: ntw03
+              host: 10.10.10.13
+              port: 9100
+              port_range_length: 5
+              params: check inter 2000 rise 2 fall 3
+
+
 Custom more complex listener (for Artifactory and subdomains for docker
 registries)
 
diff --git a/haproxy/files/haproxy.cfg b/haproxy/files/haproxy.cfg
index cfeb659..34be63c 100644
--- a/haproxy/files/haproxy.cfg
+++ b/haproxy/files/haproxy.cfg
@@ -211,7 +211,11 @@
   {%- endfor %}
   {%- endif %}
   {%- for server in listen.get('servers', []) %}
-  server {{ server.name }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }}
+  {%- set port_range_length=server.get('port_range_length', 1) %}
+  {%- set port_range_start_offset=server.get('port_range_start_offset', 0) %}
+  {%- for worker_port in range(port_range_start_offset, port_range_length) %}
+  server {{ server.name }}{% if worker_port > 0 %}p{{ worker_port }}{% endif %} {{ server.host }}:{{ server.port + worker_port }} {{ server.get('params', '') }}
+  {%- endfor %}
   {%- endfor %}
 {%- endif %}
 {%- endif %}
diff --git a/tests/pillar/single_contrail_workers.sls b/tests/pillar/single_contrail_workers.sls
new file mode 100644
index 0000000..d432528
--- /dev/null
+++ b/tests/pillar/single_contrail_workers.sls
@@ -0,0 +1,63 @@
+haproxy:
+  proxy:
+    enabled: true
+    mode: tcp
+    logging: syslog
+    max_connections: 1024
+    listen:
+      contrail_analytics:
+        type: contrail-analytics
+        binds:
+        - address: 127.0.0.1
+          port: 8081
+        servers:
+        - name: ams1posnal01
+          host: 127.0.0.1
+          port: 9081
+          params: check inter 2000 rise 2 fall 3
+        - name: ams1posnal02
+          host: 127.0.0.1
+          port: 9081
+          params: check inter 2000 rise 2 fall 3
+        - name: ams1posnal03
+          host: 127.0.0.1
+          port: 9081
+          params: check inter 2000 rise 2 fall 3
+      contrail_config_stats:
+        type: contrail-config
+        format: listen
+        binds:
+        - address: '*'
+          port: 5937
+        user: haproxy
+        password: password
+      contrail_api:
+        type: contrail-api
+        check: false
+        binds:
+        - address: 127.0.0.1
+          port: 8082
+        servers:
+        - name: ams1posntw01
+          host: 127.0.0.1
+          port: 9100
+          port_range_length: 5
+          port_range_start_offset: 1
+          params: check inter 2000 rise 2 fall 3
+        - name: ams1posntw02
+          host: 127.0.0.1
+          port: 9100
+          port_range_length: 5
+          port_range_start_offset: 2
+          params: check inter 2000 rise 2 fall 3
+        - name: ams1posntw03
+          host: 127.0.0.1
+          port: 9100
+          port_range_length: 5
+          port_range_start_offset: 5  # This should result in empty port range
+          params: check inter 2000 rise 2 fall 3
+
+# For haproxy/meta/sensu.yml
+linux:
+  network:
+    fqdn: linux.ci.local