@@ -1038,6 +1038,15 @@ def _isSCSIid(s):
10381038 return regex .search (s , 0 )
10391039
10401040
1041+ def _is_usb_device (device ):
1042+ cmd = ["udevadm" , "info" , "-q" , "path" , "-n" , device ]
1043+ try :
1044+ result = pread2 (cmd ).split ('/' )
1045+ return len (result ) >= 5 and result [4 ].startswith ('usb' )
1046+ except CommandException as inst :
1047+ raise CommandException (inst .code , inst .cmd , inst .reason )
1048+
1049+
10411050def test_scsiserial (session , device ):
10421051 device = os .path .realpath (device )
10431052 if not scsiutil ._isSCSIdev (device ):
@@ -1061,6 +1070,9 @@ def test_scsiserial(session, device):
10611070 % device )
10621071 return False
10631072
1073+ # USB devices can have identital SCSI id - prefer matching with serial number
1074+ usb_device_with_serial = serial and _is_usb_device (device )
1075+
10641076 try :
10651077 SRs = session .xenapi .SR .get_all_records ()
10661078 except :
@@ -1070,7 +1082,7 @@ def test_scsiserial(session, device):
10701082 conf = record ["sm_config" ]
10711083 if 'devserial' in conf :
10721084 for dev in conf ['devserial' ].split (',' ):
1073- if _isSCSIid (dev ):
1085+ if not usb_device_with_serial and _isSCSIid (dev ):
10741086 if match_scsiID (dev , scsiID ):
10751087 return True
10761088 elif len (serial ) and dev == serial :
0 commit comments