Merge ~troyanov/maas:backport-a467133-3.5 into maas:3.5

Proposed by Anton Troyanov
Status: Merged
Approved by: Anton Troyanov
Approved revision: bc3812b4acad8f0d72e497f11fb41efff5a2653e
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~troyanov/maas:backport-a467133-3.5
Merge into: maas:3.5
Diff against target: 164 lines (+146/-0)
3 files modified
src/maasserver/migrations/maasserver/0320_current_script_set_foreign_keys_drop_indexes.py (+48/-0)
src/maasserver/migrations/maasserver/0321_current_script_set_foreign_keys_cleanup.py (+41/-0)
src/maasserver/migrations/maasserver/0322_current_script_set_foreign_keys_readd.py (+57/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Anton Troyanov Approve
Review via email: mp+462787@code.launchpad.net

Commit message

fix: node & current_script_set database integrity

Due to a bug in Django [0] there was no foreign key constraint in the database.
So MAAS had nodes pointing to the current commissioning, installation, testing
and release script set that might have been removed already.

[0] https://code.djangoproject.com/ticket/4930

Resolves LP:2056330

(cherry picked from commit a4671339a2fb5a1124fc2382e208d2518267f645)

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

UNIT TESTS
-b backport-a467133-3.5 lp:~troyanov/maas/+git/maas into -b 3.5 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: bc3812b4acad8f0d72e497f11fb41efff5a2653e

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/migrations/maasserver/0320_current_script_set_foreign_keys_drop_indexes.py b/src/maasserver/migrations/maasserver/0320_current_script_set_foreign_keys_drop_indexes.py
2new file mode 100644
3index 0000000..a13678c
4--- /dev/null
5+++ b/src/maasserver/migrations/maasserver/0320_current_script_set_foreign_keys_drop_indexes.py
6@@ -0,0 +1,48 @@
7+# Generated by Django 3.2.12 on 2024-03-18 15:11
8+
9+from django.db import migrations, models
10+
11+
12+class Migration(migrations.Migration):
13+ dependencies = [
14+ ("maasserver", "0319_merge_0304_and_0318"),
15+ ]
16+
17+ operations = [
18+ migrations.AlterField(
19+ model_name="node",
20+ name="current_commissioning_script_set",
21+ field=models.IntegerField(
22+ blank=True,
23+ db_column="current_commissioning_script_set_id",
24+ null=True,
25+ ),
26+ ),
27+ migrations.AlterField(
28+ model_name="node",
29+ name="current_installation_script_set",
30+ field=models.IntegerField(
31+ blank=True,
32+ db_column="current_installation_script_set_id",
33+ null=True,
34+ ),
35+ ),
36+ migrations.AlterField(
37+ model_name="node",
38+ name="current_testing_script_set",
39+ field=models.IntegerField(
40+ blank=True,
41+ db_column="current_testing_script_set_id",
42+ null=True,
43+ ),
44+ ),
45+ migrations.AlterField(
46+ model_name="node",
47+ name="current_release_script_set",
48+ field=models.IntegerField(
49+ blank=True,
50+ db_column="current_release_script_set_id",
51+ null=True,
52+ ),
53+ ),
54+ ]
55diff --git a/src/maasserver/migrations/maasserver/0321_current_script_set_foreign_keys_cleanup.py b/src/maasserver/migrations/maasserver/0321_current_script_set_foreign_keys_cleanup.py
56new file mode 100644
57index 0000000..a8800d9
58--- /dev/null
59+++ b/src/maasserver/migrations/maasserver/0321_current_script_set_foreign_keys_cleanup.py
60@@ -0,0 +1,41 @@
61+# Generated by Django 3.2.12 on 2024-03-18 15:12
62+
63+from django.db import migrations, models
64+
65+
66+def clean_up_missing_scriptset_links(apps, schema_editor):
67+ """Clean up current_foo_script_set_id that have been removed.
68+
69+ A node points to the current commissioning, installation, testing
70+ and release script set. But since there was no foreign key constraint
71+ in the database, the corresponding script set might have been removed
72+ already.
73+ """
74+ ScriptSet = apps.get_model("maasserver", "ScriptSet")
75+ Node = apps.get_model("maasserver", "Node")
76+ Node.objects.exclude(
77+ current_testing_script_set__isnull=False,
78+ current_testing_script_set__in=ScriptSet.objects.all(),
79+ ).update(current_testing_script_set=None)
80+ Node.objects.exclude(
81+ current_commissioning_script_set__isnull=False,
82+ current_commissioning_script_set__in=ScriptSet.objects.all(),
83+ ).update(current_commissioning_script_set=None)
84+ Node.objects.exclude(
85+ current_installation_script_set__isnull=False,
86+ current_installation_script_set__in=ScriptSet.objects.all(),
87+ ).update(current_installation_script_set=None)
88+ Node.objects.exclude(
89+ current_release_script_set__isnull=False,
90+ current_release_script_set__in=ScriptSet.objects.all(),
91+ ).update(current_release_script_set=None)
92+
93+
94+class Migration(migrations.Migration):
95+ dependencies = [
96+ ("maasserver", "0320_current_script_set_foreign_keys_drop_indexes"),
97+ ]
98+
99+ operations = [
100+ migrations.RunPython(clean_up_missing_scriptset_links),
101+ ]
102diff --git a/src/maasserver/migrations/maasserver/0322_current_script_set_foreign_keys_readd.py b/src/maasserver/migrations/maasserver/0322_current_script_set_foreign_keys_readd.py
103new file mode 100644
104index 0000000..b9327c9
105--- /dev/null
106+++ b/src/maasserver/migrations/maasserver/0322_current_script_set_foreign_keys_readd.py
107@@ -0,0 +1,57 @@
108+# Generated by Django 3.2.12 on 2024-03-18 15:12
109+
110+from django.db import migrations, models
111+import django.db.models.deletion
112+
113+
114+class Migration(migrations.Migration):
115+ dependencies = [
116+ ("maasserver", "0321_current_script_set_foreign_keys_cleanup"),
117+ ]
118+
119+ operations = [
120+ migrations.AlterField(
121+ model_name="node",
122+ name="current_commissioning_script_set",
123+ field=models.ForeignKey(
124+ blank=True,
125+ null=True,
126+ on_delete=django.db.models.deletion.SET_NULL,
127+ related_name="+",
128+ to="maasserver.scriptset",
129+ ),
130+ ),
131+ migrations.AlterField(
132+ model_name="node",
133+ name="current_installation_script_set",
134+ field=models.ForeignKey(
135+ blank=True,
136+ null=True,
137+ on_delete=django.db.models.deletion.SET_NULL,
138+ related_name="+",
139+ to="maasserver.scriptset",
140+ ),
141+ ),
142+ migrations.AlterField(
143+ model_name="node",
144+ name="current_testing_script_set",
145+ field=models.ForeignKey(
146+ blank=True,
147+ null=True,
148+ on_delete=django.db.models.deletion.SET_NULL,
149+ related_name="+",
150+ to="maasserver.scriptset",
151+ ),
152+ ),
153+ migrations.AlterField(
154+ model_name="node",
155+ name="current_release_script_set",
156+ field=models.ForeignKey(
157+ blank=True,
158+ null=True,
159+ on_delete=django.db.models.deletion.SET_NULL,
160+ related_name="+",
161+ to="maasserver.scriptset",
162+ ),
163+ ),
164+ ]

Subscribers

People subscribed via source and target branches