Initial commit
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644
index 0000000..14a17fe
--- /dev/null
+++ b/CHANGELOG.rst
@@ -0,0 +1,6 @@
+rabbitmq formula
+================
+
+0.0.1 (2015-08-03)
+
+- Initial formula setup
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8e80b12
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2014-2015 tcp cloud a. s.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..7bacebe
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,142 @@
+=========================
+RabbitMQ messaging system
+=========================
+
+RabbitMQ is a complete and highly reliable enterprise messaging system based on the emerging AMQP standard.
+
+Sample pillars
+==============
+
+Standalone Broker
+-----------------
+
+RabbitMQ as AMQP broker with admin user and vhosts
+
+.. code-block:: yaml
+
+    rabbitmq:
+      server:
+        enabled: true
+        bind:
+          address: 0.0.0.0
+          port: 5672
+        secret_key: rabbit_master_cookie
+        admin:
+          name: adminuser
+          password: pwd
+        plugins:
+        - amqp_client
+        - rabbitmq_management
+        virtual_hosts:
+        - enabled: true
+          host: '/monitor'
+          user: 'monitor'
+          password: 'password'
+
+RabbitMQ as a Stomp broker
+
+.. code-block:: yaml
+
+    rabbitmq:
+      server:
+        enabled: true
+        secret_key: rabbit_master_cookie
+        bind:
+          address: 0.0.0.0
+          port: 5672
+        virtual_hosts:
+        - enabled: true
+          host: '/monitor'
+          user: 'monitor'
+          password: 'password'
+        plugins:
+        - rabbitmq_stomp
+
+RabbitMQ cluster
+----------------
+
+RabbitMQ as base cluster node
+
+.. code-block:: yaml
+
+    rabbitmq:
+      server:
+        enabled: true
+        bind:
+          address: 0.0.0.0
+          port: 5672
+        secret_key: rabbit_master_cookie
+        admin:
+          name: adminuser
+          password: pwd
+      cluster:
+        enabled: true
+        role: master
+        mode: disc
+        members:
+        - name: openstack1
+          host: 10.10.10.212
+        - name: openstack2
+          host: 10.10.10.213
+
+HA Queues definition
+
+.. code-block:: yaml
+
+    rabbitmq:
+      server:
+        enabled: true
+        ...
+        virtual_hosts:
+        - enabled: true
+          host: '/monitor'
+          user: 'monitor'
+          password: 'password'
+          policies:
+          - name: HA
+            pattern: '^(?!amq\.).*' 
+            definition: '{"ha-mode": "all"}'
+
+Usage
+=====
+
+Check cluster status, example shows running cluster with 3 nodes: ctl-1, ctl-2, ctl-3
+
+.. code-block:: yaml
+
+    > rabbitmqctl cluster_status
+    
+    Cluster status of node 'rabbit@ctl-1' ...
+    [{nodes,[{disc,['rabbit@ctl-1','rabbit@ctl-2','rabbit@ctl-3']}]}, 
+     {running_nodes,['rabbit@ctl-3','rabbit@ctl-2','rabbit@ctl-1']},
+     {partitions,[]}]
+    ...done.
+
+Setup management user.
+
+.. code-block:: yaml
+
+    > rabbitmqctl add_vhost vhost
+    > rabbitmqctl add_user user alive
+    > rabbitmqctl set_permissions -p vhost user ".*" ".*" ".*"
+    > rabbitmqctl set_user_tags user management
+
+EPD process is Erlang Port Mapper Daemon. It's a feature of the Erlang runtime that helps Erlang nodes to find each other. It's a pretty tiny thing and doesn't contain much state (other than "what Erlang nodes are running on this system?") so it's not a huge deal for it to still be running.
+Although it's running as user rabbitmq, it was started automatically by the Erlang VM when we started. We've considered adding "epmd -kill" to our shutdown script - but that would break any other Erlang apps running on the system; it's more "global" than RabbitMQ.
+
+Read more
+=========
+
+* http://www.rabbitmq.com/admin-guide.html
+* https://github.com/saltstack/salt-contrib/blob/master/states/rabbitmq_plugins.py
+* http://docs.saltstack.com/ref/states/all/salt.states.rabbitmq_user.html
+* http://stackoverflow.com/questions/14699873/how-to-reset-user-for-rabbitmq-management
+* http://www.rabbitmq.com/memory.html
+
+Clustering
+==========
+
+* http://www.rabbitmq.com/clustering.html#auto-config
+* https://github.com/jesusaurus/hpcs-salt-state/tree/master/rabbitmq
+* http://gigisayfan.blogspot.cz/2012/06/rabbit-mq-clustering-python-fabric.html
+* http://docwiki.cisco.com/wiki/OpenStack_Havana_Release:_High-Availability_Manual_Deployment_Guide#RabbitMQ_Installation
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..3b04cfb
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.2
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..0aaac23
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,11 @@
+salt-formula-rabbitmq (0.2) trusty; urgency=medium
+
+  * First public release
+
+ -- Filip Pytloun <filip.pytloun@tcpcloud.eu>  Tue, 06 Oct 2015 16:38:52 +0200
+
+salt-formula-rabbitmq (0.1) trusty; urgency=medium
+
+  * Initial release
+
+ -- Jakub Pavlik <jakub.pavlik@tcpcloud.eu>  Thu, 13 Aug 2015 23:23:41 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..a83a260
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,15 @@
+Source: salt-formula-rabbitmq
+Maintainer: Jakub Pavlik <jakub.pavlik@tcpcloud.eu>
+Section: admin
+Priority: optional
+Build-Depends: debhelper (>= 9)
+Standards-Version: 3.9.6
+Homepage: http://www.tcpcloud.eu
+Vcs-Browser: https://github.com/tcpcloud/salt-formula-rabbitmq
+Vcs-Git: https://github.com/tcpcloud/salt-formula-rabbitmq.git
+
+Package: salt-formula-rabbitmq
+Architecture: all
+Depends: ${misc:Depends}, salt-master, reclass
+Description: RabbitMQ Salt formula
+ Install and configure RabbitMQ server and client.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..5813386
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,15 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: salt-formula-rabbitmq
+Upstream-Contact: Jakub Pavlik <jakub.pavlik@tcpcloud.eu>
+Source: https://github.com/tcpcloud/salt-formula-rabbitmq
+
+Files: *
+Copyright: 2014-2015 tcp cloud
+License: Apache-2.0
+  Copyright (C) 2014-2015 tcp cloud
+  .
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  .
+  On a Debian system you can find a copy of this license in
+  /usr/share/common-licenses/Apache-2.0.
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..d585829
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,3 @@
+README.rst
+CHANGELOG.rst
+VERSION
diff --git a/debian/install b/debian/install
new file mode 100644
index 0000000..1050092
--- /dev/null
+++ b/debian/install
@@ -0,0 +1,2 @@
+rabbitmq/*             /usr/share/salt-formulas/env/rabbitmq/
+metadata/service/*      /usr/share/salt-formulas/reclass/service/rabbitmq/
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..abde6ef
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+
+%:
+	dh $@
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/metadata/service/server/cluster.yml b/metadata/service/server/cluster.yml
new file mode 100644
index 0000000..c7c9ec2
--- /dev/null
+++ b/metadata/service/server/cluster.yml
@@ -0,0 +1,61 @@
+applications:
+- rabbitmq
+parameters:
+  rabbitmq:
+    server:
+      enabled: true
+      secret_key: ${_param:rabbitmq_secret_key}
+      memory:
+        vm_high_watermark: 0.8
+      bind:
+        address: ${_param:cluster_local_address}
+        port: 5672
+      plugins:
+      - amqp_client
+      - rabbitmq_management
+      admin:
+        name: admin
+        password: ${_param:rabbitmq_admin_password}
+      host:
+        '/openstack':
+          enabled: true
+          user: openstack
+          password: ${_param:rabbitmq_openstack_password}
+          policies:
+          - name: HA
+            pattern: '^(?!amq\.).*' 
+            definition: '{"ha-mode": "all"}'
+    cluster:
+      enabled: true
+      name: openstack
+      role: ${_param:rabbitmq_cluster_role}
+      master: ${_param:cluster_node01_hostname}
+      mode: disc
+      members:
+      - name: ${_param:cluster_node01_hostname}
+        host: ${_param:cluster_node01_address}
+      - name: ${_param:cluster_node02_hostname}
+        host: ${_param:cluster_node02_address}
+      - name: ${_param:cluster_node03_hostname}
+        host: ${_param:cluster_node03_address}
+  haproxy:
+    proxy:
+      listen:
+        rabbitmq_cluster:
+          type: rabbitmq
+          binds:
+          - address: ${_param:cluster_vip_address}
+            port: 5672
+          servers:
+          - name: ctl01
+            host: ${_param:cluster_node01_address}
+            port: 5672
+            params: check inter 5000 rise 2 fall 3 
+          - name: ctl02
+            host: ${_param:cluster_node02_address}
+            port: 5672
+            params: backup check inter 5000 rise 2 fall 3
+          - name: ctl03
+            host: ${_param:cluster_node03_address}
+            port: 5672
+            params: backup check inter 5000 rise 2 fall 3
diff --git a/metadata/service/server/local.yml b/metadata/service/server/local.yml
new file mode 100644
index 0000000..36f8c27
--- /dev/null
+++ b/metadata/service/server/local.yml
@@ -0,0 +1,20 @@
+applications:
+- rabbitmq
+parameters:
+  _param:
+    rabbitmq_admin_user: admin
+  rabbitmq:
+    server:
+      enabled: true
+      secret_key: ${_param:rabbitmq_secret_key}
+      memory:
+        vm_high_watermark: 0.8
+      bind:
+        address: 127.0.0.1
+        port: 5672
+      plugins:
+      - amqp_client
+      - rabbitmq_management
+      admin:
+        name: ${_param:rabbitmq_admin_user}
+        password: ${_param:rabbitmq_admin_password}
diff --git a/metadata/service/server/single.yml b/metadata/service/server/single.yml
new file mode 100644
index 0000000..ce6a9d7
--- /dev/null
+++ b/metadata/service/server/single.yml
@@ -0,0 +1,20 @@
+applications:
+- rabbitmq
+parameters:
+  _param:
+    rabbitmq_admin_user: admin
+  rabbitmq:
+    server:
+      enabled: true
+      secret_key: ${_param:rabbitmq_secret_key}
+      memory:
+        vm_high_watermark: 0.8
+      bind:
+        address: 0.0.0.0
+        port: 5672
+      plugins:
+      - amqp_client
+      - rabbitmq_management
+      admin:
+        name: ${_param:rabbitmq_admin_user}
+        password: ${_param:rabbitmq_admin_password}
diff --git a/rabbitmq/cluster.sls b/rabbitmq/cluster.sls
new file mode 100644
index 0000000..50c6735
--- /dev/null
+++ b/rabbitmq/cluster.sls
@@ -0,0 +1,52 @@
+{%- from "rabbitmq/map.jinja" import cluster with context %}
+{%- if cluster.enabled %}
+
+include:
+- linux.network.host
+- rabbitmq.server.service
+
+rabbitmq_dirs:
+  file.directory:
+  - names:
+    - /root/rabbitmq/flags
+  - mode: 700
+  - user: root
+  - group: root
+  - makedirs: true
+
+{% if cluster.get('role', 'slave') == 'master' %}
+
+rabbitmq_cluster_init:
+  cmd.run:
+  - names:
+    - rabbitmqctl set_cluster_name {{ cluster.get('name', 'rabbitmq') }}
+  - unless: test -e /root/rabbitmq/flags/cluster-installed
+  - require:
+    - file: rabbitmq_dirs
+    - service: rabbitmq_service
+
+{% else %}
+
+rabbit@master:
+  rabbitmq_cluster.join:
+  - user: rabbit
+  - host: {{ cluster.master }}
+  {%- if cluster.get('mode', 'disc') == 'ram' %}
+  - ram_node: true
+  {%- endif %}
+  - require:
+    - file: rabbitmq_dirs
+    - service: rabbitmq_service
+
+{%- endif %}
+
+rabbitmq_cluster_init_final:
+  cmd.run:
+  - names:
+    - touch /root/rabbitmq/flags/cluster-installed
+  - unless: test -e /root/rabbitmq/flags/cluster-installed
+  - require:
+    - file: rabbitmq_dirs
+    - service: rabbitmq_service
+
+{%- endif %}
\ No newline at end of file
diff --git a/rabbitmq/files/default b/rabbitmq/files/default
new file mode 100644
index 0000000..b26a724
--- /dev/null
+++ b/rabbitmq/files/default
@@ -0,0 +1,13 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+# Managed by Salt
+
+# This file is sourced by /etc/init.d/rabbitmq-server. Its primary
+# reason for existing is to allow adjustment of system limits for the
+# rabbitmq-server process.
+#
+# Maximum number of open file handles. This will need to be increased
+# to handle many simultaneous connections. Refer to the system
+# documentation for ulimit (in man bash) for more information.
+#
+
+ulimit -n {{ server.ulimit }}
\ No newline at end of file
diff --git a/rabbitmq/files/rabbitmq.config b/rabbitmq/files/rabbitmq.config
new file mode 100644
index 0000000..c5e268a
--- /dev/null
+++ b/rabbitmq/files/rabbitmq.config
@@ -0,0 +1,52 @@
+{%- from "rabbitmq/map.jinja" import server with context -%}
+[
+    {#
+    {kernel,
+            [{inet_dist_listen_min, 65535},
+             {inet_dist_listen_max, 65535},
+             {inet_default_listen_options, [{nodelay, true},
+                                            {sndbuf, 65535},
+                                            {recbuf, 65535},
+                                            {keepalive, true}
+                                           ]
+             },
+             {inet_default_connect_options, [{nodelay, true},
+                                             {keepalive, true}
+                                            ]
+             }
+            ]
+    },#}{#
+    {mnesia, [{dump_log_write_threshold, 1000}]}, #}
+    {rabbit, [{vm_memory_high_watermark, {{ server.memory.vm_high_watermark }}},
+              {memory_alarms, true},
+              {disk_free_limit, 50000000},
+{#-           {disk_free_limit, {#{mem_relative, 1.0}},       #}
+              {%- if pillar.rabbitmq.cluster is defined %}
+              {%- from "rabbitmq/map.jinja" import cluster with context %}
+              {cluster_partition_handling, autoheal},
+              {tcp_listen_options,
+                        [binary,
+                          {packet, raw},
+                          {reuseaddr, true},
+                          {backlog, 128},
+                          {nodelay, true},
+                          {exit_on_close, false},
+                          {keepalive, true}
+                         ]
+              },
+              {cluster_nodes, {[{% for node in cluster.members %}'rabbit@{{ node.name }}'{% if not loop.last %}, {% endif %}{% endfor %}], {{ cluster.mode }}}},
+              {%- endif %}
+              {loopback_users, []},
+              {tcp_listeners, [{"{{ server.bind.address }}",{{ server.bind.port }}}]}
+              {%- if server.ssl is defined %},
+              {ssl_listeners, [5671]},
+              {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.pem"},
+                             {certfile,"/etc/rabbitmq/ssl/cert.pem"},
+                             {keyfile,"/etc/rabbitmq/ssl/key.pem"},
+                             {verify, verify_none},
+                             {fail_if_no_peer_cert,false}]
+              }
+              {% endif %}
+             ]
+    }
+].
diff --git a/rabbitmq/files/rabbitmq_com.gpg b/rabbitmq/files/rabbitmq_com.gpg
new file mode 100644
index 0000000..64cfab4
--- /dev/null
+++ b/rabbitmq/files/rabbitmq_com.gpg
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+mQGiBEaOQ/IRBACs/n609zN+OzlK9qDkFWwYKfPG+BlgqBj5MSy0XE2K8cE3bWSV
+2WftTe/TGEfW0hknXt1PyBla0cnO9Up1xCn142vo8bvUug8WjrxLQBBiAf11FAOR
+dt9roGe4IWw/Lakgb88re09ZYKmOL9H7MEpvMqtjdWjFSq4zeeGa8rGEswCgnQLb
+ZD/MNlUNQwQVCs+vVRdgpzcD+QELSc2EeYl4tef0NiUaZQt+mjFTs3DjQNDTjXao
+ETVAqECx4kavcshx5tSE5JbbQPIMiUgh0h9J3z3uZsBVnx6P82aW/QTw+jLhsQry
+/i3Z/+pS66mk6EWhAAYF/SPVqM/06BZh0ZvUmeG9WGGJXD9CUN1Wfi2mt42L2zhT
+xg3uBACoIs5/GORi0H2i+blLiFSxTroXw+TdxiP+mfjdPho0oXJQTljXBgG70VfX
+XW9sWsYtekqXBsmwMcbCZTjZGul/8jAUlUoYfthRw9KpP9N8Q7wB8Flx9jEv0M0H
+tV1KTrLuXNZvEAB1sECMa7RRrV1yO4wyYDsOXiZNTL6rYugOU7QwUmFiYml0TVEg
+UmVsZWFzZSBTaWduaW5nIEtleSA8aW5mb0ByYWJiaXRtcS5jb20+iGAEExECACAF
+AkaOQ/ICGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRD3uM6mBW6OVkymAJ0R
+6MwiZNRuTAttgYf1Xe7dK7HpzACfZioV/LqnDh7XvcTJEl+r4GB19by5Ag0ERo5D
++xAIAKu1ZxtAZjwlNLb0L5uwrEP7nTbRTNUYoEtE8+CNDSLLlmRIvBriKYNGicnz
+Ebq2kDnAoyH38ACIMNayrkqc6I4l3BD2sv7zPZCd4qAbyFCu6gnewTANTWkVuH60
+R65QQ8pM8sM+VZAMSoMkDSP4u248xOzFyGgVYuuWuR/sIRcaA02FW9TGvZQ7fNoF
+rf6UbKSYkjpY767IW8q0b68vKzSLw0GQvH+dsvhaj80hjKJ06+IZ9Gdi/b4+AIT2
+YWyWmrHo2QhnUmsarNdtusesQGQtiYgZw95PJJkzR0AttuPPfPNGLYZtVJenvOCC
+jsK5uUL3/eEQ3UWGs+BKEyA/qLMAAwUH/2kIFCdgCw2DnL87TO+vruhGjsM7NjXf
+57F4ojTdblFd6AerjRhMgICdzCF9WkFROdBSyQ/GajoNU81kbHZglxmKyKkVwWEb
+G7pmSIc/sk5Z7OP/zrg4h8ZGzvMbRy0XLf86lQhbDE3AcHMeJCcShIWAHAbygnYW
+j0KRhZiyqxqx4mrZQDZEWI7S1G9YNvgu1GS9EEKEpmxDEOME9nJZLi9o7mTeD1QV
+TyOzWHkpQ42QcgrFuG7RMxDaQK6bdinNTl8aPmMoPamGzotSt4aMoVMiNxjatnlH
+pqQ5UJlqbB5FGLnwJ0773WzgRdxIwSIxkFhL/Mq4agf4an8151kqcZCISQQYEQIA
+CQUCRo5D+wIbDAAKCRD3uM6mBW6OVhLmAKCYY152B/10n7aUNKejs92NsNAnPACf
+ZwbDOKBXGfkCPuRx5j/AGneASNU=
+=Ry+c
+-----END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/rabbitmq/files/sensu.conf b/rabbitmq/files/sensu.conf
new file mode 100644
index 0000000..6868655
--- /dev/null
+++ b/rabbitmq/files/sensu.conf
@@ -0,0 +1,156 @@
+{%- from "rabbitmq/map.jinja" import server with context -%}
+{%- from "linux/map.jinja" import network with context -%}
+{%- if server.bind.address == '0.0.0.0' %}
+{% if grains.ipv4[0] == '127.0.0.1' %}{% set address =  grains.ipv4[1] %}{% else %}{% set address =  grains.ipv4[0] %}{% endif %}
+{%- else %}
+{%- set address = server.bind.address %}
+{%- endif %}
+local_rabbitmq_server_proc:
+  command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_procs -C beam.smp -u rabbitmq -c 1:2"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - local-rabbitmq-server
+{%- if server.bind.address == '127.0.0.1' %}
+local_rabbitmq_server_tcp_{{ network.fqdn }}:
+  command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_tcp -H 127.0.0.1 -p 5672"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - {{ network.fqdn|replace('.', '-') }}
+{%- else %}
+remote_rabbitmq_server_tcp_{{ network.fqdn }}:
+  command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_tcp -H {% if grains.ipv4[0] == '127.0.0.1' %}{{ grains.ipv4[1] }}{% else %}{{ grains.ipv4[0] }}{% endif %} -p 5672"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+{%- endif %}
+{#
+remote_rabbitmq_alive_{{ address }}:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-amqp-alive.rb -w {{ address }}"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_mistral_alive:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-amqp-alive.rb -w {{ address }} -v %2Fmistral -u mistral --password {{ server.admin.password }}"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_murano_alive:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-amqp-alive.rb -w {{ address }} -v %2Fmurano -u murano --password {{ server.admin.password }}"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_openstack_alive:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-amqp-alive.rb -w {{ address }} -v %2Fopenstack -u {{ server.admin.name }} --password {{ server.admin.password }}"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_compute:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter compute"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_scheduler:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter scheduler"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_engine:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter engine"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_console:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter console"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_cinder_volume:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter cinder-volume"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_conductor:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter conductor"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_overview_metrics:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-overview-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }}"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_contrail_device_manager:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --filter device_manager"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_contrail_vnc_config:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --filter vnc_config"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_metrics_openstack_reply:
+  command: "PATH=$PATH:/etc/sensu/plugins rabbitmq-queue-metrics.rb --host {{ address }} --user {{ server.admin.name }} --password {{ server.admin.password }} --filter reply"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_scheduler:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue scheduler"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_engine:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue engine"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_console:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue console"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_cinder_volume:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue cinder-volume"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_cinder_scheduler:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue cinder-scheduler"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_conductor:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue conductor"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+remote_rabbitmq_queue_compute:
+  command: "PATH=$PATH:/etc/sensu/plugins check-rabbitmq-queue.rb --host {{ address }} --password {{ server.admin.password }} --user {{ server.admin.name }} -w 50 -c 100 --queue compute"
+  interval: 60
+  occurrences: 1
+  subscribers:
+  - remote-network
+#}
\ No newline at end of file
diff --git a/rabbitmq/init.sls b/rabbitmq/init.sls
new file mode 100644
index 0000000..18903da
--- /dev/null
+++ b/rabbitmq/init.sls
@@ -0,0 +1,8 @@
+
+include:
+{% if pillar.rabbitmq.server is defined %}
+- rabbitmq.server
+{% endif %}
+{% if pillar.rabbitmq.cluster is defined %}
+- rabbitmq.cluster
+{% endif %}
diff --git a/rabbitmq/map.jinja b/rabbitmq/map.jinja
new file mode 100644
index 0000000..e55224d
--- /dev/null
+++ b/rabbitmq/map.jinja
@@ -0,0 +1,39 @@
+
+{% set server = salt['grains.filter_by']({
+    'Arch': {
+        'pkgs': ['rabbitmq'],
+        'service': 'rabbitmq',
+        'config_file': '/etc/rabbitmq/rabbitmq.config',
+        'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
+        'ulimit': 8192,
+        'bind': {
+            'address': '0.0.0.0',
+            'port': '5672'
+        },
+    },
+    'Debian': {
+        'pkgs': ['rabbitmq-server'],
+        'service': 'rabbitmq-server',
+        'config_file': '/etc/rabbitmq/rabbitmq.config',
+        'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
+        'default_file': '/etc/default/rabbitmq-server',
+        'ulimit': 8192,
+        'bind': {
+            'address': '0.0.0.0',
+            'port': '5672'
+        },
+    },
+    'RedHat': {
+        'pkgs': ['rabbitmq-server'],
+        'service': 'rabbitmq-server',
+        'config_file': '/etc/rabbitmq/rabbitmq.config',
+        'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
+        'ulimit': 8192,
+        'bind': {
+            'address': '0.0.0.0',
+            'port': '5672'
+        },
+    },
+}, merge=salt['pillar.get']('rabbitmq:server')) %}
+
+{% set cluster = salt['pillar.get']('rabbitmq:cluster') %}
diff --git a/rabbitmq/server/init.sls b/rabbitmq/server/init.sls
new file mode 100644
index 0000000..5467a3d
--- /dev/null
+++ b/rabbitmq/server/init.sls
@@ -0,0 +1,5 @@
+include:
+- rabbitmq.server.service
+- rabbitmq.server.plugin
+- rabbitmq.server.vhost
+- rabbitmq.server.user
\ No newline at end of file
diff --git a/rabbitmq/server/plugin.sls b/rabbitmq/server/plugin.sls
new file mode 100644
index 0000000..6b04cb2
--- /dev/null
+++ b/rabbitmq/server/plugin.sls
@@ -0,0 +1,17 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+include:
+- rabbitmq.server.service
+
+{%- for plugin in server.get('plugins', []) %}
+
+rabbitmq_plugin_{{ plugin }}:
+  rabbitmq_plugin.enabled:
+  - name: {{ plugin }}
+  - require:
+    - service: rabbitmq_service
+
+{%- endfor %}
+
+{%- endif %}
\ No newline at end of file
diff --git a/rabbitmq/server/service.sls b/rabbitmq/server/service.sls
new file mode 100644
index 0000000..4a0b058
--- /dev/null
+++ b/rabbitmq/server/service.sls
@@ -0,0 +1,98 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+rabbitmq_packages:
+  pkg.installed:
+  - names: {{ server.pkgs }}
+
+rabbitmq_config:
+  file.managed:
+  - name: {{ server.config_file }}
+  - source: salt://rabbitmq/files/rabbitmq.config
+  - template: jinja
+  - user: rabbitmq
+  - group: rabbitmq
+  - mode: 440
+  - require:
+    - pkg: rabbitmq_packages
+
+{%- if grains.os_family == 'Debian' %}
+
+rabbitmq_default_config:
+  file.managed:
+  - name: {{ server.default_file }}
+  - source: salt://rabbitmq/files/default
+  - template: jinja
+  - user: rabbitmq
+  - group: rabbitmq
+  - mode: 440
+  - require:
+    - pkg: rabbitmq_packages
+
+{%- endif %}
+
+{%- if server.secret_key is defined %}
+
+{%- if salt['cmd.run']('cat '+server.cookie_file) != server.secret_key %}
+
+sleep_before_rabbitmq_stop:
+  cmd.run:
+  - name: sleep 30
+  - user: root
+  - require:
+    - pkg: rabbitmq_packages
+    - file: rabbitmq_config
+{#    - cmd: enable_mgmt_plugin #}
+
+stop_rabbitmq_service:
+  cmd.run:
+  - name: /etc/init.d/rabbitmq-server stop
+  - require:
+    - cmd: sleep_before_rabbitmq_stop
+
+/var/lib/rabbitmq:
+  file.directory
+
+rabbitmq_cookie:
+  file.managed:
+  - name: {{ server.cookie_file }}
+  - contents: {{ server.secret_key }}
+  - user: rabbitmq
+  - group: rabbitmq
+  - mode: 400
+  - require:
+    - file: /var/lib/rabbitmq
+    - cmd: stop_rabbitmq_service
+
+{%- if grains.os_family == 'Arch' %}
+
+/root/.erlang.cookie:
+  file.managed:
+  - contents: {{ server.secret_key }}
+  - user: root
+  - group: root
+  - mode: 400
+
+{%- endif %}
+
+sleep_before_rabbitmq_start:
+  cmd.run:
+  - name: sleep 30
+  - user: root
+  - require:
+    - cmd: stop_rabbitmq_service
+  - watch_in:
+    - service: rabbitmq_service
+
+{%- endif %}
+
+{%- endif %}
+
+rabbitmq_service:
+  service.running:
+  - enable: true
+  - name: {{ server.service }}
+  - watch:
+    - file: rabbitmq_config
+
+{%- endif %}
diff --git a/rabbitmq/server/user.sls b/rabbitmq/server/user.sls
new file mode 100644
index 0000000..dcd05ba
--- /dev/null
+++ b/rabbitmq/server/user.sls
@@ -0,0 +1,27 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+include:
+- rabbitmq.server.service
+
+{%- if server.admin is defined %}
+
+rabbit_user_admin_present:
+  rabbitmq_user.present:
+  - name: {{ server.admin.name }}
+  - password: {{ server.admin.password }}
+  - force: True
+  - tags: management administrator
+  - perms:
+    {%- for vhost_name, vhost in server.get('host', {}).iteritems() %}
+    - '{{ vhost_name }}':
+      - '.*'
+      - '.*'
+      - '.*'
+    {%- endfor %}
+  - require:
+    - service: rabbitmq_service
+
+{%- endif %}
+
+{%- endif %}
\ No newline at end of file
diff --git a/rabbitmq/server/vhost.sls b/rabbitmq/server/vhost.sls
new file mode 100644
index 0000000..6e06ede
--- /dev/null
+++ b/rabbitmq/server/vhost.sls
@@ -0,0 +1,60 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+{%- for host_name, host in server.get('host', {}).iteritems() %}
+
+{%- if host.enabled %}
+
+{%- if host_name != '/' %}
+rabbitmq_vhost_{{ host_name }}:
+  rabbitmq_vhost.present:
+  - name: {{ host_name }}
+  - require:
+    - service: rabbitmq_service
+  - require_in:
+    - rabbitmq_user: rabbitmq_user_{{ host.user }}
+{%- endif %}
+
+rabbitmq_user_{{ host.user }}:
+  rabbitmq_user.present:
+  - name: {{ host.user }}
+  - password: {{ host.password }}
+  - force: true
+  - perms:
+    - '{{ host_name }}':
+      - '.*'
+      - '.*'
+      - '.*'
+
+{%- for policy in host.get('policies', []) %}
+
+rabbitmq_policy_{{ host_name }}_{{ policy.name }}:
+  rabbitmq_policy.present:
+  - name: {{ policy.name }}
+  - pattern: {{ policy.pattern }}
+  - definition: {{ policy.definition|json }}
+  - vhost: {{ host_name }}
+  - require:
+    - service: rabbitmq_service
+
+{%- endfor %}
+
+{%- else %}
+
+rabbitmq_vhost_{{ host_name }}:
+  rabbitmq_vhost.absent:
+  - name: {{ host_name }}
+  - require:
+    - service: rabbitmq_service
+
+rabbitmq_user_{{ host.user }}:
+  rabbitmq_user.absent:
+  - name: {{ host.user }}
+  - require:
+    - service: rabbitmq_service
+
+{%- endif %}
+
+{%- endfor %}
+
+{%- endif %}