diff options
author | Thomas Cuthbert <thomas.cuthbert@canonical.com> | 2018-07-09 09:26:52 +0000 |
---|---|---|
committer | Canonial IS Mergebot <canonical-is-mergebot@canonical.com> | 2018-07-09 09:26:52 +0000 |
commit | 7e6f2361252055c19e8f70752d071eecc17e468e (patch) | |
tree | ba07295068a3f862569153e66f94ce5338cd2a7e | |
parent | 8faa36725b36c34ca625ea88391420083b3a2934 (diff) | |
parent | 76df3b0c81cb9c8e3de0ce09898c70c89f2c2d93 (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.yaml | 4 | ||||
-rwxr-xr-x | hooks/hooks.py | 85 |
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): |