Merge lp:~mpontillo/maas/remove-batch-key-for-discovery-websocket--bug-1627362 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Rejected
Rejected by: Mike Pontillo
Proposed branch: lp:~mpontillo/maas/remove-batch-key-for-discovery-websocket--bug-1627362
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 112 lines (+36/-6)
4 files modified
src/maasserver/static/js/angular/factories/discoveries.js (+1/-0)
src/maasserver/websockets/base.py (+6/-0)
src/maasserver/websockets/handlers/discovery.py (+3/-3)
src/maasserver/websockets/handlers/tests/test_discovery.py (+26/-3)
To merge this branch: bzr merge lp:~mpontillo/maas/remove-batch-key-for-discovery-websocket--bug-1627362
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+307723@code.launchpad.net

Commit message

Fix batch_key handling for Discovery websocket.

 * Drive-by fix to add missed batch key field to JavaScript side.
   (it was using the default)
 * Use ISO8601 date format in the web socket, so that dates from
   the websocket are in a standard format understood by SQL.
 * Add unit test for batch-listing discoveries.

Description of the change

Wow, just realized this is a poorly named branch, since I didn't end up removing it.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) wrote :

I'm concerned about date+time handling and have some rambling questions, but I don't think they're a blocker for this branch.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/static/js/angular/factories/discoveries.js'
2--- src/maasserver/static/js/angular/factories/discoveries.js 2016-09-22 15:05:38 +0000
3+++ src/maasserver/static/js/angular/factories/discoveries.js 2016-10-05 14:33:56 +0000
4@@ -22,6 +22,7 @@
5 PollingManager.call(this);
6
7 this._pk = "discovery_id";
8+ this._batchKey = "first_seen";
9 this._handler = "discovery";
10
11 // Poll every 10 seconds when its empty as its okay for
12
13=== modified file 'src/maasserver/websockets/base.py'
14--- src/maasserver/websockets/base.py 2016-09-27 00:47:54 +0000
15+++ src/maasserver/websockets/base.py 2016-10-05 14:33:56 +0000
16@@ -28,6 +28,7 @@
17
18
19 DATETIME_FORMAT = "%a, %d %b. %Y %H:%M:%S"
20+DATETIME_FORMAT_ISO8601 = "%Y-%m-%d %H:%M:%S.%f"
21
22
23 def dehydrate_datetime(datetime):
24@@ -35,6 +36,11 @@
25 return datetime.strftime(DATETIME_FORMAT)
26
27
28+def dehydrate_datetime_iso(datetime):
29+ """Convert the `datetime` to string with `DATETIME_FORMAT`."""
30+ return datetime.strftime(DATETIME_FORMAT_ISO8601)
31+
32+
33 class HandlerError(Exception):
34 """Generic exception a handler can raise."""
35
36
37=== modified file 'src/maasserver/websockets/handlers/discovery.py'
38--- src/maasserver/websockets/handlers/discovery.py 2016-09-06 20:31:47 +0000
39+++ src/maasserver/websockets/handlers/discovery.py 2016-10-05 14:33:56 +0000
40@@ -8,7 +8,7 @@
41 ]
42
43 from maasserver.models import Discovery
44-from maasserver.websockets.base import dehydrate_datetime
45+from maasserver.websockets.base import dehydrate_datetime_iso
46 from maasserver.websockets.handlers.viewmodel import ViewModelHandler
47 from provisioningserver.logger import get_maas_logger
48
49@@ -39,7 +39,7 @@
50 return data
51
52 def dehydrate_last_seen(self, datetime):
53- return dehydrate_datetime(datetime)
54+ return dehydrate_datetime_iso(datetime)
55
56 def dehydrate_first_seen(self, datetime):
57- return dehydrate_datetime(datetime)
58+ return dehydrate_datetime_iso(datetime)
59
60=== modified file 'src/maasserver/websockets/handlers/tests/test_discovery.py'
61--- src/maasserver/websockets/handlers/tests/test_discovery.py 2016-09-30 18:07:10 +0000
62+++ src/maasserver/websockets/handlers/tests/test_discovery.py 2016-10-05 14:33:56 +0000
63@@ -14,7 +14,7 @@
64 from maasserver.models.discovery import Discovery
65 from maasserver.testing.factory import factory
66 from maasserver.testing.testcase import MAASServerTestCase
67-from maasserver.websockets.base import dehydrate_datetime
68+from maasserver.websockets.base import dehydrate_datetime_iso
69 from maasserver.websockets.handlers.discovery import DiscoveryHandler
70
71
72@@ -46,8 +46,8 @@
73 "subnet_cidr": discovery.subnet_cidr,
74 "vid": discovery.vid,
75 "vlan": discovery.vlan_id,
76- "first_seen": dehydrate_datetime(discovery.first_seen),
77- "last_seen": dehydrate_datetime(discovery.last_seen)
78+ "first_seen": dehydrate_datetime_iso(discovery.first_seen),
79+ "last_seen": dehydrate_datetime_iso(discovery.last_seen)
80 }
81 return data
82
83@@ -72,6 +72,29 @@
84 expected_discoveries,
85 handler.list({}))
86
87+ def test_list_with_batch_limit(self):
88+ user = factory.make_User()
89+ handler = DiscoveryHandler(user, {})
90+ rack = factory.make_RegionRackController()
91+ rackif = rack.interface_set.first()
92+ for i in range(101):
93+ # Need to vary the creation times, otherwise using the first_seen
94+ # time as the batch key won't work, since they'll all be created
95+ # at the same time. (This won't happen on a production MAAS.)
96+ factory.make_Discovery(
97+ interface=rackif,
98+ created="2016-01-01 00:%02d:%02d" % (i % 60, i / 60))
99+ expected_discoveries = [
100+ self.dehydrate_discovery(discovery, for_list=True)
101+ for discovery in Discovery.objects.all()
102+ ]
103+ batch_key = DiscoveryHandler.Meta.batch_key
104+ first_50 = handler.list({'limit': 50})
105+ next_50 = handler.list({'limit': 50, 'start': first_50[-1][batch_key]})
106+ last_one = handler.list({'limit': 50, 'start': next_50[-1][batch_key]})
107+ self.assertItemsEqual(
108+ expected_discoveries, first_50 + next_50 + last_one)
109+
110 def test_list_orders_by_creation_date(self):
111 user = factory.make_User()
112 handler = DiscoveryHandler(user, {})