Merge ~bjornt/maas:no-power-check-events into maas:master

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 9f4013c21918afce7fb7e5a8d3e400b05eda50bb
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:no-power-check-events
Merge into: maas:master
Diff against target: 240 lines (+61/-97)
7 files modified
src/maasserver/migrations/maasserver/0187_status_messages_change_event_logging_levels.py (+30/-32)
src/maasserver/migrations/maasserver/0208_no_power_query_events.py (+27/-0)
src/maasserver/models/node.py (+3/-7)
src/maasserver/models/tests/test_node.py (+0/-26)
src/provisioningserver/events.py (+0/-8)
src/provisioningserver/rpc/power.py (+1/-4)
src/provisioningserver/rpc/tests/test_power.py (+0/-20)
Reviewer Review Type Date Requested Status
MAAS Lander Needs Fixing
Alberto Donato Approve
Review via email: mp+384504@code.launchpad.net

Commit message

LP: #1860619 - maasserver_event table grows without bounds

Don't emit an event for querying power and delete them from the
database. It's the only thing we can do for 2.8 to improve the situation
a bit at least.

Long-term we need to think about how to cull the event table
periodically, so that it can't grow too much.

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

+1

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b no-power-check-events lp:~bjornt/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/7583/console
COMMIT: 9f4013c21918afce7fb7e5a8d3e400b05eda50bb

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/migrations/maasserver/0187_status_messages_change_event_logging_levels.py b/src/maasserver/migrations/maasserver/0187_status_messages_change_event_logging_levels.py
2index 57403be..bd68cba 100644
3--- a/src/maasserver/migrations/maasserver/0187_status_messages_change_event_logging_levels.py
4+++ b/src/maasserver/migrations/maasserver/0187_status_messages_change_event_logging_levels.py
5@@ -6,39 +6,37 @@ from logging import DEBUG
6
7 from django.db import migrations
8
9-from provisioningserver.events import EVENT_TYPES
10-
11 CHANGED_EVENTS_INFO_TO_DEBUG = [
12- EVENT_TYPES.NODE_POWERED_ON,
13- EVENT_TYPES.NODE_POWERED_OFF,
14- EVENT_TYPES.NODE_POWER_QUERIED,
15- EVENT_TYPES.NODE_PXE_REQUEST,
16- EVENT_TYPES.NODE_INSTALLATION_FINISHED,
17- EVENT_TYPES.NODE_CHANGED_STATUS,
18- EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING,
19- EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING,
20- EVENT_TYPES.REQUEST_NODE_START_TESTING,
21- EVENT_TYPES.REQUEST_NODE_ABORT_TESTING,
22- EVENT_TYPES.REQUEST_NODE_OVERRIDE_FAILED_TESTING,
23- EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT,
24- EVENT_TYPES.REQUEST_NODE_ACQUIRE,
25- EVENT_TYPES.REQUEST_NODE_ERASE_DISK,
26- EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK,
27- EVENT_TYPES.REQUEST_NODE_RELEASE,
28- EVENT_TYPES.REQUEST_NODE_MARK_FAILED,
29- EVENT_TYPES.REQUEST_NODE_MARK_BROKEN,
30- EVENT_TYPES.REQUEST_NODE_MARK_FIXED,
31- EVENT_TYPES.REQUEST_NODE_LOCK,
32- EVENT_TYPES.REQUEST_NODE_UNLOCK,
33- EVENT_TYPES.REQUEST_NODE_START_DEPLOYMENT,
34- EVENT_TYPES.REQUEST_NODE_START,
35- EVENT_TYPES.REQUEST_NODE_STOP,
36- EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE,
37- EVENT_TYPES.REQUEST_NODE_STOP_RESCUE_MODE,
38- EVENT_TYPES.REQUEST_CONTROLLER_REFRESH,
39- EVENT_TYPES.REQUEST_RACK_CONTROLLER_ADD_CHASSIS,
40- EVENT_TYPES.RACK_IMPORT_INFO,
41- EVENT_TYPES.REGION_IMPORT_INFO,
42+ "NODE_POWERED_ON",
43+ "NODE_POWERED_OFF",
44+ "NODE_POWER_QUERIED",
45+ "NODE_PXE_REQUEST",
46+ "NODE_INSTALLATION_FINISHED",
47+ "NODE_CHANGED_STATUS",
48+ "REQUEST_NODE_START_COMMISSIONING",
49+ "REQUEST_NODE_ABORT_COMMISSIONING",
50+ "REQUEST_NODE_START_TESTING",
51+ "REQUEST_NODE_ABORT_TESTING",
52+ "REQUEST_NODE_OVERRIDE_FAILED_TESTING",
53+ "REQUEST_NODE_ABORT_DEPLOYMENT",
54+ "REQUEST_NODE_ACQUIRE",
55+ "REQUEST_NODE_ERASE_DISK",
56+ "REQUEST_NODE_ABORT_ERASE_DISK",
57+ "REQUEST_NODE_RELEASE",
58+ "REQUEST_NODE_MARK_FAILED",
59+ "REQUEST_NODE_MARK_BROKEN",
60+ "REQUEST_NODE_MARK_FIXED",
61+ "REQUEST_NODE_LOCK",
62+ "REQUEST_NODE_UNLOCK",
63+ "REQUEST_NODE_START_DEPLOYMENT",
64+ "REQUEST_NODE_START",
65+ "REQUEST_NODE_STOP",
66+ "REQUEST_NODE_START_RESCUE_MODE",
67+ "REQUEST_NODE_STOP_RESCUE_MODE",
68+ "REQUEST_CONTROLLER_REFRESH",
69+ "REQUEST_RACK_CONTROLLER_ADD_CHASSIS",
70+ "RACK_IMPORT_INFO",
71+ "REGION_IMPORT_INFO",
72 ]
73
74
75diff --git a/src/maasserver/migrations/maasserver/0208_no_power_query_events.py b/src/maasserver/migrations/maasserver/0208_no_power_query_events.py
76new file mode 100644
77index 0000000..8494baf
78--- /dev/null
79+++ b/src/maasserver/migrations/maasserver/0208_no_power_query_events.py
80@@ -0,0 +1,27 @@
81+# -*- coding: utf-8 -*-
82+# Generated by Django 1.11.11 on 2020-01-14 21:55
83+from __future__ import unicode_literals
84+
85+import collections
86+
87+from django.contrib.postgres.aggregates import ArrayAgg
88+from django.db import migrations
89+from django.db.models import Count
90+
91+
92+def delete_power_query_events(apps, schema_editor):
93+ Event = apps.get_model("maasserver", "Event")
94+ EventType = apps.get_model("maasserver", "EventType")
95+ power_query_event_types = EventType.objects.filter(
96+ name__in=["NODE_POWER_QUERIED_DEBUG", "NODE_POWER_QUERIED"]
97+ )
98+ power_query_events = Event.objects.filter(type__in=power_query_event_types)
99+ power_query_events.delete()
100+ power_query_event_types.delete()
101+
102+
103+class Migration(migrations.Migration):
104+
105+ dependencies = [("maasserver", "0207_notification_dismissable")]
106+
107+ operations = [migrations.RunPython(delete_power_query_events)]
108diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
109index cde4250..7e867cd 100644
110--- a/src/maasserver/models/node.py
111+++ b/src/maasserver/models/node.py
112@@ -5650,14 +5650,10 @@ class Node(CleanSave, TimestampedModel):
113 power_error = (
114 response["error_msg"] if "error_msg" in response else None
115 )
116- # Add event log for success or failure.
117- # Use power_error for failure message.
118 if power_error is None:
119- message = "Power state queried: %s" % power_state
120- Event.objects.create_node_event(
121- self,
122- EVENT_TYPES.NODE_POWER_QUERIED,
123- event_description=message,
124+ log.debug(
125+ f"Power state queried for node {self.system_id}: "
126+ f"{power_state}"
127 )
128 else:
129 Event.objects.create_node_event(
130diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
131index d27487f..d116e5c 100644
132--- a/src/maasserver/models/tests/test_node.py
133+++ b/src/maasserver/models/tests/test_node.py
134@@ -9194,32 +9194,6 @@ class TestNode_PowerQuery(MAASTransactionServerTestCase):
135
136 @wait_for_reactor
137 @defer.inlineCallbacks
138- def test__creates_node_event_with_no_power_error(self):
139- node = yield deferToDatabase(
140- transactional(factory.make_Node), power_state=POWER_STATE.ON
141- )
142- mock_create_node_event = self.patch(Event.objects, "create_node_event")
143- mock_power_control = self.patch(node, "_power_control_node")
144- mock_power_control.return_value = defer.succeed(
145- {"state": POWER_STATE.ON}
146- )
147- observed_state = yield node.power_query()
148-
149- self.assertEqual(POWER_STATE.ON, observed_state)
150- self.assertThat(
151- mock_power_control, MockCalledOnceWith(ANY, power_query, ANY)
152- )
153- self.assertThat(
154- mock_create_node_event,
155- MockCalledOnceWith(
156- node,
157- EVENT_TYPES.NODE_POWER_QUERIED,
158- event_description="Power state queried: %s" % POWER_STATE.ON,
159- ),
160- )
161-
162- @wait_for_reactor
163- @defer.inlineCallbacks
164 def test__creates_node_event_with_power_error(self):
165 node = yield deferToDatabase(
166 transactional(factory.make_Node), power_state=POWER_STATE.ERROR
167diff --git a/src/provisioningserver/events.py b/src/provisioningserver/events.py
168index 20566f2..1a1018a 100644
169--- a/src/provisioningserver/events.py
170+++ b/src/provisioningserver/events.py
171@@ -52,8 +52,6 @@ class EVENT_TYPES:
172 NODE_POWER_ON_FAILED = "NODE_POWER_ON_FAILED"
173 NODE_POWER_OFF_FAILED = "NODE_POWER_OFF_FAILED"
174 NODE_POWER_CYCLE_FAILED = "NODE_POWER_CYCLE_FAILED"
175- NODE_POWER_QUERIED = "NODE_POWER_QUERIED"
176- NODE_POWER_QUERIED_DEBUG = "NODE_POWER_QUERIED_DEBUG"
177 NODE_POWER_QUERY_FAILED = "NODE_POWER_QUERY_FAILED"
178 # PXE request event.
179 NODE_PXE_REQUEST = "NODE_PXE_REQUEST"
180@@ -201,12 +199,6 @@ EVENT_DETAILS = {
181 EVENT_TYPES.NODE_POWER_CYCLE_FAILED: EventDetail(
182 description="Failed to power cycle node", level=ERROR
183 ),
184- EVENT_TYPES.NODE_POWER_QUERIED: EventDetail(
185- description="Queried node's BMC", level=DEBUG
186- ),
187- EVENT_TYPES.NODE_POWER_QUERIED_DEBUG: EventDetail(
188- description="Queried node's BMC", level=DEBUG
189- ),
190 EVENT_TYPES.NODE_POWER_QUERY_FAILED: EventDetail(
191 description="Failed to query node's BMC", level=WARN
192 ),
193diff --git a/src/provisioningserver/rpc/power.py b/src/provisioningserver/rpc/power.py
194index bc8bde4..aac60e6 100644
195--- a/src/provisioningserver/rpc/power.py
196+++ b/src/provisioningserver/rpc/power.py
197@@ -376,11 +376,8 @@ def get_power_state(system_id, hostname, power_type, context, clock=reactor):
198 @inlineCallbacks
199 def power_query_success(system_id, hostname, state):
200 """Report a node that for which power querying has succeeded."""
201- message = "Power state queried: %s" % state
202+ log.debug(f"Power state queried for node {system_id}: {state}")
203 yield power_state_update(system_id, state)
204- yield send_node_event(
205- EVENT_TYPES.NODE_POWER_QUERIED_DEBUG, system_id, hostname, message
206- )
207
208
209 @inlineCallbacks
210diff --git a/src/provisioningserver/rpc/tests/test_power.py b/src/provisioningserver/rpc/tests/test_power.py
211index bc7dd1f..d8a5575 100644
212--- a/src/provisioningserver/rpc/tests/test_power.py
213+++ b/src/provisioningserver/rpc/tests/test_power.py
214@@ -789,26 +789,6 @@ class TestPowerQuery(MAASTestCase):
215 ),
216 )
217
218- def test_power_query_success_emits_event(self):
219- system_id = factory.make_name("system_id")
220- hostname = factory.make_name("hostname")
221- state = factory.make_name("state")
222- message = "Power state queried: %s" % state
223- SendEvent, _, io = self.patch_rpc_methods()
224- d = power.power_query_success(system_id, hostname, state)
225- # This blocks until the deferred is complete.
226- io.flush()
227- self.assertIsNone(extract_result(d))
228- self.assertThat(
229- SendEvent,
230- MockCalledOnceWith(
231- ANY,
232- type_name=EVENT_TYPES.NODE_POWER_QUERIED_DEBUG,
233- system_id=system_id,
234- description=message,
235- ),
236- )
237-
238 def test_get_power_state_queries_node(self):
239 system_id = factory.make_name("system_id")
240 hostname = factory.make_name("hostname")

Subscribers

People subscribed via source and target branches