a Vdɀ@sddlZddlZddlZddlZddlZddlmZddlmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZddZddZdd ZGd d d eZGd d d eZGdddeZdS)N)size_human_2_size_bytes)SystemVolumeDiskPool FileSystem AccessGroup FsSnapshot NfsExportmd5LsmError TargetPort ErrorNumber JobStatusBatteryint_divcsfdd}|S)Nc s:z|i|WStjy}zdt|dturNt|ddrN|djt|dkrftt j dtt j dt|WYd}~nd}~0tyt|dturt|ddr|djYnjt y4}zPt|dtur t|ddr |djtt j dt|WYd}~n d}~00dS)Nrbs_objzdatabase is lockedz%Timeout to require lock on state filez%Got unexpected error from sqlite3: %szGot unexpected error: %s) sqlite3OperationalErrortypeSimArrayhasattrrtrans_rollbackstrr rZTIMEOUT PLUGIN_BUG Exception)argsZkargs sql_errorZ base_errormethod9/usr/lib64/python3.9/site-packages/sim_plugin/simarray.pywrappers.   " z_handle_errors..wrapperr )rr"r rr!_handle_errorss r#c Cs:dg}tddD]}|tdtddqd|S)z. Generate a random VPD83 NAA_Type3 ID Z50rz%02x)rangeappendrrandomZrandintjoin)Zvpd_r r r! _random_vpd/sr,cCs,i}t|jD]\}}||||d<q|SNr) enumerate description)cursorrowdidxcolr r r! _dict_factory9sr5c@s8eZdZejddejddejddejddejddej ddej ddej d dej d dej d dejd dejd dejddejddiZejddejddejddejddejddej ddej ddej ddej ddej ddejddejddejddejddiZeddZd S)!PoolRAIDcCs|dkSr-r xr r r!BzPoolRAID.cCs|dkSr-r r7r r r!r9Cr:cCs|dkSNr r7r r r!r9Dr:cCs|dkSNr r7r r r!r9Er:cCs|dkSr=r r7r r r!r9Fr:cCs|dkSr=r r7r r r!r9Gr:cCs|dkSNr r7r r r!r9Hr:cCs|dko|ddkS)Nr@r<rr r7r r r!r9Ir:cCs|dko|ddkSNr<rr r7r r r!r9Jr:cCs|dko|ddkSNr<rr r7r r r!r9Kr:cCs|dko|ddkSrAr r7r r r!r9Lr:cCs|dko|ddkSrCr r7r r r!r9Mr:cCs|dko|ddkSrAr r7r r r!r9Nr:cCs|dko|ddkSrCr r7r r r!r9Or:cCs|SNr r7r r r!r9Sr:cCs|SrEr r7r r r!r9Tr:cCsdSNr r7r r r!r9Ur:cCs|dSrFr r7r r r!r9Vr:cCs|dSrFr r7r r r!r9Wr:cCs|dSrFr r7r r r!r9Xr:cCs|dSr;r r7r r r!r9Yr:cCs t|dSr;rr7r r r!r9Zr:cCst|ddSNr<rGrHr7r r r!r9[r:cCst|ddSr;rHr7r r r!r9\r:cCs|dSr;r r7r r r!r9]r:cCs|dSr?r r7r r r!r9^r:cCst|ddSrIrHr7r r r!r9_r:cCst|ddSr;rHr7r r r!r9`r:cCsV|ttjvr"ttjd|tj||durHttjd||ftj||S)z Return a integer indicating how many disks should be used as real data(not mirrored or parity) disks. Treating RAID 5 and 6 using fixed parity disk. z0data_disk_count(): Got unsupported raid type(%d)Fz;data_disk_count(): Illegal disk count(%d) for raid type(%d))listr6_RAID_DISK_CHKkeysr rr_RAID_PARITY_DISK_COUNT_FUNC) raid_type disk_countr r r!data_disk_countcszPoolRAID.data_disk_countN)__name__ __module__ __qualname__rRAID_TYPE_JBODRAID_TYPE_RAID0RAID_TYPE_RAID1ZRAID_TYPE_RAID3ZRAID_TYPE_RAID4RAID_TYPE_RAID5RAID_TYPE_RAID6RAID_TYPE_RAID10ZRAID_TYPE_RAID15ZRAID_TYPE_RAID16RAID_TYPE_RAID50RAID_TYPE_RAID60ZRAID_TYPE_RAID51ZRAID_TYPE_RAID61rKrM staticmethodrPr r r r!r6@s@                            r6c@seZdZdZdeZdZdZdZdZdZ dZ dZ d Z e jZejZejZejZd Zd Zd Zejejejejejejej gZ!gd Z"ddZ#ddZ$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+dd!d"Z,d#d$Z-d%d&Z.dd(d)Z/d*d+Z0d,d-Z1d.d/Z2d0d1Z3d2d3Z4d4d5Z5d6d7Z6dd9d:Z7dd;d<Z8d=d>Z9dd?d@Z:ddAdBZ;dCdDZe?dIdJZ@ddKdLZAdMdNZBdOdPZCdQdRZDdSdTZEdUdVZFdWdXZGdYdZZHdd[d\ZId]d^ZJd_d`ZKe?dadbZLddcddZMdedfZNdgdhZOdidjZPdkdlZQdmdnZRdodpZSdqdrZTdsdtZUddvdwZVdxdyZWdzd{ZXd|d}ZYd~dZZdddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcddZdddZeddZfddZgddZhddZiddZjddZkddZlddZmd'S) BackStorez4.1zLSM_SIMULATOR_DATA_%srGr<r>zsim-01zLSM simulated storage plug-ini #)i i@iir^iiic Cs tj|s2tt|tjtjBt|d||_d|_ t j |t t |ddd|_t|j_d}|d7}|d7}|d7}|d 7}|d 7}|d 7}|d 7}|d 7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d 7}|d!7}|d"7}|jfid#tjtjtjtjtjd$}|j}z||Wntt jy}z d%t|vrn|WYd}~nBd}~0t jy}zttjd&|jWYd}~n d}~00dS)'NiZ IMMEDIATE)timeoutZisolation_levelzPRAGMA foreign_keys = ON; z CREATE TABLE systems ( id TEXT PRIMARY KEY, name TEXT NOT NULL, status INTEGER NOT NULL, status_info TEXT, read_cache_pct INTEGER, version TEXT NOT NULL); a% CREATE TABLE tgts ( id INTEGER PRIMARY KEY, port_type INTEGER NOT NULL, service_address TEXT NOT NULL, network_address TEXT NOT NULL, physical_address TEXT NOT NULL, physical_name TEXT NOT NULL); a CREATE TABLE pools ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, status INTEGER NOT NULL, status_info TEXT, element_type INTEGER NOT NULL, unsupported_actions INTEGER, raid_type INTEGER NOT NULL, parent_pool_id INTEGER, member_type INTEGER, strip_size INTEGER, total_space LONG); a CREATE TABLE disks ( id INTEGER PRIMARY KEY, total_space LONG NOT NULL, disk_type INTEGER NOT NULL, status INTEGER NOT NULL, disk_prefix TEXT NOT NULL, location TEXT NOT NULL, owner_pool_id INTEGER, role TEXT, vpd83 TEXT, rpm INTEGER, link_type INTEGER, FOREIGN KEY(owner_pool_id) REFERENCES pools(id) ON DELETE SET DEFAULT); a; CREATE TABLE volumes ( id INTEGER PRIMARY KEY, vpd83 TEXT NOT NULL, name TEXT UNIQUE NOT NULL, total_space LONG NOT NULL, consumed_size LONG NOT NULL, admin_state INTEGER, is_hw_raid_vol INTEGER, write_cache_policy INTEGER NOT NULL, read_cache_policy INTEGER NOT NULL, phy_disk_cache INTEGER NOT NULL, pool_id INTEGER NOT NULL, FOREIGN KEY(pool_id) REFERENCES pools(id) ON DELETE CASCADE); zx CREATE TABLE ags ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL); z CREATE TABLE inits ( id TEXT UNIQUE NOT NULL, init_type INTEGER NOT NULL, owner_ag_id INTEGER NOT NULL, FOREIGN KEY(owner_ag_id) REFERENCES ags(id) ON DELETE CASCADE); a  CREATE TABLE vol_masks ( vol_id INTEGER NOT NULL, ag_id INTEGER NOT NULL, FOREIGN KEY(vol_id) REFERENCES volumes(id) ON DELETE CASCADE, FOREIGN KEY(ag_id) REFERENCES ags(id) ON DELETE CASCADE); aV CREATE TABLE vol_reps ( rep_type INTEGER, src_vol_id INTEGER NOT NULL, dst_vol_id INTEGER NOT NULL, FOREIGN KEY(src_vol_id) REFERENCES volumes(id) ON DELETE CASCADE, FOREIGN KEY(dst_vol_id) REFERENCES volumes(id) ON DELETE CASCADE); a` CREATE TABLE fss ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, total_space LONG NOT NULL, consumed_size LONG NOT NULL, free_space LONG, pool_id INTEGER NOT NULL, FOREIGN KEY(pool_id) REFERENCES pools(id) ON DELETE CASCADE); a CREATE TABLE fs_snaps ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, fs_id INTEGER NOT NULL, timestamp LONG NOT NULL, FOREIGN KEY(fs_id) REFERENCES fss(id) ON DELETE CASCADE); a- CREATE TABLE fs_clones ( src_fs_id INTEGER NOT NULL, dst_fs_id INTEGER NOT NULL, FOREIGN KEY(src_fs_id) REFERENCES fss(id) ON DELETE CASCADE, FOREIGN KEY(dst_fs_id) REFERENCES fss(id) ON DELETE CASCADE); ad CREATE TABLE exps ( id INTEGER PRIMARY KEY, fs_id INTEGER NOT NULL, exp_path TEXT UNIQUE NOT NULL, auth_type TEXT, anon_uid INTEGER, anon_gid INTEGER, options TEXT, FOREIGN KEY(fs_id) REFERENCES fss(id) ON DELETE CASCADE); z CREATE TABLE exp_root_hosts ( host TEXT NOT NULL, exp_id INTEGER NOT NULL, FOREIGN KEY(exp_id) REFERENCES exps(id) ON DELETE CASCADE); z CREATE TABLE exp_rw_hosts ( host TEXT NOT NULL, exp_id INTEGER NOT NULL, FOREIGN KEY(exp_id) REFERENCES exps(id) ON DELETE CASCADE); z CREATE TABLE exp_ro_hosts ( host TEXT NOT NULL, exp_id INTEGER NOT NULL, FOREIGN KEY(exp_id) REFERENCES exps(id) ON DELETE CASCADE); z CREATE TABLE jobs ( id INTEGER PRIMARY KEY, duration REAL NOT NULL, timestamp TEXT NOT NULL, data_type INTEGER, data_id INTEGER); z CREATE TABLE batteries ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, type INTEGER NOT NULL, status INTEGER NOT NULL); a CREATE VIEW pools_view AS SELECT pool0.id, 'POOL_ID_' || SUBSTR('{ID_PADDING}' || pool0.id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_pool_id, pool0.name, pool0.status, pool0.status_info, pool0.element_type, pool0.unsupported_actions, pool0.raid_type, pool0.member_type, pool0.parent_pool_id, 'POOL_ID_' || SUBSTR('{ID_PADDING}' || pool0.parent_pool_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) parent_lsm_pool_id, pool0.strip_size, pool1.total_space total_space, pool1.total_space - pool2.vol_consumed_size - pool3.fs_consumed_size - pool4.sub_pool_consumed_size free_space, pool1.data_disk_count, pool5.disk_count FROM pools pool0 LEFT JOIN ( SELECT pool.id, ifnull(pool.total_space, ifnull(SUM(disk.total_space), 0)) total_space, COUNT(disk.id) data_disk_count FROM pools pool LEFT JOIN disks disk ON pool.id = disk.owner_pool_id AND disk.role = 'DATA' GROUP BY pool.id ) pool1 ON pool0.id = pool1.id LEFT JOIN ( SELECT pool.id, ifnull(SUM(volume.consumed_size), 0) vol_consumed_size FROM pools pool LEFT JOIN volumes volume ON volume.pool_id = pool.id GROUP BY pool.id ) pool2 ON pool0.id = pool2.id LEFT JOIN ( SELECT pool.id, ifnull(SUM(fs.consumed_size), 0) fs_consumed_size FROM pools pool LEFT JOIN fss fs ON fs.pool_id = pool.id GROUP BY pool.id ) pool3 ON pool0.id = pool3.id LEFT JOIN ( SELECT pool.id, ifnull(SUM(sub_pool.total_space), 0) sub_pool_consumed_size FROM pools pool LEFT JOIN pools sub_pool ON sub_pool.parent_pool_id = pool.id GROUP BY pool.id ) pool4 ON pool0.id = pool4.id LEFT JOIN ( SELECT pool.id, COUNT(disk.id) disk_count FROM pools pool LEFT JOIN disks disk ON pool.id = disk.owner_pool_id GROUP BY pool.id ) pool5 ON pool0.id = pool5.id GROUP BY pool0.id; a CREATE VIEW tgts_view AS SELECT id, 'TGT_PORT_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_tgt_id, port_type, service_address, network_address, physical_address, physical_name FROM tgts; a CREATE VIEW disks_view AS SELECT id, 'DISK_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_disk_id, disk_prefix || '_' || id name, total_space, disk_type, role, status, vpd83, rpm, link_type, location, owner_pool_id FROM disks; af CREATE VIEW volumes_view AS SELECT id, 'VOL_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_vol_id, vpd83, name, total_space, consumed_size, admin_state, is_hw_raid_vol, write_cache_policy, read_cache_policy, phy_disk_cache, pool_id, 'POOL_ID_' || SUBSTR('{ID_PADDING}' || pool_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_pool_id FROM volumes; a CREATE VIEW fss_view AS SELECT id, 'FS_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_fs_id, name, total_space, consumed_size, free_space, pool_id, 'POOL_ID_' || SUBSTR('{ID_PADDING}' || pool_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_pool_id FROM fss; a CREATE VIEW bats_view AS SELECT id, 'BAT_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_bat_id, name, type, status FROM batteries; ap CREATE VIEW fs_snaps_view AS SELECT id, 'FS_SNAP_ID_' || SUBSTR('{ID_PADDING}' || id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_fs_snap_id, name, timestamp, fs_id, 'FS_ID_' || SUBSTR('{ID_PADDING}' || fs_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_fs_id FROM fs_snaps; a; CREATE VIEW volumes_by_ag_view AS SELECT vol.id, 'VOL_ID_' || SUBSTR('{ID_PADDING}' || vol.id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_vol_id, vol.vpd83, vol.name, vol.total_space, vol.consumed_size, vol.pool_id, 'POOL_ID_' || SUBSTR('{ID_PADDING}' || vol.pool_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_pool_id, vol.admin_state, vol.is_hw_raid_vol, vol_mask.ag_id ag_id, vol.write_cache_policy, vol.read_cache_policy, vol.phy_disk_cache FROM volumes vol LEFT JOIN vol_masks vol_mask ON vol_mask.vol_id = vol.id; a CREATE VIEW ags_view AS SELECT ag.id, 'AG_ID_' || SUBSTR('{ID_PADDING}' || ag.id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_ag_id, ag.name, CASE WHEN count(DISTINCT init.init_type) = 1 THEN init.init_type WHEN count(DISTINCT init.init_type) = 2 THEN {AG_INIT_TYPE_MIXED} ELSE {AG_INIT_TYPE_UNKNOWN} END init_type, group_concat(init.id, '{SPLITTER}') init_ids_str FROM ags ag LEFT JOIN inits init ON ag.id = init.owner_ag_id GROUP BY ag.id ORDER BY init.init_type; aO CREATE VIEW ags_by_vol_view AS SELECT ag_new.id, 'AG_ID_' || SUBSTR('{ID_PADDING}' || ag_new.id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_ag_id, ag_new.name, ag_new.init_type, ag_new.init_ids_str, vol_mask.vol_id vol_id FROM ( SELECT ag.id, ag.name, CASE WHEN count(DISTINCT init.init_type) = 1 THEN init.init_type WHEN count(DISTINCT init.init_type) = 2 THEN {AG_INIT_TYPE_MIXED} ELSE {AG_INIT_TYPE_UNKNOWN} END init_type, group_concat(init.id, '{SPLITTER}') init_ids_str FROM ags ag LEFT JOIN inits init ON ag.id = init.owner_ag_id GROUP BY ag.id ORDER BY init.init_type ) ag_new LEFT JOIN vol_masks vol_mask ON vol_mask.ag_id = ag_new.id ; ag CREATE VIEW exps_view AS SELECT exp.id, 'EXP_ID_' || SUBSTR('{ID_PADDING}' || exp.id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_exp_id, exp.fs_id, 'FS_ID_' || SUBSTR('{ID_PADDING}' || exp.fs_id, -{ID_FMT_LEN}, {ID_FMT_LEN}) lsm_fs_id, exp.exp_path, exp.auth_type, exp.anon_uid, exp.anon_gid, exp.options, exp2.exp_root_hosts_str, exp3.exp_rw_hosts_str, exp4.exp_ro_hosts_str FROM exps exp LEFT JOIN ( SELECT exp_t2.id, group_concat( exp_root_host.host, '{SPLITTER}') exp_root_hosts_str FROM exps exp_t2 LEFT JOIN exp_root_hosts exp_root_host ON exp_t2.id = exp_root_host.exp_id GROUP BY exp_t2.id ) exp2 ON exp.id = exp2.id LEFT JOIN ( SELECT exp_t3.id, group_concat( exp_rw_host.host, '{SPLITTER}') exp_rw_hosts_str FROM exps exp_t3 LEFT JOIN exp_rw_hosts exp_rw_host ON exp_t3.id = exp_rw_host.exp_id GROUP BY exp_t3.id ) exp3 ON exp.id = exp3.id LEFT JOIN ( SELECT exp_t4.id, group_concat( exp_ro_host.host, '{SPLITTER}') exp_ro_hosts_str FROM exps exp_t4 LEFT JOIN exp_ro_hosts exp_ro_host ON exp_t4.id = exp_ro_host.exp_id GROUP BY exp_t4.id ) exp4 ON exp.id = exp4.id GROUP BY exp.id; ; 0)Z ID_PADDINGZ ID_FMT_LENZAG_INIT_TYPE_MIXEDZAG_INIT_TYPE_UNKNOWNZSPLITTERzalready existsLStored simulator state incompatible with simulator, please move or delete %s) ospathexistscloseopenO_WRONLYO_CREATchmod statefile lastrowidrZconnectintrsql_connr5Z row_factoryformatr] _ID_FMT_LENrZINIT_TYPE_ISCSI_WWPN_MIXEDZINIT_TYPE_UNKNOWN_LIST_SPLITTERr0Z executescriptrrZ DatabaseErrorr rINVALID_ARGUMENT)selfrnrcsql_cmdsql_currr r r!__init__s                _)G zBackStore.__init__cCs\|}t|dks|ds dSd|dvrF|ddtjkrFdSttjd|jdS)NrFversionTre) sim_sysslenrLr]VERSION_SIGNATUREr rrurn)rvr{r r r!_check_version#szBackStore._check_versionc Cs||r|dS|dtjtjtjdtj tj dt d}t d}t d}g}t dd D]:}|d d |t jt jtd t jd |d||jqfg}t ddD]F}|d d|t jt jtdt jd|dt|d kr||jqg}t ddD]L}|d d|t jt jtt jt jd|dt|d kr||jqt ddD]2}|d d|t jt jtt jt jd|dq^|jdtj|tjtjBtjBtjBtj Btj!tj"Bd}|j#d|tjtjBtjB|d|jdtj|tjtjBtjBd|jdtjtjBtjBtj$|d |d!t%j&d"d"d"d#d$|d!t%j'd%d%d%d&d$|d!t%j(d'd(d)d*d$|d!t%j(d'd+d,d-d$|d!t%j(d'd.d,d-d$|d/d0t)j*t)jd1|d/d2t)j+t)jd1|dSdS)3z^ Raise error if version not match. If empty database found, initiate. Nsystemsr&)idnamestatus status_inforzread_cache_pctZ1EiBZ2TiBZ512GiBrr<disksz2TiB SATA Diski zPort: %d Box: 1 Bay: 1)Z disk_prefix total_space disk_typervpd83rpm link_typelocationrBz 2EiB SAS Diski:zPort: %d Box: 1 Bay: 2raz512GiB SSD DiskzPort: %d Box: 1 Bay: 3r$z 2TiB SSD DiskzPort: %d Box: 1 Bay: 4zPool 1)rrN sim_disk_ids element_typeunsupported_actionszPool 2(sub pool of Pool 1))rparent_pool_idrsizezPool 3)rrNrrZ lsm_test_aggr)rrrNrZtgtsz50:0a:09:86:99:4b:8d:c5ZFC_a_0b) port_typeservice_addressnetwork_addressphysical_address physical_namez50:0a:09:86:99:4b:8d:c6Z FCoE_b_0cz"iqn.1986-05.com.example:sim-tgt-03z sim-iscsi-tgt-3.example.com:3260za4:4e:31:47:f4:e0Z iSCSI_c_0dz 10.0.0.1:3260za4:4e:31:47:f4:e1Z iSCSI_c_0ez%[2001:470:1f09:efe:a64e:31ff::1]:3260 batteriesz'Battery SIMB01, 8000 mAh, 05 March 2016)rrrz&Capacitor SIMC01, 500 J, 05 March 2016), trans_beginr~ trans_commit _data_addr]SYS_IDSYS_NAMEr STATUS_OKr}_DEFAULT_READ_CACHE_PCTrr'rZ TYPE_SATAr,Z LINK_TYPE_ATAr(roZTYPE_SASZ LINK_TYPE_SASr|ZTYPE_SSDZRPM_NON_ROTATING_MEDIUMsim_pool_create_from_diskrrVrZELEMENT_TYPE_POOLZELEMENT_TYPE_FSELEMENT_TYPE_VOLUMEZELEMENT_TYPE_DELTAZELEMENT_TYPE_SYS_RESERVEDUNSUPPORTED_VOLUME_GROWUNSUPPORTED_VOLUME_SHRINKsim_pool_create_sub_poolrUr ZTYPE_FCZ TYPE_FCOEZ TYPE_ISCSIrZ TYPE_CHEMICALZTYPE_CAPACITOR) rvZ size_bytes_1eZ size_bytes_2tZsize_bytes_512gZ pool_1_disksiZtest_pool_disksZssd_pool_disksZ pool_1_idr r r!check_version_and_init1sh         z BackStore.check_version_and_initcCs$|j}|||j|_|S)z9 Execute sql command and get all output. )rqr0executeroZfetchall)rvrwrxr r r! _sql_execs  zBackStore._sql_execcCsd|}||S)NzSELECT * FROM %sr)rv table_namerwr r r! _get_tableszBackStore._get_tablecCs|jddS)NzBEGIN IMMEDIATE TRANSACTION;)rqrrvr r r!rszBackStore.trans_begincCs|jdSrE)rqZcommitrr r r!rszBackStore.trans_commitcCs|jdSrE)rqZrollbackrr r r!rszBackStore.trans_rollbackcCsRt|}ddt|D}d|dd|dd|f}||dS)NcSs g|]}|durdnt|qS)Nr&)r.0vr r r! sz'BackStore._data_add..z INSERT INTO %s (%s) VALUES (%s);z'%s'z', ')rJrLvaluesr*r)rvrZ data_dictrLrrwr r r!rs    zBackStore._data_addFcCsZd||f}||}|rRt|dkr*dSt|dkr>|dSttjdtn|SdS)NzSELECT * FROM %s WHERE %srrGz%_data_find(): Got non-unique data: %s)rr|r rrlocals)rvtable condition flag_uniquerwZ sim_datasr r r! _data_finds    zBackStore._data_findcCs6|durd|||f}nd||||f}||dS)Nz#UPDATE %s SET %s=NULL WHERE id='%s'z#UPDATE %s SET %s='%s' WHERE id='%s'r)rvrdata_idZ column_namevaluerwr r r! _data_updates zBackStore._data_updatecCsd||f}||dS)NzDELETE FROM %s WHERE %s;r)rvrrrwr r r! _data_deletes zBackStore._data_deleteNcCs*|dtdtjt||d|jS)z* Return a job id(Integer) jobsZ LSM_SIM_TIME)duration timestamp data_typer)rrfgetenvr]JOB_DEFAULT_DURATIONtimero)rvZ job_data_typerr r r!sim_job_create#s  zBackStore.sim_job_createcCs|dd|dS)Nrid="%s"r)rv sim_job_idr r r!sim_job_delete4szBackStore.sim_job_deletecCs|jdd|dd}|dur(ttjd|ddkrZttt|d |dd }nd }d}d}|dkrrd}|d krd }|d tjkr| |d }|d }nJ|d tj kr| |d }|d }n$|d tj kr| |d }|d }|||fS) zg Return (progress, data_type, data) tuple. progress is the integer of percent. rid=%sTrN Job not foundrrrdrr)rr r NOT_FOUND_JOBrprfloatr]JOB_DATA_TYPE_VOL sim_vol_of_idJOB_DATA_TYPE_FS sim_fs_of_idJOB_DATA_TYPE_FS_SNAPsim_fs_snap_of_id)rvrZsim_jobprogressdatarr r r!sim_job_status7s:    zBackStore.sim_job_statuscCs |dS)z0 Return a list of sim_sys dict. rrrr r r!r{\szBackStore.sim_sysscCstdd|dd|DS)Ncss|]}|dVqdS) lsm_disk_idNr rr2r r r! csz1BackStore.lsm_disk_ids_of_pool.. disks_viewowner_pool_id="%s"rJrrv sim_pool_idr r r!lsm_disk_ids_of_poolbs zBackStore.lsm_disk_ids_of_poolcCs |dS)z1 Return a list of sim_disk dict. rrrr r r! sim_diskshszBackStore.sim_diskscCs |dS)z1 Return a list of sim_pool dict. pools_viewrrr r r! sim_poolsnszBackStore.sim_poolscCs|d|tjdS)Nrr)_sim_data_of_idrNOT_FOUND_POOLrr r r!sim_pool_of_idtszBackStore.sim_pool_of_idrc Cs|dkrtj}|tjks"|tjkr(tj}|d|tjd|||tj |dt |t |}|j }|d|D]$} |d| d||d| ddql||dD]$} |d| d||d| dd q|S) Nrpoolsr&)rrrrrrN member_type strip_sizerZ owner_pool_idroleZDATAZPARITY)r]DEFAULT_STRIP_SIZErrVrTBLK_SIZErrrMEMBER_TYPE_DISKr6rPr|ror) rvrrrNrrrrPrZ sim_disk_idr r r!rxsB    z#BackStore.sim_pool_create_from_diskc Cs,|d|tjd||tjtj||d |jS)Nrr&) rrrrrrNrrr)rrrrRAID_TYPE_OTHERMEMBER_TYPE_POOLro)rvrrrrrr r r!rs z"BackStore.sim_pool_create_sub_poolcCs|d|ddS)Nz3SELECT COUNT(id) FROM disks WHERE owner_pool_id=%s;rrrr r r!sim_pool_disks_countszBackStore.sim_pool_disks_countcCs|d|ddS)NzCSELECT COUNT(id) FROM disks WHERE owner_pool_id=%s and role='DATA';rrrr r r!sim_pool_data_disks_countsz#BackStore.sim_pool_data_disks_countcCs"|r|dd|S|dSdS)z0 Return a list of sim_vol dict. Zvolumes_by_ag_viewzag_id=%s volumes_viewNrrrv sim_ag_idr r r!sim_volss zBackStore.sim_volscCs8|j|d|dd}|dur4|r0t|d|ndS|S)NrTrz %s not found)rr )rvrr lsm_error_noZ data_namesim_datar r r!rszBackStore._sim_data_of_idcCs|d|tjdS)zD Return sim_vol if found. Raise error if not found. rr)rrNOT_FOUND_VOLUMErv sim_vol_idr r r!rszBackStore.sim_vol_of_idcCs&||}|d|kr"ttjddS)N free_spaceInsufficient space in pool)rr rNOT_ENOUGH_SPACE)rvr size_bytessim_poolr r r!_check_pool_free_spaces   z BackStore._check_pool_free_spacecCs|tjdtjtjSrF)r]r)rr r r!_block_roundings  zBackStore._block_roundingc Cst|}|||t}t|d<||d<||d<||d<||d<tj|d<||d<tj|d<tj|d <tj |d <z| d |Wn6t j y}zt tjd |WYd}~n d}~00|jS) Nrrpool_idr consumed_size admin_stateis_hw_raid_volwrite_cache_policyread_cache_policyphy_disk_cachevolumes+Name '%s' is already in use by other volume)r]rrdictr,rADMIN_STATE_ENABLEDDEFAULT_WRITE_CACHE_POLICYDEFAULT_READ_CACHE_POLICYDEFAULT_PHYSICAL_DISK_CACHErrIntegrityErrorr r NAME_CONFLICTro)rvrrrrsim_volrr r r!sim_vol_creates*       zBackStore.sim_vol_createcCs||}||r ttjd||}t|dkrT|D]}||kr:ttjdq:|dr|dd|dD]}| d|d d d qp| d d |dn| dd |d S)zB This does not check whether volume exist or not. z Volume is masked to access grouprGz%Requested volume has child dependencyrrrrrrrNrrr) r_sim_ag_ids_of_masked_volr r IS_MASKEDdst_sim_vol_ids_of_srcr|HAS_CHILD_DEPENDENCYrrr)rvrrdst_sim_vol_idsdst_sim_vol_idr2r r r!sim_vol_deletes&     zBackStore.sim_vol_deletecCsN|||||dd||f}|r8ttjd|d||ddS)N vol_masksag_id="%s" AND vol_id="%s"z2Volume is already masked to requested access group)ag_idvol_id)r sim_ag_of_idrr rNO_STATE_CHANGEr)rvrr exist_maskr r r! sim_vol_masks   zBackStore.sim_vol_maskcCsN||||d||f}|d|}|r>|d|n ttjddS)Nrrz.Volume is not masked to requested access group)rrrrr rr)rvrrrrr r r!sim_vol_unmask.s    zBackStore.sim_vol_unmaskcCstdd|dd|DS)Ncss|]}|dVqdS)rNr rmr r r!r;sz6BackStore._sim_vol_ids_of_masked_ag..rz ag_id="%s"rrr r r!_sim_vol_ids_of_masked_ag:s z#BackStore._sim_vol_ids_of_masked_agcCstdd|dd|DS)Ncss|]}|dVqdS)rNr r"r r r!r@sz6BackStore._sim_ag_ids_of_masked_vol..rz vol_id="%s"rrr r r!r?s z#BackStore._sim_ag_ids_of_masked_volcCst|}||}|d|kr,ttjd||d}||d}|dkr|dtj@rhttj d|d|krttj dn|dtj @rttj d| d |d|| d |d |dS) Nrz%Volume size is identical to requestedrrrz.Requested pool does not allow volume size growrrrr) r]rrr rrrrr NO_SUPPORTrrr)rvrnew_size_bytesrrZ incrementr r r!sim_vol_resizeDs4      zBackStore.sim_vol_resizecCs(||tdd|dd|DS)zL Return a list of dst_vol_id for provided source volume ID. css|]}|dVqdS) dst_vol_idNr rr r r!risz3BackStore.dst_sim_vol_ids_of_src..vol_repssrc_vol_id="%s")rrJrrvsrc_sim_vol_idr r r!rds  z BackStore.dst_sim_vol_ids_of_srccCst||||||kr dS|tjkr.dStdd|dd|D}t|dkr\dS|d|||ddS)Ncss|]}|dVqdS) src_vol_idNr )rrr r r!rsz,BackStore.sim_vol_replica..r)zdst_vol_id="%s"rG)r-r(rep_type)rrZREPLICATE_COPYrJrr|r)rvr,rr/Z blk_rangesZcur_src_sim_vol_idsr r r!sim_vol_replicans(    zBackStore.sim_vol_replicacCs*||sttjd|dd|dS)Nz+Provided volume is not a replication sourcer)r*)rr rrrr+r r r!sim_vol_src_replica_breaks  z#BackStore.sim_vol_src_replica_breakcCs6||}|d|kr"ttjd|d|d|dS)Nrz,Volume admin state is identical to requestedr)rr rrr)rvrZnew_admin_staterr r r!sim_vol_state_changes   zBackStore.sim_vol_state_changecCs|dtj|d<|d=|S)z= Update 'init_type' and 'init_ids' of sim_ag Z init_ids_strinit_idssplitr]rtsim_agr r r!_sim_ag_formats zBackStore._sim_ag_formatcCs.|r|dd|}n |d}dd|DS)NZags_by_vol_viewz vol_id=%sags_viewcSsg|]}t|qSr )r]r8rar r r!rr:z%BackStore.sim_ags..r)rvrsim_agsr r r!r<s  zBackStore.sim_agsc CsTz|d|||dWn6tjyN}zttjd|WYd}~n d}~00dS)Ninits)r init_typeZ owner_ag_idz6Initiator '%s' is already in use by other access group)rrrr rZEXISTS_INITIATOR)rvr>init_idrrr r r!_sim_init_creates zBackStore._sim_init_createcCsdSrEr )rvr?in_userin_passout_userout_passr r r!iscsi_chap_auth_setszBackStore.iscsi_chap_auth_setc Csdz|dd|i|j}Wn6tjyP}zttjd|WYd}~n d}~00|||||S)Nagsrz1Name '%s' is already in use by other access group)rrorrr rrr@)rvrr>r?rrr r r! sim_ag_creates zBackStore.sim_ag_createcCs4||||r ttjd|dd|dS)Nz!Access group has volume masked torFr)rr$r rrrrr r r! sim_ag_deletes   zBackStore.sim_ag_deletecCsT||}||dvr"ttjd|tjkrB|tjkrBttjd||||dS)Nr3z!Initiator already in access groupz.Only support iSCSI IQN and WWPN initiator type) rr rrrZINIT_TYPE_ISCSI_IQNZINIT_TYPE_WWPNr%r@)rvrr?r>r7r r r!sim_ag_init_adds   zBackStore.sim_ag_init_addcCsR||}||dvr"ttjdt|ddkr>ttjd|dd|dS)Nr3z(Initiator is not in defined access grouprGz6Refused to remove the last initiator from access groupr=r)rr rrr|ZLAST_INIT_IN_ACCESS_GROUPr)rvrr?r7r r r!sim_ag_init_deletes  zBackStore.sim_ag_init_deletecCs |d|tjd}t||S)Nr9z Access Group)rrZNOT_FOUND_ACCESS_GROUPr]r8)rvrr7r r r!rs  zBackStore.sim_ag_of_idcCs |dS)z/ Return a list of sim_fs dict. fss_viewrrr r r!sim_fssszBackStore.sim_fssTcCstj}|sd}|d||dS)NrKz File System)r NOT_FOUND_FSr)rv sim_fs_idZ raise_errorrr r r!rs  zBackStore.sim_fs_of_idc Cspt|}|||z|d|||||dWn6tjyh}zttjd|WYd}~n d}~00|j S)Nfss)rrrrrz'Name '%s' is already in use by other fs) r]rrrrrr rrro)rvrrrrr r r! sim_fs_create s"  zBackStore.sim_fs_createcCs4||||r ttjd|dd|dS)Nz*Requested file system has child dependencyrOr)rclone_dst_sim_fs_ids_of_srcr rrrrvrNr r r! sim_fs_deletes   zBackStore.sim_fs_deletecCst|}||}|d|kr,ttjd||d}||dkrf|d||dkrfttjd|d|d||d|d||d|d|dS)Nrz*File System size is identical to requestedrrrrOr) r]rrr rrrrr)rvrNr&sim_fsrr r r! sim_fs_resize%s     zBackStore.sim_fs_resizecCs|||dd|S)N fs_snaps_viewz fs_id="%s")rrrRr r r! sim_fs_snaps;s zBackStore.sim_fs_snapscCs2|d|tjd}|r.|d|kr.ttjd|S)NrVzFile system snapshotfs_idzFDefined file system snapshot ID is not belong to requested file system)rrNOT_FOUND_FS_SSr )rvsim_fs_snap_idrN sim_fs_snapr r r!r?szBackStore.sim_fs_snap_of_idc Csd||z |d||ttdWn2tjy\}zttjdWYd}~n d}~00|j S)Nfs_snaps)rrXrz6The name is already used by other file system snapshot) rrrprrrr rrro)rvrNrrr r r!sim_fs_snap_createJs  zBackStore.sim_fs_snap_createcCs|||r|||dSrErr)rvrNrZfiles restore_filesflag_all_filesr r r!sim_fs_snap_restoreXs  zBackStore.sim_fs_snap_restorecCs*||||||dd|dS)Nr\r)rrr)rvrZrNr r r!sim_fs_snap_deleteas  zBackStore.sim_fs_snap_deletecCsd|}||dS)Nz&DELETE FROM fs_snaps WHERE fs_id='%s';r)rvrNrwr r r!sim_fs_snap_del_by_fsfszBackStore.sim_fs_snap_del_by_fscCs:|||||r$||||d||ddS)N fs_clones) src_fs_id dst_fs_id)rrr)rv src_sim_fs_id dst_sim_fs_idrZr r r! sim_fs_clonejs   zBackStore.sim_fs_clonecCs|||r|||dSrEr^)rvrN src_fs_name dst_fs_namerZr r r!sim_fs_file_cloneys  zBackStore.sim_fs_file_clonecCs(||tdd|dd|DS)zM Return a list of dst_fs_id for provided clone source fs ID. css|]}|dVqdS)rgNr rr r r!rsz8BackStore.clone_dst_sim_fs_ids_of_src..resrc_fs_id="%s")rrJrrvrhr r r!rQs  z%BackStore.clone_dst_sim_fs_ids_of_srccCs|dd|dS)Nrernrror r r!sim_fs_src_clone_breaksz BackStore.sim_fs_src_clone_breakcCsBdD]8}d|}||r.||tj||<ng||<||=q|S)N) root_hostsrw_hostsro_hostsz exp_%s_strr4)rvsim_expZkey_namerr r r!_sim_exp_formats zBackStore._sim_exp_formatcstfdddDS)Nc3s|]}|VqdSrE)rurerr r!rsz%BackStore.sim_exps.. exps_view)rJrrr rr!sim_expss zBackStore.sim_expscCs||d|tjdS)Nrxz NFS Export)rurrNOT_FOUND_NFS_EXPORTrv sim_exp_idr r r! sim_exp_of_ids zBackStore.sim_exp_of_idc  Cs|durdtdd}||z|d|||||| dWn2tjyt} zttjdWYd} ~ n d} ~ 00|j} |D]} |d| | dq|D]} |d| | dq|D]}|d || dq| S) Nz /nfs_exp_%srDexps)rXexp_pathanon_uidanon_gid auth_typeoptionsz/Export path is already used by other NFS exportZexp_root_hosts)hostexp_idZ exp_rw_hostsZ exp_ro_hosts) r,rrrrr rrro)rvrNrrqrrrsrrrrrr|Z root_hostZrw_hostZro_hostr r r!sim_exp_createsF     zBackStore.sim_exp_createcCs|||dd|dS)Nr~r)r}rr{r r r!sim_exp_deletes zBackStore.sim_exp_deletecCs |dS)z0 Return a list of sim_tgt dict. Z tgts_viewrrr r r!sim_tgtsszBackStore.sim_tgtscCs |dS)z0 Return a list of sim_bat dict. Z bats_viewrrr r r!sim_batsszBackStore.sim_batscCs|||d|d|dS)Nrrrr)rvrpdcr r r!sim_vol_pdc_sets zBackStore.sim_vol_pdc_setcCs|||d|d|dS)Nrrr)rvrrcpr r r!sim_vol_rcp_sets zBackStore.sim_vol_rcp_setcCs|||d|d|dS)Nrrr)rvrwcpr r r!sim_vol_wcp_sets zBackStore.sim_vol_wcp_set)F)NN)rr)r)N)N)r)N)N)T)N)nrQrRrSZVERSIONr}rrrrrrrrrZMODE_HARDWARE_RAIDSYS_MODErWRITE_CACHE_POLICY_AUTOr READ_CACHE_POLICY_ENABLEDr ZPHYSICAL_DISK_CACHE_DISABLEDr rrtrsrUrVrWrXrYrZr[SUPPORTED_VCR_RAID_TYPESSUPPORTED_VCR_STRIP_SIZESryr~rrrrrrrrrrrrrr{rrrrrrrrrrrrr\rrrr r!r$rr'rr0r1r2r8r<r@rErGrHrIrJrrLrrPrSrUrWrr]rbrcrdrjrmrQrpruryr}rrrrrrrr r r r!r]vs 4    %  0         $           *r]c@seZdZededZeddZ eddZ eddZ ed d Z ed d Z ed dZeddZeddZeddZdddZedddZedddZedddZeddd Zed!d"Zed#d$Zedd%d&Zed'd(Zed)d*Zed+d,Zedd-d.Zed/d0Zed1d2Z edd4d5Z!edd6d7Z"edd8d9Z#edd:d;Z$eddd?Z&edd@dAZ'eddBdCZ(eddDdEZ)eddFdGZ*edHdIZ+edJdKZ,eddLdMZ-eddNdOZ.eddPdQZ/eddRdSZ0eddTdUZ1edVdWZ2eddXdYZ3eddZd[Z4edd\d]Z5ed^d_Z6edd`daZ7eddbdcZ8edddeZ9eddfdgZ:eddhdiZ;eddjdkZeddpdqZ?eddrdsZ@eddtduZAeddvdwZBeddxdyZCeddzd{ZDedd|d}ZEedd~dZFedddZGeddZHeddZIeddZJeddZKeddZLeddZMedddZNedddZOeddZPeddZQeddZRedddZSedddZTedddZUdS)rZ LSM_SIM_DATAz /lsm_sim_datacCs2zt|tj dWSty,|Yn0dSrE)rpr]rs ValueError)Zlsm_idZ lsm_errorr r r!_lsm_id_to_sim_ids zSimArray._lsm_id_to_sim_idcCst|ttjdS)Nr)rrr rr)job_idr r r!_sim_job_id_ofs zSimArray._sim_job_id_ofcCst|ttjdS)NPool not found)rrr rr)rr r r!_sim_pool_id_ofs zSimArray._sim_pool_id_ofcCst|ttjdSNVolume not found)rrr rr)rr r r!_sim_vol_id_ofs zSimArray._sim_vol_id_ofcCst|ttjdS)NzFile system not found)rrr rrM)rXr r r! _sim_fs_id_ofs zSimArray._sim_fs_id_ofcCst|ttjdS)NzFile system snapshot not found)rrr rrY)snap_idr r r!_sim_fs_snap_id_of s zSimArray._sim_fs_snap_id_ofcCst|ttjdSNzFile system export not foundrrr rrz)rr r r!_sim_exp_id_ofs zSimArray._sim_exp_id_ofcCst|ttjdSrr)rr r r! _sim_ag_id_ofs zSimArray._sim_ag_id_ofcCs4|durtj}t|||_|j||_||_dSrE)r SIM_DATA_FILEr]rrrnrc)rvrnrcr r r!rys   zSimArray.__init__NcCs|j||}dtj|fS)Nz JOB_ID_%0*d)rrr]rs)rvrZ sim_data_idrr r r! _job_create(szSimArray._job_createrc Cs~t|}|j|\}}}tj}|dkr0tj}d}|tjkrJt |}n*|tj kr`t |}n|tj krtt |}|||fS)Nr)rrrrrZ INPROGRESSZCOMPLETEr]r_sim_vol_2_lsmr _sim_fs_2_lsmr_sim_fs_snap_2_lsm) rvrflagsrrrrrrr r r! job_status,s        zSimArray.job_statuscCs*|j|jt||jdSrE)rrrrrr)rvrrr r r!job_free@s  zSimArray.job_freecCs"t|jtt|d|_||_dS)Nrb)r]rnrprrrc)rvmsrr r r! time_out_setGszSimArray.time_out_setcCs|jSrE)rcrvrr r r! time_out_getMszSimArray.time_out_getc Cs0t|d|d|d|d|dtj|ddS)Nrrrrrzr)Z _fw_version_modeZ_read_cache_pct)rr]r)sim_sysr r r!_sim_sys_2_lsmQszSimArray._sim_sys_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrE)rr)rrr r r!r]sz#SimArray.systems..)rJrr{rr r r!r[szSimArray.systemscCsD|jtjkrttjd|j|jdtjd||j dS)NSystem not foundrr) rr]rr rNOT_FOUND_SYSTEMrrrr)rvsystemZread_pctrr r r!system_read_cache_pct_updateas    z%SimArray.system_read_cache_pct_updatec Cs>t|d|d|dtjtt|dtj|dtj|dS)NZ lsm_vol_idrrrr lsm_pool_id)rr]rrprr)rr r r!rms  zSimArray._sim_vol_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrErrrr r r!rwr:z#SimArray.volumes..)rJrrrr r r!ruszSimArray.volumesc Cs^|d}|d}|d}|d}|d}|d}tj}|d}|d} t|||| ||||| S) Nrrrrrrrr)r]rr) rrrrrrrsys_idrrr r r!_sim_pool_2_lsmys  zSimArray._sim_pool_2_lsmcCs0|j|j}|jtdd|DS)Ncss|]}t|VqdSrE)rr)rrr r r!rsz!SimArray.pools..)rrrrrJ)rvrrr r r!rs    zSimArray.poolsc Csjtj}|ddur|tjO}t|d|d|dtjtt|dtj|tj|d|d|d|d d S) Nrrrrrrrrr)Z_vpd83Z _locationZ_rpmZ _link_type)rr STATUS_FREEr]rrprr)sim_diskZ disk_statusr r r!_sim_disk_2_lsms  zSimArray._sim_disk_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrE)rr)rrr r r!rsz!SimArray.disks..)rJrrrr r r!rszSimArray.disksFc CsT|dur|j|jj||t||d}|r4|S|tj|} |j| dfS)z The '_internal_use' parameter is only for SimArray internal use. This method will return the new sim_vol id instead of job_id when '_internal_use' marked as True. F)rN) rrrrrrr]rr) rvrZvol_namerZthinpr _internal_use_is_hw_raid_volZnew_sim_vol_idrr r r! volume_creates  zSimArray.volume_createcCs2|j|jt||}|j|SrE)rrrrrrrrvrrrr r r! volume_deletes   zSimArray.volume_deletecCsB|jt|}|j|||tj|}|j|dfSrE) rrrrr'rr]rr)rvrr&rrrr r r! volume_resizes    zSimArray.volume_resizec Csj|jt|}|j|}|j|||dtjdd}|j|||| t j |} |j | dfS)NrTr) rrrrrrrPROVISION_FULLr0rr]rr) rvZ dst_pool_idr/r-Z new_vol_namerr,Z src_sim_volrrr r r!volume_replicates    zSimArray.volume_replicatecCs|tjkrttjdtjSNr)r]rr rrr)rvrrr r r!!volume_replicate_range_block_sizes  z*SimArray.volume_replicate_range_block_sizecCs>|j|jt|t||||}|j|SrE)rrr0rrrr)rvr/r-r(Zrangesrrr r r!volume_replicate_ranges  zSimArray.volume_replicate_rangecCs.|j|jt|tj|jdSrE)rrr2rrrr rrvrrr r r! volume_enables   zSimArray.volume_enablecCs.|j|jt|tj|jdSrE)rrr2rrrZADMIN_STATE_DISABLEDrrr r r!volume_disables   zSimArray.volume_disablecCs2t|}|j|}|D]}||krdSqdS)NTF)rrrr)rvrrr,rrir r r!volume_child_dependencys   z SimArray.volume_child_dependencycCs2|j|jt||}|j|SrE)rrr1rrrrrr r r!volume_child_dependency_rm:s   z#SimArray.volume_child_dependency_rmcCs(t|d|d|d|d|dtjS)N lsm_fs_idrrrr)rr]r)rTr r r!rDs  zSimArray._sim_fs_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrE)rr)rfr r r!rLr:zSimArray.fs..)rJrrLrr r r!fsJsz SimArray.fscCsL|s|j|j||t|}|r,|S|tj|}|j|dfSrE) rrrPrrrr]rr)rvrZfs_namerrrZ new_sim_fs_idrr r r! fs_createNs   zSimArray.fs_createcCs2|j|jt||}|j|SrE)rrrSrrrr)rvrXrrr r r! fs_deleteds   zSimArray.fs_deletecCsBt|}|j|j|||tj|}|j|dfSrE) rrrrrUrr]rr)rvrXr&rrNrr r r! fs_resizels    zSimArray.fs_resizec Cs|jd}|rt|}t|}|j|}|d}|j|||ddd} |j|| ||t j | } |j | dfS)NrrTr) rrrrrrrrjrr]rr) rvrfrlrrrZrhZ src_sim_fsrrirr r r!fs_cloneus      zSimArray.fs_clonecCsJ|jd}|rt|}|jt|||||}|j|SrE)rrrrrmrrr)rvrXrkrlrrrZrr r r! fs_file_clones   zSimArray.fs_file_clonecCst|d|d|dS)NZlsm_fs_snap_idrr)r )r[r r r!rszSimArray._sim_fs_snap_2_lsmcCs tdd|jt|DS)Ncss|]}t|VqdSrE)rr)rsr r r!rsz(SimArray.fs_snapshots..)rJrrWrr)rvrXrr r r! fs_snapshotsszSimArray.fs_snapshotscCs>|j|jt||}|tj|}|j|dfSrE) rrr]rrrr]rr)rvrXZ snap_namerrZrr r r!fs_snapshot_creates   zSimArray.fs_snapshot_createcCs:|j|jt|t||}|j|SrE)rrrcrrrrr)rvrXrrrr r r!fs_snapshot_deletes  zSimArray.fs_snapshot_deletec CsL|jd}|rt|}|jt||||||}|j|SrE)rrrrrbrrr) rvrXrr_r`rarrZrr r r!fs_snapshot_restores   zSimArray.fs_snapshot_restorecCsht|}|dur|j|j|gkrR|j|gkrR|durN|jdS|durd|jdS)NFT)rrrrrQrWr)rvrXr_rrrNr r r!fs_child_dependencys    zSimArray.fs_child_dependencycCsb|j|j||dddur*ttjdt|}|j||j || }|j |S)z Assuming API defination is break all clone relationship and remove all snapshot of this source file system. TrFz9No snapshot or fs clone target found for this file system) rrrr rrrrrprdrr)rvrXr_rrhrr r r!fs_child_dependency_rms     zSimArray.fs_child_dependency_rmc CsBt|d|d|d|d|d|d|d|d|d |d  S) NZ lsm_exp_idrrrrqrrrsrrr)r )rtr r r!_sim_exp_2_lsms     zSimArray._sim_exp_2_lsmcCsdd|jDS)NcSsg|]}t|qSr )rrrvr r r!rr:z$SimArray.exports..)rryrr r r!exportsszSimArray.exportsc CsL|j|jt||||||||| } |j| } |jt| SrE)rrrrrr}rr) rvrXrrqrrrsrrrrrr|rtr r r! fs_exports   zSimArray.fs_exportcCs*|j|jt||jdSrE)rrrrrr)rvrrr r r! fs_unexport s  zSimArray.fs_unexportcCs"t|d|d|d|dtjS)NZ lsm_ag_idrr3r>)rr]rr6r r r! _sim_ag_2_lsm s zSimArray._sim_ag_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrErrr:r r r!r r:zSimArray.ags..)rJrr<rr r r!rF sz SimArray.agscCsP|tjkrttjd|j|j|||}|j|}|j t |Sr) r]rr rrrrrGrrrr)rvrr?r>rrZ new_sim_ag_id new_sim_agr r r!access_group_create s     zSimArray.access_group_createcCs*|j|jt||jdSrE)rrrHrrr)rvrrr r r!access_group_delete& s  zSimArray.access_group_deletecCsDt|}|j|j||||j|}|jt|SrE)rrrrrIrrr)rvrr?r>rrrr r r!access_group_initiator_add- s     z#SimArray.access_group_initiator_addcCsBt|}|j|j|||j|}|jt|SrE)rrrrrJrrr)rvrr?r>rrr7r r r!access_group_initiator_delete6 s     z&SimArray.access_group_initiator_deletecCs2|j|jt|t||jdSrE)rrr rrrrrvrrrr r r! volume_maskC s   zSimArray.volume_maskcCs2|j|jt|t||jdSrE)rrr!rrrrrr r r! volume_unmaskK s   zSimArray.volume_unmaskcCs6|j|jjt|d}|jdd|DS)N)rcSsg|]}t|qSr rrr r r!r[ r:z?SimArray.volumes_accessible_by_access_group..)rrrrrr)rvrrrr r r!"volumes_accessible_by_access_groupS s   z+SimArray.volumes_accessible_by_access_groupcCs6|j|jjt|d}|jdd|DS)N)rcSsg|]}t|qSr rr:r r r!rc r:z.)rrr<rrr)rvrrr<r r r!access_groups_granted_to_volume] s   z(SimArray.access_groups_granted_to_volumecCs,|j|j||||||jdSrE)rrrEr)rvr?rArBrCrDrr r r!iscsi_chap_authe s   zSimArray.iscsi_chap_authcCs.t|d|d|d|d|d|dtjS)NZ lsm_tgt_idrrrrr)r r]r)Zsim_tgtr r r!_sim_tgt_2_lsms s  zSimArray._sim_tgt_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrE)rrrtr r r!r} r:z(SimArray.target_ports..)rJrrrr r r! target_ports{ szSimArray.target_portscCs|jt|jttjd}tj }t j }|dt j krH|j|d}|d}|d}|d}|}|t jksx|t jkr|||||gS|t jkrttjd|d|t jks|t jkrtj }nt|d |}|||||gS) NrrrrNrOrz;volume_raid_info(): Got unsupported RAID_TYPE_MIXED pool %srrP)rrrrrr rrr]rrZOPT_IO_SIZE_UNKNOWNrrZRAID_TYPE_UNKNOWNrZRAID_TYPE_MIXEDrrVrTrp)rvlsm_volrZ min_io_sizeZ opt_io_sizerNrOrr r r!volume_raid_info s@     zSimArray.volume_raid_infocCsp|jt|jttjd}|d}g}|tj kr@|dg}n"|tj kr\|j |d}ntj }|d||fS)NrrZparent_lsm_pool_idrrN) rrrrrr rrrrrrZMEMBER_TYPE_UNKNOWN)rvZlsm_poolrrZ member_idsr r r!pool_member_info s    zSimArray.pool_member_infocCs$|jtjkrttjdtjtjfSr)rr]rr rrrr)rvrr r r!volume_raid_create_cap_get s   z#SimArray.volume_raid_create_cap_getc Cs4|tjvrttjd|tjkr(tj}n|tjvr>ttjd|j d|}dd|D}|D]"}|j t j @sbttjd|jqbz&|j j|||tjtjtjB|d}Wn6tjy} zttjd|WYd} ~ n d} ~ 00|j |} |j| d || d d tjd d d} |j | } |j t| S)Nz%Provided 'raid_type' is not supportedz&Provided 'strip_size' is not supportedzPool for volume %scSs"g|]}t|jttjdqS)zDisk not found)rrrr rZNOT_FOUND_DISKrr r r!r sz/SimArray.volume_raid_create..z'Disk %s is not in DISK.STATUS_FREE mode)rrNrrrrrrriTrG)rr)r]rr rr%rZVCR_STRIP_SIZE_DEFAULTrrrrrrrZ DISK_NOT_FREErrrrrrrrrrrrrrrr) rvrrNrrZ pool_namerZdiskrrrrrr r r!volume_raid_create sb          zSimArray.volume_raid_createcCs&t|jttjd}|j|}dSrrrrr rrrrrvvolumerZ sim_volume_idrr r r!volume_ident_led_on s   zSimArray.volume_ident_led_oncCs&t|jttjd}|j|}dSrrrr r r!volume_ident_led_off s   zSimArray.volume_ident_led_offcCs"t|d|d|d|dtjS)NZ lsm_bat_idrrr)rr]r)sim_batr r r!_sim_bat_2_lsm s zSimArray._sim_bat_2_lsmcCstdd|jDS)Ncss|]}t|VqdSrE)rrrr r r!r r:z%SimArray.batteries..)rJrrrr r r!r szSimArray.batteriescCs|jt|jttjd}tj }tj }d}|j D]}|dt j kr8d}q8|dtjkrj|rtj}n*|dtjkrtj}n|dtjkrtj}|dtjkrtj}n|dtjkrtj}|d||d||dgS)NrFrTrrr)rrrrrr rrrZ WRITE_CACHE_STATUS_WRITE_THROUGHZREAD_CACHE_STATUS_DISABLEDrrrrZWRITE_CACHE_STATUS_WRITE_BACKZWRITE_CACHE_POLICY_WRITE_BACKZWRITE_CACHE_POLICY_UNKNOWNZWRITE_CACHE_STATUS_UNKNOWNrZREAD_CACHE_STATUS_ENABLEDZREAD_CACHE_POLICY_UNKNOWNZREAD_CACHE_STATUS_UNKNOWN)rvrrZwrite_cache_statusZread_cache_statusZflag_battery_okrr r r!volume_cache_info s> zSimArray.volume_cache_infocCs<|jt|jttjd}|j|||j dSr) rrrrrr rrrr)rvrrrrr r r!!volume_physical_disk_cache_update2 s  z*SimArray.volume_physical_disk_cache_updatecCs<|jt|jttjd}|j|||j dSr) rrrrrr rrrr)rvrrrrr r r! volume_write_cache_policy_update; s  z)SimArray.volume_write_cache_policy_updatecCs<|jt|jttjd}|j|||j dSr) rrrrrr rrrr)rvrrrrr r r!volume_read_cache_policy_updateD s  z(SimArray.volume_read_cache_policy_update)NN)r)r)r)r)r)r)rFr)r)r)r)r)r)r)r)r)r)rF)r)r)r)r)r)r)r)rF)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)VrQrRrSrfrtempfileZ gettempdirrr\rrrrrrrrr#ryrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrFrrrrrrrrrrrrrrrrrrrrrrrr r r r!rsH                                                                 %   4     $  r)r)rrfrrZlsmrrrrrrrr r r r r rrrrr#r,r5objectr6r]rr r r r!s2 D 6