Merge ~cgrabowski/maas:vmcluster_create_events into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 7d304b855404df84cadf61f0e5813eece8099c9b
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:vmcluster_create_events
Merge into: maas:master
Diff against target: 215 lines (+145/-1)
5 files modified
src/maasserver/triggers/tests/test_init.py (+3/-0)
src/maasserver/triggers/tests/test_websocket_listener.py (+85/-1)
src/maasserver/triggers/websocket.py (+45/-0)
src/maasserver/websockets/handlers/pod.py (+3/-0)
src/maasserver/websockets/handlers/tests/test_pod.py (+9/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alexsander de Souza Approve
Review via email: mp+410826@code.launchpad.net

Commit message

add VMCluster DB triggers

To post a comment you must log in.
e6cfcfd... by Christian Grabowski

add cluster id to pods on the websocket handler

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

UNIT TESTS
-b vmcluster_create_events 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/11371/console
COMMIT: aa7ec790c87a75853c938b130c2add2cd64b8b0b

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

UNIT TESTS
-b vmcluster_create_events 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/11372/console
COMMIT: 1c1dc181652dd736b1ea32ccccfcbe807887e61f

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 vmcluster_create_events 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/11373/console
COMMIT: e6cfcfd38fff75eef6c29fcfccdb839a37c6a3b6

review: Needs Fixing
7d304b8... by Christian Grabowski

update list of triggers for tests

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

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

STATUS: SUCCESS
COMMIT: 7d304b855404df84cadf61f0e5813eece8099c9b

review: Approve

Update scan failed

At least one of the branches involved have failed to scan. You can manually schedule a rescan if required.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/triggers/tests/test_init.py b/src/maasserver/triggers/tests/test_init.py
2index 65b2199..9430110 100644
3--- a/src/maasserver/triggers/tests/test_init.py
4+++ b/src/maasserver/triggers/tests/test_init.py
5@@ -288,6 +288,9 @@ class TestTriggersUsed(MAASServerTestCase):
6 "zone_zone_create_notify",
7 "zone_zone_delete_notify",
8 "zone_zone_update_notify",
9+ "vmcluster_vmcluster_insert_notify",
10+ "vmcluster_vmcluster_update_notify",
11+ "vmcluster_vmcluster_delete_notify",
12 }
13
14 triggers_all = triggers_system | triggers_websocket
15diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py
16index 03739ee..4670063 100644
17--- a/src/maasserver/triggers/tests/test_websocket_listener.py
18+++ b/src/maasserver/triggers/tests/test_websocket_listener.py
19@@ -29,7 +29,13 @@ from maasserver.enum import (
20 NODE_TYPE_CHOICES,
21 )
22 from maasserver.listener import PostgresListenerService
23-from maasserver.models import Config, ControllerInfo, Node, OwnerData
24+from maasserver.models import (
25+ Config,
26+ ControllerInfo,
27+ Node,
28+ OwnerData,
29+ VMCluster,
30+)
31 from maasserver.models.blockdevice import MIN_BLOCK_DEVICE_SIZE
32 from maasserver.models.partition import MIN_PARTITION_SIZE
33 from maasserver.storage_layouts import MIN_BOOT_PARTITION_SIZE
34@@ -4482,6 +4488,84 @@ class TestBMCListener(
35 yield listener.stopService()
36
37
38+class TestVMClusterListener(
39+ MAASTransactionServerTestCase, TransactionalHelpersMixin
40+):
41+ def create_vmcluster(self, values):
42+ return VMCluster.objects.create(**values)
43+
44+ def update_vmcluster(self, filter, values):
45+ return VMCluster.objects.filter(**filter).update(**values)
46+
47+ def delete_vmcluster(self, filter):
48+ VMCluster.objects.filter(**filter).delete()
49+
50+ @wait_for_reactor
51+ @inlineCallbacks
52+ def test_calls_handler_on_create_notification(self):
53+ listener = self.make_listener_without_delay()
54+ dv = DeferredValue()
55+ listener.register("vmcluster", lambda *args: dv.set(args))
56+ yield listener.startService()
57+ try:
58+ cluster = yield deferToDatabase(
59+ self.create_vmcluster,
60+ {
61+ "name": factory.make_name("cluster"),
62+ "project": factory.make_name("project"),
63+ },
64+ )
65+ yield dv.get(timeout=2)
66+ self.assertEqual(("create", str(cluster.id)), dv.value)
67+ finally:
68+ yield listener.stopService()
69+
70+ @wait_for_reactor
71+ @inlineCallbacks
72+ def test_calls_handler_on_update_notification(self):
73+ listener = self.make_listener_without_delay()
74+ dv = DeferredValue()
75+ cluster = yield deferToDatabase(
76+ self.create_vmcluster,
77+ {
78+ "name": factory.make_name("cluster"),
79+ "project": factory.make_name("project"),
80+ },
81+ )
82+ listener.register("vmcluster", lambda *args: dv.set(args))
83+ yield listener.startService()
84+ try:
85+ pool = yield deferToDatabase(factory.make_ResourcePool)
86+ yield deferToDatabase(
87+ self.update_vmcluster, {"id": cluster.id}, {"pool": pool}
88+ )
89+ yield dv.get(timeout=2)
90+ self.assertEqual(("update", str(cluster.id)), dv.value)
91+ finally:
92+ yield listener.stopService()
93+
94+ @wait_for_reactor
95+ @inlineCallbacks
96+ def test_calls_handler_on_delete_notification(self):
97+ listener = self.make_listener_without_delay()
98+ dv = DeferredValue()
99+ cluster = yield deferToDatabase(
100+ self.create_vmcluster,
101+ {
102+ "name": factory.make_name("cluster"),
103+ "project": factory.make_name("project"),
104+ },
105+ )
106+ listener.register("vmcluster", lambda *args: dv.set(args))
107+ yield listener.startService()
108+ try:
109+ yield deferToDatabase(self.delete_vmcluster, {"id": cluster.id})
110+ yield dv.get(timeout=2)
111+ self.assertEqual(("delete", str(cluster.id)), dv.value)
112+ finally:
113+ yield listener.stopService()
114+
115+
116 class TestPodListener(
117 MAASTransactionServerTestCase, TransactionalHelpersMixin
118 ):
119diff --git a/src/maasserver/triggers/websocket.py b/src/maasserver/triggers/websocket.py
120index 429f814..c6666e2 100644
121--- a/src/maasserver/triggers/websocket.py
122+++ b/src/maasserver/triggers/websocket.py
123@@ -105,6 +105,45 @@ TAG_NODES_NOTIFY = dedent(
124 )
125
126
127+# Procedure that is called when a VM cluster is created.
128+VMCLUSTER_INSERT_NOTIFY = dedent(
129+ """\
130+ CREATE OR REPLACE FUNCTION %s() RETURNS trigger AS $$
131+ BEGIN
132+ PERFORM pg_notify('vmcluster_create',CAST(NEW.id AS text));
133+ RETURN NEW;
134+ END;
135+ $$ LANGUAGE plpgsql;
136+ """
137+)
138+
139+
140+# Procedure that is called when a VM cluster is updated
141+VMCLUSTER_UPDATE_NOTIFY = dedent(
142+ """\
143+ CREATE OR REPLACE FUNCTION %s() RETURNS trigger AS $$
144+ BEGIN
145+ PERFORM pg_notify('vmcluster_update',CAST(NEW.id AS text));
146+ RETURN NEW;
147+ END;
148+ $$ LANGUAGE plpgsql;
149+ """
150+)
151+
152+
153+# Procedure that is called when a VM cluster is deleted
154+VMCLUSTER_DELETE_NOTIFY = dedent(
155+ """\
156+ CREATE OR REPLACE FUNCTION %s() RETURNS trigger AS $$
157+ BEGIN
158+ PERFORM pg_notify('vmcluster_delete',CAST(OLD.id as text));
159+ RETURN OLD;
160+ END;
161+ $$ LANGUAGE plpgsql;
162+ """
163+)
164+
165+
166 # Procedure that is called when a pod is created.
167 POD_INSERT_NOTIFY = dedent(
168 """\
169@@ -1863,6 +1902,12 @@ def register_websocket_triggers():
170 "maasserver_iprange", "iprange_subnet", events=EVENTS_IUD
171 )
172
173+ # VMCluster notifications
174+ register_procedure(VMCLUSTER_INSERT_NOTIFY % ("vmcluster_insert_notify"))
175+ register_procedure(VMCLUSTER_UPDATE_NOTIFY % ("vmcluster_update_notify"))
176+ register_procedure(VMCLUSTER_DELETE_NOTIFY % ("vmcluster_delete_notify"))
177+ register_triggers("maasserver_vmcluster", "vmcluster", events=EVENTS_IUD)
178+
179 # Pod notifications
180 register_procedure(POD_INSERT_NOTIFY % ("pod_insert_notify", BMC_TYPE.POD))
181 register_procedure(
182diff --git a/src/maasserver/websockets/handlers/pod.py b/src/maasserver/websockets/handlers/pod.py
183index c1070b6..1f0f11f 100644
184--- a/src/maasserver/websockets/handlers/pod.py
185+++ b/src/maasserver/websockets/handlers/pod.py
186@@ -149,6 +149,9 @@ class PodHandler(TimestampedModelHandler):
187 if self.user.has_perm(PodPermission.compose, obj):
188 data["permissions"].append("compose")
189
190+ if obj.hints.cluster:
191+ data["cluster"] = obj.hints.cluster_id
192+
193 return data
194
195 def dehydrate_storage_pool(self, pool):
196diff --git a/src/maasserver/websockets/handlers/tests/test_pod.py b/src/maasserver/websockets/handlers/tests/test_pod.py
197index f4abb10..67c9ae6 100644
198--- a/src/maasserver/websockets/handlers/tests/test_pod.py
199+++ b/src/maasserver/websockets/handlers/tests/test_pod.py
200@@ -328,6 +328,15 @@ class TestPodHandler(MAASTransactionServerTestCase):
201 result = handler.get({"id": pod.id})
202 self.assertEqual(result["attached_vlans"], [])
203
204+ def test_get_with_cluster(self):
205+ admin = factory.make_admin()
206+ handler = PodHandler(admin, {}, None)
207+ node = factory.make_Node()
208+ cluster = factory.make_VMCluster(pods=0)
209+ pod = factory.make_Pod(cluster=cluster, host=node)
210+ result = handler.get({"id": pod.id})
211+ self.assertEqual(result["cluster"], cluster.id)
212+
213 def test_get_host_interfaces_no_sriov(self):
214 admin = factory.make_admin()
215 handler = PodHandler(admin, {}, None)

Subscribers

People subscribed via source and target branches