~drizzle-trunk/drizzle/development

« back to all changes in this revision

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

  • Committer: patrick crews
  • Date: 2011-01-15 21:27:41 UTC
  • mto: (2119.2.1 drizzle)
  • mto: This revision was merged to the branch mainline in revision 2121.
  • Revision ID: gleebix@gmail.com-20110115212741-htz3af0cib4fwdlv
Updated tree so that test-run.pl and test-run.py may live together in peace for a time

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
# -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 
3
# vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
4
#
 
5
# Copyright (C) 2010 Patrick Crews
 
6
#
 
7
"""server_management.py
 
8
   code for dealing with apportioning servers
 
9
   to suit the needs of the tests and executors
 
10
 
 
11
"""
 
12
# imports
 
13
import thread
 
14
 
 
15
class serverManager:
 
16
    """ code that handles the server objects
 
17
        We use this to track, do mass actions, etc
 
18
        Single point of contact for this business
 
19
 
 
20
    """
 
21
 
 
22
    def __init__(self, system_manager, variables):
 
23
        self.skip_keys = [ 'ld_preload'
 
24
                         , 'system_manager'
 
25
                         ]
 
26
        self.debug = variables['debug']
 
27
        self.verbose = variables['verbose']
 
28
        self.initial_run = 1
 
29
        self.server_base_name = 'server'
 
30
        self.no_secure_file_priv = variables['nosecurefilepriv']
 
31
        self.system_manager = system_manager
 
32
        self.logging = system_manager.logging
 
33
        self.code_tree = system_manager.code_tree
 
34
        self.servers = {}
 
35
        # We track this
 
36
        self.ld_preload = system_manager.ld_preload
 
37
        self.mutex = thread.allocate_lock()
 
38
 
 
39
        if self.debug:
 
40
            self.logging.debug_class(self)
 
41
 
 
42
    def request_servers( self, requester, workdir, master_count
 
43
                   , slave_count, server_options
 
44
                   , expect_fail = 0):
 
45
        """ We produce the server objects / start the server processes
 
46
            as requested.  We report errors and whatnot if we can't
 
47
            That is, unless we expect the server to not start, then
 
48
            we just return a value / message
 
49
    
 
50
        """
 
51
        
 
52
        # Make sure we have the proper number of servers for this requester
 
53
        self.process_server_count( requester, master_count+slave_count
 
54
                                 , workdir, server_options)
 
55
 
 
56
        # Make sure we are running with the correct options 
 
57
        self.evaluate_existing_servers(requester, server_options)
 
58
 
 
59
        # Fire our servers up
 
60
        self.start_servers(requester, expect_fail)
 
61
 
 
62
        # Return them to the requester
 
63
        return self.get_server_list(requester)         
 
64
 
 
65
 
 
66
    
 
67
    def allocate_server(self, requester, server_options, workdir):
 
68
        """ Intialize an appropriate server object.
 
69
            Start up occurs elsewhere
 
70
 
 
71
        """
 
72
        # Get a name for our server
 
73
        server_name = self.get_server_name(requester)
 
74
 
 
75
        # initialize a server_object
 
76
        if self.code_tree.type == 'Drizzle':
 
77
          from lib.server_mgmt.drizzled import drizzleServer as server_type
 
78
        new_server = server_type( server_name, self, server_options
 
79
                                , requester, workdir )
 
80
        self.log_server(new_server, requester)
 
81
 
 
82
    def start_servers(self, requester, expect_fail):
 
83
        """ Start all servers for the requester """
 
84
        for server in self.get_server_list(requester):
 
85
            if server.status == 0:
 
86
                server.start(expect_fail)
 
87
 
 
88
    def stop_server(self, server):
 
89
        """ Stop an individual server if it is running """
 
90
        if server.status == 1:
 
91
            server.stop()
 
92
 
 
93
    def stop_servers(self, requester):
 
94
        """ Stop all servers running for the requester """
 
95
        for server in self.get_server_list(requester):
 
96
            self.stop_server(server)
 
97
 
 
98
    def stop_server_list(self, server_list):
 
99
        """ Stop the servers in an arbitrary list of them """
 
100
        for server in server_list:
 
101
            self.stop_server(server)
 
102
 
 
103
    def stop_all_servers(self):
 
104
        """ Stop all running servers """
 
105
 
 
106
        self.logging.info("Stopping all running servers...")
 
107
        for server_list in self.servers.values():
 
108
            for server in server_list:
 
109
                self.stop_server(server)
 
110
 
 
111
    def cleanup_all_servers(self):
 
112
        """Mainly for freeing server ports for now """
 
113
        for server_list in self.servers.values():
 
114
            for server in server_list:
 
115
                server.cleanup()
 
116
 
 
117
    def cleanup(self):
 
118
        """Stop all servers and free their ports and whatnot """
 
119
        self.stop_all_servers()
 
120
        self.cleanup_all_servers()
 
121
 
 
122
    def get_server_name(self, requester):
 
123
        """ We name our servers requester.server_basename.count
 
124
            where count is on a per-requester basis
 
125
            We see how many servers this requester has and name things 
 
126
            appropriately
 
127
 
 
128
        """
 
129
 
 
130
        server_count = self.server_count(requester)
 
131
        return "%s%d" %(self.server_base_name, server_count)
 
132
 
 
133
    def has_servers(self, requester):
 
134
        """ Check if the given requester has any servers """
 
135
        if requester not in self.servers: # new requester
 
136
            self.servers[requester] = []
 
137
        return self.server_count(requester)
 
138
 
 
139
    def log_server(self, new_server, requester):
 
140
        self.servers[requester].append(new_server)
 
141
 
 
142
    def evaluate_existing_servers( self, requester, server_options):
 
143
        """ See if the requester has any servers and if they
 
144
            are suitable for the current test
 
145
 
 
146
        """
 
147
        current_servers = self.servers[requester]
 
148
        
 
149
        for server in current_servers:
 
150
            if self.compare_options( server.server_options
 
151
                                   , server_options):
 
152
                return 1
 
153
            else:
 
154
                # We need to reset what is running and change the server
 
155
                # options
 
156
                self.reset_server(server)
 
157
                self.update_server_options(server, server_options)
 
158
            
 
159
    
 
160
    def compare_options(self, optlist1, optlist2):
 
161
        """ Compare two sets of server options and see if they match """
 
162
        return sorted(optlist1) == sorted(optlist2)
 
163
 
 
164
    def reset_server(self, server):
 
165
        self.stop_server(server)
 
166
        server.restore_snapshot()
 
167
 
 
168
    def reset_servers(self, requester):
 
169
        for server in self.servers[requester]:
 
170
            self.reset_server(server)
 
171
 
 
172
 
 
173
    def process_server_count(self, requester, desired_count, workdir, server_options):
 
174
        """ We see how many servers we have.  We shrink / grow
 
175
            the requesters set of servers as needed.
 
176
 
 
177
            If we shrink, we shutdown / reset the discarded servers
 
178
            (naturally)
 
179
 
 
180
        """
 
181
 
 
182
        current_count = self.has_servers(requester)
 
183
        if desired_count > current_count:
 
184
            for i in range(desired_count - current_count):
 
185
                self.allocate_server(requester, server_options, workdir)
 
186
        elif desired_count < current_count:
 
187
            good_servers = self.get_server_list(requester)[:desired_count]
 
188
            retired_servers = self.get_server_list(requester)[desired_count - current_count:]
 
189
            self.stop_server_list(retired_servers)
 
190
            self.set_server_list(requester, good_servers)
 
191
            
 
192
         
 
193
 
 
194
    def server_count(self, requester):
 
195
        """ Return how many servers the the requester has """
 
196
        return len(self.servers[requester])
 
197
 
 
198
    def get_server_list(self, requester):
 
199
        """ Return the list of servers assigned to the requester """
 
200
        return self.servers[requester]
 
201
 
 
202
    def set_server_list(self, requester, server_list):
 
203
        """ Set the requesters list of servers to server_list """
 
204
 
 
205
        self.servers[requester] = server_list
 
206
 
 
207
    def add_server(self, requester, new_server):
 
208
       """ Add new_server to the requester's set of servers """
 
209
       self.servers[requester].append(new_server)
 
210
 
 
211
    def update_server_options(self, server, server_options):
 
212
        """ Change the option_list a server has to use on startup """
 
213
        if self.debug:
 
214
            self.logging.debug("Updating server: %s options" %(server.name))
 
215
            self.logging.debug("FROM: %s" %(server.server_options))
 
216
            self.logging.debug("TO: %s" %(server_options))
 
217
        server.set_server_options(server_options)
 
218
 
 
219
    def get_server_count(self):
 
220
       """ Find out how many servers we have out """
 
221
       server_count = 0
 
222
       for server_list in self.servers.values():
 
223
           for server in server_list:
 
224
               server_count = server_count + 1
 
225
       return server_count
 
226
 
 
227
 
 
228
 
 
229
 
 
230
 
 
231
        
 
232
 
 
233
 
 
234
 
 
235
 
 
236
 
 
237
 
 
238
 
 
239