Merge ~ltrager/maas:lp1660418 into maas:master

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: aa4e1ce5387f9e27eb3d7d1c616600458194506e
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1660418
Merge into: maas:master
Diff against target: 116 lines (+53/-2)
2 files modified
src/maasserver/forms/__init__.py (+11/-0)
src/maasserver/forms/tests/test_bootresource.py (+42/-2)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+355478@code.launchpad.net

Commit message

LP: #1660418 - Delete new versions of user uploaded BootResources by default.

To post a comment you must log in.
~ltrager/maas:lp1660418 updated
aa4e1ce... by Lee Trager

Update comments

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

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
2index 903c510..773d09c 100644
3--- a/src/maasserver/forms/__init__.py
4+++ b/src/maasserver/forms/__init__.py
5@@ -2301,6 +2301,8 @@ class BootResourceForm(MAASModelForm):
6 content = forms.FileField(
7 label="File", allow_empty_file=False)
8
9+ keep_old = forms.BooleanField(required=False)
10+
11 def __init__(self, *args, **kwargs):
12 super(BootResourceForm, self).__init__(*args, **kwargs)
13 self.set_up_architecture_field()
14@@ -2437,6 +2439,15 @@ class BootResourceForm(MAASModelForm):
15 resource_set = self.create_resource_set(resource, 'uploaded')
16 self.create_resource_file(
17 resource_set, self.cleaned_data)
18+
19+ # LP:1660418 - Delete new versions of user uploaded BootResources to
20+ # avoid duplicated images in the database that are unusable.
21+ if not self.cleaned_data['keep_old']:
22+ old_brfs = BootResourceFile.objects.filter(
23+ resource_set__resource=resource)
24+ old_brfs = old_brfs.exclude(resource_set=resource_set)
25+ old_brfs.delete()
26+
27 return resource
28
29
30diff --git a/src/maasserver/forms/tests/test_bootresource.py b/src/maasserver/forms/tests/test_bootresource.py
31index c716ef4..2b8570c 100644
32--- a/src/maasserver/forms/tests/test_bootresource.py
33+++ b/src/maasserver/forms/tests/test_bootresource.py
34@@ -13,8 +13,14 @@ from maasserver.enum import (
35 BOOT_RESOURCE_TYPE,
36 )
37 from maasserver.forms import BootResourceForm
38-from maasserver.models import BootResource
39-from maasserver.models.signals import bootsources
40+from maasserver.models import (
41+ BootResource,
42+ BootResourceFile,
43+)
44+from maasserver.models.signals import (
45+ bootresourcefiles,
46+ bootsources,
47+)
48 from maasserver.testing.architecture import make_usable_architecture
49 from maasserver.testing.factory import factory
50 from maasserver.testing.testcase import MAASServerTestCase
51@@ -31,6 +37,8 @@ class TestBootResourceForm(MAASServerTestCase):
52 super().setUp()
53 self.addCleanup(bootsources.signals.enable)
54 bootsources.signals.disable()
55+ self.addCleanup(bootresourcefiles.signals.enable)
56+ bootresourcefiles.signals.disable()
57
58 def pick_filetype(self):
59 filetypes = {
60@@ -193,6 +201,7 @@ class TestBootResourceForm(MAASServerTestCase):
61 'name': name,
62 'architecture': architecture,
63 'filetype': upload_type,
64+ 'keep_old': True,
65 }
66 form = BootResourceForm(data=data, files={'content': uploaded_file})
67 self.assertTrue(form.is_valid(), form._errors)
68@@ -260,6 +269,7 @@ class TestBootResourceForm(MAASServerTestCase):
69 'name': name,
70 'architecture': architecture,
71 'filetype': upload_type,
72+ 'keep_old': True,
73 }
74 form = BootResourceForm(data=data, files={'content': uploaded_file})
75 self.assertTrue(form.is_valid(), form._errors)
76@@ -295,6 +305,7 @@ class TestBootResourceForm(MAASServerTestCase):
77 'name': name,
78 'architecture': architecture,
79 'filetype': upload_type,
80+ 'keep_old': True,
81 }
82 form = BootResourceForm(data=data, files={'content': uploaded_file})
83 self.assertTrue(form.is_valid(), form._errors)
84@@ -317,3 +328,32 @@ class TestBootResourceForm(MAASServerTestCase):
85 'name', 'architecture', 'filetype', 'content',
86 ],
87 form.errors.keys())
88+
89+ def test_removes_old_bootresourcefiles(self):
90+ # Regression test for LP:1660418
91+ os = factory.make_name('os')
92+ series = factory.make_name('series')
93+ OperatingSystemRegistry.register_item(os, CustomOS())
94+ self.addCleanup(
95+ OperatingSystemRegistry.unregister_item, os)
96+ name = '%s/%s' % (os, series)
97+ architecture = make_usable_architecture(self)
98+ resource = factory.make_usable_boot_resource(
99+ rtype=BOOT_RESOURCE_TYPE.UPLOADED,
100+ name=name, architecture=architecture)
101+ upload_type, filetype = self.pick_filetype()
102+ size = random.randint(1024, 2048)
103+ content = factory.make_string(size).encode('utf-8')
104+ upload_name = factory.make_name('filename')
105+ uploaded_file = SimpleUploadedFile(content=content, name=upload_name)
106+ data = {
107+ 'name': name,
108+ 'architecture': architecture,
109+ 'filetype': upload_type,
110+ }
111+ form = BootResourceForm(data=data, files={'content': uploaded_file})
112+ self.assertTrue(form.is_valid(), form._errors)
113+ form.save()
114+ self.assertEqual(
115+ 1, BootResourceFile.objects.filter(
116+ resource_set__resource=resource).count())

Subscribers

People subscribed via source and target branches