Skip to content

Commit a879ff3

Browse files
author
Blake Rouse
authored
Fix issues where the new self._reset should be called instead of setting self._data. Fixes canonical#226. (canonical#227)
1 parent 97a05b4 commit a879ff3

6 files changed

Lines changed: 87 additions & 52 deletions

File tree

maas/client/viscera/block_devices.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,25 +123,25 @@ async def set_as_boot_disk(self):
123123

124124
async def format(self, fstype, *, uuid=None):
125125
"""Format this block device."""
126-
self._data = await self._handler.format(
126+
self._reset(await self._handler.format(
127127
system_id=self.node.system_id, id=self.id,
128-
fstype=fstype, uuid=uuid)
128+
fstype=fstype, uuid=uuid))
129129

130130
async def unformat(self):
131131
"""Unformat this block device."""
132-
self._data = await self._handler.unformat(
133-
system_id=self.node.system_id, id=self.id)
132+
self._reset(await self._handler.unformat(
133+
system_id=self.node.system_id, id=self.id))
134134

135135
async def mount(self, mount_point, *, mount_options=None):
136136
"""Mount this block device."""
137-
self._data = await self._handler.mount(
137+
self._reset(await self._handler.mount(
138138
system_id=self.node.system_id, id=self.id, mount_point=mount_point,
139-
mount_options=mount_options)
139+
mount_options=mount_options))
140140

141141
async def unmount(self):
142142
"""Unmount this block device."""
143-
self._data = await self._handler.unmount(
144-
system_id=self.node.system_id, id=self.id)
143+
self._reset(await self._handler.unmount(
144+
system_id=self.node.system_id, id=self.id))
145145

146146

147147
class BlockDevicesType(ObjectType):

maas/client/viscera/interfaces.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ async def delete(self):
158158

159159
async def disconnect(self):
160160
"""Disconnect this interface."""
161-
self._data = await self._handler.disconnect(
162-
system_id=self.node.system_id, id=self.id)
161+
self._reset(await self._handler.disconnect(
162+
system_id=self.node.system_id, id=self.id))
163163

164164

165165
class InterfaceDiscoveredLink(Object):

maas/client/viscera/machines.py

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -408,13 +408,13 @@ async def abort(self, *, comment: str = None):
408408
}
409409
if comment:
410410
params["comment"] = comment
411-
self._data = await self._handler.abort(**params)
411+
self._reset(await self._handler.abort(**params))
412412
return self
413413

414414
async def clear_default_gateways(self):
415415
"""Clear default gateways."""
416-
self._data = await self._handler.clear_default_gateways(
417-
system_id=self.system_id)
416+
self._reset(await self._handler.clear_default_gateways(
417+
system_id=self.system_id))
418418
return self
419419

420420
async def commission(
@@ -462,15 +462,15 @@ async def commission(
462462
params["testing_scripts"] = ["none"]
463463
else:
464464
params["testing_scripts"] = ",".join(testing_scripts)
465-
self._data = await self._handler.commission(**params)
465+
self._reset(await self._handler.commission(**params))
466466
if not wait:
467467
return self
468468
else:
469469
# Wait for the machine to be fully commissioned.
470470
while self.status in [
471471
NodeStatus.COMMISSIONING, NodeStatus.TESTING]:
472472
await asyncio.sleep(wait_interval)
473-
self._data = await self._handler.read(system_id=self.system_id)
473+
self._reset(await self._handler.read(system_id=self.system_id))
474474
if self.status == NodeStatus.FAILED_COMMISSIONING:
475475
msg = "{hostname} failed to commission.".format(
476476
hostname=self.hostname)
@@ -512,14 +512,14 @@ async def deploy(
512512
params["hwe_kernel"] = hwe_kernel
513513
if comment is not None:
514514
params["comment"] = comment
515-
self._data = await self._handler.deploy(**params)
515+
self._reset(await self._handler.deploy(**params))
516516
if not wait:
517517
return self
518518
else:
519519
# Wait for the machine to be fully deployed
520520
while self.status == NodeStatus.DEPLOYING:
521521
await asyncio.sleep(wait_interval)
522-
self._data = await self._handler.read(system_id=self.system_id)
522+
self._reset(await self._handler.read(system_id=self.system_id))
523523
if self.status == NodeStatus.FAILED_DEPLOYMENT:
524524
msg = "{hostname} failed to deploy.".format(
525525
hostname=self.hostname
@@ -536,8 +536,8 @@ async def enter_rescue_mode(
536536
:param wait_interval: How often to poll, defaults to 5 seconds
537537
"""
538538
try:
539-
self._data = await self._handler.rescue_mode(
540-
system_id=self.system_id)
539+
self._reset(await self._handler.rescue_mode(
540+
system_id=self.system_id))
541541
except CallError as error:
542542
if error.status == HTTPStatus.FORBIDDEN:
543543
message = "Not allowed to enter rescue mode"
@@ -551,7 +551,7 @@ async def enter_rescue_mode(
551551
# Wait for machine to finish entering rescue mode
552552
while self.status == NodeStatus.ENTERING_RESCUE_MODE:
553553
await asyncio.sleep(wait)
554-
self._data = await self._handler.read(system_id=self.system_id)
554+
self._reset(await self._handler.read(system_id=self.system_id))
555555
if self.status == NodeStatus.FAILED_ENTERING_RESCUE_MODE:
556556
msg = "{hostname} failed to enter rescue mode.".format(
557557
hostname=self.hostname
@@ -568,9 +568,9 @@ async def exit_rescue_mode(
568568
:param wait_interval: How often to poll, defaults to 5 seconds
569569
"""
570570
try:
571-
self._data = await self._handler.exit_rescue_mode(
571+
self._reset(await self._handler.exit_rescue_mode(
572572
system_id=self.system_id
573-
)
573+
))
574574
except CallError as error:
575575
if error.status == HTTPStatus.FORBIDDEN:
576576
message = "Not allowed to exit rescue mode."
@@ -583,7 +583,7 @@ async def exit_rescue_mode(
583583
# Wait for machine to finish exiting rescue mode
584584
while self.status == NodeStatus.EXITING_RESCUE_MODE:
585585
await asyncio.sleep(wait_interval)
586-
self._data = await self._handler.read(system_id=self.system_id)
586+
self._reset(await self._handler.read(system_id=self.system_id))
587587
if self.status == NodeStatus.FAILED_EXITING_RESCUE_MODE:
588588
msg = "{hostname} failed to exit rescue mode.".format(
589589
hostname=self.hostname
@@ -618,7 +618,7 @@ async def mark_broken(self, *, comment: str = None):
618618
}
619619
if comment:
620620
params["comment"] = comment
621-
self._data = await self._handler.mark_broken(**params)
621+
self._reset(await self._handler.mark_broken(**params))
622622
return self
623623

624624
async def mark_fixed(self, *, comment: str = None):
@@ -632,7 +632,7 @@ async def mark_fixed(self, *, comment: str = None):
632632
}
633633
if comment:
634634
params["comment"] = comment
635-
self._data = await self._handler.mark_fixed(**params)
635+
self._reset(await self._handler.mark_fixed(**params))
636636
return self
637637

638638
async def release(
@@ -662,7 +662,7 @@ async def release(
662662
"secure_erase": secure_erase,
663663
"quick_erase": quick_erase,
664664
})
665-
self._data = await self._handler.release(**params)
665+
self._reset(await self._handler.release(**params))
666666
if not wait:
667667
return self
668668
else:
@@ -671,8 +671,8 @@ async def release(
671671
NodeStatus.RELEASING, NodeStatus.DISK_ERASING]:
672672
await asyncio.sleep(wait_interval)
673673
try:
674-
self._data = await self._handler.read(
675-
system_id=self.system_id)
674+
self._reset(await self._handler.read(
675+
system_id=self.system_id))
676676
except CallError as error:
677677
if error.status == HTTPStatus.NOT_FOUND:
678678
# Release must have been on a machine in a pod. This
@@ -710,7 +710,7 @@ async def power_on(
710710
if comment is not None:
711711
params["comment"] = comment
712712
try:
713-
self._data = await self._handler.power_on(**params)
713+
self._reset(await self._handler.power_on(**params))
714714
except CallError as error:
715715
if error.status == HTTPStatus.FORBIDDEN:
716716
message = "Not allowed to power on machine."
@@ -725,7 +725,7 @@ async def power_on(
725725
# Wait for machine to be powered on.
726726
while self.power_state == PowerState.OFF:
727727
await asyncio.sleep(wait_interval)
728-
self._data = await self._handler.read(system_id=self.system_id)
728+
self._reset(await self._handler.read(system_id=self.system_id))
729729
if self.power_state == PowerState.ERROR:
730730
msg = "{hostname} failed to power on.".format(
731731
hostname=self.hostname
@@ -752,7 +752,7 @@ async def power_off(
752752
if comment is not None:
753753
params["comment"] = comment
754754
try:
755-
self._data = await self._handler.power_off(**params)
755+
self._reset(await self._handler.power_off(**params))
756756
except CallError as error:
757757
if error.status == HTTPStatus.FORBIDDEN:
758758
message = "Not allowed to power off machine."
@@ -767,7 +767,7 @@ async def power_off(
767767
# Wait for machine to be powered off.
768768
while self.power_state == PowerState.ON:
769769
await asyncio.sleep(wait_interval)
770-
self._data = await self._handler.read(system_id=self.system_id)
770+
self._reset(await self._handler.read(system_id=self.system_id))
771771
if self.power_state == PowerState.ERROR:
772772
msg = "{hostname} failed to power off.".format(
773773
hostname=self.hostname
@@ -794,22 +794,22 @@ async def restore_default_configuration(self):
794794
"""
795795
Restore machine's configuration to its initial state.
796796
"""
797-
self._data = await self._handler.restore_default_configuration(
798-
system_id=self.system_id)
797+
self._reset(await self._handler.restore_default_configuration(
798+
system_id=self.system_id))
799799

800800
async def restore_networking_configuration(self):
801801
"""
802802
Restore machine's networking configuration to its initial state.
803803
"""
804-
self._data = await self._handler.restore_networking_configuration(
805-
system_id=self.system_id)
804+
self._reset(await self._handler.restore_networking_configuration(
805+
system_id=self.system_id))
806806

807807
async def restore_storage_configuration(self):
808808
"""
809809
Restore machine's storage configuration to its initial state.
810810
"""
811-
self._data = await self._handler.restore_storage_configuration(
812-
system_id=self.system_id)
811+
self._reset(await self._handler.restore_storage_configuration(
812+
system_id=self.system_id))
813813

814814
async def lock(self, *, comment: str = None):
815815
"""Lock the machine to prevent changes.
@@ -822,7 +822,7 @@ async def lock(self, *, comment: str = None):
822822
}
823823
if comment:
824824
params["comment"] = comment
825-
self._data = await self._handler.lock(**params)
825+
self._reset(await self._handler.lock(**params))
826826
return self
827827

828828
async def unlock(self, *, comment: str = None):
@@ -836,5 +836,5 @@ async def unlock(self, *, comment: str = None):
836836
}
837837
if comment:
838838
params["comment"] = comment
839-
self._data = await self._handler.unlock(**params)
839+
self._reset(await self._handler.unlock(**params))
840840
return self

maas/client/viscera/partitions.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,30 +83,30 @@ async def delete(self):
8383

8484
async def format(self, fstype, *, uuid=None):
8585
"""Format this partition."""
86-
self._data = await self._handler.format(
86+
self._reset(await self._handler.format(
8787
system_id=self.block_device.node.system_id,
8888
device_id=self.block_device.id, id=self.id,
89-
fstype=fstype, uuid=uuid)
89+
fstype=fstype, uuid=uuid))
9090

9191
async def unformat(self):
9292
"""Unformat this partition."""
93-
self._data = await self._handler.unformat(
93+
self._reset(await self._handler.unformat(
9494
system_id=self.block_device.node.system_id,
95-
device_id=self.block_device.id, id=self.id)
95+
device_id=self.block_device.id, id=self.id))
9696

9797
async def mount(self, mount_point, *, mount_options=None):
9898
"""Mount this partition."""
99-
self._data = await self._handler.mount(
99+
self._reset(await self._handler.mount(
100100
system_id=self.block_device.node.system_id,
101101
device_id=self.block_device.id, id=self.id,
102102
mount_point=mount_point,
103-
mount_options=mount_options)
103+
mount_options=mount_options))
104104

105105
async def umount(self):
106106
"""Unmount this partition."""
107-
self._data = await self._handler.unmount(
107+
self._reset(await self._handler.unmount(
108108
system_id=self.block_device.node.system_id,
109-
device_id=self.block_device.id, id=self.id)
109+
device_id=self.block_device.id, id=self.id))
110110

111111

112112
class PartitionsType(ObjectType):

maas/client/viscera/tests/test_vlans.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,41 @@ def test__vlan_update_vid(self):
217217
fabric_id=fabric_id, vid=vid, _vid=new_vid)
218218
self.assertThat(new_vid, Equals(new_vid))
219219

220+
def test__vlan_update_vid_twice(self):
221+
origin = make_origin()
222+
Vlan = origin.Vlan
223+
Vlan._handler.params = ['fabric_id', 'vid']
224+
fabric_id = random.randint(1, 100)
225+
vlan_id = random.randint(5001, 6000)
226+
vid = random.randint(100, 200)
227+
new_vid = random.randint(201, 300)
228+
vlan = Vlan({
229+
"id": vlan_id,
230+
"fabric_id": fabric_id,
231+
"vid": vid,
232+
})
233+
vlan.vid = new_vid
234+
Vlan._handler.update.return_value = {
235+
"id": vlan_id,
236+
"vid": new_vid,
237+
}
238+
vlan.save()
239+
Vlan._handler.update.assert_called_once_with(
240+
fabric_id=fabric_id, vid=vid, _vid=new_vid)
241+
self.assertThat(vlan.vid, Equals(new_vid))
242+
243+
# Second call should pass the new_vid as the vid, and not the old vid.
244+
new_vid_2 = random.randint(301, 400)
245+
vlan.vid = new_vid_2
246+
Vlan._handler.update.return_value = {
247+
"id": vlan_id,
248+
"vid": new_vid_2,
249+
}
250+
vlan.save()
251+
Vlan._handler.update.assert_called_with(
252+
fabric_id=fabric_id, vid=new_vid, _vid=new_vid_2)
253+
self.assertThat(vlan.vid, Equals(new_vid_2))
254+
220255
def test__vlan_update_relay_vlan_with_object(self):
221256
origin = make_origin()
222257
Vlan = origin.Vlan

maas/client/viscera/vlans.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ async def save(self):
122122
update_data['vid'] = update_data['_vid'] = self._orig_data['vid']
123123
if 'vid' in self._changed_data:
124124
update_data['_vid'] = self._changed_data['vid']
125-
self._data = await self._handler.update(**update_data)
126-
127-
# Set fabric_id because it was lost from the `save`.
128-
self._data['fabric_id'] = fabric_id
125+
data = await self._handler.update(**update_data)
126+
# Set fabric_id because it was lost from the `update`.
127+
data['fabric_id'] = fabric_id
128+
self._reset(data)
129129

130130
async def delete(self):
131131
"""Delete this VLAN."""

0 commit comments

Comments
 (0)