67
67
options={}. This will allow for reduced code needed to call multiple tests.
70
def __init__(self, master, slave, verbose=False):
70
def __init__(self, master, slave, options):
73
73
master[in] Master Server object
74
74
slave[in] Slave Server object
75
verbose[in] print extra data during operations (optional)
75
options[in] Options for class
76
verbose print extra data during operations (optional)
76
77
default value = False
78
master_log_file master log file
80
master_log_pos position in log file
81
default = -1 (no position specified)
82
from_beginning if True, start from beginning of logged events
78
self.verbose = verbose
85
self.verbosity = options.get("verbosity", 0)
86
self.master_log_file = options.get("master_log_file", None)
87
self.master_log_pos = options.get("master_log_pos", 0)
88
self.from_beginning = options.get("from_beginning", False)
79
89
self.master = master
81
91
self.master_server_id = None
563
573
# Create user class instance
564
574
user = User(self.master,
565
575
"%s@%s:%s" % (rpl_user, self.master.host, self.master.port),
568
578
r_user, r_pass = re.match("(\w+)(?:\:(\w+))?", rpl_user).groups()
570
580
# Check to see if rpl_user is present, else create her
571
581
if not user.exists():
582
if self.verbosity > 0:
573
583
print "# Creating replication user..."
576
586
# Check to see if rpl_user has the correct grants, else grant rights
577
587
if not user.has_privilege("*", "*", "REPLICATION SLAVE"):
588
if self.verbosity > 0:
579
589
print "# Granting replication access to replication user..."
580
590
query_str = "GRANT REPLICATION SLAVE ON *.* TO '%s'@'%s' " % \
581
591
(r_user, self.slave.host)
594
604
print "ERROR: Cannot retrieve master status."
597
master_file = res[0][0]
598
master_pos = res[0][1]
607
# If master log file, pos not specified, read master log file info
608
read_master_info = False
609
if self.master_log_file is None:
610
res = self.master.exec_query("SHOW MASTER STATUS")
612
print "ERROR: Cannot retrieve master status."
615
read_master_info = True
616
self.master_log_file = res[0][0]
617
self.master_log_pos = res[0][1]
619
# Check to make sure file is accessible and valid
621
res = self.master.exec_query("SHOW BINARY LOGS",
625
if row[0] == self.master_log_file:
629
raise UtilError("Master binary log file not listed as a "
630
"valid binary log file on the master.")
632
if self.master_log_file is None:
633
raise UtilError("No master log file specified.")
600
635
# Stop slave first
601
636
res = self.slave.exec_query("SHOW SLAVE STATUS")
604
639
res = self.slave.exec_query("STOP SLAVE", self.query_options)
606
641
# Connect slave to master
642
if self.verbosity > 0:
608
643
print "# Connecting slave to master..."
609
644
change_master = "CHANGE MASTER TO MASTER_HOST = '%s', " % \
611
646
change_master += "MASTER_USER = '%s', " % r_user
612
647
change_master += "MASTER_PASSWORD = '%s', " % r_pass
613
change_master += "MASTER_PORT = %s, " % self.master.port
614
change_master += "MASTER_LOG_FILE = '%s', " % master_file
615
change_master += "MASTER_LOG_POS = %s" % master_pos
648
change_master += "MASTER_PORT = %s" % self.master.port
649
if not self.from_beginning:
650
change_master += ", MASTER_LOG_FILE = '%s' " % self.master_log_file
651
if self.master_log_pos >= 0:
652
change_master += ", MASTER_LOG_POS = %s" % self.master_log_pos
616
653
res = self.slave.exec_query(change_master, self.query_options)
654
if self.verbosity > 0:
618
655
print "# %s" % change_master
622
print "# Starting slave..."
658
if self.verbosity > 0:
659
if not self.from_beginning:
661
print "# Starting slave from master's last position..."
663
msg = "# Starting slave from master log file '%s'" % \
665
if self.master_log_pos >= 0:
666
msg += " using position %s" % self.master_log_pos
670
print "# Starting slave from the beginning..."
623
671
res = self.slave.exec_query("START SLAVE", self.query_options)
625
673
# Check slave status
629
677
res = self.slave.exec_query("SHOW SLAVE STATUS")
630
678
status = res[0][0]
679
if self.verbosity > 0:
632
680
print "# status: %s" % status
633
681
print "# error: %s:%s" % (res[0][34], res[0][35])
634
682
if status == "Waiting for master to send event":
684
if self.verbosity > 0:
637
685
print "# Waiting for slave to synchronize with master"
639
687
if i == num_tries:
640
688
print "ERROR: failed to synch slave with master."
643
# unlock tables on master
645
print "# Unlocking tables on master..."
646
query_str = "UNLOCK TABLES"
647
res = self.master.exec_query(query_str, self.query_options)
648
691
if result is True:
649
692
self.replicating = True
663
706
if not self.replicating:
664
707
print "ERROR: Replication is not running among master and slave."
665
708
print "# Testing replication setup..."
709
if self.verbosity > 0:
667
710
print "# Creating a test database on master named %s..." % db
668
711
res = self.master.exec_query("CREATE DATABASE %s" % db,
669
712
self.query_options)