Merge ~cgrabowski/maas:name_cluster_project_vmhost_uniqueness into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 2075956ed467e48a4b49beb3d155f3688b27e524
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:name_cluster_project_vmhost_uniqueness
Merge into: maas:master
Diff against target: 133 lines (+80/-1)
3 files modified
src/maasserver/migrations/maasserver/0251_auto_20211027_2128.py (+26/-0)
src/maasserver/models/bmc.py (+10/-1)
src/maasserver/models/tests/test_bmc.py (+44/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alexsander de Souza Approve
Review via email: mp+410906@code.launchpad.net

Commit message

change pod name uniqueness to either unqiue or unique within a LXD
project

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

UNIT TESTS
-b name_cluster_project_vmhost_uniqueness lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11378/console
COMMIT: 41bd50d66948f45921863b3a49578e49a162829e

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

UNIT TESTS
-b name_cluster_project_vmhost_uniqueness lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

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

review: Needs Fixing
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

+1

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

UNIT TESTS
-b name_cluster_project_vmhost_uniqueness lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 2075956ed467e48a4b49beb3d155f3688b27e524

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

LANDING
-b name_cluster_project_vmhost_uniqueness lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED BUILD
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11383/consoleText

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

LANDING
-b name_cluster_project_vmhost_uniqueness lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED BUILD
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11385/consoleText

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/migrations/maasserver/0251_auto_20211027_2128.py b/src/maasserver/migrations/maasserver/0251_auto_20211027_2128.py
2new file mode 100644
3index 0000000..78d667d
4--- /dev/null
5+++ b/src/maasserver/migrations/maasserver/0251_auto_20211027_2128.py
6@@ -0,0 +1,26 @@
7+# Generated by Django 2.2.12 on 2021-10-27 21:28
8+
9+from django.db import migrations, models
10+
11+
12+class Migration(migrations.Migration):
13+
14+ dependencies = [
15+ ("maasserver", "0250_node_last_applied_storage_layout"),
16+ ]
17+
18+ operations = [
19+ migrations.AlterField(
20+ model_name="bmc",
21+ name="name",
22+ field=models.CharField(blank=True, default="", max_length=255),
23+ ),
24+ migrations.AddConstraint(
25+ model_name="bmc",
26+ constraint=models.UniqueConstraint(
27+ condition=models.Q(power_parameters__project__exists=False),
28+ fields=("name",),
29+ name="name-unique",
30+ ),
31+ ),
32+ ]
33diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
34index 1b282c7..74d34a3 100644
35--- a/src/maasserver/models/bmc.py
36+++ b/src/maasserver/models/bmc.py
37@@ -25,9 +25,11 @@ from django.db.models import (
38 Manager,
39 ManyToManyField,
40 PROTECT,
41+ Q,
42 SET_DEFAULT,
43 SET_NULL,
44 TextField,
45+ UniqueConstraint,
46 )
47 from django.db.models.query import QuerySet
48 from django.shortcuts import get_object_or_404
49@@ -150,6 +152,13 @@ class BMC(CleanSave, TimestampedModel):
50 # use a HASH index to get around the size limitation on the content of
51 # the indexed object
52 indexes = (HashIndex(fields=("power_parameters",)),)
53+ constraints = [
54+ UniqueConstraint(
55+ name="name-unique",
56+ fields=["name"],
57+ condition=Q(power_parameters__project__exists=False),
58+ ),
59+ ]
60
61 objects = Manager()
62
63@@ -190,7 +199,7 @@ class BMC(CleanSave, TimestampedModel):
64 )
65
66 # Name of the pod.
67- name = CharField(max_length=255, default="", blank=True, unique=True)
68+ name = CharField(max_length=255, default="", blank=True, unique=False)
69
70 version = TextField(default="", blank=True)
71
72diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
73index bc43e9c..b4b89fe 100644
74--- a/src/maasserver/models/tests/test_bmc.py
75+++ b/src/maasserver/models/tests/test_bmc.py
76@@ -11,6 +11,7 @@ from django.core.exceptions import (
77 PermissionDenied,
78 ValidationError,
79 )
80+from django.db import IntegrityError
81 from django.db.models.deletion import ProtectedError
82 from django.http import Http404
83 import petname
84@@ -878,6 +879,49 @@ class PodTestMixin:
85
86
87 class TestPod(MAASServerTestCase, PodTestMixin):
88+ def test_name_project_cluster_uniqueness(self):
89+ user = factory.make_User()
90+ cluster = factory.make_VMCluster(pods=0)
91+ discovered_pod = self.make_discovered_pod()
92+ pod1 = Pod(
93+ power_type="lxd",
94+ power_parameters={"project": factory.make_name("project")},
95+ )
96+ pod1.sync(discovered_pod, user)
97+ pod1.hints.cluster = cluster
98+ pod1.save()
99+ pod2 = Pod(
100+ power_type="lxd",
101+ name=pod1.name,
102+ power_parameters={"project": pod1.power_parameters["project"]},
103+ )
104+ self.assertRaises(IntegrityError, pod2.sync, discovered_pod, user)
105+
106+ def test_name_always_unique_with_no_cluster(self):
107+ pod1 = Pod(power_type="virsh", power_parameters={})
108+ pod1.save()
109+ pod2 = Pod(power_type="virsh", power_parameters={}, name=pod1.name)
110+ self.assertRaises(IntegrityError, pod2.save)
111+
112+ def test_allows_same_name_in_cluster_different_project(self):
113+ cluster = factory.make_VMCluster(pods=0)
114+ discovered = self.make_discovered_pod()
115+ pod1 = Pod(
116+ power_type="lxd",
117+ power_parameters={"project": factory.make_name("project")},
118+ )
119+ pod1.save()
120+ pod1.sync_hints(discovered.hints, cluster=cluster)
121+ pod2 = Pod(
122+ power_type="lxd",
123+ name=pod1.name,
124+ power_parameters={"project": factory.make_name("project")},
125+ )
126+ pod2.save()
127+ pod2.sync_hints(discovered.hints, cluster=cluster)
128+ self.assertEqual(pod1.name, pod2.name)
129+ self.assertEqual(pod1.hints.cluster_id, pod2.hints.cluster_id)
130+
131 def test_create_with_pool(self):
132 pool = ResourcePool.objects.get_default_resource_pool()
133 pod = Pod(power_type="virsh", power_parameters={}, pool=pool)

Subscribers

People subscribed via source and target branches