Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1246)

Side by Side Diff: servermanager.py

Issue 153503002: Make traffic shaping work when WPR chooses the server ports. (Closed) Base URL: http://web-page-replay.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « replay.py ('k') | trafficshaper.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2011 Google Inc. All Rights Reserved. 2 # Copyright 2011 Google Inc. All Rights Reserved.
3 # 3 #
4 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License. 5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at 6 # You may obtain a copy of the License at
7 # 7 #
8 # http://www.apache.org/licenses/LICENSE-2.0 8 # http://www.apache.org/licenses/LICENSE-2.0
9 # 9 #
10 # Unless required by applicable law or agreed to in writing, software 10 # Unless required by applicable law or agreed to in writing, software
(...skipping 15 matching lines...) Expand all
26 passed to ServerManager.Append() and by calling __enter__(). Once an 26 passed to ServerManager.Append() and by calling __enter__(). Once an
27 server's initializer is called successfully, the __exit__() function 27 server's initializer is called successfully, the __exit__() function
28 is guaranteed to be called when ServerManager.Run() completes. 28 is guaranteed to be called when ServerManager.Run() completes.
29 """ 29 """
30 30
31 def __init__(self, is_record_mode): 31 def __init__(self, is_record_mode):
32 """Initialize a server manager.""" 32 """Initialize a server manager."""
33 self.initializers = [] 33 self.initializers = []
34 self.record_callbacks = [] 34 self.record_callbacks = []
35 self.replay_callbacks = [] 35 self.replay_callbacks = []
36 self.traffic_shapers = []
36 self.is_record_mode = is_record_mode 37 self.is_record_mode = is_record_mode
37 self.should_exit = False 38 self.should_exit = False
38 39
39 def Append(self, initializer, *init_args, **init_kwargs): 40 def Append(self, initializer, *init_args, **init_kwargs):
40 """Append a server to the end of the list to run. 41 """Append a server to the end of the list to run.
41 42
42 Servers start in the order they are appended and stop in the 43 Servers start in the order they are appended and stop in the
43 opposite order. 44 opposite order.
44 45
45 Args: 46 Args:
46 initializer: a function that returns a server instance. 47 initializer: a function that returns a server instance.
47 A server needs to implement the with-statement interface. 48 A server needs to implement the with-statement interface.
48 init_args: positional arguments for the initializer. 49 init_args: positional arguments for the initializer.
49 init_args: keyword arguments for the initializer. 50 init_args: keyword arguments for the initializer.
50 """ 51 """
51 self.initializers.append((initializer, init_args, init_kwargs)) 52 self.initializers.append((initializer, init_args, init_kwargs))
52 53
54 def AppendTrafficShaper(self, initializer, *init_args, **init_kwargs):
55 """Append a traffic shaper to the end of the list to run.
56
57 Args:
58 initializer: a function that returns a server instance.
59 A server needs to implement the with-statement interface.
60 init_args: positional arguments for the initializer.
61 init_args: keyword arguments for the initializer.
62 """
63 self.traffic_shapers.append((initializer, init_args, init_kwargs))
64
53 def AppendRecordCallback(self, func): 65 def AppendRecordCallback(self, func):
54 """Append a function to the list to call when switching to record mode. 66 """Append a function to the list to call when switching to record mode.
55 67
56 Args: 68 Args:
57 func: a function that takes no arguments and returns no value. 69 func: a function that takes no arguments and returns no value.
58 """ 70 """
59 self.record_callbacks.append(func) 71 self.record_callbacks.append(func)
60 72
61 def AppendReplayCallback(self, func): 73 def AppendReplayCallback(self, func):
62 """Append a function to the list to call when switching to replay mode. 74 """Append a function to the list to call when switching to replay mode.
(...skipping 21 matching lines...) Expand all
84 96
85 def Run(self): 97 def Run(self):
86 """Create the servers and loop. 98 """Create the servers and loop.
87 99
88 The loop quits if a server raises an exception. 100 The loop quits if a server raises an exception.
89 101
90 Raises: 102 Raises:
91 any exception raised by the servers 103 any exception raised by the servers
92 """ 104 """
93 server_exits = [] 105 server_exits = []
106 server_ports = []
94 exception_info = (None, None, None) 107 exception_info = (None, None, None)
95 try: 108 try:
96 for initializer, init_args, init_kwargs in self.initializers: 109 for initializer, init_args, init_kwargs in self.initializers:
97 server = initializer(*init_args, **init_kwargs) 110 server = initializer(*init_args, **init_kwargs)
98 if server: 111 if server:
99 server_exits.insert(0, server.__exit__) 112 server_exits.insert(0, server.__exit__)
100 server.__enter__() 113 server.__enter__()
114 if hasattr(server, 'server_port'):
115 server_ports.append(server.server_port)
116 for initializer, init_args, init_kwargs in self.traffic_shapers:
117 init_kwargs['ports'] = server_ports
118 shaper = initializer(*init_args, **init_kwargs)
119 if server:
120 server_exits.insert(0, shaper.__exit__)
121 shaper.__enter__()
101 while True: 122 while True:
102 time.sleep(1) 123 time.sleep(1)
103 if self.should_exit: 124 if self.should_exit:
104 break 125 break
105 except: 126 except:
106 exception_info = sys.exc_info() 127 exception_info = sys.exc_info()
107 finally: 128 finally:
108 for server_exit in server_exits: 129 for server_exit in server_exits:
109 try: 130 try:
110 if server_exit(*exception_info): 131 if server_exit(*exception_info):
111 exception_info = (None, None, None) 132 exception_info = (None, None, None)
112 except: 133 except:
113 exception_info = sys.exc_info() 134 exception_info = sys.exc_info()
114 if exception_info != (None, None, None): 135 if exception_info != (None, None, None):
115 raise exception_info[0], exception_info[1], exception_info[2] 136 raise exception_info[0], exception_info[1], exception_info[2]
OLDNEW
« no previous file with comments | « replay.py ('k') | trafficshaper.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698