def configure_vscsis(config_devs, vals): """Create the config for vscsis (virtual scsi devices). """ devidlist = [] config_scsi = [] if len(vals.vscsi) == 0: return 0 scsi_devices = vscsi_util.vscsi_get_scsidevices() for (p_dev, v_dev, backend) in vals.vscsi: tmp = p_dev.split(':') if len(tmp) == 4: (p_hctl, block) = vscsi_util._vscsi_hctl_block(p_dev, scsi_devices) else: (p_hctl, block) = vscsi_util._vscsi_block_scsiid_to_hctl(p_dev, scsi_devices) if p_hctl == None: raise ValueError("Cannot find device \"%s\"" % p_dev) for config in config_scsi: dev = vscsi_convert_sxp_to_dict(config) if dev['v-dev'] == v_dev: raise ValueError('The virtual device "%s" is already defined' % v_dev) v_hctl = v_dev.split(':') devid = int(v_hctl[0]) config_scsi.append(['dev', \ ['state', 'Initialising'], \ ['devid', devid], \ ['p-dev', p_hctl], \ ['p-devname', block], \ ['v-dev', v_dev] ]) if vscsi_lookup_devid(devidlist, devid) == 0: devidlist.append([devid, backend]) for devid, backend in devidlist: tmp = [] for config in config_scsi: dev = vscsi_convert_sxp_to_dict(config) if dev['devid'] == devid: tmp.append(config) tmp.insert(0, 'vscsi') if backend: tmp.append(['backend', backend]) config_devs.append(['device', tmp])
def configure_vscsis(config_devs, vals): """Create the config for vscsis (virtual scsi devices). """ def get_devid(hctl): return int(hctl.split(':')[0]) if len(vals.vscsi) == 0: return 0 config_scsi = {} pHCTL_list = [] vHCTL_list = [] scsi_devices = vscsi_util.vscsi_get_scsidevices() for (p_dev, v_dev, backend) in vals.vscsi: (p_hctl, devname) = \ vscsi_util.vscsi_get_hctl_and_devname_by(p_dev, scsi_devices) if p_hctl == None: raise ValueError('Cannot find device "%s"' % p_dev) feature_host = 0 if v_dev == 'host': if serverType == SERVER_XEN_API: # TODO raise ValueError("SCSI devices assignment by HBA is not implemeted") feature_host = 1 scsi_info = [] devid = get_devid(p_hctl) for (pHCTL, devname, _, _) in scsi_devices: if get_devid(pHCTL) == devid: scsi_info.append([devid, pHCTL, devname, pHCTL]) else: scsi_info = [[get_devid(v_dev), p_hctl, devname, v_dev]] devid_key = scsi_info[0][0] try: config = config_scsi[devid_key] except KeyError: config = {'feature-host': feature_host, 'backend': backend, 'devs': []} devs = config['devs'] for (devid, pHCTL, devname, vHCTL) in scsi_info: if pHCTL in pHCTL_list: raise ValueError('The physical device "%s" is already defined' % pHCTL) if vHCTL in vHCTL_list: raise ValueError('The virtual device "%s" is already defined' % vHCTL) pHCTL_list.append(pHCTL) vHCTL_list.append(vHCTL) devs.append(['dev', \ ['state', xenbusState['Initialising']], \ ['devid', devid], \ ['p-dev', pHCTL], \ ['p-devname', devname], \ ['v-dev', vHCTL] ]) if config['feature-host'] != feature_host: raise ValueError('The physical device "%s" cannot define ' 'because mode is different' % scsi_info[0][1]) if config['backend'] != backend: raise ValueError('The physical device "%s" cannot define ' 'because backend is different' % scsi_info[0][1]) config['devs'] = devs config_scsi[devid_key] = config for config in config_scsi.values(): device = ['vscsi', ['feature-host', config['feature-host']]] for dev in config['devs']: device.append(dev) if config['backend']: device.append(['backend', config['backend']]) config_devs.append(['device', device])