1
1
#! /usr/bin/env python
2
# -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
# -*- mode: python; indent-tabs-mode: nil; -*-
3
3
# vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5
# Copyright (C) 2010 Patrick Crews
5
# Copyright (C) 2010,2011 Patrick Crews
7
7
# This program is free software; you can redistribute it and/or modify
8
8
# it under the terms of the GNU General Public License as published by
43
def __init__(self, name, server_manager, server_options
44
, requester, workdir_root):
45
self.skip_keys = [ 'server_manager'
48
, 'preferred_base_port'
49
, 'no_secure_file_priv'
50
, 'secure_file_string'
53
self.debug = server_manager.debug
54
self.verbose = server_manager.verbose
56
self.owner = requester
57
self.server_options = server_options
58
self.server_manager = server_manager
59
# We register with server_manager asap
60
self.server_manager.log_server(self, requester)
62
self.system_manager = self.server_manager.system_manager
63
self.valgrind = self.system_manager.valgrind
64
self.gdb = self.system_manager.gdb
66
self.valgrind_time_buffer = 10
68
self.valgrind_time_buffer = 1
69
self.cmd_prefix = self.system_manager.cmd_prefix
70
self.logging = self.system_manager.logging
71
self.no_secure_file_priv = self.server_manager.no_secure_file_priv
44
def __init__( self, name, server_manager, default_storage_engine
45
, server_options, requester, workdir_root):
46
super(drizzleServer, self).__init__( name, server_manager
47
, default_storage_engine
48
, server_options, requester
72
50
self.code_tree = self.system_manager.code_tree
73
51
self.preferred_base_port = 9306
75
self.status = 0 # stopped, 1 = running
77
self.failed_test = 0 # was the last test a failure? our state is suspect
78
self.server_start_timeout = 60 * self.valgrind_time_buffer
54
self.drizzledump = self.code_tree.drizzledump
55
self.drizzle_client = self.code_tree.drizzle_client
56
self.drizzleimport = self.code_tree.drizzleimport
57
self.drizzleadmin = self.code_tree.drizzleadmin
58
self.drizzleslap = self.code_tree.drizzleslap
59
self.server_path = self.code_tree.drizzle_server
60
self.drizzle_client_path = self.code_tree.drizzle_client
61
self.schemawriter = self.code_tree.schemawriter
81
64
self.port_block = self.system_manager.port_manager.get_port_block( self.name
82
65
, self.preferred_base_port
84
67
self.master_port = self.port_block[0]
85
68
self.drizzle_tcp_port = self.port_block[1]
86
69
self.mc_port = self.port_block[2]
87
70
self.pbms_port = self.port_block[3]
88
71
self.rabbitmq_node_port = self.port_block[4]
72
self.json_server_port = self.port_block[5]
91
74
# Generate our working directories
92
75
self.dirset = { self.name : { 'var': {'std_data_ln':( os.path.join(self.code_tree.testdir,'std_data'))
112
95
self.pid_file = os.path.join(self.rundir,('%s.pid' %(self.name)))
113
96
self.socket_file = os.path.join(self.vardir, ('%s.sock' %(self.name)))
114
97
self.timer_file = os.path.join(self.logdir,('timer'))
99
# Do magic to create a config file for use with the slave
101
self.slave_config_file = os.path.join(self.logdir,'slave.cnf')
102
self.create_slave_config_file()
115
104
self.snapshot_path = os.path.join(self.tmpdir,('snapshot_%s' %(self.master_port)))
116
105
# We want to use --secure-file-priv = $vardir by default
117
106
# but there are times / tools when we need to shut this off
121
110
self.secure_file_string = "--secure-file-priv='%s'" %(self.vardir)
122
111
self.user_string = '--user=root'
125
self.drizzledump = self.code_tree.drizzledump
126
self.drizzle_client = self.code_tree.drizzle_client
127
self.drizzleimport = self.code_tree.drizzleimport
128
self.drizzleadmin = self.code_tree.drizzleadmin
129
self.drizzleslap = self.code_tree.drizzleslap
130
self.server_path = self.code_tree.drizzle_server
131
self.drizzle_client_path = self.code_tree.drizzle_client
132
self.schemawriter = self.code_tree.schemawriter
134
113
self.initialize_databases()
135
114
self.take_db_snapshot()
168
147
, "--mysql-unix-socket-protocol.path=%s" %(self.socket_file)
169
148
, "--pid-file=%s" %(self.pid_file)
170
149
, "--drizzle-protocol.port=%d" %(self.drizzle_tcp_port)
150
, "--default-storage-engine=%s" %(self.default_storage_engine)
171
151
, "--datadir=%s" %(self.datadir)
172
152
, "--tmpdir=%s" %(self.tmpdir)
173
153
, self.secure_file_string
199
179
return "%s --ping --port=%d --user=root" % (self.drizzle_client_path, self.master_port)
201
def process_server_options(self):
202
"""Consume the list of options we have been passed.
203
Return a string with them joined
181
def is_started(self):
182
""" Determine if the server is up and running -
183
this may vary from server type to server type
207
return " ".join(self.server_options)
187
# We experiment with waiting for a pid file to be created vs. pinging
188
# This is what test-run.pl does and it helps us pass logging_stats tests
189
# while not self.ping_server(server, quiet=True) and timer != timeout:
191
return self.system_manager.find_path( [self.pid_file]
194
def create_slave_config_file(self):
195
""" Create a config file suitable for use
196
with the slave-plugin. This allows
197
us to tie other servers in easily
201
config_data = [ "master-host=127.0.0.1"
202
, "master-port=%d" %self.master_port
205
, "max-reconnects=100"
206
#, "seconds-between-reconnects=20"
208
outfile = open(self.slave_config_file,'w')
209
for line in config_data:
210
outfile.write("%s\n" %(line))
209
def initialize_databases(self):
210
""" Call schemawriter to make db.opt files """
214
for database in databases:
215
db_path = os.path.join(self.datadir,'local',database,'db.opt')
216
cmd = "%s %s %s" %(self.schemawriter, database, db_path)
217
self.system_manager.execute_cmd(cmd)
219
def take_db_snapshot(self):
220
""" Take a snapshot of our vardir for quick restores """
222
self.logging.info("Taking clean db snapshot...")
223
if os.path.exists(self.snapshot_path):
224
# We need to remove an existing path as python shutil
225
# doesn't want an existing target
226
self.system_manager.remove_dir(self.snapshot_path)
227
self.system_manager.copy_dir(self.datadir, self.snapshot_path)
229
def restore_snapshot(self):
230
""" Restore from a stored snapshot """
233
self.logging.verbose("Restoring from db snapshot")
234
if not os.path.exists(self.snapshot_path):
235
self.logging.error("Could not find snapshot: %s" %(self.snapshot_path))
236
self.system_manager.remove_dir(self.datadir)
237
self.system_manager.copy_dir(self.snapshot_path, self.datadir)
240
""" Cleanup - just free ports for now..."""
241
self.system_manager.port_manager.free_ports(self.port_block)
243
def set_server_options(self, server_options):
244
""" We update our server_options to the new set """
245
self.server_options = server_options
248
""" Voodoo to reset ourselves """