~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to tests/lib/server_mgmt/drizzled.py

  • Committer: pcrews
  • Date: 2011-05-24 17:36:24 UTC
  • mfrom: (1099.4.232 drizzle)
  • Revision ID: pcrews@lucid32-20110524173624-mwr1bvq6fa1r01ao
Updated translations + 2011.05.18 tarball tag

Show diffs side-by-side

added added

removed removed

Lines of Context:
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:
4
4
#
5
 
# Copyright (C) 2010 Patrick Crews
 
5
# Copyright (C) 2010,2011 Patrick Crews
6
6
#
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
27
27
 
28
28
# imports
29
29
import os
 
30
from lib.server_mgmt.server import Server
30
31
 
31
 
class drizzleServer():
 
32
class drizzleServer(Server):
32
33
    """ represents a drizzle server, its possessions
33
34
        (datadir, ports, etc), and methods for controlling
34
35
        and querying it
40
41
 
41
42
    """
42
43
 
43
 
    def __init__(self, name, server_manager, server_options
44
 
                , requester, workdir_root):
45
 
        self.skip_keys = [ 'server_manager'
46
 
                         , 'system_manager'
47
 
                         , 'dirset'
48
 
                         , 'preferred_base_port'
49
 
                         , 'no_secure_file_priv'
50
 
                         , 'secure_file_string'
51
 
                         , 'port_block'
52
 
                         ]
53
 
        self.debug = server_manager.debug
54
 
        self.verbose = server_manager.verbose
55
 
        self.initial_run = 1
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)
61
 
 
62
 
        self.system_manager = self.server_manager.system_manager
63
 
        self.valgrind = self.system_manager.valgrind
64
 
        self.gdb = self.system_manager.gdb
65
 
        if self.valgrind:
66
 
            self.valgrind_time_buffer = 10
67
 
        else:
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
 
49
                                           , workdir_root)
72
50
        self.code_tree = self.system_manager.code_tree
73
51
        self.preferred_base_port = 9306
74
 
        self.name = name
75
 
        self.status = 0 # stopped, 1 = running
76
 
        self.tried_start = 0
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
 
52
        
 
53
        # client files
 
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
79
62
 
80
63
        # Get our ports
81
64
        self.port_block = self.system_manager.port_manager.get_port_block( self.name
82
65
                                                                         , self.preferred_base_port
83
 
                                                                         , 5 )
 
66
                                                                         , 6 )
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]
89
 
        
 
72
        self.json_server_port = self.port_block[5]
90
73
 
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'))
 
98
 
 
99
        # Do magic to create a config file for use with the slave
 
100
        # plugin
 
101
        self.slave_config_file = os.path.join(self.logdir,'slave.cnf')
 
102
        self.create_slave_config_file()
 
103
 
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'
123
112
 
124
 
        # client files
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
133
 
 
134
113
        self.initialize_databases()
135
114
        self.take_db_snapshot()
136
115
 
148
127
                        , 'vardir'
149
128
                        , 'status'
150
129
                        ]
151
 
        self.logging.info("%s master server:" %(self.owner))
 
130
        self.logging.info("%s server:" %(self.owner))
152
131
        for key in report_values:
153
132
          value = vars(self)[key] 
154
133
          self.logging.info("%s: %s" %(key.upper(), value))
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
198
178
 
199
179
        return "%s --ping --port=%d --user=root" % (self.drizzle_client_path, self.master_port)
200
180
 
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
204
184
 
205
185
        """
206
 
        
207
 
        return " ".join(self.server_options)
 
186
 
 
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:
 
190
 
 
191
        return self.system_manager.find_path( [self.pid_file]
 
192
                                            , required=0)
 
193
 
 
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
 
198
 
 
199
       """
 
200
 
 
201
       config_data = [ "master-host=127.0.0.1"
 
202
                     , "master-port=%d" %self.master_port
 
203
                     , "master-user=root"
 
204
                     , "master-pass=''"
 
205
                     , "max-reconnects=100"
 
206
                     #, "seconds-between-reconnects=20"
 
207
                     ]
 
208
       outfile = open(self.slave_config_file,'w')
 
209
       for line in config_data:
 
210
           outfile.write("%s\n" %(line))
 
211
       outfile.close()
 
212
 
 
213
 
 
214
 
 
215
 
208
216
                  
209
 
    def initialize_databases(self):
210
 
        """ Call schemawriter to make db.opt files """
211
 
        databases = [ 'test'
212
 
                    , 'mysql'
213
 
                    ]
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)
218
 
 
219
 
    def take_db_snapshot(self):
220
 
        """ Take a snapshot of our vardir for quick restores """
221
 
       
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)
228
 
 
229
 
    def restore_snapshot(self):
230
 
        """ Restore from a stored snapshot """
231
 
        
232
 
        if self.verbose:
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)
238
 
 
239
 
    def cleanup(self):
240
 
        """ Cleanup - just free ports for now..."""
241
 
        self.system_manager.port_manager.free_ports(self.port_block)
242
 
 
243
 
    def set_server_options(self, server_options):
244
 
        """ We update our server_options to the new set """
245
 
        self.server_options = server_options
246
 
 
247
 
    def reset(self):
248
 
        """ Voodoo to reset ourselves """
249
 
        self.failed_test = 0
 
217
 
 
218
 
 
219
 
 
220
 
 
221
 
250
222
         
251
223
 
252
224