37
'percona-xtradb-cluster-server-5.5',
38
'percona-xtradb-cluster-client-5.5',
40
# NOTE: python-mysqldb is installed by charmhelpers.contrib.database.mysql so
41
# hence why we import here
41
46
KEY = "keys/repo.percona.com"
42
47
REPO = """deb http://repo.percona.com/apt {release} main
46
51
HOSTS_FILE = '/etc/hosts'
54
def determine_packages():
55
if lsb_release()['DISTRIB_CODENAME'] > 'utopic':
56
# NOTE(beisner): pxc 5.6 client package is not available
57
# in Vivid, install mysql 5.6 client instead per
58
# https://launchpad.net/bugs/1476845.
60
'percona-xtradb-cluster-server-5.6',
65
'percona-xtradb-cluster-server-5.5',
66
'percona-xtradb-cluster-client-5.5',
50
71
''' Check whether service unit is already seeded '''
51
72
return os.path.exists(SEEDED_MARKER)
90
111
return answers[0].address
114
def is_sufficient_peers():
115
"""If min-cluster-size has been provided, check that we have sufficient
116
number of peers to proceed with bootstrapping percona cluster.
118
min_size = config('min-cluster-size')
121
for rid in relation_ids('cluster'):
122
size = len(related_units(rid))
127
log("Insufficient number of units to configure percona cluster "
128
"(expected=%s, got=%s)" % (min_size, size), level=INFO)
131
log("Sufficient units available to configure percona cluster "
132
"(>=%s)" % (min_size), level=DEBUG)
93
137
def get_cluster_hosts():
95
139
hostname = get_host_ip()
247
291
shutil.copy(src_file, dest_file)
249
293
log("'%s' already exists, skipping" % dest_file, level='INFO')
296
def get_wsrep_value(key):
297
m_helper = get_db_helper()
299
m_helper.connect(password=m_helper.get_mysql_root_password())
300
except OperationalError:
301
log("Could not connect to db", DEBUG)
304
cursor = m_helper.connection.cursor()
307
cursor.execute("show status like '%s'" % (key))
308
ret = cursor.fetchall()
310
log("Failed to get '%s'", ERROR)
321
def is_bootstrapped():
322
if not is_sufficient_peers():
326
rids = relation_ids('cluster') or []
328
units = related_units(rid)
329
units.append(local_unit())
331
id = relation_get('bootstrap-uuid', unit=unit, rid=rid)
336
if len(set(uuids)) > 1:
337
log("Found inconsistent bootstrap uuids - %s" % (uuids), WARNING)
344
def notify_bootstrapped(cluster_rid=None, cluster_uuid=None):
348
rids = relation_ids('cluster')
350
log("No relation ids found for 'cluster'", level=INFO)
354
cluster_uuid = get_wsrep_value('wsrep_cluster_state_uuid')
356
cluster_uuid = str(uuid.uuid4())
357
log("Could not determine cluster uuid so using '%s' instead" %
358
(cluster_uuid), INFO)
360
log("Notifying peers that percona is bootstrapped (uuid=%s)" %
361
(cluster_uuid), DEBUG)
363
relation_set(relation_id=rid, **{'bootstrap-uuid': cluster_uuid})