summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2014-06-19 00:02:54 -0700
committerelijah <elijah@riseup.net>2014-06-25 18:17:11 -0700
commitdb669a6911c55d9a5675fb4b42f4de5728f34c76 (patch)
tree9a35b56f81fe845368528795b8c66a38d8bf5c0b
parentedf1306a418203df297d034544d51f5cdcd053c7 (diff)
couchdb: generate hiera files suitable for plain couchdb + read-only mirrors
-rw-r--r--platform.rb2
-rw-r--r--provider_base/services/_couchdb_master.json8
-rw-r--r--provider_base/services/_couchdb_mirror.json16
-rw-r--r--provider_base/services/_couchdb_multimaster.json20
-rw-r--r--provider_base/services/couchdb.json17
-rw-r--r--provider_base/services/couchdb.rb18
6 files changed, 67 insertions, 14 deletions
diff --git a/platform.rb b/platform.rb
index cd0cbde0..ac79df65 100644
--- a/platform.rb
+++ b/platform.rb
@@ -5,7 +5,7 @@
Leap::Platform.define do
self.version = "0.5.2"
- self.compatible_cli = "1.5.5".."1.99"
+ self.compatible_cli = "1.5.7".."1.99"
#
# the facter facts that should be gathered
diff --git a/provider_base/services/_couchdb_master.json b/provider_base/services/_couchdb_master.json
new file mode 100644
index 00000000..20c6f99b
--- /dev/null
+++ b/provider_base/services/_couchdb_master.json
@@ -0,0 +1,8 @@
+//
+// Applied to master couchdb node when there is a single master
+//
+{
+ "couch": {
+ "mode": "master"
+ }
+} \ No newline at end of file
diff --git a/provider_base/services/_couchdb_mirror.json b/provider_base/services/_couchdb_mirror.json
new file mode 100644
index 00000000..67004c70
--- /dev/null
+++ b/provider_base/services/_couchdb_mirror.json
@@ -0,0 +1,16 @@
+//
+// Applied to all non-master couchdb nodes
+//
+{
+ "stunnel": {
+ "couch_client": "= stunnel_client(nodes[couch.replication.masters.keys], couch.port)"
+ },
+ "couch": {
+ "mode": "mirror",
+ "replication": {
+ // for now, pick the first close one, or the first one.
+ // in the future, maybe use haproxy to balance among all the masters
+ "masters": "= try{pick_node(:couch_master,nodes_near_me['services' => 'couchdb']['couch.master' => true]).pick_fields('domain.internal')} || try{pick_node(:couch_master,nodes_like_me['services' => 'couchdb']['couch.master' => true]).pick_fields('domain.internal')}"
+ }
+ }
+} \ No newline at end of file
diff --git a/provider_base/services/_couchdb_multimaster.json b/provider_base/services/_couchdb_multimaster.json
new file mode 100644
index 00000000..ff133b9c
--- /dev/null
+++ b/provider_base/services/_couchdb_multimaster.json
@@ -0,0 +1,20 @@
+//
+// Only applied to master couchdb nodes when there are multiple masters
+//
+{
+ "stunnel": {
+ "epmd_server": "= stunnel_server(couch.bigcouch.epmd_port)",
+ "epmd_clients": "= stunnel_client(nodes_like_me[:services => :couchdb], couch.bigcouch.epmd_port)",
+ "ednp_server": "= stunnel_server(couch.bigcouch.ednp_port)",
+ "ednp_clients": "= stunnel_client(nodes_like_me[:services => :couchdb], couch.bigcouch.ednp_port)"
+ },
+ "couch": {
+ "mode": "multimaster",
+ "bigcouch": {
+ "epmd_port": 4369,
+ "ednp_port": 9002,
+ "cookie": "= secret :bigcouch_cookie",
+ "neighbors": "= nodes_like_me['services' => 'couchdb']['couch.master' => true].exclude(self).field('domain.full')"
+ }
+ }
+}
diff --git a/provider_base/services/couchdb.json b/provider_base/services/couchdb.json
index 5f1b5381..d75fd8de 100644
--- a/provider_base/services/couchdb.json
+++ b/provider_base/services/couchdb.json
@@ -3,20 +3,11 @@
"use": true
},
"stunnel": {
- "couch_server": "= stunnel_server(couch.port)",
- "epmd_server": "= stunnel_server(couch.bigcouch.epmd_port)",
- "epmd_clients": "= stunnel_client(nodes_like_me[:services => :couchdb], global.services[:couchdb].couch.bigcouch.epmd_port)",
- "ednp_server": "= stunnel_server(couch.bigcouch.ednp_port)",
- "ednp_clients": "= stunnel_client(nodes_like_me[:services => :couchdb], global.services[:couchdb].couch.bigcouch.ednp_port)"
+ "couch_server": "= stunnel_server(couch.port)"
},
"couch": {
+ "master": false,
"port": 5984,
- "bigcouch": {
- "epmd_port": 4369,
- "ednp_port": 9002,
- "cookie": "= secret :bigcouch_cookie",
- "neighbors": "= nodes_like_me[:services => :couchdb].exclude(self).field('domain.full')"
- },
"users": {
"admin": {
"username": "admin",
@@ -49,8 +40,8 @@
"salt": "= hex_secret :couch_webapp_password_salt, 128"
}
},
- "webapp": {
- "nagios_test_pw": "= secret :nagios_test_password"
+ "webapp": {
+ "nagios_test_pw": "= secret :nagios_test_password"
}
}
}
diff --git a/provider_base/services/couchdb.rb b/provider_base/services/couchdb.rb
new file mode 100644
index 00000000..c8f5d8a7
--- /dev/null
+++ b/provider_base/services/couchdb.rb
@@ -0,0 +1,18 @@
+#
+# custom logic for couchdb json resolution
+#
+
+unless nodes_like_me['services' => 'couchdb']['couch.master' => true].any?
+ raise 'node `%s`, environment `%s`: there must be at least one node with couch.master set to `true` for this environment.' % [@node.name, @node.environment]
+end
+
+if couch.master
+ if nodes_like_me['services' => 'couchdb']['couch.master' => true].size > 1
+ apply_partial 'services/_couchdb_multimaster.json'
+ else
+ apply_partial 'services/_couchdb_master.json'
+ end
+else
+ apply_partial 'services/_couchdb_mirror.json'
+end
+