diff options
Diffstat (limited to 'hooks')
| -rwxr-xr-x | hooks/hooks.py | 85 | 
1 files changed, 65 insertions, 20 deletions
| 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): | 
