SUBSYSTEM=="pci", RUN+="socket:/org/xen/xend/udev_event"
-#SUBSYSTEM=="scsi", RUN+="socket:/org/xen/xend/udev_event"
+SUBSYSTEM=="scsi", RUN+="socket:/org/xen/xend/udev_event"
#SUBSYSTEM=="net", KERNEL!="vif[0-9]*.[0-9]*|tap[0-9]*.[0-9]*", RUN+="socket:/org/xen/xend/udev_event"
except:
return None
-def get_all_scsi_devices():
+def _make_scsi_record(scsi_info):
+ scsi_rec = {
+ 'physical_HCTL': scsi_info[0],
+ 'dev_name': None,
+ 'sg_name': scsi_info[2],
+ 'scsi_id': None
+ }
+ if scsi_info[1] is not None:
+ scsi_rec['dev_name'] = scsi_info[1]
+ if scsi_info[3] is not None:
+ scsi_rec['scsi_id'] = scsi_info[3]
+
+ scsi_rec['vendor_name'] = \
+ get_scsi_vendor(scsi_rec['physical_HCTL'])
+ scsi_rec['model'] = \
+ get_scsi_model(scsi_rec['physical_HCTL'])
+ scsi_rec['type_id'] = \
+ get_scsi_typeid(scsi_rec['physical_HCTL'])
+ scsi_rec['revision'] = \
+ get_scsi_revision(scsi_rec['physical_HCTL'])
+ scsi_rec['scsi_level'] = \
+ get_scsi_scsilevel(scsi_rec['physical_HCTL'])
- scsi_devs = []
+ try:
+ lsscsi_info = os.popen('lsscsi %s 2>/dev/null' % scsi_rec['physical_HCTL']).read().split()
+ scsi_rec['type'] = lsscsi_info[1]
+ except:
+ scsi_rec['type'] = None
- for scsi_info in vscsi_get_scsidevices():
- scsi_dev = {
- 'physical_HCTL': scsi_info[0],
- 'dev_name': None,
- 'sg_name': scsi_info[2],
- 'scsi_id': None
- }
- if scsi_info[1] is not None:
- scsi_dev['dev_name'] = scsi_info[1]
- if scsi_info[3] is not None:
- scsi_dev['scsi_id'] = scsi_info[3]
-
- scsi_dev['vendor_name'] = \
- get_scsi_vendor(scsi_dev['physical_HCTL'])
- scsi_dev['model'] = \
- get_scsi_model(scsi_dev['physical_HCTL'])
- scsi_dev['type_id'] = \
- get_scsi_typeid(scsi_dev['physical_HCTL'])
- scsi_dev['revision'] = \
- get_scsi_revision(scsi_dev['physical_HCTL'])
- scsi_dev['scsi_level'] = \
- get_scsi_scsilevel(scsi_dev['physical_HCTL'])
+ return scsi_rec
- try:
- lsscsi_info = os.popen('lsscsi %s 2>/dev/null' % scsi_dev['physical_HCTL']).read().split()
- scsi_dev['type'] = lsscsi_info[1]
- except:
- scsi_dev['type'] = None
-
- scsi_devs.append(scsi_dev)
+def get_scsi_device(pHCTL):
+ scsis_info = _vscsi_get_scsidevices_by_lsscsi(pHCTL)
+ if not scsis_info:
+ scsis_info = _vscsi_get_scsidevices_by_sysfs()
+ for scsi_info in scsis_info:
+ if scsi_info[0] == pHCTL:
+ return _make_scsi_record(scsi_info)
+ return None
- return scsi_devs
+def get_all_scsi_devices():
+ scsi_records = []
+ for scsi_info in vscsi_get_scsidevices():
+ scsi_record = _make_scsi_record(scsi_info)
+ scsi_records.append(scsi_record)
+ return scsi_records
self.save_PPCIs()
- def add_PSCSI(self):
- # TODO
- log.debug("add_network(): Not implemented.")
+ def add_PSCSI(self, add_HCTL):
+ saved_pscsis = self.state_store.load_state('pscsi')
+ saved_pscsi_table = {}
+ if saved_pscsis:
+ for saved_uuid, saved_record in saved_pscsis.items():
+ try:
+ saved_pscsi_table[saved_record['scsi_id']] = saved_uuid
+ except KeyError:
+ pass
+ # Initialise the PSCSI
+ pscsi_record = vscsi_util.get_scsi_device(add_HCTL)
+ if pscsi_record and pscsi_record['scsi_id']:
+ pscsi_uuid = saved_pscsi_table.get(pscsi_record['scsi_id'], None)
+ if pscsi_uuid is None:
+ pscsi_uuid = uuid.createString()
+ XendPSCSI(pscsi_uuid, pscsi_record)
+ self.save_PSCSIs()
- def remove_PSCSI(self):
- # TODO
- log.debug("add_network(): Not implemented.")
+
+ def remove_PSCSI(self, rem_HCTL):
+ saved_pscsis = self.state_store.load_state('pscsi')
+ if not saved_pscsis:
+ return
+
+ # Remove the PSCSI
+ for pscsi_record in saved_pscsis.values():
+ if rem_HCTL == pscsi_record['physical_HCTL']:
+ pscsi_ref = XendPSCSI.get_by_HCTL(rem_HCTL)
+ XendAPIStore.get(pscsi_ref, "PSCSI").destroy()
+ self.save_PSCSIs()
+ return
## def network_destroy(self, net_uuid):
log.info("Removing pci device %s", pci_name)
XendNode.instance().remove_PPCI(pci_name)
- elif (udev_event.get('SUBSYSTEMS', None) == 'scsi'):
+ elif (udev_event.get('SUBSYSTEM', None) == 'scsi'):
+ hctl = None
+ devpath = udev_event.get('DEVPATH', None)
+ if devpath:
+ hctl = devpath.split('/')[-1]
+ if len(hctl.split(':')) != 4:
+ hctl = None
+ if hctl is None:
+ # By any possibility, if an HCTL isn't gotten from
+ # the udev event, the udev event is ignored.
+ log.warn("Invalid udev event about scsi received")
+ return
+
if (udev_event['ACTION'] == 'add'):
- log.info("Adding scsi device")
- XendNode.instance().add_PSCSI()
+ log.info("Adding scsi device %s", hctl)
+ XendNode.instance().add_PSCSI(hctl)
elif (udev_event['ACTION'] == 'remove'):
- log.info("Removing scci device")
- XendNode.instance().remove_PSCSI()
+ log.info("Removing scsi device %s", hctl)
+ XendNode.instance().remove_PSCSI(hctl)
elif (udev_event.get('SUBSYSTEM', None) == 'net'):
interface = udev_event.get('INTERFACE', None)