File 0004-handle-repeating-mysqld-options-containing-equals.patch of Package openstack-trove
Index: trove-2014.1.1.dev10.gf103b49/trove/guestagent/datastore/mysql/service.py
===================================================================
--- trove-2014.1.1.dev10.gf103b49.orig/trove/guestagent/datastore/mysql/service.py
+++ trove-2014.1.1.dev10.gf103b49/trove/guestagent/datastore/mysql/service.py
@@ -19,6 +19,7 @@
import os
import re
import uuid
+from collections import defaultdict
from datetime import date
import sqlalchemy
from sqlalchemy import exc
@@ -138,13 +139,13 @@ def load_mysqld_options():
out, err = utils.execute(mysqld_bin, "--print-defaults",
run_as_root=True, root_helper="sudo")
arglist = re.split("\n", out)[1].split()
- args = {}
+ args = defaultdict(list)
for item in arglist:
if "=" in item:
- key, value = item.split("=")
- args[key.lstrip("--")] = value
+ key, value = item.split("=", 1)
+ args[key.lstrip("--")].append(value)
else:
- args[item.lstrip("--")] = None
+ args[item.lstrip("--")].append(None)
return args
except exception.ProcessExecutionError:
return {}
@@ -178,7 +179,7 @@ class MySqlAppStatus(service.BaseDbStatu
except exception.ProcessExecutionError:
mysql_args = load_mysqld_options()
pid_file = mysql_args.get('pid_file',
- '/var/run/mysqld/mysqld.pid')
+ ['/var/run/mysqld/mysqld.pid'])[0]
if os.path.exists(pid_file):
LOG.info("Service Status is CRASHED.")
return rd_instance.ServiceStatuses.CRASHED
Index: trove-2014.1.1.dev10.gf103b49/trove/tests/unittests/guestagent/test_dbaas.py
===================================================================
--- trove-2014.1.1.dev10.gf103b49.orig/trove/tests/unittests/guestagent/test_dbaas.py
+++ trove-2014.1.1.dev10.gf103b49/trove/tests/unittests/guestagent/test_dbaas.py
@@ -125,12 +125,26 @@ class DbaasTest(testtools.TestCase):
options = dbaas.load_mysqld_options()
self.assertEqual(5, len(options))
- self.assertEqual(options["user"], "mysql")
- self.assertEqual(options["port"], "3306")
- self.assertEqual(options["basedir"], "/usr")
- self.assertEqual(options["tmpdir"], "/tmp")
+ self.assertEqual(options["user"], ["mysql"])
+ self.assertEqual(options["port"], ["3306"])
+ self.assertEqual(options["basedir"], ["/usr"])
+ self.assertEqual(options["tmpdir"], ["/tmp"])
self.assertTrue("skip-external-locking" in options)
+ def test_load_mysqld_options_contains_plugin_loads_options(self):
+ output = ("mysqld would've been started with the these args:\n"
+ "--plugin-load=blackhole=ha_blackhole.so "
+ "--plugin-load=federated=ha_federated.so")
+
+ with patch.object(os.path, 'isfile', return_value=True):
+ dbaas.utils.execute = Mock(return_value=(output, None))
+ options = dbaas.load_mysqld_options()
+
+ self.assertEqual(1, len(options))
+ self.assertEqual(options["plugin-load"],
+ ["blackhole=ha_blackhole.so",
+ "federated=ha_federated.so"])
+
def test_load_mysqld_options_error(self):
dbaas.utils.execute = Mock(side_effect=ProcessExecutionError())
@@ -1168,7 +1182,7 @@ class MySqlAppStatusTest(testtools.TestC
mocked = Mock(side_effect=ProcessExecutionError())
dbaas.utils.execute_with_timeout = mocked
- dbaas.load_mysqld_options = Mock()
+ dbaas.load_mysqld_options = Mock(return_value={})
dbaas.os.path.exists = Mock(return_value=False)
self.mySqlAppStatus = MySqlAppStatus()