~mysql/mysql-utilities/1.3.2

« back to all changes in this revision

Viewing changes to mysql-test/suite/replication/t/rpl_admin.py

  • Committer: Paulo Jesus
  • Date: 2013-04-19 18:31:54 UTC
  • mfrom: (289.1.47 mysql-utilities-1.2.2)
  • Revision ID: paulo.jesus@oracle.com-20130419183154-g8rkvs2oezbdvrud
Release-1.3.1 Merge

This patch merges version 1.2.2 to 1.3.1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16
16
#
17
17
import os
 
18
import time
18
19
import mutlib
19
20
from mysql.utilities.exception import MUTLibError
20
21
 
24
25
    """test replication administration commands
25
26
    This test runs the mysqlrpladmin utility on a known topology.
26
27
    
27
 
    Note: this test will run against older servers. See rpl_admin_gtid
28
 
    test for test cases for GTID enabled servers.
 
28
    Note: this test will run against servers without GTID enabled.
 
29
    See rpl_admin_gtid test for test cases for GTID enabled servers.
29
30
    """
30
31
 
31
32
    def check_prerequisites(self):
32
 
        if self.servers.get_server(0).check_version_compat(5, 6, 5):
33
 
            raise MUTLibError("Test requires server version prior to 5.6.5")
 
33
        if not self.servers.get_server(0).check_version_compat(5, 5, 30):
 
34
            raise MUTLibError("Test requires server version 5.5.30 or later.")
 
35
        if self.servers.get_server(0).supports_gtid() == "ON":
 
36
            raise MUTLibError("Test requires servers without GTID enabled.")
34
37
        return self.check_num_servers(1)
35
38
 
36
39
    def spawn_server(self, name, mysqld=None, kill=False):
71
74
 
72
75
    def setup(self):
73
76
        self.res_fname = "result.txt"
74
 
        
 
77
 
75
78
        # Spawn servers
76
79
        self.server0 = self.servers.get_server(0)
77
80
        self.server1 = self.spawn_server("rep_master")
79
82
        self.server3 = self.spawn_server("rep_slave2")
80
83
        self.server4 = self.spawn_server("rep_slave3")
81
84
 
 
85
        # Reset spawned servers (clear binary log and GTID_EXECUTED set)
 
86
        self.reset_master()
 
87
 
82
88
        self.m_port = self.server1.port
83
89
        self.s1_port = self.server2.port
84
90
        self.s2_port = self.server3.port
85
91
        self.s3_port = self.server4.port
86
 
        
 
92
 
87
93
        for slave in [self.server2, self.server3, self.server4]:
 
94
            slave.exec_query("SET SQL_LOG_BIN= 0")
88
95
            slave.exec_query("GRANT REPLICATION SLAVE ON *.* TO "
89
 
                              "'rpl'@'localhost' IDENTIFIED BY 'rpl'")
 
96
                              "'rpl'@'%s' IDENTIFIED BY 'rpl'" %
 
97
                              self.server1.host)
 
98
            slave.exec_query("SET SQL_LOG_BIN= 1")
90
99
 
91
100
        # Form replication topology - 1 master, 3 slaves
92
101
        return self.reset_topology()
151
160
                raise MUTLibError("%s: failed" % comment)
152
161
            test_num += 1
153
162
 
154
 
        cmd_str = "mysqlrpladmin.py --master=%s " % master_conn
155
 
        cmd_opts = " health --disc=root:root "
156
 
        cmd_opts += "--slaves=%s" % slaves_loopback
157
 
        comment= "Test case %s - health with loopback and discovery" % test_num
158
 
        res = mutlib.System_test.run_test_case(self, 0, cmd_str+cmd_opts,
159
 
                                               comment)
160
 
        if not res:
161
 
            raise MUTLibError("%s: failed" % comment)
162
 
        test_num += 1
163
 
 
164
 
        # Perform stop, start, and reset
 
163
        cmd_str = ("mysqlrpladmin.py --master={0} health "
 
164
                   "--slaves={1}").format(master_conn, slaves_loopback)
 
165
        comment = "Test case {0} - health with loopback".format(test_num)
 
166
        res = self.run_test_case(0, cmd_str, comment)
 
167
        if not res:
 
168
            raise MUTLibError("{0}: failed".format(comment))
 
169
        test_num += 1
 
170
 
 
171
        cmd_str = ("mysqlrpladmin.py --master={0} health "
 
172
                   "--disc=root:root").format(master_conn)
 
173
        comment = "Test case {0} - health with discovery".format(test_num)
 
174
        res = self.run_test_case(0, cmd_str, comment)
 
175
        if not res:
 
176
            raise MUTLibError("{0}: failed".format(comment))
 
177
        test_num += 1
 
178
 
 
179
        # Perform stop, start, and reset (with --master option)
165
180
        commands = ['stop', 'start', 'stop', 'reset']
166
181
        for cmd in commands:
167
 
            comment = "Test case %s - run command %s" % (test_num, cmd)
168
 
            cmd_str = "mysqlrpladmin.py --master=%s " % master_conn
169
 
            cmd_opts = " --slaves=%s %s" % (slaves_str, cmd)
170
 
            res = mutlib.System_test.run_test_case(self, 0, cmd_str+cmd_opts,
171
 
                                                   comment)
172
 
            if not res:
173
 
                raise MUTLibError("%s: failed" % comment)
174
 
            test_num += 1
175
 
            
 
182
            comment = ("Test case {0} - run command {1} with "
 
183
                       "--master").format(test_num, cmd)
 
184
            cmd_str = ("mysqlrpladmin.py --master={0} --slaves={1} "
 
185
                       "{2}").format(master_conn, slaves_str, cmd)
 
186
            res = self.run_test_case(0, cmd_str, comment)
 
187
            if not res:
 
188
                raise MUTLibError("%s: failed" % comment)
 
189
            test_num += 1
 
190
            # START SLAVE is asynchronous and it can take some time to complete
 
191
            # on slow servers
 
192
            if cmd == 'start':
 
193
                time.sleep(3)  # wait 3 second for START to finish
 
194
 
 
195
        # Needed to reset the topology here to run with 5.1 servers.
 
196
        # Note: With 5.1 servers after reset commands slaves seem to forgot
 
197
        # about their master.
 
198
        self.reset_topology()
 
199
 
 
200
        # Perform stop, start, and reset (without --master option)
 
201
        commands = ['start', 'stop', 'reset']
 
202
        for cmd in commands:
 
203
            comment = ("Test case {0} - run command {1} without "
 
204
                       "--master").format(test_num, cmd)
 
205
            cmd_str = ("mysqlrpladmin.py --slaves={0} "
 
206
                       "{1}").format(slaves_str, cmd)
 
207
            res = self.run_test_case(0, cmd_str, comment)
 
208
            if not res:
 
209
                raise MUTLibError("%s: failed" % comment)
 
210
            test_num += 1
 
211
 
176
212
        # Now we return the topology to its original state for other tests
177
213
        self.reset_topology()
178
214
 
186
222
        self.replace_substring(str(self.s1_port), "PORT2")
187
223
        self.replace_substring(str(self.s2_port), "PORT3")
188
224
        self.replace_substring(str(self.s3_port), "PORT4")
189
 
        
190
 
    def reset_topology(self):
191
 
        # Form replication topology - 1 master, 3 slaves
 
225
 
 
226
        self.replace_substring(": NO", ": XXX")  # for columns.
 
227
        self.replace_substring("| NO ", "| XXX")
 
228
        self.replace_substring("OFF", "XXX")
 
229
 
 
230
        # Mask slaves behind master.
 
231
        # It happens sometimes on windows in a non-deterministic way.
 
232
        self.replace_substring("+--------------------------------------------"
 
233
                               "--+", "+---------+")
 
234
        self.replace_substring("| health                                     "
 
235
                               "  |", "| health  |")
 
236
        self.replace_substring("| OK                                         "
 
237
                               "  |", "| OK      |")
 
238
        self.replace_substring("| Slave delay is 1 seconds behind master., "
 
239
                               "No  |", "| OK      |")
 
240
        self.replace_substring("| Slave delay is 2 seconds behind master., "
 
241
                               "No  |", "| OK      |")
 
242
        self.replace_substring("| Slave delay is 3 seconds behind master., "
 
243
                               "No  |", "| OK      |")
 
244
        self.replace_substring("| Slave delay is 4 seconds behind master., "
 
245
                               "No  |", "| OK      |")
 
246
 
 
247
    def reset_master(self, servers_list=[]):
 
248
        # Clear binary log and GTID_EXECUTED of given servers
 
249
        if servers_list:
 
250
            servers = servers_list
 
251
        else:
 
252
            servers = [self.server1, self.server2, self.server3, self.server4]
 
253
        for srv in servers:
 
254
            try:
 
255
                srv.exec_query("RESET MASTER")
 
256
            except Exception as err:
 
257
                raise MUTLibError("Unexpected error performing RESET MASTER "
 
258
                                  "for server %s:%s: %s"
 
259
                                  % (srv.host, srv.port, err))
 
260
 
 
261
    def reset_topology(self, slaves_list=[]):
 
262
        if slaves_list:
 
263
            slaves = slaves_list
 
264
        else:
 
265
            # Default replication topology - 1 master, 3 slaves
 
266
            slaves = [self.server2, self.server3, self.server4]
192
267
        self.master_str = " --master=%s" % \
193
268
                          self.build_connection_string(self.server1)
194
 
        for slave in [self.server1, self.server2, self.server3, self.server4]:
 
269
 
 
270
        servers = [self.server1]
 
271
        servers.extend(slaves)
 
272
        for slave in servers:
195
273
            try:
196
274
                slave.exec_query("STOP SLAVE")
197
275
                slave.exec_query("RESET SLAVE")
198
276
            except:
199
277
                pass
200
 
        
201
 
        for slave in [self.server2, self.server3, self.server4]:
 
278
 
 
279
        for slave in slaves:
202
280
            slave_str = " --slave=%s" % self.build_connection_string(slave)
203
281
            conn_str = self.master_str + slave_str
204
 
            cmd = "mysqlreplicate.py --rpl-user=rpl:rpl %s" % conn_str
 
282
            cmd = "mysqlreplicate.py --rpl-user=rpl:rpl %s -vvv" % conn_str
205
283
            res = self.exec_util(cmd, self.res_fname)
206
284
            if res != 0:
207
285
                return False