Merge lp:~allenap/maas/overhaul-logging-more-03 into lp:~maas-committers/maas/trunk

Proposed by Gavin Panella
Status: Merged
Approved by: Gavin Panella
Approved revision: no longer in the source branch.
Merged at revision: 5525
Proposed branch: lp:~allenap/maas/overhaul-logging-more-03
Merge into: lp:~maas-committers/maas/trunk
Prerequisite: lp:~allenap/maas/overhaul-logging-more-02
Diff against target: 1611 lines (+301/-162)
50 files modified
src/maasserver/bootresources.py (+5/-2)
src/maasserver/clusterrpc/boot_images.py (+4/-1)
src/maasserver/dhcp.py (+8/-5)
src/maasserver/dns/publication.py (+4/-1)
src/maasserver/models/largefile.py (+4/-1)
src/maasserver/models/signals/power.py (+4/-1)
src/maasserver/plugin.py (+4/-1)
src/maasserver/populate_tags.py (+5/-2)
src/maasserver/rack_controller.py (+4/-1)
src/maasserver/region_controller.py (+4/-1)
src/maasserver/regiondservices/active_discovery.py (+5/-1)
src/maasserver/regiondservices/ntp.py (+4/-1)
src/maasserver/regiondservices/reverse_dns.py (+4/-1)
src/maasserver/regiondservices/service_monitor_service.py (+4/-1)
src/maasserver/rpc/regionservice.py (+8/-3)
src/maasserver/rpc/tests/test_regionservice.py (+6/-12)
src/maasserver/start_up.py (+5/-2)
src/maasserver/utils/async.py (+7/-4)
src/maasserver/utils/dbtasks.py (+4/-1)
src/maasserver/utils/tests/test_async.py (+1/-1)
src/maasserver/webapp.py (+5/-4)
src/maasserver/websockets/handlers/bootresource.py (+4/-1)
src/maasserver/websockets/handlers/machine.py (+4/-5)
src/maasserver/websockets/protocol.py (+9/-5)
src/maasserver/websockets/tests/test_protocol.py (+7/-6)
src/maasserver/websockets/tests/test_websockets.py (+7/-12)
src/maasserver/websockets/websockets.py (+8/-5)
src/maastesting/testcase.py (+13/-0)
src/maastesting/twisted.py (+42/-10)
src/provisioningserver/dhcp/detect.py (+15/-17)
src/provisioningserver/import_images/download_resources.py (+4/-1)
src/provisioningserver/logger/__init__.py (+2/-0)
src/provisioningserver/logger/_common.py (+9/-0)
src/provisioningserver/logger/_django.py (+1/-1)
src/provisioningserver/logger/_logging.py (+1/-1)
src/provisioningserver/logger/_twisted.py (+9/-14)
src/provisioningserver/logger/tests/test__twisted.py (+5/-8)
src/provisioningserver/power/change.py (+5/-2)
src/provisioningserver/rackdservices/dhcp_probe_service.py (+5/-2)
src/provisioningserver/rackdservices/image_download_service.py (+5/-2)
src/provisioningserver/rackdservices/node_power_monitor_service.py (+5/-2)
src/provisioningserver/rackdservices/ntp.py (+4/-1)
src/provisioningserver/rackdservices/service_monitor_service.py (+5/-2)
src/provisioningserver/rackdservices/tftp.py (+5/-2)
src/provisioningserver/rpc/boot_images.py (+4/-1)
src/provisioningserver/rpc/clusterservice.py (+10/-10)
src/provisioningserver/rpc/common.py (+4/-1)
src/provisioningserver/rpc/tests/test_clusterservice.py (+1/-1)
src/provisioningserver/utils/services.py (+5/-2)
src/provisioningserver/utils/twisted.py (+4/-1)
To merge this branch: bzr merge lp:~allenap/maas/overhaul-logging-more-03
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+309735@code.launchpad.net

Commit message

Switch all of MAAS over to LegacyLogger, a transitional shim between the legacy Twisted logging module and the new logging system.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Branch looks good. I think that the web requests logging needs to be improved:

2016-11-01 13:32:46 [twisted.python.log#info] ::ffff:127.0.0.1 - - [01/Nov/2016:13:32:45 +0000] "POST /MAAS/metadata/status/htmada/latest HTTP/1.1" 200 2 "-" "Python-urllib/3.5"

"twisted.python.log" is not helpful in anyway.

review: Approve
Revision history for this message
Gavin Panella (allenap) wrote :

> "twisted.python.log" is not helpful in anyway.

I agree but let's fix this in a subsequent branch; there are several other such bits that need cleaning up. Thanks for the review!

Revision history for this message
MAAS Lander (maas-lander) wrote :
Download full text (32.5 KiB)

The attempt to merge lp:~allenap/maas/overhaul-logging-more-03 into lp:maas failed. Below is the output from the failed tests.

Hit:1 http://security.ubuntu.com/ubuntu xenial-security InRelease
Hit:2 http://prodstack-zone-2.clouds.archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://prodstack-zone-2.clouds.archive.ubuntu.com/ubuntu xenial-updates InRelease [95.7 kB]
Get:4 http://prodstack-zone-2.clouds.archive.ubuntu.com/ubuntu xenial-backports InRelease [92.2 kB]
Get:5 http://prodstack-zone-2.clouds.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [416 kB]
Get:6 http://prodstack-zone-2.clouds.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [356 kB]
Fetched 960 kB in 0s (986 kB/s)
Reading package lists...
sudo DEBIAN_FRONTEND=noninteractive apt-get -y \
    --no-install-recommends install apache2 archdetect-deb authbind avahi-utils bash bind9 bind9utils build-essential bzr bzr-builddeb chromium-browser chromium-chromedriver curl daemontools debhelper dh-apport dh-systemd distro-info dnsutils firefox freeipmi-tools git gjs ipython isc-dhcp-common isc-dhcp-server libjs-angularjs libjs-jquery libjs-jquery-hotkeys libjs-yui3-full libjs-yui3-min libpq-dev make nodejs-legacy npm postgresql pxelinux python3-all python3-apt python3-attr python3-bson python3-convoy python3-crochet python3-cssselect python3-curtin python3-dev python3-distro-info python3-django python3-django-nose python3-django-piston3 python3-dnspython python3-docutils python3-formencode python3-hivex python3-httplib2 python3-jinja2 python3-jsonschema python3-lxml python3-netaddr python3-netifaces python3-novaclient python3-oauth python3-oauthlib python3-openssl python3-paramiko python3-petname python3-pexpect python3-psycopg2 python3-pyinotify python3-pyparsing python3-pyvmomi python3-requests python3-seamicroclient python3-setuptools python3-simplestreams python3-sphinx python3-tempita python3-twisted python3-txtftp python3-tz python3-yaml python3-zope.interface python-bson python-crochet python-django python-django-piston python-djorm-ext-pgarray python-formencode python-lxml python-netaddr python-netifaces python-pocket-lint python-psycopg2 python-simplejson python-tempita python-twisted python-yaml socat syslinux-common tgt ubuntu-cloudimage-keyring wget xvfb
Reading package lists...
Building dependency tree...
Reading state information...
authbind is already the newest version (2.1.1+nmu1).
avahi-utils is already the newest version (0.6.32~rc+dfsg-1ubuntu2).
build-essential is already the newest version (12.1ubuntu2).
debhelper is already the newest version (9.20160115ubuntu3).
distro-info is already the newest version (0.14build1).
freeipmi-tools is already the newest version (1.4.11-1ubuntu1).
git is already the newest version (1:2.7.4-0ubuntu1).
libjs-angularjs is already the newest version (1.2.28-1ubuntu2).
libjs-jquery is already the newest version (1.11.3+dfsg-4).
libjs-yui3-full is already the newest version (3.5.1-1ubuntu3).
libjs-yui3-min is already the newest version (3.5.1-1ubuntu3).
make is already the newest version (4.1-6).
postgresql is already the newest version (9.5+173).
pxelinux is already the newest version (3:6.03+dfsg-11ubun...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/bootresources.py'
2--- src/maasserver/bootresources.py 2016-10-12 15:26:17 +0000
3+++ src/maasserver/bootresources.py 2016-11-01 16:47:02 +0000
4@@ -88,7 +88,10 @@
5 )
6 from provisioningserver.import_images.keyrings import write_all_keyrings
7 from provisioningserver.import_images.product_mapping import map_products
8-from provisioningserver.logger import get_maas_logger
9+from provisioningserver.logger import (
10+ get_maas_logger,
11+ LegacyLogger,
12+)
13 from provisioningserver.rpc.cluster import (
14 ListBootImages,
15 ListBootImagesV2,
16@@ -116,11 +119,11 @@
17 inlineCallbacks,
18 )
19 from twisted.protocols.amp import UnhandledCommand
20-from twisted.python import log
21 from twisted.python.failure import Failure
22
23
24 maaslog = get_maas_logger("bootresources")
25+log = LegacyLogger()
26
27 # Used by maasserver.middleware.AccessMiddleware to allow
28 # anonymous access to the simplestreams endpoint.
29
30=== modified file 'src/maasserver/clusterrpc/boot_images.py'
31--- src/maasserver/clusterrpc/boot_images.py 2016-05-06 09:28:28 +0000
32+++ src/maasserver/clusterrpc/boot_images.py 2016-11-01 16:47:02 +0000
33@@ -30,6 +30,7 @@
34 from maasserver.utils import async
35 from maasserver.utils.orm import transactional
36 from maasserver.utils.threads import deferToDatabase
37+from provisioningserver.logger import LegacyLogger
38 from provisioningserver.rpc.cluster import (
39 ImportBootImages,
40 IsImportBootImagesRunning,
41@@ -48,10 +49,12 @@
42 DeferredSemaphore,
43 )
44 from twisted.protocols.amp import UnhandledCommand
45-from twisted.python import log
46 from twisted.python.failure import Failure
47
48
49+log = LegacyLogger()
50+
51+
52 def suppress_failures(responses):
53 """Suppress failures returning from an async/gather operation.
54
55
56=== modified file 'src/maasserver/dhcp.py'
57--- src/maasserver/dhcp.py 2016-10-12 15:26:17 +0000
58+++ src/maasserver/dhcp.py 2016-11-01 16:47:02 +0000
59@@ -53,6 +53,7 @@
60 IPNetwork,
61 )
62 from provisioningserver.dhcp.omshell import generate_omapi_key
63+from provisioningserver.logger import LegacyLogger
64 from provisioningserver.rpc.cluster import (
65 ConfigureDHCPv4,
66 ConfigureDHCPv4_V2,
67@@ -73,7 +74,9 @@
68 )
69 from twisted.internet.defer import inlineCallbacks
70 from twisted.protocols import amp
71-from twisted.python import log
72+
73+
74+log = LegacyLogger()
75
76
77 def get_omapi_key():
78@@ -562,14 +565,14 @@
79 config = get_dhcp_configure_for(
80 4, rack_controller, vlan, subnets_v4, ntp_servers,
81 default_domain, dhcp_snippets)
82- except DHCPConfigurationError as e:
83+ except DHCPConfigurationError:
84 # XXX bug #1602412: this silently breaks DHCPv4, but we cannot
85 # allow it to crash here since DHCPv6 might be able to run.
86 # This error may be irrelevant if there is an IPv4 network in
87 # the MAAS model which is not configured on the rack, and the
88 # user only wants to serve DHCPv6. But it is still something
89 # worth noting, so log it and continue.
90- log.err(e)
91+ log.err(None, "Failure configuring DHCPv4.")
92 else:
93 failover_peer, subnets, hosts, interface = config
94 if failover_peer is not None:
95@@ -586,14 +589,14 @@
96 config = get_dhcp_configure_for(
97 6, rack_controller, vlan, subnets_v6,
98 ntp_servers, default_domain, dhcp_snippets)
99- except DHCPConfigurationError as e:
100+ except DHCPConfigurationError:
101 # XXX bug #1602412: this silently breaks DHCPv6, but we cannot
102 # allow it to crash here since DHCPv4 might be able to run.
103 # This error may be irrelevant if there is an IPv6 network in
104 # the MAAS model which is not configured on the rack, and the
105 # user only wants to serve DHCPv4. But it is still something
106 # worth noting, so log it and continue.
107- log.err(e)
108+ log.err(None, "Failure configuring DHCPv6.")
109 else:
110 failover_peer, subnets, hosts, interface = config
111 if failover_peer is not None:
112
113=== modified file 'src/maasserver/dns/publication.py'
114--- src/maasserver/dns/publication.py 2016-04-29 20:16:40 +0000
115+++ src/maasserver/dns/publication.py 2016-11-01 16:47:02 +0000
116@@ -16,12 +16,15 @@
117 from maasserver.models.dnspublication import DNSPublication
118 from maasserver.utils.orm import transactional
119 from maasserver.utils.threads import deferToDatabase
120+from provisioningserver.logger import LegacyLogger
121 from provisioningserver.utils.twisted import callOut
122 from pytz import UTC
123 from twisted.application.service import Service
124 from twisted.internet import reactor
125 from twisted.internet.task import LoopingCall
126-from twisted.python import log
127+
128+
129+log = LegacyLogger()
130
131
132 class DNSPublicationGarbageService(Service):
133
134=== modified file 'src/maasserver/models/largefile.py'
135--- src/maasserver/models/largefile.py 2016-07-30 01:17:54 +0000
136+++ src/maasserver/models/largefile.py 2016-11-01 16:47:02 +0000
137@@ -26,12 +26,15 @@
138 transactional,
139 )
140 from maasserver.utils.threads import deferToDatabase
141+from provisioningserver.logger import LegacyLogger
142 from provisioningserver.utils.twisted import (
143 asynchronous,
144 FOREVER,
145 )
146 from twisted.internet import reactor
147-from twisted.python import log
148+
149+
150+log = LegacyLogger()
151
152
153 class FileStorageManager(Manager):
154
155=== modified file 'src/maasserver/models/signals/power.py'
156--- src/maasserver/models/signals/power.py 2016-04-23 08:53:54 +0000
157+++ src/maasserver/models/signals/power.py 2016-11-01 16:47:02 +0000
158@@ -18,6 +18,7 @@
159 )
160 from maasserver.utils.signals import SignalsManager
161 from maasserver.utils.threads import deferToDatabase
162+from provisioningserver.logger import LegacyLogger
163 from provisioningserver.rpc.exceptions import UnknownPowerType
164 from provisioningserver.utils.twisted import (
165 asynchronous,
166@@ -26,7 +27,9 @@
167 synchronous,
168 )
169 from twisted.internet import reactor
170-from twisted.python import log
171+
172+
173+log = LegacyLogger()
174
175
176 signals = SignalsManager()
177
178=== modified file 'src/maasserver/plugin.py'
179--- src/maasserver/plugin.py 2016-10-19 17:06:30 +0000
180+++ src/maasserver/plugin.py 2016-11-01 16:47:02 +0000
181@@ -11,6 +11,7 @@
182
183 from maasserver.monkey import add_patches_to_django
184 from provisioningserver import logger
185+from provisioningserver.logger import LegacyLogger
186 from provisioningserver.monkey import add_patches_to_twisted
187 from provisioningserver.utils.debug import (
188 register_sigusr2_thread_dump_handler,
189@@ -18,11 +19,13 @@
190 from twisted.application.service import IServiceMaker
191 from twisted.internet import reactor
192 from twisted.plugin import IPlugin
193-from twisted.python import log
194 from twisted.python.threadable import isInIOThread
195 from zope.interface import implementer
196
197
198+log = LegacyLogger()
199+
200+
201 class Options(logger.VerbosityOptions):
202 """Command-line options for `regiond`."""
203
204
205=== modified file 'src/maasserver/populate_tags.py'
206--- src/maasserver/populate_tags.py 2016-10-12 15:26:17 +0000
207+++ src/maasserver/populate_tags.py 2016-11-01 16:47:02 +0000
208@@ -31,7 +31,10 @@
209 )
210 from maasserver.rpc import getAllClients
211 from maasserver.utils.orm import transactional
212-from provisioningserver.logger import get_maas_logger
213+from provisioningserver.logger import (
214+ get_maas_logger,
215+ LegacyLogger,
216+)
217 from provisioningserver.rpc.cluster import EvaluateTag
218 from provisioningserver.tags import (
219 DEFAULT_BATCH_SIZE,
220@@ -46,10 +49,10 @@
221 )
222 from provisioningserver.utils.xpath import try_match_xpath
223 from twisted.internet.defer import DeferredList
224-from twisted.python import log
225
226
227 maaslog = get_maas_logger("tags")
228+log = LegacyLogger()
229
230
231 # The nsmap that XPath expression must be compiled with. This will
232
233=== modified file 'src/maasserver/rack_controller.py'
234--- src/maasserver/rack_controller.py 2016-07-20 20:27:50 +0000
235+++ src/maasserver/rack_controller.py 2016-11-01 16:47:02 +0000
236@@ -43,6 +43,7 @@
237 from maasserver.models.node import RackController
238 from maasserver.utils.orm import transactional
239 from maasserver.utils.threads import deferToDatabase
240+from provisioningserver.logger import LegacyLogger
241 from provisioningserver.utils.twisted import (
242 asynchronous,
243 callOut,
244@@ -55,7 +56,9 @@
245 maybeDeferred,
246 )
247 from twisted.internet.task import LoopingCall
248-from twisted.python import log
249+
250+
251+log = LegacyLogger()
252
253
254 class RackControllerService(Service):
255
256=== modified file 'src/maasserver/region_controller.py'
257--- src/maasserver/region_controller.py 2016-03-31 20:41:32 +0000
258+++ src/maasserver/region_controller.py 2016-11-01 16:47:02 +0000
259@@ -27,6 +27,7 @@
260 from maasserver.proxyconfig import proxy_update_config
261 from maasserver.utils.orm import transactional
262 from maasserver.utils.threads import deferToDatabase
263+from provisioningserver.logger import LegacyLogger
264 from provisioningserver.utils.twisted import (
265 asynchronous,
266 FOREVER,
267@@ -35,7 +36,9 @@
268 from twisted.internet import reactor
269 from twisted.internet.defer import DeferredList
270 from twisted.internet.task import LoopingCall
271-from twisted.python import log
272+
273+
274+log = LegacyLogger()
275
276
277 class RegionControllerService(Service):
278
279=== modified file 'src/maasserver/regiondservices/active_discovery.py'
280--- src/maasserver/regiondservices/active_discovery.py 2016-09-29 00:15:29 +0000
281+++ src/maasserver/regiondservices/active_discovery.py 2016-11-01 16:47:02 +0000
282@@ -27,13 +27,17 @@
283 with_connection,
284 )
285 from maasserver.utils.threads import deferToDatabase
286+from provisioningserver.logger import LegacyLogger
287 from twisted.application.internet import TimerService
288 from twisted.internet import reactor
289 from twisted.internet.defer import (
290 inlineCallbacks,
291 maybeDeferred,
292 )
293-from twisted.python import log
294+
295+
296+log = LegacyLogger()
297+
298
299 # The check interval serves as somewhat of a throttle; normally, we will
300 # not scan more than once every CHECK_INTERVAL seconds (unless the discovery
301
302=== modified file 'src/maasserver/regiondservices/ntp.py'
303--- src/maasserver/regiondservices/ntp.py 2016-10-03 20:32:26 +0000
304+++ src/maasserver/regiondservices/ntp.py 2016-11-01 16:47:02 +0000
305@@ -15,6 +15,7 @@
306 from maasserver.service_monitor import service_monitor
307 from maasserver.utils.orm import transactional
308 from maasserver.utils.threads import deferToDatabase
309+from provisioningserver.logger import LegacyLogger
310 from provisioningserver.ntp.config import configure_region
311 from provisioningserver.utils.twisted import (
312 callOut,
313@@ -23,7 +24,9 @@
314 from twisted.application.internet import TimerService
315 from twisted.internet.defer import maybeDeferred
316 from twisted.internet.threads import deferToThread
317-from twisted.python import log
318+
319+
320+log = LegacyLogger()
321
322
323 class RegionNetworkTimeProtocolService(TimerService):
324
325=== modified file 'src/maasserver/regiondservices/reverse_dns.py'
326--- src/maasserver/regiondservices/reverse_dns.py 2016-10-20 23:17:48 +0000
327+++ src/maasserver/regiondservices/reverse_dns.py 2016-11-01 16:47:02 +0000
328@@ -15,10 +15,13 @@
329 RegionController,
330 )
331 from maasserver.utils.threads import deferToDatabase
332+from provisioningserver.logger import LegacyLogger
333 from provisioningserver.utils.network import reverseResolve
334 from twisted.application.service import Service
335 from twisted.internet.defer import inlineCallbacks
336-from twisted.python import log
337+
338+
339+log = LegacyLogger()
340
341
342 class ReverseDNSService(Service):
343
344=== modified file 'src/maasserver/regiondservices/service_monitor_service.py'
345--- src/maasserver/regiondservices/service_monitor_service.py 2016-08-19 10:22:29 +0000
346+++ src/maasserver/regiondservices/service_monitor_service.py 2016-11-01 16:47:02 +0000
347@@ -15,10 +15,13 @@
348 from maasserver.utils.orm import transactional
349 from maasserver.utils.threads import deferToDatabase
350 from provisioningserver.config import is_dev_environment
351+from provisioningserver.logger import LegacyLogger
352 from twisted.application.internet import TimerService
353 from twisted.internet import reactor
354 from twisted.internet.defer import inlineCallbacks
355-from twisted.python import log
356+
357+
358+log = LegacyLogger()
359
360
361 class ServiceMonitorService(TimerService, object):
362
363=== modified file 'src/maasserver/rpc/regionservice.py'
364--- src/maasserver/rpc/regionservice.py 2016-10-12 15:26:17 +0000
365+++ src/maasserver/rpc/regionservice.py 2016-11-01 16:47:02 +0000
366@@ -67,6 +67,7 @@
367 AddrConversionError,
368 IPAddress,
369 )
370+from provisioningserver.logger import LegacyLogger
371 from provisioningserver.rpc import (
372 cluster,
373 common,
374@@ -116,9 +117,12 @@
375 from twisted.internet.task import LoopingCall
376 from twisted.internet.threads import deferToThread
377 from twisted.protocols import amp
378-from twisted.python import log
379 from zope.interface import implementer
380
381+
382+log = LegacyLogger()
383+
384+
385 # Number of regiond processes that should be running for a regiond.
386 # XXX blake_r 2016-03-10 bug=1555901: It would be better to determine this
387 # value from systemd or other means instead of hard coding the number.
388@@ -870,7 +874,8 @@
389 super(RegionService, self).startService()
390 self.starting = defer.DeferredList(
391 (self._bindFirst(endpoint_options, self.factory)
392- for endpoint_options in self.endpoints))
393+ for endpoint_options in self.endpoints),
394+ consumeErrors=True)
395
396 def log_failure(failure):
397 if failure.check(defer.CancelledError):
398@@ -903,7 +908,7 @@
399 try:
400 yield conn.transport.loseConnection()
401 except:
402- log.err()
403+ log.err(None, "Failure when closing RPC connection.")
404 yield super(RegionService, self).stopService()
405
406 @asynchronous(timeout=FOREVER)
407
408=== modified file 'src/maasserver/rpc/tests/test_regionservice.py'
409--- src/maasserver/rpc/tests/test_regionservice.py 2016-10-12 15:26:17 +0000
410+++ src/maasserver/rpc/tests/test_regionservice.py 2016-11-01 16:47:02 +0000
411@@ -124,9 +124,7 @@
412 from twisted.internet.interfaces import IStreamServerEndpoint
413 from twisted.internet.protocol import Factory
414 from twisted.internet.task import LoopingCall
415-from twisted.logger import globalLogPublisher
416 from twisted.protocols import amp
417-from twisted.python import log
418 from twisted.python.failure import Failure
419 from twisted.python.reflect import fullyQualifiedName
420 from zope.interface.verify import verifyObject
421@@ -661,19 +659,17 @@
422 endpoints = self.patch(service, "endpoints", [[Mock()]])
423 endpoints[0][0].listen.return_value = fail(exception)
424
425- logged_failures = []
426- self.patch(log, "msg", (
427- lambda failure, **kw: logged_failures.append(failure)))
428-
429 logged_failures_expected = [
430 AfterPreprocessing(
431 (lambda failure: failure.value),
432 Is(exception)),
433 ]
434
435- yield service.startService()
436+ with TwistedLoggerFixture() as logger:
437+ yield service.startService()
438+
439 self.assertThat(
440- logged_failures, MatchesListwise(logged_failures_expected))
441+ logger.failures, MatchesListwise(logged_failures_expected))
442
443 @wait_for_reactor
444 @inlineCallbacks
445@@ -821,12 +817,12 @@
446 # Connection-specific errors are logged.
447 self.assertDocTestMatches(
448 """\
449- Unhandled Error
450+ Failure when closing RPC connection.
451 Traceback (most recent call last):
452 ...
453 builtins.OSError: broken
454 ...
455- Unhandled Error
456+ Failure when closing RPC connection.
457 Traceback (most recent call last):
458 ...
459 builtins.OSError: broken
460@@ -841,8 +837,6 @@
461 exception = ValueError("This is a very naughty boy.")
462 endpoints = self.patch(service, "endpoints", [[Mock()]])
463 endpoints[0][0].listen.return_value = fail(exception)
464- # Suppress logged messages.
465- self.patch(globalLogPublisher, "_observers", [])
466
467 service.startService()
468 # The test is that stopService() succeeds.
469
470=== modified file 'src/maasserver/start_up.py'
471--- src/maasserver/start_up.py 2016-06-21 10:36:38 +0000
472+++ src/maasserver/start_up.py 2016-11-01 16:47:02 +0000
473@@ -27,7 +27,10 @@
474 with_connection,
475 )
476 from maasserver.utils.threads import deferToDatabase
477-from provisioningserver.logger import get_maas_logger
478+from provisioningserver.logger import (
479+ get_maas_logger,
480+ LegacyLogger,
481+)
482 from provisioningserver.utils.twisted import (
483 asynchronous,
484 FOREVER,
485@@ -35,11 +38,11 @@
486 )
487 from twisted.internet import reactor
488 from twisted.internet.defer import inlineCallbacks
489-from twisted.python import log
490
491
492 maaslog = get_maas_logger("start-up")
493 logger = logging.getLogger(__name__)
494+log = LegacyLogger()
495
496
497 @asynchronous(timeout=FOREVER)
498
499=== modified file 'src/maasserver/utils/async.py'
500--- src/maasserver/utils/async.py 2016-09-21 14:14:38 +0000
501+++ src/maasserver/utils/async.py 2016-11-01 16:47:02 +0000
502@@ -15,6 +15,7 @@
503 import threading
504
505 from maasserver.exceptions import IteratorReusedError
506+from provisioningserver.logger import LegacyLogger
507 from provisioningserver.utils.twisted import (
508 asynchronous,
509 FOREVER,
510@@ -27,7 +28,9 @@
511 Deferred,
512 maybeDeferred,
513 )
514-from twisted.python import log
515+
516+
517+log = LegacyLogger()
518
519
520 class UseOnceIterator:
521@@ -118,7 +121,7 @@
522 try:
523 deferred.cancel()
524 except:
525- log.err()
526+ log.err(None, "Failure gathering results.")
527
528 if timeout is None:
529 canceller = None
530@@ -243,12 +246,12 @@
531 @asynchronous
532 def _cancel_in_reactor(hook):
533 hook.addErrback(suppress, CancelledError)
534- hook.addErrback(log.err)
535+ hook.addErrback(log.err, "Failure when cancelling hook.")
536 try:
537 hook.cancel()
538 except:
539 # The canceller has failed. We take a hint from DeferredList here,
540 # by logging the exception and moving on.
541- log.err(_why="Failure when cancelling hook.")
542+ log.err(None, "Failure when cancelling hook.")
543 else:
544 return hook
545
546=== modified file 'src/maasserver/utils/dbtasks.py'
547--- src/maasserver/utils/dbtasks.py 2015-12-01 18:12:59 +0000
548+++ src/maasserver/utils/dbtasks.py 2016-11-01 16:47:02 +0000
549@@ -14,6 +14,7 @@
550 ]
551
552 from maasserver.utils.threads import deferToDatabase
553+from provisioningserver.logger import LegacyLogger
554 from provisioningserver.utils.twisted import (
555 asynchronous,
556 FOREVER,
557@@ -24,7 +25,9 @@
558 DeferredQueue,
559 )
560 from twisted.internet.task import cooperate
561-from twisted.python import log
562+
563+
564+log = LegacyLogger()
565
566
567 class DatabaseTaskAlreadyRunning(Exception):
568
569=== modified file 'src/maasserver/utils/tests/test_async.py'
570--- src/maasserver/utils/tests/test_async.py 2016-09-20 00:55:30 +0000
571+++ src/maasserver/utils/tests/test_async.py 2016-11-01 16:47:02 +0000
572@@ -299,7 +299,7 @@
573 self.assertThat(d, IsFiredDeferred())
574 self.assertDocTestMatches(
575 dedent("""\
576- Unhandled Error
577+ Failure when cancelling hook.
578 Traceback (most recent call last):
579 ...
580 maastesting.factory.TestException#...
581
582=== modified file 'src/maasserver/webapp.py'
583--- src/maasserver/webapp.py 2016-03-28 13:54:47 +0000
584+++ src/maasserver/webapp.py 2016-11-01 16:47:02 +0000
585@@ -19,6 +19,7 @@
586 lookupProtocolForFactory,
587 WebSocketsResource,
588 )
589+from provisioningserver.logger import LegacyLogger
590 from provisioningserver.utils.twisted import (
591 asynchronous,
592 ThreadPoolLimiter,
593@@ -28,10 +29,7 @@
594 defer,
595 reactor,
596 )
597-from twisted.python import (
598- failure,
599- log,
600-)
601+from twisted.python import failure
602 from twisted.web.resource import (
603 ErrorPage,
604 Resource,
605@@ -45,6 +43,9 @@
606 from twisted.web.wsgi import WSGIResource
607
608
609+log = LegacyLogger()
610+
611+
612 class StartPage(ErrorPage, object):
613 def __init__(self):
614 super(StartPage, self).__init__(
615
616=== modified file 'src/maasserver/websockets/handlers/bootresource.py'
617--- src/maasserver/websockets/handlers/bootresource.py 2016-10-17 20:17:10 +0000
618+++ src/maasserver/websockets/handlers/bootresource.py 2016-11-01 16:47:02 +0000
619@@ -57,6 +57,7 @@
620 image_passes_filter,
621 )
622 from provisioningserver.import_images.keyrings import write_all_keyrings
623+from provisioningserver.logger import LegacyLogger
624 from provisioningserver.utils.fs import tempdir
625 from provisioningserver.utils.twisted import (
626 asynchronous,
627@@ -64,7 +65,9 @@
628 FOREVER,
629 )
630 from twisted.internet.defer import Deferred
631-from twisted.python import log
632+
633+
634+log = LegacyLogger()
635
636
637 def get_distro_series_info_row(series):
638
639=== modified file 'src/maasserver/websockets/handlers/machine.py'
640--- src/maasserver/websockets/handlers/machine.py 2016-10-24 17:11:57 +0000
641+++ src/maasserver/websockets/handlers/machine.py 2016-11-01 16:47:02 +0000
642@@ -79,13 +79,12 @@
643 node_prefetch,
644 NodeHandler,
645 )
646-from provisioningserver.logger import get_maas_logger
647+from provisioningserver.logger import LegacyLogger
648 from provisioningserver.rpc.exceptions import UnknownPowerType
649 from provisioningserver.utils.twisted import asynchronous
650-from twisted.python import log
651-
652-
653-maaslog = get_maas_logger("websockets.machine")
654+
655+
656+log = LegacyLogger()
657
658
659 class MachineHandler(NodeHandler):
660
661=== modified file 'src/maasserver/websockets/protocol.py'
662--- src/maasserver/websockets/protocol.py 2016-09-07 15:40:52 +0000
663+++ src/maasserver/websockets/protocol.py 2016-11-01 16:47:02 +0000
664@@ -4,7 +4,8 @@
665 """The MAAS WebSockets protocol."""
666
667 __all__ = [
668- ]
669+ "WebSocketProtocol",
670+]
671
672 from collections import deque
673 from functools import partial
674@@ -29,6 +30,7 @@
675 from maasserver.utils.threads import deferToDatabase
676 from maasserver.websockets import handlers
677 from maasserver.websockets.websockets import STATUSES
678+from provisioningserver.logger import LegacyLogger
679 from provisioningserver.utils import typed
680 from provisioningserver.utils.twisted import (
681 deferred,
682@@ -42,11 +44,13 @@
683 Factory,
684 Protocol,
685 )
686-from twisted.python import log
687 from twisted.python.modules import getModule
688 from twisted.web.server import NOT_DONE_YET
689
690
691+log = LegacyLogger()
692+
693+
694 class MSG_TYPE:
695 #: Request made from client.
696 REQUEST = 0
697@@ -126,8 +130,8 @@
698
699 def loseConnection(self, status, reason):
700 """Close connection with status and reason."""
701- msgFormat = "Closing connection: %(status)r (%(reason)r)"
702- log.msg(format=msgFormat, status=status, reason=reason)
703+ msgFormat = "Closing connection: {status!r} ({reason!r})"
704+ log.debug(msgFormat, status=status, reason=reason)
705 self.transport._receiver._transport.loseConnection(
706 status, reason.encode("utf-8"))
707
708@@ -321,7 +325,7 @@
709 error = failure.getErrorMessage()
710 why = "Error on request (%s) %s.%s: %s" % (
711 request_id, handler._meta.handler_name, method, error)
712- log.err(failure, _why=why)
713+ log.err(failure, why)
714
715 error_msg = {
716 "type": MSG_TYPE.RESPONSE,
717
718=== modified file 'src/maasserver/websockets/tests/test_protocol.py'
719--- src/maasserver/websockets/tests/test_protocol.py 2016-09-14 19:50:53 +0000
720+++ src/maasserver/websockets/tests/test_protocol.py 2016-11-01 16:47:02 +0000
721@@ -40,6 +40,7 @@
722 MockCalledWith,
723 )
724 from maastesting.testcase import MAASTestCase
725+from maastesting.twisted import TwistedLoggerFixture
726 from provisioningserver.refresh.node_info_scripts import LSHW_OUTPUT_NAME
727 from provisioningserver.utils.twisted import synchronous
728 from testtools.matchers import (
729@@ -155,15 +156,15 @@
730
731 def test_loseConnection_writes_to_log(self):
732 protocol, factory = self.make_protocol()
733- mock_log_msg = self.patch_autospec(protocol_module.log, "msg")
734 status = random.randint(1000, 1010)
735 reason = maas_factory.make_name("reason")
736- protocol.loseConnection(status, reason)
737+ with TwistedLoggerFixture() as logger:
738+ protocol.loseConnection(status, reason)
739 self.assertThat(
740- mock_log_msg,
741- MockCalledOnceWith(
742- format="Closing connection: %(status)r (%(reason)r)",
743- status=status, reason=reason))
744+ logger.messages, Equals([
745+ "Closing connection: %(status)r (%(reason)r)"
746+ % dict(status=status, reason=reason),
747+ ]))
748
749 def test_loseConnection_calls_loseConnection_with_status_and_reason(self):
750 protocol, factory = self.make_protocol()
751
752=== modified file 'src/maasserver/websockets/tests/test_websockets.py'
753--- src/maasserver/websockets/tests/test_websockets.py 2016-09-29 16:30:55 +0000
754+++ src/maasserver/websockets/tests/test_websockets.py 2016-11-01 16:47:02 +0000
755@@ -28,13 +28,13 @@
756 WebSocketsTransport,
757 )
758 from maastesting.testcase import MAASTestCase
759+from maastesting.twisted import TwistedLoggerFixture
760 from testtools.matchers import StartsWith
761 from twisted.internet.protocol import (
762 Factory,
763 Protocol,
764 )
765 from twisted.protocols.tls import TLSMemoryBIOProtocol
766-from twisted.python import log
767 from twisted.test.proto_helpers import (
768 AccumulatingProtocol,
769 StringTransportWithDisconnection,
770@@ -396,18 +396,13 @@
771 When a C{CLOSE} frame is received, the protocol closes the connection
772 and logs a message.
773 """
774- loggedMessages = []
775-
776- def logConnectionLostMsg(eventDict):
777- loggedMessages.append(log.textFromEventDict(eventDict))
778-
779- log.addObserver(logConnectionLostMsg)
780-
781- self.protocol.dataReceived(
782- _makeFrame(b"", CONTROLS.CLOSE, True, mask=b"abcd"))
783+ with TwistedLoggerFixture() as logger:
784+ self.protocol.dataReceived(
785+ _makeFrame(b"", CONTROLS.CLOSE, True, mask=b"abcd"))
786 self.assertFalse(self.transport.connected)
787- self.assertEqual(["Closing connection: <STATUSES=NONE>"],
788- loggedMessages)
789+ self.assertEqual(
790+ ["Closing connection: <STATUSES=NONE>"],
791+ logger.messages)
792
793 def test_invalidFrame(self):
794 """
795
796=== modified file 'src/maasserver/websockets/websockets.py'
797--- src/maasserver/websockets/websockets.py 2016-09-30 13:23:30 +0000
798+++ src/maasserver/websockets/websockets.py 2016-11-01 16:47:02 +0000
799@@ -27,10 +27,10 @@
800 Sequence,
801 )
802
803+from provisioningserver.logger import LegacyLogger
804 from provisioningserver.utils import typed
805 from twisted.internet.protocol import Protocol
806 from twisted.protocols.tls import TLSMemoryBIOProtocol
807-from twisted.python import log
808 from twisted.python.constants import (
809 ValueConstant,
810 Values,
811@@ -45,6 +45,9 @@
812 )
813
814
815+log = LegacyLogger()
816+
817+
818 class _WSException(Exception):
819 """
820 Internal exception for control flow inside the WebSockets frame parser.
821@@ -392,7 +395,7 @@
822 Log the new connection and initialize the buffer list.
823 """
824 peer = self.transport.getPeer()
825- log.msg(format="Opening connection with %(peer)s", peer=peer)
826+ log.debug("Opening connection with {peer}", peer=peer)
827 self._buffer = []
828 self._receiver.makeConnection(WebSocketsTransport(self.transport))
829
830@@ -405,10 +408,10 @@
831 if opcode == CONTROLS.CLOSE:
832 # The other side wants us to close.
833 code, reason = data
834- msgFormat = "Closing connection: %(code)r"
835+ msgFormat = "Closing connection: {code!r}"
836 if reason:
837- msgFormat += " (%(reason)r)"
838- log.msg(format=msgFormat, reason=reason, code=code)
839+ msgFormat += " ({reason!r})"
840+ log.debug(msgFormat, reason=reason, code=code)
841
842 # Close the connection.
843 self.transport.loseConnection()
844
845=== modified file 'src/maastesting/testcase.py'
846--- src/maastesting/testcase.py 2016-09-17 20:11:23 +0000
847+++ src/maastesting/testcase.py 2016-11-01 16:47:02 +0000
848@@ -28,11 +28,17 @@
849 MAASTwistedRunTest,
850 )
851 from maastesting.scenarios import WithScenarios
852+from maastesting.twisted import TwistedLoggerFixture
853 from nose.proxy import ResultProxy
854 from nose.tools import nottest
855 import testresources
856 import testtools
857+from testtools.content import (
858+ Content,
859+ UTF8_TEXT,
860+)
861 import testtools.matchers
862+from twisted.logger import formatEventAsClassicLogText
863
864
865 @nottest
866@@ -139,6 +145,13 @@
867 return MAASRunTest
868
869 def setUp(self):
870+ # Capture Twisted logs and add them as a test detail.
871+ twistedLog = self.useFixture(TwistedLoggerFixture())
872+ self.addDetail("Twisted logs", Content(
873+ UTF8_TEXT, lambda: (
874+ formatEventAsClassicLogText(event).encode("utf-8")
875+ for event in twistedLog.events)))
876+
877 self.maybeCheckTableRowCounts()
878 self.maybeCloseDatabaseConnections()
879 super(MAASTestCase, self).setUp()
880
881=== modified file 'src/maastesting/twisted.py'
882--- src/maastesting/twisted.py 2016-10-24 14:01:30 +0000
883+++ src/maastesting/twisted.py 2016-11-01 16:47:02 +0000
884@@ -18,7 +18,10 @@
885 from testtools.deferredruntest import CaptureTwistedLogs
886 from testtools.twistedsupport._deferred import extract_result
887 from twisted.internet import defer
888-from twisted.logger import LogLevel
889+from twisted.logger import (
890+ formatEvent,
891+ LogLevel,
892+)
893 from twisted.python import log
894
895
896@@ -47,17 +50,20 @@
897 super(TwistedLoggerFixture, self).__init__()
898 self.events = []
899
900- def dump(self):
901- """Return all logs as a string."""
902- return "\n---\n".join(
903- log.textFromEventDict(event) for event in self.events)
904+ @property
905+ def messages(self):
906+ """Return a list of events formatted with `t.logger.formatEvent`.
907
908- # For compatibility with fixtures.FakeLogger.
909- output = property(dump)
910+ This returns a list of *strings*, not event dictionaries.
911+ """
912+ return [formatEvent(event) for event in self.events]
913
914 @property
915 def errors(self):
916- """Return events that are at `LogLevel.error` or above."""
917+ """Return a list of events that are at `LogLevel.error` or above.
918+
919+ This returns a list of event *dictionaries*, not strings.
920+ """
921 return [
922 event for event in self.events
923 if "log_level" in event and
924@@ -65,8 +71,34 @@
925 event["log_level"] >= LogLevel.error
926 ]
927
928- def containsError(self):
929- return any(event["isError"] for event in self.events)
930+ @property
931+ def failures(self):
932+ """Return a list of `Failure` instances from events."""
933+
934+ def find_failure(event):
935+ if "failure" in event:
936+ return event["failure"]
937+ elif "log_failure" in event:
938+ return event["log_failure"]
939+ else:
940+ return None
941+
942+ failures = map(find_failure, self.events)
943+ return [failure for failure in failures if failure is not None]
944+
945+ def dump(self):
946+ """Return a string of events formatted with `textFromEventDict`.
947+
948+ This returns a single string, where each log message is separated from
949+ the next by a line containing "---". Formatting is done by Twisted's
950+ *legacy* log machinery, which may or may not differ from the modern
951+ machinery.
952+ """
953+ return "\n---\n".join(
954+ log.textFromEventDict(event) for event in self.events)
955+
956+ # For compatibility with fixtures.FakeLogger.
957+ output = property(dump)
958
959 def setUp(self):
960 super(TwistedLoggerFixture, self).setUp()
961
962=== modified file 'src/provisioningserver/dhcp/detect.py'
963--- src/provisioningserver/dhcp/detect.py 2016-10-05 01:31:22 +0000
964+++ src/provisioningserver/dhcp/detect.py 2016-11-01 16:47:02 +0000
965@@ -22,7 +22,10 @@
966
967 import attr
968 from netaddr import IPAddress
969-from provisioningserver.logger import get_maas_logger
970+from provisioningserver.logger import (
971+ get_maas_logger,
972+ LegacyLogger,
973+)
974 from provisioningserver.utils.dhcp import DHCP
975 from twisted.internet import reactor
976 from twisted.internet.defer import (
977@@ -38,17 +41,11 @@
978 blockingCallFromThread,
979 deferToThread,
980 )
981-from twisted.python import log
982 from twisted.python.failure import Failure
983
984
985-_LOG_SYSTEM = "dhcp.detect"
986-maaslog = get_maas_logger(_LOG_SYSTEM)
987-
988-
989-def _log_msg(*args, **kwargs):
990- """Log to the Twisted logger using a unique `system` name."""
991- log.msg(*args, system=_LOG_SYSTEM, **kwargs)
992+maaslog = get_maas_logger("dhcp.detect")
993+log = LegacyLogger()
994
995
996 def make_dhcp_transaction_id() -> bytes:
997@@ -358,10 +355,10 @@
998 else:
999 offer = DHCP(data)
1000 if not offer.is_valid():
1001- _log_msg(
1002- "Invalid DHCP response received from %s on '%s': "
1003- "%s" % (
1004- address, self.ifname, offer.invalid_reason))
1005+ log.info(
1006+ "Invalid DHCP response received from {address} "
1007+ "on '{ifname}': {reason}", address=address,
1008+ ifname=self.ifname, reason=offer.invalid_reason)
1009 elif offer.packet.xid == xid:
1010 # Offer matches our transaction ID, so check if it has
1011 # a Server Identifier option.
1012@@ -390,7 +387,7 @@
1013 # has already been called.
1014 return None
1015 elif failure.check(DHCPProbeException):
1016- _log_msg("DHCP probe failed. %s" % failure.getErrorMessage())
1017+ log.msg("DHCP probe failed. %s" % failure.getErrorMessage())
1018 elif failure.check(CancelledError):
1019 # Intentionally cancelled; no need to spam the log.
1020 pass
1021@@ -450,9 +447,10 @@
1022 """
1023 servers = yield deferToThread(self.send_requests_and_await_replies)
1024 if len(servers) > 0:
1025- _log_msg(
1026- "External DHCP server(s) discovered on interface '%s': %s"
1027- % (self.ifname, ', '.join(str(server) for server in servers)))
1028+ log.info(
1029+ "External DHCP server(s) discovered on interface '{ifname}': "
1030+ "{servers}", ifname=self.ifname, servers=', '.join(
1031+ str(server) for server in servers))
1032 self.servers = servers
1033
1034 @property
1035
1036=== modified file 'src/provisioningserver/import_images/download_resources.py'
1037--- src/provisioningserver/import_images/download_resources.py 2016-10-12 15:26:17 +0000
1038+++ src/provisioningserver/import_images/download_resources.py 2016-11-01 16:47:02 +0000
1039@@ -17,6 +17,7 @@
1040 get_signing_policy,
1041 maaslog,
1042 )
1043+from provisioningserver.logger import LegacyLogger
1044 from provisioningserver.utils import in_develop_mode
1045 from provisioningserver.utils.shell import call_and_check
1046 from simplestreams.contentsource import FdContentSource
1047@@ -30,7 +31,9 @@
1048 path_from_mirror_url,
1049 products_exdata,
1050 )
1051-from twisted.python import log
1052+
1053+
1054+log = LegacyLogger()
1055
1056
1057 DEFAULT_KEYRING_PATH = "/usr/share/keyrings"
1058
1059=== modified file 'src/provisioningserver/logger/__init__.py'
1060--- src/provisioningserver/logger/__init__.py 2016-10-25 14:00:30 +0000
1061+++ src/provisioningserver/logger/__init__.py 2016-11-01 16:47:02 +0000
1062@@ -51,6 +51,7 @@
1063 __all__ = [
1064 "configure",
1065 "get_maas_logger",
1066+ "LegacyLogger",
1067 "LoggingMode",
1068 "VerbosityOptions",
1069 ]
1070@@ -63,6 +64,7 @@
1071 from provisioningserver.logger._tftp import configure_tftp_logging
1072 from provisioningserver.logger._twisted import (
1073 configure_twisted_logging,
1074+ LegacyLogger,
1075 VerbosityOptions,
1076 )
1077 from provisioningserver.utils import typed
1078
1079=== modified file 'src/provisioningserver/logger/_common.py'
1080--- src/provisioningserver/logger/_common.py 2016-10-25 13:30:27 +0000
1081+++ src/provisioningserver/logger/_common.py 2016-11-01 16:47:02 +0000
1082@@ -100,3 +100,12 @@
1083 asctime=time.strftime(DEFAULT_LOG_FORMAT_DATE, time.localtime()),
1084 name="global", levelname="warn", message=message)
1085 print(message, file=sys.__stdout__, flush=True)
1086+
1087+
1088+def is_dev_environment():
1089+ """Is this the development environment, or production?
1090+
1091+ Lazy import to avoid circular import issues.
1092+ """
1093+ from provisioningserver.config import is_dev_environment
1094+ return is_dev_environment()
1095
1096=== modified file 'src/provisioningserver/logger/_django.py'
1097--- src/provisioningserver/logger/_django.py 2016-10-25 13:30:27 +0000
1098+++ src/provisioningserver/logger/_django.py 2016-11-01 16:47:02 +0000
1099@@ -9,8 +9,8 @@
1100
1101 import warnings
1102
1103-from provisioningserver.config import is_dev_environment
1104 from provisioningserver.logger._common import (
1105+ is_dev_environment,
1106 LoggingMode,
1107 warn_unless,
1108 )
1109
1110=== modified file 'src/provisioningserver/logger/_logging.py'
1111--- src/provisioningserver/logger/_logging.py 2016-10-25 13:36:56 +0000
1112+++ src/provisioningserver/logger/_logging.py 2016-11-01 16:47:02 +0000
1113@@ -12,11 +12,11 @@
1114 import logging.handlers
1115 import sys
1116
1117-from provisioningserver.config import is_dev_environment
1118 from provisioningserver.logger._common import (
1119 DEFAULT_LOG_FORMAT,
1120 DEFAULT_LOG_FORMAT_DATE,
1121 DEFAULT_LOG_VERBOSITY_LEVELS,
1122+ is_dev_environment,
1123 LoggingMode,
1124 )
1125 from provisioningserver.utils import typed
1126
1127=== modified file 'src/provisioningserver/logger/_twisted.py'
1128--- src/provisioningserver/logger/_twisted.py 2016-10-26 08:54:13 +0000
1129+++ src/provisioningserver/logger/_twisted.py 2016-11-01 16:47:02 +0000
1130@@ -185,7 +185,7 @@
1131 return super().__call__(event)
1132
1133
1134-class LegacyLogger:
1135+class LegacyLogger(twistedModern.Logger):
1136 """Looks like a stripped-down `t.p.log` module, logs to a `Logger`.
1137
1138 Use this with code that cannot easily be changed to use `twisted.logger`
1139@@ -193,7 +193,7 @@
1140 """
1141
1142 @classmethod
1143- def install(cls, module, attribute="log", *, observer=None):
1144+ def install(cls, module, attribute="log", *, source=None, observer=None):
1145 """Install a `LegacyLogger` at `module.attribute`.
1146
1147 Warns if `module.attribute` does not exist, but carries on anyway.
1148@@ -201,8 +201,8 @@
1149 :param module: A module (or any other object with assignable
1150 attributes and a `__name__`).
1151 :param attribute: The name of the attribute on `module` to replace.
1152- :param observer: A (modern) logging observer to use. If not specified
1153- the global log publisher will be used.
1154+ :param source: See `Logger.__init__`.
1155+ :param observer: See `Logger.__init__`.
1156 :return: The newly created `LegacyLogger`.
1157 """
1158 replacing = getattr(module, attribute, "<not-found>")
1159@@ -210,14 +210,9 @@
1160 "Legacy logger being installed to replace %r but expected a "
1161 "reference to twisted.python.log module; please investigate!"
1162 % (replacing,)))
1163- modernLogger = twistedModern.Logger(module.__name__, observer=observer)
1164- legacyLogger = cls(modernLogger)
1165- setattr(module, attribute, legacyLogger)
1166- return legacyLogger
1167-
1168- def __init__(self, logger: twistedModern.Logger):
1169- super(LegacyLogger, self).__init__()
1170- self.logger = logger
1171+ logger = cls(module.__name__, source=source, observer=observer)
1172+ setattr(module, attribute, logger)
1173+ return logger
1174
1175 def msg(self, *message, **kwargs):
1176 """Write a message to the log.
1177@@ -228,14 +223,14 @@
1178 """
1179 fmt = " ".join("{_message_%d}" % i for i, _ in enumerate(message))
1180 kwargs.update({"_message_%d" % i: m for i, m in enumerate(message)})
1181- self.logger.info(fmt, **kwargs)
1182+ self.info(fmt, **kwargs)
1183
1184 def err(self, _stuff=None, _why=None, **kwargs):
1185 """Write a failure to the log.
1186
1187 See `twisted.python.log.err`.
1188 """
1189- self.logger.failure("{_why}", _stuff, _why=_why, **kwargs)
1190+ self.failure("{_why}", _stuff, _why=_why, **kwargs)
1191
1192
1193 class VerbosityOptions(usage.Options):
1194
1195=== modified file 'src/provisioningserver/logger/tests/test__twisted.py'
1196--- src/provisioningserver/logger/tests/test__twisted.py 2016-10-26 09:12:47 +0000
1197+++ src/provisioningserver/logger/tests/test__twisted.py 2016-11-01 16:47:02 +0000
1198@@ -261,8 +261,7 @@
1199 def test__logs_messages(self):
1200 events = []
1201 namespace = factory.make_name("namespace")
1202- modern_logger = logger.Logger(namespace, self, events.append)
1203- legacy_logger = LegacyLogger(modern_logger)
1204+ legacy_logger = LegacyLogger(namespace, self, events.append)
1205 message = factory.make_name("message")
1206 keywords = {
1207 factory.make_name("key"): factory.make_name("value")
1208@@ -274,7 +273,7 @@
1209 expected = {
1210 'log_format': Equals('{_message_0}'),
1211 'log_level': Equals(logger.LogLevel.info),
1212- 'log_logger': Is(modern_logger),
1213+ 'log_logger': Is(legacy_logger),
1214 'log_namespace': Equals(namespace),
1215 'log_source': Is(self),
1216 'log_time': IsInstance(float),
1217@@ -292,8 +291,7 @@
1218
1219 def test__logs_multiple_messages(self):
1220 events = []
1221- modern_logger = logger.Logger(observer=events.append)
1222- legacy_logger = LegacyLogger(modern_logger)
1223+ legacy_logger = LegacyLogger(observer=events.append)
1224 messages = [
1225 factory.make_name("message"),
1226 factory.make_name("message"),
1227@@ -317,8 +315,7 @@
1228 def test__logs_errors(self):
1229 events = []
1230 namespace = factory.make_name("namespace")
1231- modern_logger = logger.Logger(namespace, self, events.append)
1232- legacy_logger = LegacyLogger(modern_logger)
1233+ legacy_logger = LegacyLogger(namespace, self, events.append)
1234 message = factory.make_name("message")
1235 exception_type = factory.make_exception_type()
1236 keywords = {
1237@@ -341,7 +338,7 @@
1238 ),
1239 'log_format': Equals('{_why}'),
1240 'log_level': Equals(logger.LogLevel.critical),
1241- 'log_logger': Is(modern_logger),
1242+ 'log_logger': Is(legacy_logger),
1243 'log_namespace': Equals(namespace),
1244 'log_source': Is(self),
1245 'log_time': IsInstance(float),
1246
1247=== modified file 'src/provisioningserver/power/change.py'
1248--- src/provisioningserver/power/change.py 2016-10-25 13:57:02 +0000
1249+++ src/provisioningserver/power/change.py 2016-11-01 16:47:02 +0000
1250@@ -19,7 +19,10 @@
1251 EVENT_TYPES,
1252 send_event_node,
1253 )
1254-from provisioningserver.logger import get_maas_logger
1255+from provisioningserver.logger import (
1256+ get_maas_logger,
1257+ LegacyLogger,
1258+)
1259 from provisioningserver.power import query
1260 from provisioningserver.rpc import getRegionClient
1261 from provisioningserver.rpc.exceptions import (
1262@@ -40,10 +43,10 @@
1263 returnValue,
1264 )
1265 from twisted.internet.task import deferLater
1266-from twisted.python import log
1267
1268
1269 maaslog = get_maas_logger("power")
1270+log = LegacyLogger()
1271
1272
1273 # Timeout for change_power_state(). We set it to 5 minutes by default,
1274
1275=== modified file 'src/provisioningserver/rackdservices/dhcp_probe_service.py'
1276--- src/provisioningserver/rackdservices/dhcp_probe_service.py 2016-10-25 19:10:55 +0000
1277+++ src/provisioningserver/rackdservices/dhcp_probe_service.py 2016-11-01 16:47:02 +0000
1278@@ -12,7 +12,10 @@
1279
1280 from provisioningserver.config import is_dev_environment
1281 from provisioningserver.dhcp.detect import probe_interface
1282-from provisioningserver.logger import get_maas_logger
1283+from provisioningserver.logger import (
1284+ get_maas_logger,
1285+ LegacyLogger,
1286+)
1287 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
1288 from provisioningserver.rpc.region import ReportForeignDHCPServer
1289 from provisioningserver.utils.network import (
1290@@ -30,10 +33,10 @@
1291 )
1292 from twisted.internet.threads import deferToThread
1293 from twisted.protocols.amp import UnhandledCommand
1294-from twisted.python import log
1295
1296
1297 maaslog = get_maas_logger("dhcp.probe")
1298+log = LegacyLogger()
1299
1300
1301 class DHCPProbeService(TimerService):
1302
1303=== modified file 'src/provisioningserver/rackdservices/image_download_service.py'
1304--- src/provisioningserver/rackdservices/image_download_service.py 2016-03-28 13:54:47 +0000
1305+++ src/provisioningserver/rackdservices/image_download_service.py 2016-11-01 16:47:02 +0000
1306@@ -11,7 +11,10 @@
1307 from datetime import timedelta
1308
1309 from provisioningserver.boot import tftppath
1310-from provisioningserver.logger import get_maas_logger
1311+from provisioningserver.logger import (
1312+ get_maas_logger,
1313+ LegacyLogger,
1314+)
1315 from provisioningserver.rpc.boot_images import import_boot_images
1316 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
1317 from provisioningserver.rpc.region import (
1318@@ -29,10 +32,10 @@
1319 returnValue,
1320 )
1321 from twisted.protocols.amp import UnhandledCommand
1322-from twisted.python import log
1323
1324
1325 maaslog = get_maas_logger("boot_image_download_service")
1326+log = LegacyLogger()
1327
1328
1329 class ImageDownloadService(TimerService, object):
1330
1331=== modified file 'src/provisioningserver/rackdservices/node_power_monitor_service.py'
1332--- src/provisioningserver/rackdservices/node_power_monitor_service.py 2016-10-25 13:57:02 +0000
1333+++ src/provisioningserver/rackdservices/node_power_monitor_service.py 2016-11-01 16:47:02 +0000
1334@@ -10,7 +10,10 @@
1335
1336 from datetime import timedelta
1337
1338-from provisioningserver.logger import get_maas_logger
1339+from provisioningserver.logger import (
1340+ get_maas_logger,
1341+ LegacyLogger,
1342+)
1343 from provisioningserver.power.query import query_all_nodes
1344 from provisioningserver.rpc import getRegionClient
1345 from provisioningserver.rpc.exceptions import (
1346@@ -21,10 +24,10 @@
1347 from twisted.application.internet import TimerService
1348 from twisted.internet.defer import inlineCallbacks
1349 from twisted.internet.error import ConnectionDone
1350-from twisted.python import log
1351
1352
1353 maaslog = get_maas_logger("power_monitor_service")
1354+log = LegacyLogger()
1355
1356
1357 class NodePowerMonitorService(TimerService, object):
1358
1359=== modified file 'src/provisioningserver/rackdservices/ntp.py'
1360--- src/provisioningserver/rackdservices/ntp.py 2016-10-04 11:50:27 +0000
1361+++ src/provisioningserver/rackdservices/ntp.py 2016-11-01 16:47:02 +0000
1362@@ -10,6 +10,7 @@
1363 from datetime import timedelta
1364
1365 import attr
1366+from provisioningserver.logger import LegacyLogger
1367 from provisioningserver.ntp.config import configure_rack
1368 from provisioningserver.rpc import exceptions
1369 from provisioningserver.rpc.region import (
1370@@ -24,7 +25,9 @@
1371 maybeDeferred,
1372 )
1373 from twisted.internet.threads import deferToThread
1374-from twisted.python import log
1375+
1376+
1377+log = LegacyLogger()
1378
1379
1380 class RackNetworkTimeProtocolService(TimerService):
1381
1382=== modified file 'src/provisioningserver/rackdservices/service_monitor_service.py'
1383--- src/provisioningserver/rackdservices/service_monitor_service.py 2016-08-19 10:22:29 +0000
1384+++ src/provisioningserver/rackdservices/service_monitor_service.py 2016-11-01 16:47:02 +0000
1385@@ -12,7 +12,10 @@
1386 from datetime import timedelta
1387
1388 from provisioningserver.config import is_dev_environment
1389-from provisioningserver.logger import get_maas_logger
1390+from provisioningserver.logger import (
1391+ get_maas_logger,
1392+ LegacyLogger,
1393+)
1394 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
1395 from provisioningserver.rpc.region import UpdateServices
1396 from provisioningserver.service_monitor import service_monitor
1397@@ -22,10 +25,10 @@
1398 )
1399 from twisted.application.internet import TimerService
1400 from twisted.internet.defer import inlineCallbacks
1401-from twisted.python import log
1402
1403
1404 maaslog = get_maas_logger("service_monitor_service")
1405+log = LegacyLogger()
1406
1407
1408 class ServiceMonitorService(TimerService, object):
1409
1410=== modified file 'src/provisioningserver/rackdservices/tftp.py'
1411--- src/provisioningserver/rackdservices/tftp.py 2016-10-25 13:57:02 +0000
1412+++ src/provisioningserver/rackdservices/tftp.py 2016-11-01 16:47:02 +0000
1413@@ -25,7 +25,10 @@
1414 send_event_node_mac_address,
1415 )
1416 from provisioningserver.kernel_opts import KernelParameters
1417-from provisioningserver.logger import get_maas_logger
1418+from provisioningserver.logger import (
1419+ get_maas_logger,
1420+ LegacyLogger,
1421+)
1422 from provisioningserver.rpc.boot_images import list_boot_images
1423 from provisioningserver.rpc.exceptions import BootConfigNoResponse
1424 from provisioningserver.rpc.region import (
1425@@ -65,11 +68,11 @@
1426 returnValue,
1427 )
1428 from twisted.internet.task import deferLater
1429-from twisted.python import log
1430 from twisted.python.filepath import FilePath
1431
1432
1433 maaslog = get_maas_logger("tftp")
1434+log = LegacyLogger()
1435
1436
1437 def get_boot_image(params):
1438
1439=== modified file 'src/provisioningserver/rpc/boot_images.py'
1440--- src/provisioningserver/rpc/boot_images.py 2016-07-28 16:42:04 +0000
1441+++ src/provisioningserver/rpc/boot_images.py 2016-11-01 16:47:02 +0000
1442@@ -16,6 +16,7 @@
1443 from provisioningserver.boot import tftppath
1444 from provisioningserver.config import ClusterConfiguration
1445 from provisioningserver.import_images import boot_resources
1446+from provisioningserver.logger import LegacyLogger
1447 from provisioningserver.rpc import getRegionClient
1448 from provisioningserver.rpc.region import UpdateLastImageSync
1449 from provisioningserver.utils.env import (
1450@@ -28,7 +29,9 @@
1451 inlineCallbacks,
1452 )
1453 from twisted.internet.threads import deferToThread
1454-from twisted.python import log
1455+
1456+
1457+log = LegacyLogger()
1458
1459
1460 CACHED_BOOT_IMAGES = None
1461
1462=== modified file 'src/provisioningserver/rpc/clusterservice.py'
1463--- src/provisioningserver/rpc/clusterservice.py 2016-10-25 13:57:02 +0000
1464+++ src/provisioningserver/rpc/clusterservice.py 2016-11-01 16:47:02 +0000
1465@@ -40,7 +40,10 @@
1466 from provisioningserver.drivers.power import power_drivers_by_name
1467 from provisioningserver.drivers.power.mscm import probe_and_enlist_mscm
1468 from provisioningserver.drivers.power.msftocs import probe_and_enlist_msftocs
1469-from provisioningserver.logger import get_maas_logger
1470+from provisioningserver.logger import (
1471+ get_maas_logger,
1472+ LegacyLogger,
1473+)
1474 from provisioningserver.power.change import maybe_change_power_state
1475 from provisioningserver.power.query import get_power_state
1476 from provisioningserver.refresh import (
1477@@ -115,22 +118,19 @@
1478 )
1479 from twisted.internet.threads import deferToThread
1480 from twisted.protocols import amp
1481-from twisted.python import log
1482 from twisted.python.failure import Failure
1483 from twisted.python.reflect import fullyQualifiedName
1484 from twisted.web import http
1485 import twisted.web.client
1486-from twisted.web.client import getPage
1487+from twisted.web.client import (
1488+ getPage,
1489+ URI,
1490+)
1491 from zope.interface import implementer
1492
1493-# From python-twisted 15+ changes the name of _URI to URI.
1494-try:
1495- from twisted.web.client import _URI as URI
1496-except ImportError:
1497- from twisted.web.client import URI
1498-
1499
1500 maaslog = get_maas_logger("rpc.cluster")
1501+log = LegacyLogger()
1502
1503
1504 def catch_probe_and_enlist_error(name, failure):
1505@@ -1132,7 +1132,7 @@
1506 log.msg("Event-loop %s (%s:%d): %s" % (
1507 eventloop, host, port, error))
1508 except:
1509- log.err()
1510+ log.err(None, "Failure making new RPC connection.")
1511 else:
1512 break
1513 # Remove connections to event-loops that are no longer
1514
1515=== modified file 'src/provisioningserver/rpc/common.py'
1516--- src/provisioningserver/rpc/common.py 2016-08-19 10:22:29 +0000
1517+++ src/provisioningserver/rpc/common.py 2016-11-01 16:47:02 +0000
1518@@ -13,6 +13,7 @@
1519 from os import getpid
1520 from socket import gethostname
1521
1522+from provisioningserver.logger import LegacyLogger
1523 from provisioningserver.rpc.interfaces import (
1524 IConnection,
1525 IConnectionToRegion,
1526@@ -20,10 +21,12 @@
1527 from provisioningserver.utils.twisted import asynchronous
1528 from twisted.internet.defer import Deferred
1529 from twisted.protocols import amp
1530-from twisted.python import log
1531 from twisted.python.failure import Failure
1532
1533
1534+log = LegacyLogger()
1535+
1536+
1537 class Identify(amp.Command):
1538 """Request the identity of the remote side, e.g. its UUID.
1539
1540
1541=== modified file 'src/provisioningserver/rpc/tests/test_clusterservice.py'
1542--- src/provisioningserver/rpc/tests/test_clusterservice.py 2016-10-20 15:34:08 +0000
1543+++ src/provisioningserver/rpc/tests/test_clusterservice.py 2016-11-01 16:47:02 +0000
1544@@ -650,7 +650,7 @@
1545
1546 self.assertDocTestMatches(
1547 """\
1548- Unhandled Error
1549+ Failure making new RPC connection.
1550 Traceback (most recent call last):
1551 ...
1552 builtins.RuntimeError: Something went wrong.
1553
1554=== modified file 'src/provisioningserver/utils/services.py'
1555--- src/provisioningserver/utils/services.py 2016-10-25 13:57:02 +0000
1556+++ src/provisioningserver/utils/services.py 2016-11-01 16:47:02 +0000
1557@@ -18,7 +18,10 @@
1558 import re
1559
1560 from provisioningserver.config import is_dev_environment
1561-from provisioningserver.logger import get_maas_logger
1562+from provisioningserver.logger import (
1563+ get_maas_logger,
1564+ LegacyLogger,
1565+)
1566 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
1567 from provisioningserver.utils.fs import (
1568 get_maas_provision_command,
1569@@ -46,11 +49,11 @@
1570 )
1571 from twisted.internet.protocol import ProcessProtocol
1572 from twisted.internet.threads import deferToThread
1573-from twisted.python import log
1574 from twisted.python.failure import Failure
1575
1576
1577 maaslog = get_maas_logger("networks.monitor")
1578+log = LegacyLogger()
1579
1580
1581 class JSONPerLineProtocol(ProcessProtocol):
1582
1583=== modified file 'src/provisioningserver/utils/twisted.py'
1584--- src/provisioningserver/utils/twisted.py 2016-10-24 14:36:30 +0000
1585+++ src/provisioningserver/utils/twisted.py 2016-11-01 16:47:02 +0000
1586@@ -52,6 +52,7 @@
1587 import threading
1588
1589 from crochet import run_in_reactor
1590+from provisioningserver.logger import LegacyLogger
1591 from twisted.internet import reactor
1592 from twisted.internet.defer import (
1593 AlreadyCalledError,
1594@@ -66,7 +67,6 @@
1595 from twisted.logger import Logger
1596 from twisted.python import (
1597 context,
1598- log,
1599 threadable,
1600 threadpool,
1601 )
1602@@ -75,6 +75,9 @@
1603 from zope import interface
1604
1605
1606+log = LegacyLogger()
1607+
1608+
1609 undefined = object()
1610 FOREVER = object()
1611 LONGTIME = 60 * 60 * 24 * 7 * 4 # 4 weeks.