Initial commit
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644
index 0000000..009c3e5
--- /dev/null
+++ b/CHANGELOG.rst
@@ -0,0 +1,6 @@
+mongodb 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..33fc124
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+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.
+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.
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..bf44925
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,121 @@
+=======
+MongoDB
+=======
+
+MongoDB (from "humongous") is an open-source document database, and the leading NoSQL database. Written in C++.
+
+Available states
+================
+
+.. contents::
+ :local:
+
+``mongodb.server``
+--------------------
+
+Setup MongoDB server
+
+Available metadata
+==================
+
+.. contents::
+ :local:
+
+``metadata.mongodb.server.single``
+----------------------------------
+
+Single-node MongoDB setup
+
+``metadata.mongodb.server.cluster``
+-----------------------------------
+
+Clustered MongoDB setup
+
+Configuration parameters
+========================
+
+
+Example reclass
+===============
+
+Setup MongoDB with database for ceilometer.
+
+.. code-block:: yaml
+
+ classes:
+ - service.mongodb.server.cluster
+ parameters:
+ _param:
+ mongodb_server_replica_set: ceilometer
+ mongodb_ceilometer_password: cloudlab
+ mongodb_admin_password: cloudlab
+ mongodb_shared_key: xxx
+ mongodb:
+ server:
+ database:
+ ceilometer:
+ enabled: true
+ password: ${_param:mongodb_ceilometer_password}
+ users:
+ - name: ceilometer
+ password: ${_param:mongodb_ceilometer_password}
+
+Sample pillars
+==============
+
+Simple single server
+
+.. code-block:: yaml
+
+ mongodb:
+ server:
+ enabled: true
+ bind:
+ address: 0.0.0.0
+ port: 27017
+ admin:
+ username: admin
+ password: magicunicorn
+ database:
+ dbname:
+ enabled: true
+ encoding: 'utf8'
+ users:
+ - name: 'username'
+ password: 'password'
+
+Cluster of 3 nodes
+
+.. code-block:: yaml
+
+ mongodb:
+ server:
+ enabled: true
+ admin:
+ user: admin
+ password: magicunicorn
+ master: mongo01
+ members:
+ - host: 192.168.1.11
+ priority: 2
+ - host: 192.168.1.12
+ - host: 192.168.1.13
+ replica_set: default
+ shared_key: magicunicorn
+
+It's possible that first Salt run on master node won't pass correctly before
+all slave nodes are up and ready.
+Simply run salt again on master node to setup cluster, databases and users.
+
+To check cluster status, execute following:
+
+.. code-block:: bash
+
+ mongo 127.0.0.1:27017/admin -u admin -p magicunicorn --eval "rs.status()"
+
+Read more
+=========
+
+* http://docs.mongodb.org/manual/
+* http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
+* https://www.linode.com/docs/databases/mongodb/creating-a-mongodb-replication-set-on-ubuntu-12-04-precise
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..7a8de51
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,11 @@
+salt-formula-mongodb (0.2) trusty; urgency=medium
+
+ * First public release
+
+ -- Filip Pytloun <filip.pytloun@tcpcloud.eu> Tue, 06 Oct 2015 16:38:47 +0200
+
+salt-formula-mongodb (0.1) trusty; urgency=medium
+
+ * Initial release
+
+ -- Filip Pytloun <filip.pytloun@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..2f9bae6
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,15 @@
+Source: salt-formula-mongodb
+Maintainer: Filip Pytloun <filip.pytloun@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-mongodb
+Vcs-Git: https://github.com/tcpcloud/salt-formula-mongodb.git
+
+Package: salt-formula-mongodb
+Architecture: all
+Depends: ${misc:Depends}, salt-master, reclass
+Description: MongoDB Salt formula
+ Install and configure MongoDB server.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..add93b7
--- /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-mongodb
+Upstream-Contact: Filip Pytloun <filip.pytloun@tcpcloud.eu>
+Source: https://github.com/tcpcloud/salt-formula-mongodb
+
+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..1ed8ec5
--- /dev/null
+++ b/debian/install
@@ -0,0 +1,2 @@
+mongodb/* /usr/share/salt-formulas/env/mongodb/
+metadata/service/* /usr/share/salt-formulas/reclass/service/mongodb/
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..8ceb95b
--- /dev/null
+++ b/metadata/service/server/cluster.yml
@@ -0,0 +1,19 @@
+applications:
+- mongodb
+parameters:
+ _param:
+ mongodb_server_replica_set: default
+ mongodb:
+ server:
+ enabled: true
+ admin:
+ user: admin
+ password: ${_param:mongodb_admin_password}
+ bind:
+ address: 0.0.0.0
+ port: 27017
+ replica_set: ${_param:mongodb_server_replica_set}
+ shared_key: ${_param:mongodb_shared_key}
+ members: ${_param:mongodb_server_members}
+ master: ${_param:mongodb_master}
+
diff --git a/metadata/service/server/single.yml b/metadata/service/server/single.yml
new file mode 100644
index 0000000..4a9b916
--- /dev/null
+++ b/metadata/service/server/single.yml
@@ -0,0 +1,15 @@
+applications:
+- mongodb
+parameters:
+ mongodb:
+ server:
+ enabled: true
+ admin:
+ user: admin
+ password: ${_param:mongodb_admin_password}
+ bind:
+ address: 0.0.0.0
+ port: 27017
+ shard_service: False
+ config_service: False
+ shared_key: ${_param:mongodb_shared_key}
diff --git a/mongodb/files/cluster.js b/mongodb/files/cluster.js
new file mode 100644
index 0000000..0da24ca
--- /dev/null
+++ b/mongodb/files/cluster.js
@@ -0,0 +1,16 @@
+{%- from "mongodb/map.jinja" import server with context %}
+rs.initiate({
+ "_id": "{{ server.replica_set }}",
+ "members": [
+ {%- for member in server.members %}
+ {
+ "_id": {{ loop.index0 }},
+ {%- if member.priority is defined %}
+ "priority": {{ member.priority }},
+ {%- endif %}
+ "host": "{{ member.host }}"
+ }{% if not loop.last %},{% endif %}
+ {%- endfor %}
+ ]
+});
+rs.conf();
diff --git a/mongodb/files/mongodb.conf b/mongodb/files/mongodb.conf
new file mode 100644
index 0000000..58924e2
--- /dev/null
+++ b/mongodb/files/mongodb.conf
@@ -0,0 +1,113 @@
+{%- from "mongodb/map.jinja" import server with context %}
+
+# mongodb.conf
+
+# Where to store the data.
+dbpath=/var/lib/mongodb
+
+#where to log
+logpath=/var/log/mongodb/mongodb.log
+
+logappend=true
+
+bind_ip = {{ server.bind.address }}
+#port = 27017
+
+# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
+journal=true
+
+# Enables periodic logging of CPU utilization and I/O wait
+#cpu = true
+
+keyFile = /etc/mongodb.key
+
+{%- if server.replica_set is defined %}
+replSet = {{ server.replica_set }}
+{%- endif %}
+
+# Turn on/off security. Off is currently the default
+#noauth = true
+auth = true
+
+# Verbose logging output.
+verbose = true
+
+# Inspect all client data for validity on receipt (useful for
+# developing drivers)
+#objcheck = true
+
+# Enable db quota management
+#quota = true
+
+setParameter = logLevel=1
+
+#OpenStack guide for Juno
+smallfiles = true
+
+# Set oplogging level where n is
+# 0=off (default)
+# 1=W
+# 2=R
+# 3=both
+# 7=W+some reads
+#oplog = 0
+
+# Diagnostic/debugging option
+#nocursors = true
+
+# Ignore query hints
+#nohints = true
+
+# Disable the HTTP interface (Defaults to localhost:27018).
+#nohttpinterface = true
+
+# Turns off server-side scripting. This will result in greatly limited
+# functionality
+#noscripting = true
+
+# Turns off table scans. Any query that would do a table scan fails.
+#notablescan = true
+
+# Disable data file preallocation.
+#noprealloc = true
+
+# Specify .ns file size for new databases.
+# nssize = <size>
+
+# Accout token for Mongo monitoring server.
+#mms-token = <token>
+
+# Server name for Mongo monitoring server.
+#mms-name = <server-name>
+
+# Ping interval for Mongo monitoring server.
+#mms-interval = <seconds>
+
+# Replication Options
+
+# in replicated mongo databases, specify here whether this is a slave or master
+#slave = true
+#source = master.example.com
+# Slave only: specify a single database to replicate
+#only = master.example.com
+# or
+#master = true
+#source = slave.example.com
+
+# Address of a server to pair with.
+#pairwith = <server:port>
+# Address of arbiter server.
+#arbiter = <server:port>
+# Automatically resync if slave data is stale
+#autoresync
+# Custom size for replication operation log.
+#oplogSize = <MB>
+# Size limit for in-memory storage of op ids.
+#opIdMem = <bytes>
+
+# SSL options
+# Enable SSL on normal ports
+#sslOnNormalPorts = true
+# SSL Key file and password
+#sslPEMKeyFile = /etc/ssl/mongodb.pem
+#sslPEMKeyPassword = pass
diff --git a/mongodb/files/user.js b/mongodb/files/user.js
new file mode 100644
index 0000000..d5d783d
--- /dev/null
+++ b/mongodb/files/user.js
@@ -0,0 +1,3 @@
+{%- from "mongodb/map.jinja" import server with context -%}
+db.addUser("admin","{{ server.admin.password }}")
+db.auth("admin","{{ server.admin.password }}")
diff --git a/mongodb/files/user_role.js b/mongodb/files/user_role.js
new file mode 100644
index 0000000..d3d8d8f
--- /dev/null
+++ b/mongodb/files/user_role.js
@@ -0,0 +1,3 @@
+{%- from "mongodb/map.jinja" import server with context -%}
+db = db.getSiblingDB("{{ database_name }}");
+db.addUser({user: "{{ database_name }}", pwd: "{{ pillar.ceilometer.server.database.password }}",roles: [ "readWrite", "dbAdmin" ]});
diff --git a/mongodb/init.sls b/mongodb/init.sls
new file mode 100644
index 0000000..44eb0da
--- /dev/null
+++ b/mongodb/init.sls
@@ -0,0 +1,4 @@
+{%- if pillar.mongodb is defined %}
+include:
+ - mongodb.server
+{%- endif %}
\ No newline at end of file
diff --git a/mongodb/map.jinja b/mongodb/map.jinja
new file mode 100644
index 0000000..63f3705
--- /dev/null
+++ b/mongodb/map.jinja
@@ -0,0 +1,30 @@
+{% set server = salt['grains.filter_by']({
+ 'Debian': {
+ 'pkgs': ['mongodb-server', 'mongodb', 'python-pymongo', 'mongodb-clients'],
+ 'service': 'mongodb',
+ 'lock_dir': "/var/lock/mongodb",
+ 'bind': {
+ 'address': '0.0.0.0',
+ 'port': 27017
+ },
+ 'config_service': False,
+ 'shard_service': True,
+ 'admin': {
+ 'username': 'root'
+ }
+ },
+ 'RedHat': {
+ 'pkgs': ['mongodb-server', 'mongodb', 'python-pymongo', 'mongodb-clients'],
+ 'service': 'mongod',
+ 'lock_dir': "/var/lock/mongodb",
+ 'bind': {
+ 'address': '0.0.0.0',
+ 'port': 27017
+ },
+ 'config_service': False,
+ 'shard_service': True,
+ 'admin': {
+ 'username': 'root'
+ }
+ },
+}, merge=salt['pillar.get']('mongodb:server')) %}
diff --git a/mongodb/server.sls b/mongodb/server.sls
new file mode 100644
index 0000000..6f33eed
--- /dev/null
+++ b/mongodb/server.sls
@@ -0,0 +1,116 @@
+{%- from "mongodb/map.jinja" import server with context %}
+{%- if server.enabled %}
+
+mongodb_packages:
+ pkg.installed:
+ - names: {{ server.pkgs }}
+
+/etc/mongodb.conf:
+ file.managed:
+ - source: salt://mongodb/files/mongodb.conf
+ - template: jinja
+ - require:
+ - pkg: mongodb_packages
+
+{%- if server.shared_key is defined %}
+
+/etc/mongodb.key:
+ file.managed:
+ - contents_pillar: mongodb:server:shared_key
+ - mode: 600
+ - user: mongodb
+ - require:
+ - pkg: mongodb_packages
+ - watch_in:
+ - service: mongodb_service
+
+{%- endif %}
+
+{{ server.lock_dir }}:
+ file.directory:
+ - makedirs: true
+
+mongodb_service:
+ service.running:
+ - name: {{ server.service }}
+ - enable: true
+ - require:
+ - file: {{ server.lock_dir }}
+ - pkg: mongodb_packages
+ - watch:
+ - file: /etc/mongodb.conf
+
+{%- if server.members is not defined or server.master == pillar.linux.system.name %}
+{# We are not a cluster or we are master #}
+
+/var/tmp/mongodb_user.js:
+ file.managed:
+ - source: salt://mongodb/files/user.js
+ - template: jinja
+ - mode: 600
+ - user: root
+
+mongodb_change_root_password:
+ cmd.run:
+ - name: 'mongo localhost:27017/admin /var/tmp/mongodb_user.js && touch {{ server.lock_dir }}/mongodb_password_changed'
+ - require:
+ - file: /var/tmp/mongodb_user.js
+ - service: mongodb_service
+ - creates: {{ server.lock_dir }}/mongodb_password_changed
+
+{%- for database_name, database in server.get('database', {}).iteritems() %}
+
+mongodb_database_{{ database_name }}:
+ mongodb_user.present:
+ - name: {{ database_name }}
+ - passwd: {{ database.password }}
+ {%- if server.members is defined %}
+ require:
+ - cmd: mongodb_setup_cluster
+ {%- endif %}
+
+/var/tmp/mongodb_user_{{ database_name }}.js:
+ file.managed:
+ - source: salt://mongodb/files/user_role.js
+ - template: jinja
+ - mode: 600
+ - user: root
+ - require:
+ - mongodb_user: {{ database_name }}
+ - defaults:
+ database_name: {{ database_name }}
+
+mongodb_{{ database_name }}_fix_role:
+ cmd.run:
+ - name: 'mongo localhost:27017/admin -u admin -p {{ server.admin.password }} /var/tmp/mongodb_user_{{ database_name }}.js && touch {{ server.lock_dir }}/mongodb_user_{{ database_name }}_created'
+ - require:
+ - file: /var/tmp/mongodb_user_{{ database_name }}.js
+ - service: mongodb_service
+ - creates: {{ server.lock_dir }}/mongodb_user_{{ database_name }}_created
+
+{%- endfor %}
+
+{%- if server.members is defined %}
+
+/var/tmp/mongodb_cluster.js:
+ file.managed:
+ - source: salt://mongodb/files/cluster.js
+ - template: jinja
+ - mode: 600
+ - user: root
+
+mongodb_setup_cluster:
+ cmd.run:
+ - name: 'mongo localhost:27017/admin /var/tmp/mongodb_cluster.js && mongo localhost:27017/admin --quiet --eval "rs.conf()" | grep object -q'
+ - unless: 'mongo localhost:27017/admin -u admin -p {{ server.admin.password }} --quiet --eval "rs.conf()" | grep object -q'
+ - require:
+ - service: mongodb_service
+ - file: /var/tmp/mongodb_cluster.js
+ - require_in:
+ - cmd: mongodb_change_root_password
+
+{%- endif %}
+
+{%- endif %}
+
+{%- endif %}