If a machine has no disks, the node websocket raises and error as it tries to access the ID for the boot disk.
2021-11-25 10:17:23 maasserver.listener: [critical] Failure while handling notification to 'machine': 'kgpthr'
Traceback (most recent call last):
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 501, in errback
self._startRunCallbacks(fail)
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 568, in _startRunCallbacks
self._runCallbacks()
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 1475, in gotResult
_inlineCallbacks(r, g, status)
--- <exception caught here> ---
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/python/failure.py", line 491, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/protocol.py", line 454, in onNotify
data = yield deferToDatabase(
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/python/threadpool.py", line 250, in inContext
result = inContext.theWork()
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/python/threadpool.py", line 266, in <lambda>
inContext.theWork = lambda: context.call(ctx, func, *args, **kw)
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/python/context.py", line 122, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/snap/maas/x5/usr/lib/python3/dist-packages/twisted/python/context.py", line 85, in callWithContext
return func(*args,**kw)
File "/snap/maas/x5/lib/python3.8/site-packages/provisioningserver/utils/twisted.py", line 870, in callInContext
return func(*args, **kwargs)
File "/snap/maas/x5/lib/python3.8/site-packages/provisioningserver/utils/twisted.py", line 202, in wrapper
result = func(*args, **kwargs)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/utils/orm.py", line 756, in call_within_transaction
return func_outside_txn(*args, **kwargs)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/utils/orm.py", line 559, in retrier
return func(*args, **kwargs)
File "/usr/lib/python3.8/contextlib.py", line 75, in inner
return func(*args, **kwds)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/protocol.py", line 463, in processNotify
return handler.on_listen(channel, action, obj_id)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/base.py", line 630, in on_listen
return self.on_listen_for_active_pk(action, pk, obj)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/handlers/node.py", line 531, in on_listen_for_active_pk
return super().on_listen_for_active_pk(action, pk, obj)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/base.py", line 653, in on_listen_for_active_pk
self.full_dehydrate(obj, for_list=False),
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/base.py", line 231, in full_dehydrate
return self.dehydrate(obj, data, for_list=for_list)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/handlers/machine.py", line 267, in dehydrate
data = super().dehydrate(obj, data, for_list=for_list)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/handlers/node.py", line 354, in dehydrate
data["disks"] = sorted(
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/handlers/node.py", line 357, in <genexpr>
self.dehydrate_blockdevice(blockdevice, obj)
File "/snap/maas/x5/lib/python3.8/site-packages/maasserver/websockets/handlers/node.py", line 548, in dehydrate_blockdevice
is_boot = blockdevice.id == obj.get_boot_disk().id
builtins.AttributeError: 'NoneType' object has no attribute 'id'