Merge ~ack/maas:test-results-limits into maas:master

Proposed by Alberto Donato
Status: Merged
Approved by: Andres Rodriguez
Approved revision: b4315528b23313de21c2d4c6e99343bb94068513
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:test-results-limits
Merge into: maas:master
Diff against target: 477 lines (+231/-108)
4 files modified
src/maasserver/forms/settings.py (+1/-1)
src/maasserver/models/config.py (+1/-1)
src/metadataserver/models/scriptset.py (+24/-23)
src/metadataserver/models/tests/test_scriptset.py (+205/-83)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
MAAS Lander Needs Fixing
Blake Rouse (community) Approve
Review via email: mp+333202@code.launchpad.net

Commit message

LP: #1722665 - apply limits to ScriptResults (per script), not ScriptSets

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/626/console
COMMIT: b738cd0a82d541a9a9cace7d93430963077d9685

review: Needs Fixing
Revision history for this message
Blake Rouse (blake-rouse) :
review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/627/console
COMMIT: 490405b946f610ca0d1aabd56b06e9ac2470b233

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/628/console
COMMIT: ed2ce6761e75475bd91eb308a17be4fc1c05c56e

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: e41e34772f152ba4c98c7b59a839c99ad505b2e3

review: Approve
Revision history for this message
Blake Rouse (blake-rouse) wrote :

I think you can do it removing an unneeded query.

review: Needs Fixing
Revision history for this message
Lee Trager (ltrager) wrote :

This branch doesn't account for Physical block devices. As I describe below this means systems with more then 10 disks will be broken.

While we've agreed to keep storage limits for now I think we should give the user an option to store unlimited results. I would say if max_node_commissioning_results, max_node_testing_results, or max_node_installation_results are set to 0 keep unlimited results.

review: Needs Fixing
Revision history for this message
Lee Trager (ltrager) wrote :

I forgot that we already have code written to property list a scripts full history, accounting for storage devices. You should be able to do something like this

for script_result in new_script_set:
    if len(script_result.history) > limit:
        script_result.history[limit:].delete()

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/639/console
COMMIT: a9e4c84da57f22b7030db252baaf84e1b05900c3

review: Needs Fixing
Revision history for this message
Alberto Donato (ack) wrote :

@Lee updated code to use ScriptResult.history and added a test with block devices

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/652/console
COMMIT: 217ca2dcea0716b392068d62c26e497c41411904

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/653/console
COMMIT: fa8dbb5bbd2b2ce553b74c049f34cc6fda5e811f

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/654/console
COMMIT: a0f101176e116234a245c9a677dab17e1e45d2f4

review: Needs Fixing
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good. I think @ltrager should also take another look before this lands.

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

UNIT TESTS
-b test-results-limits lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/656/console
COMMIT: b4315528b23313de21c2d4c6e99343bb94068513

review: Needs Fixing
Revision history for this message
Lee Trager (ltrager) wrote :

LGTM!

review: Approve

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
index 6673000..e659d0b 100644
--- a/src/maasserver/forms/settings.py
+++ b/src/maasserver/forms/settings.py
@@ -516,7 +516,7 @@ CONFIG_ITEMS = {
516 },516 },
517 },517 },
518 'max_node_installation_results': {518 'max_node_installation_results': {
519 'default': 1,519 'default': 3,
520 'form': forms.IntegerField,520 'form': forms.IntegerField,
521 'form_kwargs': {521 'form_kwargs': {
522 'required': False,522 'required': False,
diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
index c0a7c28..756b17b 100644
--- a/src/maasserver/models/config.py
+++ b/src/maasserver/models/config.py
@@ -100,7 +100,7 @@ def get_default_config():
100 'completed_intro': False,100 'completed_intro': False,
101 'max_node_commissioning_results': 10,101 'max_node_commissioning_results': 10,
102 'max_node_testing_results': 10,102 'max_node_testing_results': 10,
103 'max_node_installation_results': 1,103 'max_node_installation_results': 3,
104 # Notifications.104 # Notifications.
105 'subnet_ip_exhaustion_threshold_count': 16,105 'subnet_ip_exhaustion_threshold_count': 16,
106 'http_boot': True,106 'http_boot': True,
diff --git a/src/metadataserver/models/scriptset.py b/src/metadataserver/models/scriptset.py
index 493165f..4987e83 100644
--- a/src/metadataserver/models/scriptset.py
+++ b/src/metadataserver/models/scriptset.py
@@ -15,6 +15,7 @@ from django.core.exceptions import (
15from django.db.models import (15from django.db.models import (
16 CASCADE,16 CASCADE,
17 CharField,17 CharField,
18 Count,
18 DateTimeField,19 DateTimeField,
19 ForeignKey,20 ForeignKey,
20 IntegerField,21 IntegerField,
@@ -104,28 +105,6 @@ def translate_result_type(result_type):
104105
105class ScriptSetManager(Manager):106class ScriptSetManager(Manager):
106107
107 def _clean_old(self, node, result_type, new_script_set):
108 # Gather the list of existing script results of the given type for this
109 # node.
110 script_sets = self.filter(node=node, result_type=result_type)
111 # Exclude the newly created script_set so we don't try to remove it.
112 # This can happen when multiple script_sets have last_ping = None.
113 script_sets = script_sets.exclude(id=new_script_set.id)
114 # Sort by last_ping in reverse order so we only remove older entrees.
115 script_sets = script_sets.order_by('last_ping').reverse()
116 config_var = {
117 RESULT_TYPE.COMMISSIONING: 'max_node_commissioning_results',
118 RESULT_TYPE.TESTING: 'max_node_testing_results',
119 RESULT_TYPE.INSTALLATION: 'max_node_installation_results',
120 }
121 script_set_limit = Config.objects.get_config(config_var[result_type])
122 # Remove one from the script_set_limit to account for the newly created
123 # script_set.
124 script_set_limit -= 1
125 if script_sets.count() > script_set_limit:
126 for script_set in script_sets[script_set_limit:]:
127 script_set.delete(force=True)
128
129 def create_commissioning_script_set(self, node, scripts=[], input={}):108 def create_commissioning_script_set(self, node, scripts=[], input={}):
130 """Create a new commissioning ScriptSet with ScriptResults109 """Create a new commissioning ScriptSet with ScriptResults
131110
@@ -140,7 +119,6 @@ class ScriptSetManager(Manager):
140 script_set = self.create(119 script_set = self.create(
141 node=node, result_type=RESULT_TYPE.COMMISSIONING,120 node=node, result_type=RESULT_TYPE.COMMISSIONING,
142 power_state_before_transition=node.power_state)121 power_state_before_transition=node.power_state)
143 self._clean_old(node, RESULT_TYPE.COMMISSIONING, script_set)
144122
145 for script_name, data in NODE_INFO_SCRIPTS.items():123 for script_name, data in NODE_INFO_SCRIPTS.items():
146 if node.is_controller and not data['run_on_controller']:124 if node.is_controller and not data['run_on_controller']:
@@ -149,6 +127,8 @@ class ScriptSetManager(Manager):
149 script_set=script_set, status=SCRIPT_STATUS.PENDING,127 script_set=script_set, status=SCRIPT_STATUS.PENDING,
150 script_name=script_name)128 script_name=script_name)
151129
130 self._clean_old(node, RESULT_TYPE.COMMISSIONING, script_set)
131
152 # MAAS doesn't run custom commissioning scripts during controller132 # MAAS doesn't run custom commissioning scripts during controller
153 # refresh.133 # refresh.
154 if node.is_controller:134 if node.is_controller:
@@ -242,6 +222,27 @@ class ScriptSetManager(Manager):
242 self._clean_old(node, RESULT_TYPE.INSTALLATION, script_set)222 self._clean_old(node, RESULT_TYPE.INSTALLATION, script_set)
243 return script_set223 return script_set
244224
225 def _clean_old(self, node, result_type, new_script_set):
226 config_var = {
227 RESULT_TYPE.COMMISSIONING: 'max_node_commissioning_results',
228 RESULT_TYPE.TESTING: 'max_node_testing_results',
229 RESULT_TYPE.INSTALLATION: 'max_node_installation_results',
230 }
231 limit = Config.objects.get_config(config_var[result_type])
232
233 for script_result in new_script_set.scriptresult_set.all():
234 first_to_delete = script_result.history.order_by(
235 '-id')[limit:limit + 1].first()
236 if first_to_delete is not None:
237 script_result.history.filter(
238 pk__lte=first_to_delete.pk).delete()
239
240 # delete empty ScriptSets
241 empty_scriptsets = ScriptSet.objects.annotate(
242 results_count=Count('scriptresult')).filter(
243 node=node, results_count=0)
244 empty_scriptsets.delete()
245
245246
246class ScriptSet(CleanSave, Model):247class ScriptSet(CleanSave, Model):
247248
diff --git a/src/metadataserver/models/tests/test_scriptset.py b/src/metadataserver/models/tests/test_scriptset.py
index 80b3918..fff2430 100644
--- a/src/metadataserver/models/tests/test_scriptset.py
+++ b/src/metadataserver/models/tests/test_scriptset.py
@@ -28,6 +28,7 @@ from metadataserver.enum import (
28 SCRIPT_TYPE,28 SCRIPT_TYPE,
29)29)
30from metadataserver.models import (30from metadataserver.models import (
31 ScriptResult,
31 ScriptSet,32 ScriptSet,
32 scriptset as scriptset_module,33 scriptset as scriptset_module,
33)34)
@@ -110,28 +111,6 @@ class TestTranslateResultType(MAASServerTestCase):
110class TestScriptSetManager(MAASServerTestCase):111class TestScriptSetManager(MAASServerTestCase):
111 """Test the ScriptSet manager."""112 """Test the ScriptSet manager."""
112113
113 def test_clean_old_ignores_new_script_set(self):
114 # Make sure the created script_set isn't cleaned up. This can happen
115 # when multiple script_sets last_ping are set to None.
116 script_set_limit = Config.objects.get_config(
117 'max_node_installation_results')
118 node = factory.make_Node()
119 for _ in range(script_set_limit * 2):
120 ScriptSet.objects.create(
121 node=node, result_type=RESULT_TYPE.INSTALLATION,
122 last_ping=None)
123
124 script_set = ScriptSet.objects.create_installation_script_set(node)
125 # If the new script_set was cleaned up this will fail.
126 node.current_installation_script_set = script_set
127 node.save()
128
129 self.assertEquals(
130 script_set_limit,
131 ScriptSet.objects.filter(
132 node=node,
133 result_type=RESULT_TYPE.INSTALLATION).count())
134
135 def test_create_commissioning_script_set(self):114 def test_create_commissioning_script_set(self):
136 custom_scripts = [115 custom_scripts = [
137 factory.make_Script(script_type=SCRIPT_TYPE.COMMISSIONING)116 factory.make_Script(script_type=SCRIPT_TYPE.COMMISSIONING)
@@ -220,36 +199,79 @@ class TestScriptSetManager(MAASServerTestCase):
220 node.power_state, script_set.power_state_before_transition)199 node.power_state, script_set.power_state_before_transition)
221200
222 def test_create_commissioning_script_set_cleans_up_past_limit(self):201 def test_create_commissioning_script_set_cleans_up_past_limit(self):
223 script_set_limit = Config.objects.get_config(202 limit = Config.objects.get_config('max_node_commissioning_results')
224 'max_node_commissioning_results')
225 node = factory.make_Node()203 node = factory.make_Node()
226 for _ in range(script_set_limit * 2):204 for i in range(limit + 2):
227 factory.make_ScriptSet(205 ScriptSet.objects.create_commissioning_script_set(node)
228 node=node, result_type=RESULT_TYPE.COMMISSIONING)206
229207 for script_name in NODE_INFO_SCRIPTS:
230 ScriptSet.objects.create_commissioning_script_set(node)208 self.assertEqual(
231209 limit,
232 self.assertEquals(210 ScriptResult.objects.filter(script_name=script_name).count())
233 script_set_limit,211
234 ScriptSet.objects.filter(212 def test_create_commissioning_script_set_cleans_up_by_node(self):
235 node=node,213 limit = Config.objects.get_config('max_node_commissioning_results')
236 result_type=RESULT_TYPE.COMMISSIONING).count())214 node1 = factory.make_Node()
215 node2 = factory.make_Node()
216 for i in range(limit + 2):
217 ScriptSet.objects.create_commissioning_script_set(node1)
218 ScriptSet.objects.create_commissioning_script_set(node2)
219
220 for script_name in NODE_INFO_SCRIPTS:
221 self.assertEqual(
222 limit,
223 ScriptResult.objects.filter(
224 script_name=script_name,
225 script_set__in=ScriptSet.objects.filter(
226 node=node1)).count())
227 self.assertEqual(
228 limit,
229 ScriptResult.objects.filter(
230 script_name=script_name,
231 script_set__in=ScriptSet.objects.filter(
232 node=node2)).count())
237233
238 def test_create_commissioning_script_set_cleans_up_current(self):234 def test_create_commissioning_script_set_cleans_up_current(self):
239 Config.objects.set_config('max_node_commissioning_results', 1)235 Config.objects.set_config('max_node_commissioning_results', 1)
240 node = factory.make_Node()236 node = factory.make_Node()
241 script_set = factory.make_ScriptSet(237
242 node=node, result_type=RESULT_TYPE.COMMISSIONING)238 node.current_commissioning_script_set = (
243 node.current_commissioning_script_set = script_set239 ScriptSet.objects.create_commissioning_script_set(node))
244 node.save()240 node.save()
245241
246 ScriptSet.objects.create_commissioning_script_set(node)242 ScriptSet.objects.create_commissioning_script_set(node)
247243
248 self.assertEquals(244 for script_name in NODE_INFO_SCRIPTS:
249 1,245 self.assertEqual(
246 1,
247 ScriptResult.objects.filter(script_name=script_name).count())
248
249 def test_create_commissioning_script_set_cleans_up_empty_sets(self):
250 Config.objects.set_config('max_node_commissioning_results', 1)
251 node = factory.make_Node()
252 ScriptSet.objects.create_commissioning_script_set(node)
253 script_set = ScriptSet.objects.create_commissioning_script_set(node)
254
255 # the first set is removed since it's empty
256 self.assertCountEqual(
257 [script_set],
250 ScriptSet.objects.filter(258 ScriptSet.objects.filter(
251 node=node,259 result_type=RESULT_TYPE.COMMISSIONING).all())
252 result_type=RESULT_TYPE.COMMISSIONING).count())260
261 def test_create_commissioning_script_set_cleans_up_per_node(self):
262 Config.objects.set_config('max_node_commissioning_results', 1)
263 node1 = factory.make_Node()
264 node2 = factory.make_Node()
265 ScriptSet.objects.create_commissioning_script_set(node1)
266 script_set1 = ScriptSet.objects.create_commissioning_script_set(node1)
267 ScriptSet.objects.create_commissioning_script_set(node2)
268 script_set2 = ScriptSet.objects.create_commissioning_script_set(node2)
269
270 # older sets for each node are removed
271 self.assertCountEqual(
272 [script_set1, script_set2],
273 ScriptSet.objects.filter(
274 result_type=RESULT_TYPE.COMMISSIONING).all())
253275
254 def test_create_commissioning_script_set_accepts_params(self):276 def test_create_commissioning_script_set_accepts_params(self):
255 script = factory.make_Script(277 script = factory.make_Script(
@@ -337,40 +359,102 @@ class TestScriptSetManager(MAASServerTestCase):
337 ScriptSet.objects.create_testing_script_set, node)359 ScriptSet.objects.create_testing_script_set, node)
338360
339 def test_create_testing_script_set_cleans_up_past_limit(self):361 def test_create_testing_script_set_cleans_up_past_limit(self):
340 script_set_limit = Config.objects.get_config(362 limit = Config.objects.get_config('max_node_testing_results')
341 'max_node_testing_results')
342 node = factory.make_Node()363 node = factory.make_Node()
343 for _ in range(script_set_limit * 2):
344 factory.make_ScriptSet(
345 node=node, result_type=RESULT_TYPE.TESTING)
346
347 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)364 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
365 for _ in range(limit + 2):
366 ScriptSet.objects.create_testing_script_set(
367 node, scripts=[script.name])
368 self.assertEqual(
369 limit,
370 ScriptResult.objects.filter(script_name=script.name).count())
371
372 def test_create_testing_script_set_cleans_up_by_node(self):
373 limit = Config.objects.get_config('max_node_testing_results')
374 node1 = factory.make_Node()
375 node2 = factory.make_Node()
376 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
377 for _ in range(limit + 2):
378 ScriptSet.objects.create_testing_script_set(
379 node1, scripts=[script.name])
380 ScriptSet.objects.create_testing_script_set(
381 node2, scripts=[script.name])
382
383 self.assertEqual(
384 limit,
385 ScriptResult.objects.filter(
386 script_set__in=ScriptSet.objects.filter(node=node1)).count())
387 self.assertEqual(
388 limit,
389 ScriptResult.objects.filter(
390 script_set__in=ScriptSet.objects.filter(node=node2)).count())
391
392 def test_create_testing_script_set_cleans_up_by_blockdevice(self):
393 Config.objects.set_config('max_node_testing_results', 1)
394 node = factory.make_Node()
395 for _ in range(2):
396 factory.make_PhysicalBlockDevice(node=node)
397
398 script = factory.make_Script(
399 script_type=SCRIPT_TYPE.TESTING, parameters={
400 'storage': {'type': 'storage'}})
348 ScriptSet.objects.create_testing_script_set(401 ScriptSet.objects.create_testing_script_set(
349 node, scripts=[script.name])402 node, [script.name], {script.name: {'storage': 'all'}})
403 ScriptSet.objects.create_testing_script_set(
404 node, [script.name], {script.name: {'storage': 'all'}})
350405
351 self.assertEquals(406 # one result is kept for each block device
352 script_set_limit,407 self.assertEqual(
353 ScriptSet.objects.filter(408 3,
354 node=node,409 ScriptResult.objects.filter(
355 result_type=RESULT_TYPE.TESTING).count())410 script_set__in=ScriptSet.objects.filter(node=node)).count())
356411
357 def test_create_testing_script_set_cleans_up_current(self):412 def test_create_testing_script_set_cleans_up_current(self):
358 Config.objects.set_config('max_node_testing_results', 1)413 Config.objects.set_config('max_node_testing_results', 1)
414 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
359 node = factory.make_Node()415 node = factory.make_Node()
360 script_set = factory.make_ScriptSet(416 node.current_testing_script_set = (
361 node=node, result_type=RESULT_TYPE.TESTING)417 ScriptSet.objects.create_testing_script_set(
362 node.current_testing_script_set = script_set418 node, scripts=[script.name]))
363 node.save()419 node.save()
364420
365 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
366 ScriptSet.objects.create_testing_script_set(421 ScriptSet.objects.create_testing_script_set(
367 node, scripts=[script.name])422 node, scripts=[script.name])
368423
369 self.assertEquals(424 self.assertEqual(
370 1,425 1,
371 ScriptSet.objects.filter(426 ScriptResult.objects.filter(script_name=script.name).count())
372 node=node,427
373 result_type=RESULT_TYPE.TESTING).count())428 def test_create_testing_script_set_cleans_up_empty_sets(self):
429 Config.objects.set_config('max_node_testing_results', 1)
430 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
431 node = factory.make_Node()
432 ScriptSet.objects.create_testing_script_set(
433 node, scripts=[script.name])
434 script_set = ScriptSet.objects.create_testing_script_set(
435 node, scripts=[script.name])
436 # the first set is removed since it's empty
437 self.assertCountEqual(
438 [script_set],
439 ScriptSet.objects.filter(result_type=RESULT_TYPE.TESTING).all())
440
441 def test_create_testing_script_set_cleans_up_per_node(self):
442 Config.objects.set_config('max_node_testing_results', 1)
443 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
444 node1 = factory.make_Node()
445 node2 = factory.make_Node()
446 ScriptSet.objects.create_testing_script_set(
447 node1, scripts=[script.name])
448 script_set1 = ScriptSet.objects.create_testing_script_set(
449 node1, scripts=[script.name])
450 ScriptSet.objects.create_testing_script_set(
451 node2, scripts=[script.name])
452 script_set2 = ScriptSet.objects.create_testing_script_set(
453 node2, scripts=[script.name])
454 # older sets are removed for each node
455 self.assertCountEqual(
456 [script_set1, script_set2],
457 ScriptSet.objects.filter(result_type=RESULT_TYPE.TESTING).all())
374458
375 def test_create_testing_script_set_accepts_params(self):459 def test_create_testing_script_set_accepts_params(self):
376 script = factory.make_Script(460 script = factory.make_Script(
@@ -410,41 +494,79 @@ class TestScriptSetManager(MAASServerTestCase):
410 self.assertItemsEqual(494 self.assertItemsEqual(
411 [CURTIN_INSTALL_LOG],495 [CURTIN_INSTALL_LOG],
412 [script_result.name for script_result in script_set])496 [script_result.name for script_result in script_set])
413 self.assertEquals(RESULT_TYPE.INSTALLATION, script_set.result_type)497 self.assertEquals(
498 RESULT_TYPE.INSTALLATION, script_set.result_type)
414 self.assertEquals(499 self.assertEquals(
415 node.power_state, script_set.power_state_before_transition)500 node.power_state, script_set.power_state_before_transition)
416501
417 def test_create_installation_script_set_cleans_up_past_limit(self):502 def test_create_installation_script_set_cleans_up_past_limit(self):
418 script_set_limit = Config.objects.get_config(503 limit = Config.objects.get_config('max_node_installation_results')
419 'max_node_installation_results')
420 node = factory.make_Node()504 node = factory.make_Node()
421 for _ in range(script_set_limit * 2):505 for _ in range(limit + 2):
422 factory.make_ScriptSet(506 ScriptSet.objects.create_installation_script_set(node)
423 node=node, result_type=RESULT_TYPE.INSTALLATION)507
424508 self.assertEqual(
425 ScriptSet.objects.create_installation_script_set(node)509 limit,
426510 ScriptResult.objects.filter(
427 self.assertEquals(511 script_name=CURTIN_INSTALL_LOG).count())
428 script_set_limit,512
429 ScriptSet.objects.filter(513 def test_create_installation_script_set_cleans_up_by_node(self):
430 node=node,514 limit = Config.objects.get_config('max_node_installation_results')
431 result_type=RESULT_TYPE.INSTALLATION).count())515 node1 = factory.make_Node()
516 node2 = factory.make_Node()
517 for _ in range(limit + 2):
518 ScriptSet.objects.create_installation_script_set(node1)
519 ScriptSet.objects.create_installation_script_set(node2)
520
521 self.assertEqual(
522 limit,
523 ScriptResult.objects.filter(
524 script_name=CURTIN_INSTALL_LOG,
525 script_set__in=ScriptSet.objects.filter(node=node1)).count())
526 self.assertEqual(
527 limit,
528 ScriptResult.objects.filter(
529 script_name=CURTIN_INSTALL_LOG,
530 script_set__in=ScriptSet.objects.filter(node=node2)).count())
432531
433 def test_create_installation_script_set_cleans_up_current(self):532 def test_create_installation_script_set_cleans_up_current(self):
434 Config.objects.get_config('max_node_installation_results', 1)533 Config.objects.set_config('max_node_installation_results', 1)
435 node = factory.make_Node()534 node = factory.make_Node()
436 script_set = factory.make_ScriptSet(535 node.current_installation_script_set = (
437 node=node, result_type=RESULT_TYPE.INSTALLATION)536 ScriptSet.objects.create_installation_script_set(node))
438 node.current_installation_script_set = script_set
439 node.save()537 node.save()
440538
441 ScriptSet.objects.create_installation_script_set(node)539 ScriptSet.objects.create_installation_script_set(node)
442540
443 self.assertEquals(541 self.assertEqual(
444 1,542 1,
543 ScriptResult.objects.filter(
544 script_name=CURTIN_INSTALL_LOG).count())
545
546 def test_create_installation_script_set_cleans_up_empty_sets(self):
547 Config.objects.set_config('max_node_installation_results', 1)
548 node = factory.make_Node()
549 ScriptSet.objects.create_installation_script_set(node)
550 script_set = ScriptSet.objects.create_installation_script_set(node)
551 # the first set is removed since it's empty
552 self.assertCountEqual(
553 [script_set],
554 ScriptSet.objects.filter(
555 result_type=RESULT_TYPE.INSTALLATION).all())
556
557 def test_create_installation_script_set_cleans_up_per_node(self):
558 Config.objects.set_config('max_node_installation_results', 1)
559 node1 = factory.make_Node()
560 node2 = factory.make_Node()
561 ScriptSet.objects.create_installation_script_set(node1)
562 script_set1 = ScriptSet.objects.create_installation_script_set(node1)
563 ScriptSet.objects.create_installation_script_set(node2)
564 script_set2 = ScriptSet.objects.create_installation_script_set(node2)
565 # older results are deleted by node
566 self.assertCountEqual(
567 [script_set1, script_set2],
445 ScriptSet.objects.filter(568 ScriptSet.objects.filter(
446 node=node,569 result_type=RESULT_TYPE.INSTALLATION).all())
447 result_type=RESULT_TYPE.INSTALLATION).count())
448570
449571
450class TestScriptSet(MAASServerTestCase):572class TestScriptSet(MAASServerTestCase):

Subscribers

People subscribed via source and target branches