Skip to content

Commit 9053c70

Browse files
committed
q-dev: add self_identity do device identity
1 parent 6b031a0 commit 9053c70

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

qubes/api/admin.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,8 @@ async def vm_device_available(self, endpoint):
12231223
# the list is empty
12241224
self.enforce(len(devices) <= 1)
12251225
devices = self.fire_event_for_filter(devices, devclass=devclass)
1226-
dev_info = {dev.ident: dev.serialize().decode() for dev in devices}
1226+
dev_info = {f'{dev.ident}:{dev.self_identity}':
1227+
dev.serialize().decode() for dev in devices}
12271228
return ''.join('{} {}\n'.format(ident, dev_info[ident])
12281229
for ident in sorted(dev_info))
12291230

@@ -1253,7 +1254,8 @@ async def vm_device_list(self, endpoint):
12531254
device_assignments, devclass=devclass)
12541255

12551256
dev_info = {
1256-
f'{assignment.backend_domain}+{assignment.ident}':
1257+
(f'{assignment.backend_domain}'
1258+
f'+{assignment.ident}:{assignment.device_identity}'):
12571259
assignment.serialize().decode('ascii', errors="ignore")
12581260
for assignment in device_assignments}
12591261

@@ -1288,7 +1290,8 @@ async def vm_device_attached(self, endpoint):
12881290
devclass=devclass)
12891291

12901292
dev_info = {
1291-
f'{assignment.backend_domain}+{assignment.ident}':
1293+
(f'{assignment.backend_domain}'
1294+
f'+{assignment.ident}:{assignment.device_identity}'):
12921295
assignment.serialize().decode('ascii', errors="ignore")
12931296
for assignment in device_assignments}
12941297

qubes/device_protocol.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ def check_device_properties(
216216

217217
if properties.get('ident', expected.ident) != expected.ident:
218218
raise UnexpectedDeviceProperty(
219-
f"Got device with id: {properties['ident']} "
220-
f"when expected id: {expected.ident}.")
219+
f"Got device from port: {properties['ident']} "
220+
f"when expected port: {expected.ident}.")
221221
properties['ident'] = expected.ident
222222

223223
if properties.get('devclass', expected.devclass) != expected.devclass:
@@ -966,12 +966,14 @@ def deserialize(
966966
cls,
967967
serialization: bytes,
968968
expected_port: Port,
969+
expected_identity: Optional[str],
969970
) -> 'DeviceAssignment':
970971
"""
971972
Recovers a serialized object, see: :py:meth:`serialize`.
972973
"""
973974
try:
974-
result = cls._deserialize(serialization, expected_port)
975+
result = cls._deserialize(
976+
serialization, expected_port, expected_identity)
975977
except Exception as exc:
976978
raise ProtocolError() from exc
977979
return result
@@ -981,6 +983,7 @@ def _deserialize(
981983
cls,
982984
untrusted_serialization: bytes,
983985
expected_port: Port,
986+
expected_identity: Optional[str],
984987
) -> 'DeviceAssignment':
985988
"""
986989
Actually deserializes the object.
@@ -993,4 +996,9 @@ def _deserialize(
993996
del properties['ident']
994997
del properties['devclass']
995998

996-
return cls(expected_port, **properties)
999+
assignment = cls(expected_port, **properties)
1000+
if assignment.device.self_identity != expected_identity:
1001+
raise UnexpectedDeviceProperty(
1002+
f"Got device with identity {assignment.device.self_identity}"
1003+
f"when expected devices with identity {expected_identity}.")
1004+
return assignment

qubes/devices.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,14 @@ async def assign(self, assignment: DeviceAssignment):
223223
"""
224224
if assignment.devclass != self._bus:
225225
raise ValueError(
226-
f'Trying to attach {assignment.devclass} device '
226+
f'Trying to assign {assignment.devclass} device '
227227
f'when {self._bus} device expected.')
228228

229229
device = assignment.device
230230
if device in self.get_assigned_devices():
231231
raise DeviceAlreadyAssigned(
232-
'{} device {!s} already assigned to {!s}'.format(
233-
self._bus, device, self._vm))
232+
f'{self._bus} device {device!s} '
233+
f'already assigned to {self._vm!s}')
234234

235235
self._set.add(assignment)
236236

@@ -366,10 +366,10 @@ def get_assigned_devices(
366366
367367
Safe to access before libvirt bootstrap.
368368
"""
369-
for dev in self._set:
370-
if required_only and not dev.required:
369+
for ass in self._set:
370+
if required_only and not ass.required:
371371
continue
372-
yield dev
372+
yield ass
373373

374374
def get_exposed_devices(self) -> Iterable[DeviceInfo]:
375375
"""

0 commit comments

Comments
 (0)