Merge lp:~mpontillo/maas/l2-spaces--phase1 into lp:~maas-committers/maas/trunk
- l2-spaces--phase1
- Merge into trunk
Proposed by
Mike Pontillo
Status: | Merged |
---|---|
Approved by: | Mike Pontillo |
Approved revision: | no longer in the source branch. |
Merged at revision: | 5594 |
Proposed branch: | lp:~mpontillo/maas/l2-spaces--phase1 |
Merge into: | lp:~maas-committers/maas/trunk |
Diff against target: |
376 lines (+191/-15) 11 files modified
src/maasserver/api/tests/test_vlans.py (+62/-0) src/maasserver/api/vlans.py (+15/-0) src/maasserver/forms_vlan.py (+22/-11) src/maasserver/migrations/builtin/maasserver/0096_set_default_vlan_field.py (+1/-2) src/maasserver/migrations/builtin/maasserver/0098_add_space_to_vlan.py (+24/-0) src/maasserver/migrations/builtin/maasserver/0099_set_default_vlan_field.py (+24/-0) src/maasserver/models/vlan.py (+4/-0) src/maasserver/static/partials/vlan-details.html (+3/-0) src/maasserver/testing/factory.py (+2/-2) src/maasserver/tests/test_forms_vlan.py (+33/-0) src/maasserver/websockets/handlers/tests/test_vlan.py (+1/-0) |
To merge this branch: | bzr merge lp:~mpontillo/maas/l2-spaces--phase1 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gavin Panella (community) | Approve | ||
Review via email: mp+312563@code.launchpad.net |
Commit message
L2 spaces: Phase 1
* Add 'space' reference to VLAN.
* Fix failing migration due to reference to maasserver.models.
* Allow modification via the Web UI and REST API.
Description of the change
Note: constraints will be done in a future branch.
To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote : | # |
Thanks for the review.
The oddities you pointed out in the diff are not unique to this diff. (That is, I made the new code consistent with code that was already in those files - so I won't go back and tweak those in this MP.)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/maasserver/api/tests/test_vlans.py' | |||
2 | --- src/maasserver/api/tests/test_vlans.py 2016-11-30 21:13:52 +0000 | |||
3 | +++ src/maasserver/api/tests/test_vlans.py 2016-12-06 16:09:53 +0000 | |||
4 | @@ -107,6 +107,50 @@ | |||
5 | 107 | self.assertEqual(mtu, response_data['mtu']) | 107 | self.assertEqual(mtu, response_data['mtu']) |
6 | 108 | self.assertEqual(relay_vlan.vid, response_data['relay_vlan']['vid']) | 108 | self.assertEqual(relay_vlan.vid, response_data['relay_vlan']['vid']) |
7 | 109 | 109 | ||
8 | 110 | def test_create_without_space(self): | ||
9 | 111 | self.become_admin() | ||
10 | 112 | fabric = factory.make_Fabric() | ||
11 | 113 | vlan_name = factory.make_name("fabric") | ||
12 | 114 | vid = random.randint(1, 1000) | ||
13 | 115 | mtu = random.randint(552, 1500) | ||
14 | 116 | uri = get_vlans_uri(fabric) | ||
15 | 117 | response = self.client.post(uri, { | ||
16 | 118 | "name": vlan_name, | ||
17 | 119 | "vid": vid, | ||
18 | 120 | "mtu": mtu, | ||
19 | 121 | }) | ||
20 | 122 | self.assertEqual( | ||
21 | 123 | http.client.OK, response.status_code, response.content) | ||
22 | 124 | response_data = json.loads( | ||
23 | 125 | response.content.decode(settings.DEFAULT_CHARSET)) | ||
24 | 126 | self.assertEqual(vlan_name, response_data['name']) | ||
25 | 127 | self.assertEqual(vid, response_data['vid']) | ||
26 | 128 | self.assertEqual(mtu, response_data['mtu']) | ||
27 | 129 | self.assertEqual(None, response_data['space']) | ||
28 | 130 | |||
29 | 131 | def test_create_with_space(self): | ||
30 | 132 | self.become_admin() | ||
31 | 133 | fabric = factory.make_Fabric() | ||
32 | 134 | vlan_name = factory.make_name("fabric") | ||
33 | 135 | vid = random.randint(1, 1000) | ||
34 | 136 | mtu = random.randint(552, 1500) | ||
35 | 137 | space = factory.make_Space() | ||
36 | 138 | uri = get_vlans_uri(fabric) | ||
37 | 139 | response = self.client.post(uri, { | ||
38 | 140 | "name": vlan_name, | ||
39 | 141 | "vid": vid, | ||
40 | 142 | "mtu": mtu, | ||
41 | 143 | "space": space.id, | ||
42 | 144 | }) | ||
43 | 145 | self.assertEqual( | ||
44 | 146 | http.client.OK, response.status_code, response.content) | ||
45 | 147 | response_data = json.loads( | ||
46 | 148 | response.content.decode(settings.DEFAULT_CHARSET)) | ||
47 | 149 | self.assertEqual(vlan_name, response_data['name']) | ||
48 | 150 | self.assertEqual(vid, response_data['vid']) | ||
49 | 151 | self.assertEqual(mtu, response_data['mtu']) | ||
50 | 152 | self.assertEqual(space.name, response_data['space']) | ||
51 | 153 | |||
52 | 110 | def test_create_admin_only(self): | 154 | def test_create_admin_only(self): |
53 | 111 | fabric = factory.make_Fabric() | 155 | fabric = factory.make_Fabric() |
54 | 112 | vlan_name = factory.make_name("fabric") | 156 | vlan_name = factory.make_name("fabric") |
55 | @@ -176,6 +220,24 @@ | |||
56 | 176 | "resource_uri": Equals(get_vlan_uri(vlan)), | 220 | "resource_uri": Equals(get_vlan_uri(vlan)), |
57 | 177 | })) | 221 | })) |
58 | 178 | 222 | ||
59 | 223 | def test_read_with_space(self): | ||
60 | 224 | space = factory.make_Space() | ||
61 | 225 | vlan = factory.make_VLAN(space=space) | ||
62 | 226 | uri = get_vlan_uri(vlan, vlan.fabric) | ||
63 | 227 | response = self.client.get(uri) | ||
64 | 228 | |||
65 | 229 | self.assertEqual( | ||
66 | 230 | http.client.OK, response.status_code, response.content) | ||
67 | 231 | parsed_vlan = json.loads( | ||
68 | 232 | response.content.decode(settings.DEFAULT_CHARSET)) | ||
69 | 233 | self.assertThat(parsed_vlan, ContainsDict({ | ||
70 | 234 | "id": Equals(vlan.id), | ||
71 | 235 | "name": Equals(vlan.get_name()), | ||
72 | 236 | "vid": Equals(vlan.vid), | ||
73 | 237 | "space": Equals(space.get_name()), | ||
74 | 238 | "resource_uri": Equals(get_vlan_uri(vlan)), | ||
75 | 239 | })) | ||
76 | 240 | |||
77 | 179 | def test_read_404_when_bad_id(self): | 241 | def test_read_404_when_bad_id(self): |
78 | 180 | fabric = factory.make_Fabric() | 242 | fabric = factory.make_Fabric() |
79 | 181 | uri = reverse( | 243 | uri = reverse( |
80 | 182 | 244 | ||
81 | === modified file 'src/maasserver/api/vlans.py' | |||
82 | --- src/maasserver/api/vlans.py 2016-11-30 21:13:52 +0000 | |||
83 | +++ src/maasserver/api/vlans.py 2016-12-06 16:09:53 +0000 | |||
84 | @@ -27,6 +27,7 @@ | |||
85 | 27 | 'dhcp_on', | 27 | 'dhcp_on', |
86 | 28 | 'external_dhcp', | 28 | 'external_dhcp', |
87 | 29 | 'relay_vlan', | 29 | 'relay_vlan', |
88 | 30 | 'space', | ||
89 | 30 | ) | 31 | ) |
90 | 31 | 32 | ||
91 | 32 | 33 | ||
92 | @@ -55,6 +56,13 @@ | |||
93 | 55 | else: | 56 | else: |
94 | 56 | return None | 57 | return None |
95 | 57 | 58 | ||
96 | 59 | @classmethod | ||
97 | 60 | def space(handler, vlan): | ||
98 | 61 | if vlan.space: | ||
99 | 62 | return vlan.space.get_name() | ||
100 | 63 | else: | ||
101 | 64 | return None | ||
102 | 65 | |||
103 | 58 | def read(self, request, fabric_id): | 66 | def read(self, request, fabric_id): |
104 | 59 | """List all VLANs belonging to fabric. | 67 | """List all VLANs belonging to fabric. |
105 | 60 | 68 | ||
106 | @@ -113,6 +121,13 @@ | |||
107 | 113 | return None | 121 | return None |
108 | 114 | 122 | ||
109 | 115 | @classmethod | 123 | @classmethod |
110 | 124 | def space(handler, vlan): | ||
111 | 125 | if vlan.space: | ||
112 | 126 | return vlan.space.get_name() | ||
113 | 127 | else: | ||
114 | 128 | return None | ||
115 | 129 | |||
116 | 130 | @classmethod | ||
117 | 116 | def fabric(cls, vlan): | 131 | def fabric(cls, vlan): |
118 | 117 | """Return fabric name.""" | 132 | """Return fabric name.""" |
119 | 118 | return vlan.fabric.get_name() | 133 | return vlan.fabric.get_name() |
120 | 119 | 134 | ||
121 | === modified file 'src/maasserver/forms_vlan.py' | |||
122 | --- src/maasserver/forms_vlan.py 2016-11-30 16:42:37 +0000 | |||
123 | +++ src/maasserver/forms_vlan.py 2016-12-06 16:09:53 +0000 | |||
124 | @@ -11,7 +11,10 @@ | |||
125 | 11 | from django.core.exceptions import ValidationError | 11 | from django.core.exceptions import ValidationError |
126 | 12 | from maasserver.fields import NodeChoiceField | 12 | from maasserver.fields import NodeChoiceField |
127 | 13 | from maasserver.forms import MAASModelForm | 13 | from maasserver.forms import MAASModelForm |
129 | 14 | from maasserver.models import RackController | 14 | from maasserver.models import ( |
130 | 15 | RackController, | ||
131 | 16 | Space, | ||
132 | 17 | ) | ||
133 | 15 | from maasserver.models.vlan import VLAN | 18 | from maasserver.models.vlan import VLAN |
134 | 16 | 19 | ||
135 | 17 | 20 | ||
136 | @@ -21,6 +24,9 @@ | |||
137 | 21 | # Linux doesn't allow lower than 552 for the MTU. | 24 | # Linux doesn't allow lower than 552 for the MTU. |
138 | 22 | mtu = forms.IntegerField(min_value=552, required=False) | 25 | mtu = forms.IntegerField(min_value=552, required=False) |
139 | 23 | 26 | ||
140 | 27 | space = forms.ModelChoiceField( | ||
141 | 28 | queryset=Space.objects.all(), required=False) | ||
142 | 29 | |||
143 | 24 | class Meta: | 30 | class Meta: |
144 | 25 | model = VLAN | 31 | model = VLAN |
145 | 26 | fields = ( | 32 | fields = ( |
146 | @@ -32,6 +38,7 @@ | |||
147 | 32 | 'primary_rack', | 38 | 'primary_rack', |
148 | 33 | 'secondary_rack', | 39 | 'secondary_rack', |
149 | 34 | 'relay_vlan', | 40 | 'relay_vlan', |
150 | 41 | 'space', | ||
151 | 35 | ) | 42 | ) |
152 | 36 | 43 | ||
153 | 37 | def __init__(self, *args, **kwargs): | 44 | def __init__(self, *args, **kwargs): |
154 | @@ -134,16 +141,20 @@ | |||
155 | 134 | "dhcp can only be turned on when a dynamic IP range is defined.") | 141 | "dhcp can only be turned on when a dynamic IP range is defined.") |
156 | 135 | 142 | ||
157 | 136 | def save(self): | 143 | def save(self): |
160 | 137 | """Persist the interface into the database.""" | 144 | """Persist the VLAN into the database.""" |
161 | 138 | interface = super(VLANForm, self).save(commit=False) | 145 | vlan = super(VLANForm, self).save(commit=False) |
162 | 139 | if self.fabric is not None: | 146 | if self.fabric is not None: |
164 | 140 | interface.fabric = self.fabric | 147 | vlan.fabric = self.fabric |
165 | 148 | if ('space' in self.data and | ||
166 | 149 | not self.cleaned_data.get('space')): | ||
167 | 150 | # 'space' is being cleared. | ||
168 | 151 | vlan.space = None | ||
169 | 141 | if ('relay_vlan' in self.data and | 152 | if ('relay_vlan' in self.data and |
170 | 142 | not self.cleaned_data.get('relay_vlan')): | 153 | not self.cleaned_data.get('relay_vlan')): |
178 | 143 | # relay_vlan is being cleared. | 154 | # 'relay_vlan' is being cleared. |
179 | 144 | interface.relay_vlan = None | 155 | vlan.relay_vlan = None |
180 | 145 | if interface.dhcp_on: | 156 | if vlan.dhcp_on: |
181 | 146 | # relay_vlan cannot be set when dhcp is on. | 157 | # 'relay_vlan' cannot be set when dhcp is on. |
182 | 147 | interface.relay_vlan = None | 158 | vlan.relay_vlan = None |
183 | 148 | interface.save() | 159 | vlan.save() |
184 | 149 | return interface | 160 | return vlan |
185 | 150 | 161 | ||
186 | === modified file 'src/maasserver/migrations/builtin/maasserver/0096_set_default_vlan_field.py' | |||
187 | --- src/maasserver/migrations/builtin/maasserver/0096_set_default_vlan_field.py 2016-12-05 14:56:57 +0000 | |||
188 | +++ src/maasserver/migrations/builtin/maasserver/0096_set_default_vlan_field.py 2016-12-06 16:09:53 +0000 | |||
189 | @@ -6,7 +6,6 @@ | |||
190 | 6 | models, | 6 | models, |
191 | 7 | ) | 7 | ) |
192 | 8 | import django.db.models.deletion | 8 | import django.db.models.deletion |
193 | 9 | import maasserver.models.subnet | ||
194 | 10 | 9 | ||
195 | 11 | 10 | ||
196 | 12 | class Migration(migrations.Migration): | 11 | class Migration(migrations.Migration): |
197 | @@ -19,6 +18,6 @@ | |||
198 | 19 | migrations.AlterField( | 18 | migrations.AlterField( |
199 | 20 | model_name='subnet', | 19 | model_name='subnet', |
200 | 21 | name='vlan', | 20 | name='vlan', |
202 | 22 | field=models.ForeignKey(to='maasserver.VLAN', default=maasserver.models.subnet.get_default_vlan, on_delete=django.db.models.deletion.PROTECT), | 21 | field=models.ForeignKey(to='maasserver.VLAN', default=lambda: 0, on_delete=django.db.models.deletion.PROTECT), |
203 | 23 | ), | 22 | ), |
204 | 24 | ] | 23 | ] |
205 | 25 | 24 | ||
206 | === added file 'src/maasserver/migrations/builtin/maasserver/0098_add_space_to_vlan.py' | |||
207 | --- src/maasserver/migrations/builtin/maasserver/0098_add_space_to_vlan.py 1970-01-01 00:00:00 +0000 | |||
208 | +++ src/maasserver/migrations/builtin/maasserver/0098_add_space_to_vlan.py 2016-12-06 16:09:53 +0000 | |||
209 | @@ -0,0 +1,24 @@ | |||
210 | 1 | # -*- coding: utf-8 -*- | ||
211 | 2 | from __future__ import unicode_literals | ||
212 | 3 | |||
213 | 4 | from django.db import ( | ||
214 | 5 | migrations, | ||
215 | 6 | models, | ||
216 | 7 | ) | ||
217 | 8 | import django.db.models.deletion | ||
218 | 9 | import maasserver.models.subnet | ||
219 | 10 | |||
220 | 11 | |||
221 | 12 | class Migration(migrations.Migration): | ||
222 | 13 | |||
223 | 14 | dependencies = [ | ||
224 | 15 | ('maasserver', '0097_node_chassis_storage_hints'), | ||
225 | 16 | ] | ||
226 | 17 | |||
227 | 18 | operations = [ | ||
228 | 19 | migrations.AddField( | ||
229 | 20 | model_name='vlan', | ||
230 | 21 | name='space', | ||
231 | 22 | field=models.ForeignKey(blank=True, null=True, to='maasserver.Space', on_delete=django.db.models.deletion.SET_NULL), | ||
232 | 23 | ), | ||
233 | 24 | ] | ||
234 | 0 | 25 | ||
235 | === added file 'src/maasserver/migrations/builtin/maasserver/0099_set_default_vlan_field.py' | |||
236 | --- src/maasserver/migrations/builtin/maasserver/0099_set_default_vlan_field.py 1970-01-01 00:00:00 +0000 | |||
237 | +++ src/maasserver/migrations/builtin/maasserver/0099_set_default_vlan_field.py 2016-12-06 16:09:53 +0000 | |||
238 | @@ -0,0 +1,24 @@ | |||
239 | 1 | # -*- coding: utf-8 -*- | ||
240 | 2 | from __future__ import unicode_literals | ||
241 | 3 | |||
242 | 4 | from django.db import ( | ||
243 | 5 | migrations, | ||
244 | 6 | models, | ||
245 | 7 | ) | ||
246 | 8 | import django.db.models.deletion | ||
247 | 9 | import maasserver.models.subnet | ||
248 | 10 | |||
249 | 11 | |||
250 | 12 | class Migration(migrations.Migration): | ||
251 | 13 | |||
252 | 14 | dependencies = [ | ||
253 | 15 | ('maasserver', '0098_add_space_to_vlan'), | ||
254 | 16 | ] | ||
255 | 17 | |||
256 | 18 | operations = [ | ||
257 | 19 | migrations.AlterField( | ||
258 | 20 | model_name='subnet', | ||
259 | 21 | name='vlan', | ||
260 | 22 | field=models.ForeignKey(to='maasserver.VLAN', on_delete=django.db.models.deletion.PROTECT, default=maasserver.models.subnet.get_default_vlan), | ||
261 | 23 | ), | ||
262 | 24 | ] | ||
263 | 0 | 25 | ||
264 | === modified file 'src/maasserver/models/vlan.py' | |||
265 | --- src/maasserver/models/vlan.py 2016-12-01 14:12:32 +0000 | |||
266 | +++ src/maasserver/models/vlan.py 2016-12-06 16:09:53 +0000 | |||
267 | @@ -19,6 +19,7 @@ | |||
268 | 19 | IntegerField, | 19 | IntegerField, |
269 | 20 | Manager, | 20 | Manager, |
270 | 21 | Q, | 21 | Q, |
271 | 22 | SET_NULL, | ||
272 | 22 | TextField, | 23 | TextField, |
273 | 23 | ) | 24 | ) |
274 | 24 | from django.db.models.query import QuerySet | 25 | from django.db.models.query import QuerySet |
275 | @@ -174,6 +175,9 @@ | |||
276 | 174 | 'self', null=True, blank=True, editable=True, | 175 | 'self', null=True, blank=True, editable=True, |
277 | 175 | related_name='relay_vlans', on_delete=deletion.SET_NULL) | 176 | related_name='relay_vlans', on_delete=deletion.SET_NULL) |
278 | 176 | 177 | ||
279 | 178 | space = ForeignKey( | ||
280 | 179 | 'Space', editable=True, blank=True, null=True, on_delete=SET_NULL) | ||
281 | 180 | |||
282 | 177 | def __str__(self): | 181 | def __str__(self): |
283 | 178 | return "%s.%s" % (self.fabric.get_name(), self.get_name()) | 182 | return "%s.%s" % (self.fabric.get_name(), self.get_name()) |
284 | 179 | 183 | ||
285 | 180 | 184 | ||
286 | === modified file 'src/maasserver/static/partials/vlan-details.html' | |||
287 | --- src/maasserver/static/partials/vlan-details.html 2016-12-06 07:32:14 +0000 | |||
288 | +++ src/maasserver/static/partials/vlan-details.html 2016-12-06 16:09:53 +0000 | |||
289 | @@ -232,6 +232,9 @@ | |||
290 | 232 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> | 232 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> |
291 | 233 | <maas-obj-field type="text" key="mtu" label="MTU" placeholder="VLAN MTU" | 233 | <maas-obj-field type="text" key="mtu" label="MTU" placeholder="VLAN MTU" |
292 | 234 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> | 234 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> |
293 | 235 | <maas-obj-field type="options" key="space" label="Space" placeholder="(not in a space)" placeholder-enabled="true" | ||
294 | 236 | options="space.id as space.name for space in vlanDetails.spaces" | ||
295 | 237 | label-width="two" input-width="three"></maas-obj-field> | ||
296 | 235 | <maas-obj-field type="textarea" key="description" label="Description" placeholder="VLAN description" | 238 | <maas-obj-field type="textarea" key="description" label="Description" placeholder="VLAN description" |
297 | 236 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> | 239 | label-width="two" input-width="three" blur-on-enter="true"></maas-obj-field> |
298 | 237 | </fieldset> | 240 | </fieldset> |
299 | 238 | 241 | ||
300 | === modified file 'src/maasserver/testing/factory.py' | |||
301 | --- src/maasserver/testing/factory.py 2016-12-06 09:34:06 +0000 | |||
302 | +++ src/maasserver/testing/factory.py 2016-12-06 16:09:53 +0000 | |||
303 | @@ -1037,7 +1037,7 @@ | |||
304 | 1037 | "Could not generate vid in fabric %s" % fabric) | 1037 | "Could not generate vid in fabric %s" % fabric) |
305 | 1038 | 1038 | ||
306 | 1039 | def make_VLAN( | 1039 | def make_VLAN( |
308 | 1040 | self, name=None, vid=None, fabric=None, dhcp_on=False, | 1040 | self, name=None, vid=None, fabric=None, dhcp_on=False, space=None, |
309 | 1041 | primary_rack=None, secondary_rack=None, relay_vlan=None): | 1041 | primary_rack=None, secondary_rack=None, relay_vlan=None): |
310 | 1042 | assert vid != 0, "VID=0 VLANs are auto-created" | 1042 | assert vid != 0, "VID=0 VLANs are auto-created" |
311 | 1043 | if fabric is None: | 1043 | if fabric is None: |
312 | @@ -1046,7 +1046,7 @@ | |||
313 | 1046 | # Don't create the vid=0 VLAN, it's auto-created. | 1046 | # Don't create the vid=0 VLAN, it's auto-created. |
314 | 1047 | vid = self._get_available_vid(fabric) | 1047 | vid = self._get_available_vid(fabric) |
315 | 1048 | vlan = VLAN( | 1048 | vlan = VLAN( |
317 | 1049 | name=name, vid=vid, fabric=fabric, dhcp_on=dhcp_on, | 1049 | name=name, vid=vid, fabric=fabric, dhcp_on=dhcp_on, space=space, |
318 | 1050 | primary_rack=primary_rack, secondary_rack=secondary_rack, | 1050 | primary_rack=primary_rack, secondary_rack=secondary_rack, |
319 | 1051 | relay_vlan=relay_vlan) | 1051 | relay_vlan=relay_vlan) |
320 | 1052 | vlan.save() | 1052 | vlan.save() |
321 | 1053 | 1053 | ||
322 | === modified file 'src/maasserver/tests/test_forms_vlan.py' | |||
323 | --- src/maasserver/tests/test_forms_vlan.py 2016-11-30 16:42:37 +0000 | |||
324 | +++ src/maasserver/tests/test_forms_vlan.py 2016-12-06 16:09:53 +0000 | |||
325 | @@ -266,6 +266,39 @@ | |||
326 | 266 | vlan = reload_object(vlan) | 266 | vlan = reload_object(vlan) |
327 | 267 | self.assertIsNone(vlan.relay_vlan) | 267 | self.assertIsNone(vlan.relay_vlan) |
328 | 268 | 268 | ||
329 | 269 | def test_update_sets_space(self): | ||
330 | 270 | vlan = factory.make_VLAN() | ||
331 | 271 | space = factory.make_Space() | ||
332 | 272 | form = VLANForm(instance=vlan, data={ | ||
333 | 273 | "space": space.id, | ||
334 | 274 | }) | ||
335 | 275 | self.assertTrue(form.is_valid(), form.errors) | ||
336 | 276 | form.save() | ||
337 | 277 | vlan = reload_object(vlan) | ||
338 | 278 | self.assertEquals(space.id, vlan.space.id) | ||
339 | 279 | |||
340 | 280 | def test_update_clears_space_when_None(self): | ||
341 | 281 | space = factory.make_Space() | ||
342 | 282 | vlan = factory.make_VLAN(space=space) | ||
343 | 283 | form = VLANForm(instance=vlan, data={ | ||
344 | 284 | "space": None, | ||
345 | 285 | }) | ||
346 | 286 | self.assertTrue(form.is_valid(), form.errors) | ||
347 | 287 | form.save() | ||
348 | 288 | vlan = reload_object(vlan) | ||
349 | 289 | self.assertIsNone(vlan.space) | ||
350 | 290 | |||
351 | 291 | def test_update_clears_space_vlan_when_empty(self): | ||
352 | 292 | space = factory.make_Space() | ||
353 | 293 | vlan = factory.make_VLAN(space=space) | ||
354 | 294 | form = VLANForm(instance=vlan, data={ | ||
355 | 295 | "space": "", | ||
356 | 296 | }) | ||
357 | 297 | self.assertTrue(form.is_valid(), form.errors) | ||
358 | 298 | form.save() | ||
359 | 299 | vlan = reload_object(vlan) | ||
360 | 300 | self.assertIsNone(vlan.space) | ||
361 | 301 | |||
362 | 269 | def test_update_disables_relay_vlan_when_dhcp_turned_on(self): | 302 | def test_update_disables_relay_vlan_when_dhcp_turned_on(self): |
363 | 270 | relay_vlan = factory.make_VLAN() | 303 | relay_vlan = factory.make_VLAN() |
364 | 271 | vlan = factory.make_VLAN(relay_vlan=relay_vlan) | 304 | vlan = factory.make_VLAN(relay_vlan=relay_vlan) |
365 | 272 | 305 | ||
366 | === modified file 'src/maasserver/websockets/handlers/tests/test_vlan.py' | |||
367 | --- src/maasserver/websockets/handlers/tests/test_vlan.py 2016-12-06 08:04:18 +0000 | |||
368 | +++ src/maasserver/websockets/handlers/tests/test_vlan.py 2016-12-06 16:09:53 +0000 | |||
369 | @@ -36,6 +36,7 @@ | |||
370 | 36 | "vid": vlan.vid, | 36 | "vid": vlan.vid, |
371 | 37 | "mtu": vlan.mtu, | 37 | "mtu": vlan.mtu, |
372 | 38 | "fabric": vlan.fabric_id, | 38 | "fabric": vlan.fabric_id, |
373 | 39 | "space": vlan.space_id, | ||
374 | 39 | "updated": dehydrate_datetime(vlan.updated), | 40 | "updated": dehydrate_datetime(vlan.updated), |
375 | 40 | "created": dehydrate_datetime(vlan.created), | 41 | "created": dehydrate_datetime(vlan.created), |
376 | 41 | "dhcp_on": vlan.dhcp_on, | 42 | "dhcp_on": vlan.dhcp_on, |
Seems good to me!