summaryrefslogtreecommitdiff
diff options
authorThomas Cuthbert <thomas.cuthbert@canonical.com>2018-07-09 09:26:52 +0000
committerCanonial IS Mergebot <canonical-is-mergebot@canonical.com>2018-07-09 09:26:52 +0000
commit7e6f2361252055c19e8f70752d071eecc17e468e (patch)
treeba07295068a3f862569153e66f94ce5338cd2a7e
parent8faa36725b36c34ca625ea88391420083b3a2934 (diff)
parent76df3b0c81cb9c8e3de0ce09898c70c89f2c2d93 (diff)
Initial implementation of bionic support
Reviewed-on: https://code.launchpad.net/~tcuthbert/mongodb-charm/+git/mongodb-charm/+merge/349115 Reviewed-by: Stuart Bishop <stuart.bishop@canonical.com>
-rw-r--r--config.yaml4
-rwxr-xr-xhooks/hooks.py85
2 files changed, 67 insertions, 22 deletions
diff --git a/config.yaml b/config.yaml
index cbaf414..f06d870 100644
--- a/config.yaml
+++ b/config.yaml
@@ -58,7 +58,7 @@ options:
diaglog:
default: 0
type: int
- description: Set oplogging level where n is 0=off (default), 1=W, 2=R, 3=both, 7=W+some reads
+ description: DEPRECATED Set oplogging level where n is 0=off (default), 1=W, 2=R, 3=both, 7=W+some reads
nocursors:
default: False
type: boolean
@@ -114,7 +114,7 @@ options:
web_admin_ui:
default: True
type: boolean
- description: Replica Set Admin UI (accessible via default_port + 1000)
+ description: DEPRECATED Replica Set Admin UI (accessible via default_port + 1000)
replicaset_master:
default: auto
type: string
diff --git a/hooks/hooks.py b/hooks/hooks.py
index 9de334d..a458e99 100755
--- a/hooks/hooks.py
+++ b/hooks/hooks.py
@@ -6,8 +6,10 @@ Created on Aug 1, 2012
'''
import commands
+import distutils
import json
import os
+import platform
import pprint
import re
import signal
@@ -88,6 +90,7 @@ hooks = Hooks()
###############################################################################
default_mongodb_config = "/etc/mongodb.conf"
default_mongodb_init_config = "/etc/init/mongodb.conf"
+mongodb_env_config = "/etc/default/mongodb"
default_mongos_list = "/etc/mongos.list"
default_wait_for = 3
default_max_tries = 7
@@ -122,6 +125,12 @@ was_i_primary = False
###############################################################################
+def is_bionic_or_greater():
+ current_version = platform.linux_distribution()[1]
+ if distutils.version.LooseVersion(current_version) >= distutils.version.LooseVersion('18.04'):
+ return True
+
+
def port_check(host=None, port=None, protocol='TCP'):
if host is None or port is None:
juju_log("port_check: host and port must be defined.")
@@ -302,9 +311,14 @@ def mongodb_conf(config_data=None):
config.append("quota = true")
config.append("")
- # diaglog
- config.append("diaglog = %d" % config_data['diaglog'])
- config.append("")
+ if not is_bionic_or_greater():
+ # diaglog
+ config.append("diaglog = %d" % config_data['diaglog'])
+ config.append("")
+ # nohttpinterface
+ if config_data['web_admin_ui']:
+ config.append("rest = true")
+ config.append("")
# nocursors
if config_data['nocursors']:
@@ -316,11 +330,6 @@ def mongodb_conf(config_data=None):
config.append("nohints = true")
config.append("")
- # nohttpinterface
- if config_data['web_admin_ui']:
- config.append("rest = true")
- config.append("")
-
# noscripting
if config_data['noscripting']:
config.append("noscripting = true")
@@ -537,7 +546,7 @@ def join_replset(master_node=None, host=None):
if master_node is None or host is None:
retVal = False
else:
- retVal = mongo_client_smart('localhost', 'rs.add("%s")' % host)
+ retVal = rs_add(host)
juju_log("join_replset returns: %s" % retVal, level=DEBUG)
return(retVal)
@@ -618,18 +627,27 @@ def remove_rest_from_upstart():
def update_daemon_options(daemon_options=None):
- mongodb_init_config = open(default_mongodb_init_config).read()
- pat_replace = []
- if daemon_options is None or daemon_options == "none":
- pat_replace.append(
- (' --config /etc/mongodb.conf.*',
- ' --config /etc/mongodb.conf; fi'))
+ if is_bionic_or_greater():
+ if daemon_options and daemon_options != "none":
+ daemon_opts = 'DAEMON_OPTS="{0}"\n'.format(daemon_options)
+ return(update_file(mongodb_env_config, daemon_opts))
+ else:
+ if os.path.exists(mongodb_env_config):
+ os.remove(mongodb_env_config)
+ return True
else:
- pat_replace.append(
- (' --config /etc/mongodb.conf.*',
- ' --config /etc/mongodb.conf %s; fi' % daemon_options))
- regex_sub(pat_replace, mongodb_init_config)
- return(update_file(default_mongodb_init_config, mongodb_init_config))
+ mongodb_init_config = open(default_mongodb_init_config).read()
+ pat_replace = []
+ if daemon_options is None or daemon_options == "none":
+ pat_replace.append(
+ (' --config /etc/mongodb.conf.*',
+ ' --config /etc/mongodb.conf; fi'))
+ else:
+ pat_replace.append(
+ (' --config /etc/mongodb.conf.*',
+ ' --config /etc/mongodb.conf %s; fi' % daemon_options))
+ regex_sub(pat_replace, mongodb_init_config)
+ return(update_file(default_mongodb_init_config, mongodb_init_config))
def enable_arbiter(master_node=None, host=None):
@@ -1169,6 +1187,33 @@ def replica_set_relation_joined():
juju_log("replica_set_relation_joined-finish")
+def rs_add(host):
+ if not is_bionic_or_greater():
+ return mongo_client_smart('localhost', 'rs.add("%s")' % host)
+
+ command = 'rs.add("%s")' % host
+ if host is None:
+ raise ValueError("missing host")
+ else:
+ cmd_line = ['mongo', '--quiet', '--host', "localhost",
+ '--eval', 'printjson(%s)' % command]
+ juju_log("Executing: %s" % cmd_line, level=DEBUG)
+ run(cmd_line)
+
+ for i in xrange(MONGO_CLIENT_RETRIES):
+ c = MongoClient('localhost')
+ cmd_output = subprocess.check_output(cmd_line)
+ r = run_admin_command(c, 'replSetGetStatus')
+ members = r["members"]
+ ok = [m for m in members if m['name'] == host and m['state'] == MONGO_SECONDARY]
+ if ok:
+ return ok
+
+ time.sleep(1.5)
+
+ return False
+
+
def am_i_primary():
c = MongoClient('localhost')
for i in xrange(10):