2194.2.1
by patrick crews
Integrated randgen with dbqp. We now have mode=randgen and a set of randgen test suites (very basic now). Output = same as dtr : ) We also have mode=cleanup to kill any servers we have started. Docs updates too. Gendata utility allows us to populate test servers |
1 |
#! /usr/bin/env python
|
2235.5.2
by Stewart Smith
dbqp source (and all its libs) should use emacs python mode, not emacs C mode |
2 |
# -*- mode: python; indent-tabs-mode: nil; -*-
|
2194.2.1
by patrick crews
Integrated randgen with dbqp. We now have mode=randgen and a set of randgen test suites (very basic now). Output = same as dtr : ) We also have mode=cleanup to kill any servers we have started. Docs updates too. Gendata utility allows us to populate test servers |
3 |
# vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
4 |
#
|
|
5 |
# Copyright (C) 2010,2011 Patrick Crews
|
|
6 |
#
|
|
7 |
# This program is free software; you can redistribute it and/or modify
|
|
8 |
# it under the terms of the GNU General Public License as published by
|
|
9 |
# the Free Software Foundation; either version 2 of the License, or
|
|
10 |
# (at your option) any later version.
|
|
11 |
#
|
|
12 |
# This program is distributed in the hope that it will be useful,
|
|
13 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 |
# GNU General Public License for more details.
|
|
16 |
#
|
|
17 |
# You should have received a copy of the GNU General Public License
|
|
18 |
# along with this program; if not, write to the Free Software
|
|
19 |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
20 |
||
21 |
||
22 |
""" server.py: generic server object used by the server
|
|
23 |
manager. This contains the generic methods for all
|
|
24 |
servers. Specific types (Drizzle, MySQL, etc) should
|
|
25 |
inherit from this guy
|
|
26 |
||
27 |
"""
|
|
28 |
||
29 |
# imports
|
|
30 |
import os |
|
31 |
||
32 |
class Server(object): |
|
33 |
""" the server class from which other servers
|
|
34 |
will inherit - contains generic methods
|
|
35 |
certain methods will be overridden by more
|
|
36 |
specific ones
|
|
37 |
||
38 |
"""
|
|
39 |
||
40 |
def __init__(self |
|
41 |
, name |
|
42 |
, server_manager |
|
43 |
, default_storage_engine |
|
44 |
, server_options |
|
45 |
, requester |
|
46 |
, workdir_root): |
|
47 |
self.skip_keys = [ 'server_manager' |
|
48 |
, 'system_manager' |
|
49 |
, 'dirset' |
|
50 |
, 'preferred_base_port' |
|
51 |
, 'no_secure_file_priv' |
|
52 |
, 'secure_file_string' |
|
53 |
, 'port_block' |
|
54 |
]
|
|
55 |
self.debug = server_manager.debug |
|
56 |
self.verbose = server_manager.verbose |
|
57 |
self.initial_run = 1 |
|
58 |
self.owner = requester |
|
59 |
self.server_options = server_options |
|
60 |
self.default_storage_engine = default_storage_engine |
|
61 |
self.server_manager = server_manager |
|
62 |
# We register with server_manager asap
|
|
63 |
self.server_manager.log_server(self, requester) |
|
64 |
||
65 |
self.system_manager = self.server_manager.system_manager |
|
66 |
self.valgrind = self.system_manager.valgrind |
|
67 |
self.gdb = self.system_manager.gdb |
|
68 |
if self.valgrind: |
|
69 |
self.valgrind_time_buffer = 10 |
|
70 |
else: |
|
71 |
self.valgrind_time_buffer = 1 |
|
72 |
self.cmd_prefix = self.system_manager.cmd_prefix |
|
73 |
self.logging = self.system_manager.logging |
|
74 |
self.no_secure_file_priv = self.server_manager.no_secure_file_priv |
|
75 |
self.name = name |
|
76 |
self.status = 0 # stopped, 1 = running |
|
77 |
self.tried_start = 0 |
|
78 |
self.failed_test = 0 # was the last test a failure? our state is suspect |
|
79 |
self.server_start_timeout = 60 * self.valgrind_time_buffer |
|
2246.5.1
by patrick crews
Tweaked randgen tests so that we now have crash tests for inno_rpl_log and slave plugin! : ) |
80 |
self.pid = None |
2194.2.1
by patrick crews
Integrated randgen with dbqp. We now have mode=randgen and a set of randgen test suites (very basic now). Output = same as dtr : ) We also have mode=cleanup to kill any servers we have started. Docs updates too. Gendata utility allows us to populate test servers |
81 |
|
82 |
def initialize_databases(self): |
|
83 |
""" Call schemawriter to make db.opt files """
|
|
84 |
databases = [ 'test' |
|
85 |
, 'mysql' |
|
86 |
]
|
|
87 |
for database in databases: |
|
88 |
db_path = os.path.join(self.datadir,'local',database,'db.opt') |
|
89 |
cmd = "%s %s %s" %(self.schemawriter, database, db_path) |
|
90 |
self.system_manager.execute_cmd(cmd) |
|
91 |
||
92 |
def process_server_options(self): |
|
93 |
"""Consume the list of options we have been passed.
|
|
94 |
Return a string with them joined
|
|
95 |
||
96 |
"""
|
|
97 |
||
98 |
return " ".join(self.server_options) |
|
99 |
||
100 |
def take_db_snapshot(self): |
|
101 |
""" Take a snapshot of our vardir for quick restores """
|
|
102 |
||
103 |
self.logging.info("Taking clean db snapshot...") |
|
104 |
if os.path.exists(self.snapshot_path): |
|
105 |
# We need to remove an existing path as python shutil
|
|
106 |
# doesn't want an existing target
|
|
107 |
self.system_manager.remove_dir(self.snapshot_path) |
|
108 |
self.system_manager.copy_dir(self.datadir, self.snapshot_path) |
|
109 |
||
110 |
def restore_snapshot(self): |
|
111 |
""" Restore from a stored snapshot """
|
|
112 |
||
113 |
if self.verbose: |
|
114 |
self.logging.verbose("Restoring from db snapshot") |
|
115 |
if not os.path.exists(self.snapshot_path): |
|
116 |
self.logging.error("Could not find snapshot: %s" %(self.snapshot_path)) |
|
117 |
self.system_manager.remove_dir(self.datadir) |
|
118 |
self.system_manager.copy_dir(self.snapshot_path, self.datadir) |
|
119 |
||
120 |
def is_started(self): |
|
121 |
""" Is the server running? Particulars are server-dependent """
|
|
122 |
||
123 |
return
|
|
124 |
||
125 |
def get_start_cmd(self): |
|
126 |
""" Return the command the server_manager can use to start me """
|
|
127 |
||
128 |
return "Allakazam!" |
|
129 |
||
130 |
def get_stop_cmd(self): |
|
131 |
""" Return the command the server_manager can use to stop me """
|
|
132 |
||
133 |
return "Whoa, Nelly!" |
|
134 |
||
135 |
def get_ping_cmd(self): |
|
136 |
""" Return the command that can be used to 'ping' me
|
|
137 |
Very similar to is_started, but different
|
|
138 |
||
139 |
Determining if a server is still running (ping)
|
|
140 |
may differ from the method used to determine
|
|
141 |
server startup
|
|
142 |
||
143 |
"""
|
|
144 |
||
145 |
return "Hello?" |
|
146 |
||
147 |
def cleanup(self): |
|
148 |
""" Cleanup - just free ports for now..."""
|
|
149 |
self.system_manager.port_manager.free_ports(self.port_block) |
|
150 |
||
151 |
def set_server_options(self, server_options): |
|
152 |
""" We update our server_options to the new set """
|
|
153 |
self.server_options = server_options |
|
154 |
||
155 |
def reset(self): |
|
156 |
""" Voodoo to reset ourselves """
|
|
157 |
self.failed_test = 0 |