a V€œdÉ€ã@sÄddlZddlZddlZddlZddlZddlmZddlmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZdd„Zdd„Zdd „ZGd d „d eƒZGd d „d eƒZGdd„deƒZdS)éN)Úsize_human_2_size_bytes)ÚSystemÚVolumeÚDiskÚPoolÚ FileSystemÚ AccessGroupÚ FsSnapshotÚ NfsExportÚmd5ÚLsmErrorÚ TargetPortÚ ErrorNumberÚ JobStatusÚBatteryÚint_divcs‡fdd„}|S)Nc s:zˆ|i|¤ŽWStjyŽ}zdt|dƒturNt|ddƒrN|dj ¡t|ƒdkrftt j dƒ‚tt j dt|ƒƒ‚WYd}~n°d}~0tyÌt|dƒturÆt|ddƒrÆ|dj ¡‚Ynjt �y4}zPt|dƒtu�r t|ddƒ�r |dj ¡tt j dt|ƒƒ‚WYd}~n d}~00dS)NrÚbs_objzdatabase is lockedz%Timeout to require lock on state filez%Got unexpected error from sqlite3: %szGot unexpected error: %s) Úsqlite3ÚOperationalErrorÚtypeÚSimArrayÚhasattrrÚtrans_rollbackÚstrr rZTIMEOUTÚ PLUGIN_BUGÚ Exception)ÚargsZkargsÚ sql_errorZ base_error©Úmethod©ú9/usr/lib64/python3.9/site-packages/sim_plugin/simarray.pyÚwrappers. ÿ þ " ÿz_handle_errors..wrapperr )rr"r rr!Ú_handle_errorss r#c Cs:dg}tddƒD]}| tdt dd¡ƒ¡qd |¡S)z. Generate a random VPD83 NAA_Type3 ID Z50réz%02xéÿÚ)ÚrangeÚappendrÚrandomZrandintÚjoin)ZvpdÚ_r r r!Ú _random_vpd/sr,cCs,i}t|jƒD]\}}||||d<q|S©Nr)Ú enumerateÚ description)ÚcursorÚrowÚdÚidxÚcolr r r!Ú _dict_factory9sr5c@s8eZdZejdd„ejdd„ejdd„ejdd„ejdd„ej dd„ej dd„ej d d„ej d d„ej d d„ejd d„ejd d„ejdd„ejdd„iZejdd„ejdd„ejdd„ejdd„ejdd„ej dd„ej dd„ej dd„ej dd„ej dd„ejdd„ejdd„ejdd„ejdd„iZedd„ƒZd S)!ÚPoolRAIDcCs|dkSr-r ©Úxr r r!ÚBózPoolRAID.cCs|dkSr-r r7r r r!r9Cr:cCs|dkS©Nér r7r r r!r9Dr:cCs|dkS©Nér r7r r r!r9Er:cCs|dkSr=r r7r r r!r9Fr:cCs|dkSr=r r7r r r!r9Gr:cCs|dkS©Nér r7r r r!r9Hr:cCs|dko|ddkS)Nr@r<rr r7r r r!r9Ir:cCs|dko|ddkS©Nér<rr r7r r r!r9Jr:cCs|dko|ddkS©Nér<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|S©Nr r7r r r!r9Sr:cCs|SrEr r7r r r!r9Tr:cCsdS©Nér 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|dƒSr;©rr7r r r!r9Zr:cCst|dƒdS©Nr<rGrHr7r r r!r9[r:cCst|dƒdSr;rHr7r r r!r9\r:cCs|dSr;r r7r r r!r9]r:cCs|dSr?r r7r r r!r9^r:cCst|dƒdSrIrHr7r r r!r9_r:cCst|dƒdSr;rHr7r r r!r9`r:cCsV|ttj ¡ƒvr"ttjd|ƒ‚tj||ƒdurHttjd||fƒ‚tj||ƒ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_CHKÚkeysr rrÚ_RAID_PARITY_DISK_COUNT_FUNC)Ú raid_typeÚ disk_countr r r!Údata_disk_countcsþÿÿzPoolRAID.data_disk_countN)Ú__name__Ú __module__Ú __qualname__rÚRAID_TYPE_JBODÚRAID_TYPE_RAID0ÚRAID_TYPE_RAID1ZRAID_TYPE_RAID3ZRAID_TYPE_RAID4ÚRAID_TYPE_RAID5ÚRAID_TYPE_RAID6ÚRAID_TYPE_RAID10ZRAID_TYPE_RAID15ZRAID_TYPE_RAID16ÚRAID_TYPE_RAID50ÚRAID_TYPE_RAID60ZRAID_TYPE_RAID51ZRAID_TYPE_RAID61rKrMÚ staticmethodrPr r r r!r6@s@              ò              òr6c@sòeZdZdZdeZdZdZdZdZdZ dZ dZ d Z e jZejZejZejZd Zd Zd Zejejejejejejej gZ!gd ¢Z"dd„Z#dd„Z$dd„Z%dd„Z&dd„Z'dd„Z(dd„Z)dd„Z*dd„Z+d¦d!d"„Z,d#d$„Z-d%d&„Z.d§d(d)„Z/d*d+„Z0d,d-„Z1d.d/„Z2d0d1„Z3d2d3„Z4d4d5„Z5d6d7„Z6d¨d9d:„Z7d©d;d<„Z8d=d>„Z9dªd?d@„Z:d«dAdB„Z;dCdD„Ze?dIdJ„ƒZ@d¬dKdL„ZAdMdN„ZBdOdP„ZCdQdR„ZDdSdT„ZEdUdV„ZFdWdX„ZGdYdZ„ZHd­d[d\„ZId]d^„ZJd_d`„ZKe?dadb„ƒZLd®dcdd„ZMdedf„ZNdgdh„ZOdidj„ZPdkdl„ZQdmdn„ZRdodp„ZSdqdr„ZTdsdt„ZUd¯dvdw„ZVdxdy„ZWdzd{„ZXd|d}„ZYd~d„ZZd°d€d�„Z[d‚dƒ„Z\d„d…„Z]d†d‡„Z^dˆd‰„Z_dŠd‹„Z`dŒd�„ZadŽd�„Zbd�d‘„Zcd’d“„Zdd”d•„Zed–d—„Zfd˜d™„Zgdšd›„Zhdœd�„ZidždŸ„Zjd d¡„Zkd¢d£„Zld¤d¥„Zmd'S)±Ú BackStorez4.1zLSM_SIMULATOR_DATA_%srGr<r>zsim-01zLSM simulated storage plug-iniéé ú#é)i i@i€ir^iiic Cs tj |¡s2t t |tjtjB¡¡t |d¡||_d|_ t j |t t |dƒƒdd�|_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 j�yÌ}z d%t|ƒv�r´n|‚WYd}~nBd}~0t j�y}zttjd&|jƒ‚WYd}~n d}~00dS)'Ni¶éèZ 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 existsúLStored simulator state incompatible with simulator, please move or delete %s) ÚosÚpathÚexistsÚcloseÚopenÚO_WRONLYÚO_CREATÚchmodÚ statefileÚ lastrowidrZconnectÚintrÚsql_connr5Z row_factoryÚformatr]Ú _ID_FMT_LENrZINIT_TYPE_ISCSI_WWPN_MIXEDZINIT_TYPE_UNKNOWNÚ_LIST_SPLITTERr0Z executescriptrrZ DatabaseErrorr rÚINVALID_ARGUMENT)ÚselfrnrcÚsql_cmdÚsql_currr r r!Ú__init__–sð   þÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ_ÿÿÿÿÿÿÿÿÿ)ÿGûÿ ÿþzBackStore.__init__cCs\| ¡}t|ƒdks|ds dSd|d ¡vrF|ddtjkrFdSttjd|jƒ‚dS)NrFÚversionTre) Úsim_syssÚlenrLr]ÚVERSION_SIGNATUREr rrurn)rvr{r r r!Ú_check_version#sÿÿþzBackStore._check_versionc Csð| ¡| ¡r| ¡dS| dtjtjtjdtj tj dœ¡t dƒ}t dƒ}t dƒ}g}t dd ƒD]:}| d d |t jt jtƒd t jd |dœ¡| |j¡qfg}t ddƒD]F}| d d|t jt jtƒdt jd|dœ¡t|ƒd kr°| |j¡q°g}t ddƒD]L}| d d|t jt jtƒt jt jd|dœ¡t|ƒd k�r| |j¡�qt ddƒD]2}| d d|t jt jtƒt jt jd|dœ¡�q^|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. NÚsystemsr&)ÚidÚnameÚstatusÚ status_inforzÚread_cache_pctZ1EiBZ2TiBZ512GiBrr<Údisksz2TiB SATA Diski zPort: %d Box: 1 Bay: 1)Z disk_prefixÚ total_spaceÚ disk_typer‚Úvpd83ÚrpmÚ link_typeÚlocationrBz 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)r�rNÚ sim_disk_idsÚ element_typeÚunsupported_actionszPool 2(sub pool of Pool 1))r�Úparent_pool_idr�ÚsizezPool 3)r�rNrŒr�Z lsm_test_aggr)r�r�rNrŒZtgtsz50:0a:09:86:99:4b:8d:c5ZFC_a_0b)Ú port_typeÚservice_addressÚnetwork_addressÚphysical_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)r�rr‚z&Capacitor SIMC01, 500 J, 05 March 2016),Ú trans_beginr~Ú trans_commitÚ _data_addr]ÚSYS_IDÚSYS_NAMErÚ STATUS_OKr}Ú_DEFAULT_READ_CACHE_PCTrr'rZ TYPE_SATAr,Z LINK_TYPE_ATAr(roZTYPE_SASZ LINK_TYPE_SASr|ZTYPE_SSDZRPM_NON_ROTATING_MEDIUMÚsim_pool_create_from_diskrrVrZELEMENT_TYPE_POOLZELEMENT_TYPE_FSÚELEMENT_TYPE_VOLUMEZELEMENT_TYPE_DELTAZELEMENT_TYPE_SYS_RESERVEDÚUNSUPPORTED_VOLUME_GROWÚUNSUPPORTED_VOLUME_SHRINKÚsim_pool_create_sub_poolrUr ZTYPE_FCZ TYPE_FCOEZ TYPE_ISCSIrZ TYPE_CHEMICALZTYPE_CAPACITOR) rvZ size_bytes_1eZ size_bytes_2tZsize_bytes_512gZ pool_1_disksÚiZtest_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. )rqr0ÚexecuteroZfetchall)rvrwrxr r r!Ú _sql_execäs  zBackStore._sql_execcCsd|}| |¡S)NzSELECT * FROM %s©r¦)rvÚ table_namerwr r r!Ú _get_tableíszBackStore._get_tablecCs|j d¡dS)NzBEGIN IMMEDIATE TRANSACTION;)rqr¥©rvr r r!r—ñszBackStore.trans_begincCs|j ¡dSrE)rqZcommitrªr r r!r˜ôszBackStore.trans_commitcCs|j ¡dSrE)rqZrollbackrªr r r!r÷szBackStore.trans_rollbackcCsRt| ¡ƒ}dd„t| ¡ƒDƒ}d|dd |¡dd |¡f}| |¡dS)NcSs g|]}|durdnt|ƒ‘qS)Nr&)r©Ú.0Úvr r r!Ú üsz'BackStore._data_add..z INSERT INTO %s (%s) VALUES (%s);z'%s'z', ')rJrLÚvaluesr*r¦)rvr¨Z data_dictrLr¯rwr r r!r™ús  ÿ  þÿzBackStore._data_addFcCsZd||f}| |¡}|rRt|ƒdkr*dSt|ƒdkr>|dSttjdtƒƒ‚n|SdS)NzSELECT * FROM %s WHERE %srrGz%_data_find(): Got non-unique data: %s)r¦r|r rrÚlocals)rvÚtableÚ 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§)rvr±Údata_idZ column_nameÚvaluerwr r r!Ú _data_updatesÿ ÿzBackStore._data_updatecCsd||f}| |¡dS)NzDELETE FROM %s WHERE %s;r§)rvr±r²rwr r r!Ú _data_deletes zBackStore._data_deleteNcCs*| dt dtj¡t ¡||dœ¡|jS)z* Return a job id(Integer) ÚjobsZ LSM_SIM_TIME)ÚdurationÚ timestampÚ data_typerµ)r™rfÚgetenvr]ÚJOB_DEFAULT_DURATIONÚtimero)rvZ job_data_typerµr r r!Úsim_job_create#s øÿ zBackStore.sim_job_createcCs| dd|¡dS)Nr¹úid="%s"©r¸)rvÚ sim_job_idr r r!Úsim_job_delete4szBackStore.sim_job_deletecCsø|jdd|dd�}|dur(ttjdƒ‚|ddkrZtt ¡t|d ƒ|dd ƒ}nd }d}d}|dkrrd}|d krîd }|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. r¹úid=%sT©r³Nú Job not foundrºrr»édr¼rµ)r´r rÚ NOT_FOUND_JOBrpr¿Úfloatr]ÚJOB_DATA_TYPE_VOLÚ sim_vol_of_idÚJOB_DATA_TYPE_FSÚ sim_fs_of_idÚJOB_DATA_TYPE_FS_SNAPÚsim_fs_snap_of_id)rvrÃZsim_jobÚprogressÚdatar¼r r r!Úsim_job_status7s:þ  ÿÿ  zBackStore.sim_job_statuscCs | d¡S)z0 Return a list of sim_sys dict. r©r©rªr r r!r{\szBackStore.sim_sysscCstdd„| dd|¡DƒƒS)Ncss|]}|dVqdS)Ú lsm_disk_idNr ©r¬r2r r r!Ú csÿz1BackStore.lsm_disk_ids_of_pool..Ú disks_viewúowner_pool_id="%s"©rJr´©rvÚ sim_pool_idr r r!Úlsm_disk_ids_of_poolbs ÿþzBackStore.lsm_disk_ids_of_poolcCs | d¡S)z1 Return a list of sim_disk dict. rØrÔrªr r r!Ú sim_diskshszBackStore.sim_diskscCs | d¡S)z1 Return a list of sim_pool dict. Ú pools_viewrÔrªr r r!Ú sim_poolsnszBackStore.sim_poolscCs| d|tjd¡S)Nrßr)Ú_sim_data_of_idrÚNOT_FOUND_POOLrÛr r r!Úsim_pool_of_idtsÿzBackStore.sim_pool_of_idrc CsÈ|dkrtj}|tjks"|tjkr(tj}| d|tjd|||tj |dœ¡t   |t |ƒ¡}|j }|d|…D]$} | d| d|¡| d| dd¡ql||d…D]$} | d| d|¡| d| dd ¡qž|S) NrÚpoolsr&)r�r‚rƒr�rŽrNÚ member_typeÚ strip_sizer…Z owner_pool_idÚroleZDATAZPARITY)r]ÚDEFAULT_STRIP_SIZErrVrTÚBLK_SIZEr™rrœÚMEMBER_TYPE_DISKr6rPr|ror·) rvr�rŒrNr�rŽrærPrÜZ sim_disk_idr r r!ržxsB ÿøÿ ÿ ÿ ÿz#BackStore.sim_pool_create_from_diskc Cs,| d|tjd||tjtj||dœ ¡|jS)Nrär&) r�r‚rƒr�rŽrNrår�r†)r™rrœrÚRAID_TYPE_OTHERÚMEMBER_TYPE_POOLro)rvr�r�r�r�rŽr r r!r¢£s÷ÿ z"BackStore.sim_pool_create_sub_poolcCs| d|¡ddS)Nz3SELECT COUNT(id) FROM disks WHERE owner_pool_id=%s;rr§rÛr r r!Úsim_pool_disks_count·sÿÿþþzBackStore.sim_pool_disks_countcCs| d|¡ddS)NzCSELECT COUNT(id) FROM disks WHERE owner_pool_id=%s and role='DATA';rr§rÛr r r!Úsim_pool_data_disks_count¼sþþþz#BackStore.sim_pool_data_disks_countcCs"|r| dd|¡S| d¡SdS)z0 Return a list of sim_vol dict. Zvolumes_by_ag_viewzag_id=%sÚ volumes_viewN©r´r©©rvÚ sim_ag_idr r r!Úsim_volsÁs ÿzBackStore.sim_volscCs8|j|d|dd�}|dur4|r0t|d|ƒ‚ndS|S)NrÅTrÆz %s not found)r´r )rvr¨rµÚ lsm_error_noZ data_nameÚsim_datar r r!ráËsþzBackStore._sim_data_of_idcCs| d|tjd¡S)zD Return sim_vol if found. Raise error if not found. rïr)rárÚNOT_FOUND_VOLUME©rvÚ sim_vol_idr r r!rÌÖsÿzBackStore.sim_vol_of_idcCs&| |¡}|d|kr"ttjdƒ‚dS)NÚ free_spaceúInsufficient space in pool)rãr rÚNOT_ENOUGH_SPACE)rvrÜÚ size_bytesÚsim_poolr r r!Ú_check_pool_free_spaceÝs   ÿz BackStore._check_pool_free_spacecCs|tjdtjtjSrF)r]ré)rür r r!Ú_block_roundingäs  ÿÿzBackStore._block_roundingc CsÄt |¡}| ||¡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) Nrˆr�Úpool_idr†Ú consumed_sizeÚ admin_stateÚis_hw_raid_volÚwrite_cache_policyÚread_cache_policyÚphy_disk_cacheÚvolumesú+Name '%s' is already in use by other volume)r]rÿrþÚdictr,rÚADMIN_STATE_ENABLEDÚDEFAULT_WRITE_CACHE_POLICYÚDEFAULT_READ_CACHE_POLICYÚDEFAULT_PHYSICAL_DISK_CACHEr™rÚIntegrityErrorr rÚ NAME_CONFLICTro)rvr�rürÜrÚsim_volrr r r!Úsim_vol_createés*       þzBackStore.sim_vol_createcCs´| |¡}| |¡r ttjdƒ‚| |¡}t|ƒdkrT|D]}||kr:ttjdƒ‚q:|dr | dd|d¡D]}|  d|d d d ¡qp|  d d |d¡n|  dd |¡d S)zB This does not check whether volume exist or not. z Volume is masked to access grouprGz%Requested volume has child dependencyrrØrÙrr…r€rçNrärÁr) rÌÚ_sim_ag_ids_of_masked_volr rÚ IS_MASKEDÚdst_sim_vol_ids_of_srcr|ÚHAS_CHILD_DEPENDENCYr´r·r¸)rvrørÚdst_sim_vol_idsÚdst_sim_vol_idr2r r r!Úsim_vol_deletes&  ÿ  ÿÿ zBackStore.sim_vol_deletecCsN| |¡| |¡| dd||f¡}|r8ttjdƒ‚| d||dœ¡dS)NÚ vol_masksúag_id="%s" AND vol_id="%s"z2Volume is already masked to requested access group)Úag_idÚvol_id)rÌÚ sim_ag_of_idr´r rÚNO_STATE_CHANGEr™)rvrøròÚ exist_maskr r r!Ú sim_vol_masks   þþzBackStore.sim_vol_maskcCsN| |¡| |¡d||f}| d|¡}|r>| d|¡n ttjdƒ‚dS)Nrrz.Volume is not masked to requested access group)rÌrr´r¸r rr)rvrøròr²rr r r!Úsim_vol_unmask.s    ÿzBackStore.sim_vol_unmaskcCstdd„| dd|¡DƒƒS)Ncss|]}|dVqdS)rNr ©r¬Úmr r r!r×;sÿz6BackStore._sim_vol_ids_of_masked_ag..rz ag_id="%s"rÚrñr r r!Ú_sim_vol_ids_of_masked_ag:s ÿÿz#BackStore._sim_vol_ids_of_masked_agcCstdd„| dd|¡DƒƒS)Ncss|]}|dVqdS)rNr r"r r r!r×@sÿz6BackStore._sim_ag_ids_of_masked_vol..rz vol_id="%s"rÚr÷r r r!r?s ÿÿz#BackStore._sim_ag_ids_of_masked_volcCsÀt |¡}| |¡}|d|kr,ttjdƒ‚| |d¡}||d}|dkr‚|dtj@rhttj dƒ‚|d|krœttj dƒ‚n|dtj @rœttj dƒ‚|  d |d|¡|  d |d |¡dS) Nr†z%Volume size is identical to requestedrrrŽz.Requested pool does not allow volume size growrùrúrr) r]rÿrÌr rrrãrr Ú NO_SUPPORTrûr¡r·)rvrøÚnew_size_bytesrrýZ incrementr r r!Úsim_vol_resizeDs4   ÿ þ ÿÿ ÿzBackStore.sim_vol_resizecCs(| |¡tdd„| dd|¡DƒƒS)zL Return a list of dst_vol_id for provided source volume ID. css|]}|dVqdS)Ú dst_vol_idNr rÖr r r!r×isÿz3BackStore.dst_sim_vol_ids_of_src..Úvol_repsúsrc_vol_id="%s")rÌrJr´©rvÚsrc_sim_vol_idr r r!rds  ÿþz BackStore.dst_sim_vol_ids_of_srccCst| |¡| |¡||kr dS|tjkr.dStdd„| dd|¡Dƒƒ}t|ƒdkr\dS| d|||dœ¡dS)Ncss|]}|dVqdS)Ú src_vol_idNr )r¬Úrr r r!r×sÿz,BackStore.sim_vol_replica..r)zdst_vol_id="%s"rG)r-r(Úrep_type)rÌrZREPLICATE_COPYrJr´r|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 rrr¸r+r r r!Úsim_vol_src_replica_break’s  ÿz#BackStore.sim_vol_src_replica_breakcCs6| |¡}|d|kr"ttjdƒ‚| d|d|¡dS)Nrz,Volume admin state is identical to requestedr)rÌr rrr·)rvrøZnew_admin_staterr r r!Úsim_vol_state_changešs  ÿ ÿzBackStore.sim_vol_state_changecCs|d tj¡|d<|d=|S)z= Update 'init_type' and 'init_ids' of sim_ag Z init_ids_strÚinit_ids©Úsplitr]rt©Úsim_agr r r!Ú_sim_ag_format£s ÿzBackStore._sim_ag_formatcCs.|r| dd|¡}n | d¡}dd„|DƒS)NZags_by_vol_viewz vol_id=%sÚags_viewcSsg|]}t |¡‘qSr )r]r8©r¬Úar r r!r®´r:z%BackStore.sim_ags..rð)rvrøÚsim_agsr r r!r<­s ÿ zBackStore.sim_agsc CsTz| d|||dœ¡Wn6tjyN}zttjd|ƒ‚WYd}~n d}~00dS)NÚinits)r€Ú init_typeZ owner_ag_idz6Initiator '%s' is already in use by other access group)r™rrr rZEXISTS_INITIATOR)rvr>Úinit_idròrr r r!Ú_sim_init_create¶sý ÿþzBackStore._sim_init_createcCsdSrEr )rvr?Úin_userÚin_passÚout_userÚout_passr r r!Úiscsi_chap_auth_setÃszBackStore.iscsi_chap_auth_setc Csdz| dd|i¡|j}Wn6tjyP}zttjd|ƒ‚WYd}~n d}~00| |||¡|S)NÚagsr�z1Name '%s' is already in use by other access group)r™rorrr rrr@)rvr�r>r?ròrr r r!Ú sim_ag_createÈs þzBackStore.sim_ag_createcCs4| |¡| |¡r ttjdƒ‚| dd|¡dS)Nz!Access group has volume masked torFrÁ)rr$r rrr¸rñr r r!Ú sim_ag_deleteÕs   ÿ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@)rvròr?r>r7r r r!Úsim_ag_init_addÝs  ÿ ÿÿzBackStore.sim_ag_init_addcCsR| |¡}||dvr"ttjdƒ‚t|dƒdkr>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¸)rvròr?r7r r r!Úsim_ag_init_deleteës  ÿþzBackStore.sim_ag_init_deletecCs | d|tjd¡}t |¡|S)Nr9z Access Group)rárZNOT_FOUND_ACCESS_GROUPr]r8)rvròr7r r r!r÷s þ zBackStore.sim_ag_of_idcCs | d¡S)z/ Return a list of sim_fs dict. Úfss_viewrÔrªr r r!Úsim_fssþszBackStore.sim_fssTcCstj}|sd}| d||d¡S)NrKz File System)rÚ NOT_FOUND_FSrá)rvÚ sim_fs_idZ raise_errorrôr r r!rÎs  ÿzBackStore.sim_fs_of_idc Cspt |¡}| ||¡z| d|||||dœ¡Wn6tjyh}zttjd|ƒ‚WYd}~n d}~00|j S)NÚfss)r�r†rrùrz'Name '%s' is already in use by other fs) r]rÿrþr™rrr rrro)rvr�rürÜrr r r!Ú sim_fs_create s"  ûÿÿzBackStore.sim_fs_createcCs4| |¡| |¡r ttjdƒ‚| dd|¡dS)Nz*Requested file system has child dependencyrOrÁ)rÎÚclone_dst_sim_fs_ids_of_srcr rrr¸©rvrNr r r!Ú sim_fs_deletes   ÿzBackStore.sim_fs_deletecCsšt |¡}| |¡}|d|kr,ttjdƒ‚| |d¡}||dkrf|d||dkrfttjdƒ‚| d|d|¡| d|d|¡| d|d|¡dS)Nr†z*File System size is identical to requestedrrùrúrOr) r]rÿrÎr rrrãrûr·)rvrNr&Úsim_fsrýr r r!Ú sim_fs_resize%s    ÿ ÿÿzBackStore.sim_fs_resizecCs| |¡| dd|¡S)NÚ fs_snaps_viewz fs_id="%s")rÎr´rRr r r!Ú sim_fs_snaps;s zBackStore.sim_fs_snapscCs2| d|tjd¡}|r.|d|kr.ttjdƒ‚|S)NrVzFile system snapshotÚfs_idzFDefined file system snapshot ID is not belong to requested file system)rárÚNOT_FOUND_FS_SSr )rvÚsim_fs_snap_idrNÚ sim_fs_snapr r r!rÐ?sþþzBackStore.sim_fs_snap_of_idc Csd| |¡z | d||tt ¡ƒdœ¡Wn2tjy\}zttjdƒ‚WYd}~n d}~00|j S)NÚfs_snaps)r�rXr»z6The name is already used by other file system snapshot) rÎr™rpr¿rrr rrro)rvrNr�rr r r!Úsim_fs_snap_createJs  ý þzBackStore.sim_fs_snap_createcCs| |¡|r| ||¡dSrE©rÎrÐ)rvrNrZÚfilesÚ restore_filesÚflag_all_filesr r r!Úsim_fs_snap_restoreXs  zBackStore.sim_fs_snap_restorecCs*| |¡| ||¡| dd|¡dS)Nr\rÁ)rÎrÐr¸)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||dœ¡dS)NÚ fs_clones)Ú src_fs_idÚ dst_fs_id)rÎrÐr™)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|¡DƒƒS)zM Return a list of dst_fs_id for provided clone source fs ID. css|]}|dVqdS)rgNr rÖr r r!rׇsÿz8BackStore.clone_dst_sim_fs_ids_of_src..reúsrc_fs_id="%s")rÎrJr´©rvrhr r r!rQ‚s  ÿÿz%BackStore.clone_dst_sim_fs_ids_of_srccCs| dd|¡dS)NrernrÂror r r!Úsim_fs_src_clone_break‹sz BackStore.sim_fs_src_clone_breakcCsBdD]8}d|}||r.|| tj¡||<ng||<||=q|S)N)Ú root_hostsÚrw_hostsÚro_hostsz exp_%s_strr4)rvÚsim_expZkey_namer¨r r r!Ú_sim_exp_formatŽsÿ zBackStore._sim_exp_formatcst‡fdd„ˆ d¡DƒƒS)Nc3s|]}ˆ |¡VqdSrE)ru©r¬Úerªr r!rךsz%BackStore.sim_exps..Ú exps_view)rJr©rªr rªr!Úsim_exps™s ÿzBackStore.sim_expscCs| | d|tjd¡¡S)Nrxz NFS Export)rurárÚNOT_FOUND_NFS_EXPORT©rvÚ sim_exp_idr r r!Ú sim_exp_of_id�s þÿzBackStore.sim_exp_of_idc  CsÔ|durdtƒdd…}| |¡z| d|||||| dœ¡Wn2tjyt} zttjdƒ‚WYd} ~ n d} ~ 00|j} |D]} | d| | dœ¡q€|D]} | d| | dœ¡qœ|D]}| d || dœ¡q¸| S) Nz /nfs_exp_%srDÚexps)rXÚexp_pathÚanon_uidÚanon_gidÚ auth_typeÚoptionsz/Export path is already used by other NFS exportZexp_root_hosts)ÚhostÚexp_idZ exp_rw_hostsZ exp_ro_hosts) r,rÎr™rrr rrro)rvrNrrqrrrsr€r�r‚rƒrr|Z root_hostZrw_hostZro_hostr r r!Úsim_exp_create£sF úÿ ÿþ þ þ zBackStore.sim_exp_createcCs| |¡| dd|¡dS)Nr~rÁ)r}r¸r{r r r!Úsim_exp_deleteÍs zBackStore.sim_exp_deletecCs | d¡S)z0 Return a list of sim_tgt dict. Z tgts_viewrÔrªr r r!Úsim_tgtsÑszBackStore.sim_tgtscCs | d¡S)z0 Return a list of sim_bat dict. Z bats_viewrÔrªr r r!Úsim_bats×szBackStore.sim_batscCs| |¡| d|d|¡dS)Nrr©rÌr·)rvrøÚpdcr r r!Úsim_vol_pdc_setÝs zBackStore.sim_vol_pdc_setcCs| |¡| d|d|¡dS)NrrrŠ)rvrøÚrcpr r r!Úsim_vol_rcp_setás zBackStore.sim_vol_rcp_setcCs| |¡| d|d|¡dS)NrrrŠ)rvrøÚwcpr r r!Úsim_vol_wcp_setås zBackStore.sim_vol_wcp_set)F)NN)rr)r)N)N)r)N)N)T)N)nrQrRrSZVERSIONr}r¾rËrÍrÏršr›rérèrZMODE_HARDWARE_RAIDÚSYS_MODErÚWRITE_CACHE_POLICY_AUTOr ÚREAD_CACHE_POLICY_ENABLEDr ZPHYSICAL_DISK_CACHE_DISABLEDr r�rtrsrUrVrWrXrYrZr[ÚSUPPORTED_VCR_RAID_TYPESÚSUPPORTED_VCR_STRIP_SIZESryr~r¤r¦r©r—r˜rr™r´r·r¸rÀrÄrÓr{rÝrÞràrãržr¢rírîrórárÌrþr\rÿrrr r!r$rr'rr0r1r2r8r<r@rErGrHrIrJrrLrÎrPrSrUrWrÐr]rbrcrdrjrmrQrpruryr}r†r‡rˆr‰rŒrŽr�r r r r!r]vsØ ý4    % ú 0û        ü $           *r]c@seZdZe de ¡d¡Zedd„ƒZ edd„ƒZ edd„ƒZ ed d „ƒZ ed d „ƒZ ed d„ƒZedd„ƒZedd„ƒZedd„ƒZdždd„ZedŸdd„ƒZed dd„ƒZed¡dd„ƒZed¢dd „ƒZed!d"„ƒZed#d$„ƒZed£d%d&„ƒZed'd(„ƒZed)d*„ƒZed+d,„ƒZed¤d-d.„ƒZed/d0„ƒZed1d2„ƒZ ed¥d4d5„ƒZ!ed¦d6d7„ƒZ"ed§d8d9„ƒZ#ed¨d:d;„ƒZ$ed©dd?„ƒZ&ed«d@dA„ƒZ'ed¬dBdC„ƒZ(ed­dDdE„ƒZ)ed®dFdG„ƒZ*edHdI„ƒZ+edJdK„ƒZ,ed¯dLdM„ƒZ-ed°dNdO„ƒZ.ed±dPdQ„ƒZ/ed²dRdS„ƒZ0ed³dTdU„ƒZ1edVdW„ƒZ2ed´dXdY„ƒZ3edµdZd[„ƒZ4ed¶d\d]„ƒZ5ed^d_„ƒZ6ed·d`da„ƒZ7ed¸dbdc„ƒZ8eddde„ƒZ9ed¹dfdg„ƒZ:edºdhdi„ƒZ;ed»djdk„ƒZed¼dpdq„ƒZ?ed½drds„ƒZ@ed¾dtdu„ƒZAed¿dvdw„ƒZBedÀdxdy„ƒZCedÁdzd{„ƒZDedÂd|d}„ƒZEedÃd~d„ƒZFedÄd€d�„ƒZGed‚dƒ„ƒZHed„d…„ƒZIed†d‡„ƒZJedˆd‰„ƒZKedŠd‹„ƒZLedŒd�„ƒZMedÅdŽd�„ƒZNedÆd�d‘„ƒZOed’d“„ƒZPed”d•„ƒZQed–d—„ƒZRedÇd˜d™„ƒZSedÈdšd›„ƒZTedÉdœd�„ƒZUdS)ÊrZ LSM_SIM_DATAz /lsm_sim_datacCs2zt|tj d…ƒWSty,|‚Yn0dSrE)rpr]rsÚ ValueError)Zlsm_idZ lsm_errorr r r!Ú_lsm_id_to_sim_idîs zSimArray._lsm_id_to_sim_idcCst |ttjdƒ¡S)NrÇ)rr—r rrÉ)Újob_idr r r!Ú_sim_job_id_ofõs ÿzSimArray._sim_job_id_ofcCst |ttjdƒ¡S)NúPool not found)rr—r rrâ)rr r r!Ú_sim_pool_id_ofús ÿzSimArray._sim_pool_id_ofcCst |ttjdƒ¡S©NúVolume not found)rr—r rrö)rr r r!Ú_sim_vol_id_ofÿs ÿzSimArray._sim_vol_id_ofcCst |ttjdƒ¡S)NzFile system not found)rr—r rrM)rXr r r!Ú _sim_fs_id_ofs ÿzSimArray._sim_fs_id_ofcCst |ttjdƒ¡S)NzFile system snapshot not found)rr—r rrY)Úsnap_idr r r!Ú_sim_fs_snap_id_of s ÿþzSimArray._sim_fs_snap_id_ofcCst |ttjdƒ¡S©NzFile system export not found©rr—r rrz)r…r r r!Ú_sim_exp_id_ofs ÿþzSimArray._sim_exp_id_ofcCst |ttjdƒ¡Sr¢r£)rr r r!Ú _sim_ag_id_ofs ÿþzSimArray._sim_ag_id_ofcCs4|durtj}t||ƒ|_|j ¡||_||_dSrE)rÚ SIM_DATA_FILEr]rr¤rnrc)rvrnrcr r r!rys   zSimArray.__init__NcCs|j ||¡}dtj|fS)Nz JOB_ID_%0*d)rrÀr]rs)rvr¼Z sim_data_idrÃr r r!Ú _job_create(szSimArray._job_createrc Cs~t |¡}|j |¡\}}}tj}|dkr0tj}d}|tjkrJt  |¡}n*|tj kr`t  |¡}n|tj krtt  |¡}|||fS)NrÈ)rr™rrÓrZ INPROGRESSZCOMPLETEr]rËÚ_sim_vol_2_lsmrÍÚ _sim_fs_2_lsmrÏÚ_sim_fs_snap_2_lsm) rvr˜ÚflagsrÃrÑr¼rõr‚rÒr r r!Ú job_status,s  ÿ      zSimArray.job_statuscCs*|j ¡|j t |¡¡|j ¡dSrE)rr—rÄrr™r˜)rvr˜r«r r r!Újob_free@s  zSimArray.job_freecCs"t|jtt|dƒƒƒ|_||_dS)Nrb)r]rnrprrrc)rvÚmsr«r r r!Ú time_out_setGszSimArray.time_out_setcCs|jSrE)rc©rvr«r r r!Ú time_out_getMszSimArray.time_out_getc Cs0t|d|d|d|d|dtj|dd�S)Nr€r�r‚rƒrzr„)Z _fw_versionÚ_modeZ_read_cache_pct)rr]r‘)Úsim_sysr r r!Ú_sim_sys_2_lsmQsúzSimArray._sim_sys_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE)rr´)r¬r³r r r!r×]sÿz#SimArray.systems..)rJrr{rªr r r!r[sþzSimArray.systemscCsD|jtjkrttjdƒ‚|j ¡|j dtjd|¡|j  ¡dS)NúSystem not foundrr„) r€r]ršr rÚNOT_FOUND_SYSTEMrr—r·r˜)rvÚsystemZread_pctr«r r r!Úsystem_read_cache_pct_updateas   ÿ z%SimArray.system_read_cache_pct_updatec Cs>t|d|d|dtjtt|dtjƒƒ|dtj|dƒS)NZ lsm_vol_idr�rˆr†rÚ lsm_pool_id)rr]rérprrš)rr r r!r¨ms ÿ üzSimArray._sim_vol_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE©rr¨r«r r r!r×wr:z#SimArray.volumes..)rJrrórªr r r!ruszSimArray.volumesc Cs^|d}|d}|d}|d}|d}|d}tj}|d}|d} t|||| |||||ƒ S) Nr¹r�r†rùr‚rƒr�rŽ)r]ršr) rýrr�r†rùr‚rƒÚsys_idr�rŽr r r!Ú_sim_pool_2_lsmys  ÿzSimArray._sim_pool_2_lsmcCs0|j ¡|j ¡}|j ¡tdd„|DƒƒS)Ncss|]}t |¡VqdSrE)rr¼)r¬rýr r r!r׌sz!SimArray.pools..)rr—ràrrJ)rvr«ràr r r!rä‡s    ÿzSimArray.poolsc Csjtj}|ddur|tjO}t|d|d|dtjtt|dtjƒƒ|tj|d|d|d|d d � S) NrçrÕr�r‡r†rˆr‹r‰rŠ)Z_vpd83Z _locationZ_rpmZ _link_type)rrœÚ STATUS_FREEr]rérprrš)Úsim_diskZ disk_statusr r r!Ú_sim_disk_2_lsm�s  özSimArray._sim_disk_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE)rr¿)r¬r¾r r r!r×£sÿz!SimArray.disks..)rJrrÞrªr r r!r…¡sþzSimArray.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) rr—rrr›r§r]rËr˜) rvrZvol_namerüZthinpr«Ú _internal_useÚ_is_hw_raid_volZnew_sim_vol_idr˜r r r!Ú volume_create§s ü zSimArray.volume_createcCs2|j ¡|j t |¡¡| ¡}|j ¡|SrE)rr—rrržr§r˜©rvrr«r˜r r r!Ú volume_deleteÆs   zSimArray.volume_deletecCsB|j ¡t |¡}|j ||¡| tj|¡}|j ¡|dfSrE) rr—rržr'r§r]rËr˜)rvrr&r«rør˜r r r!Ú volume_resizeÎs    zSimArray.volume_resizec Csj|j ¡t |¡}|j |¡}|j|||dtjdd�}|j |||¡|  t j |¡} |j  ¡| dfS)Nr†T©rÀ) rr—rr›rÌrÂrÚPROVISION_FULLr0r§r]rËr˜) rvZ dst_pool_idr/r-Z new_vol_namer«r,Z src_sim_volrr˜r r r!Úvolume_replicateÙs   ü zSimArray.volume_replicatecCs|tjkrttjdƒ‚tjS©Nrµ)r]ršr rr¶ré)rvr»r«r r r!Ú!volume_replicate_range_block_sizeós  z*SimArray.volume_replicate_range_block_sizecCs>|j ¡|j t |¡t |¡||¡| ¡}|j ¡|SrE)rr—r0rr›r§r˜)rvr/r-r(Zrangesr«r˜r r r!Úvolume_replicate_rangeùs þ zSimArray.volume_replicate_rangecCs.|j ¡|j t |¡tj¡|j ¡dSrE)rr—r2rržrr r˜©rvrr«r r r!Ú volume_enables  ÿ zSimArray.volume_enablecCs.|j ¡|j t |¡tj¡|j ¡dSrE)rr—r2rržrZADMIN_STATE_DISABLEDr˜rÌr r r!Úvolume_disables  ÿ zSimArray.volume_disablecCs2t |¡}|j |¡}|D]}||krdSqdS)NTF)rržrr)rvrr«r,rrir r r!Úvolume_child_dependencys   z SimArray.volume_child_dependencycCs2|j ¡|j t |¡¡| ¡}|j ¡|SrE)rr—r1rržr§r˜rÃr r r!Úvolume_child_dependency_rm:s   z#SimArray.volume_child_dependency_rmcCs(t|d|d|d|d|dtjƒS)NÚ lsm_fs_idr�r†rùr¹)rr]rš)rTr r r!r©Ds  þzSimArray._sim_fs_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE)rr©)r¬Úfr r r!r×Lr:zSimArray.fs..)rJrrLrªr r r!ÚfsJsz SimArray.fscCsL|s|j ¡|j ||t |¡¡}|r,|S| tj|¡}|j ¡|dfSrE) rr—rPrr›r§r]rÍr˜)rvrZfs_namerür«rÀZ new_sim_fs_idr˜r r r!Ú fs_createNs  ÿ zSimArray.fs_createcCs2|j ¡|j t |¡¡| ¡}|j ¡|SrE)rr—rSrrŸr§r˜)rvrXr«r˜r r r!Ú fs_deleteds   zSimArray.fs_deletecCsBt |¡}|j ¡|j ||¡| tj|¡}|j ¡|dfSrE) rrŸrr—rUr§r]rÍr˜)rvrXr&r«rNr˜r r r!Ú fs_resizels    zSimArray.fs_resizec Cs€|j ¡d}|rt |¡}t |¡}|j |¡}|d}|j|||ddd�} |j || |¡| t j | ¡} |j  ¡| dfS)Nr¹r†TrÆ) rr—rr¡rŸrÎrÔrjr§r]rÍr˜) rvrfrlr r«rZrhZ src_sim_fsrrir˜r r r!Úfs_cloneus     ý zSimArray.fs_clonecCsJ|j ¡d}|rt |¡}|j t |¡|||¡| ¡}|j ¡|SrE)rr—rr¡rmrŸr§r˜)rvrXrkrlr r«rZr˜r r r!Ú fs_file_clone�s  ÿ zSimArray.fs_file_clonecCst|d|d|dƒS)NZlsm_fs_snap_idr�r»)r )r[r r r!rª›sÿzSimArray._sim_fs_snap_2_lsmcCs tdd„|j t |¡¡DƒƒS)Ncss|]}t |¡VqdSrE)rrª)r¬Úsr r r!r×¢sÿz(SimArray.fs_snapshots..)rJrrWrrŸ)rvrXr«r r r!Ú fs_snapshots sþzSimArray.fs_snapshotscCs>|j ¡|j t |¡|¡}| tj|¡}|j ¡|dfSrE) rr—r]rrŸr§r]rÏr˜)rvrXZ snap_namer«rZr˜r r r!Úfs_snapshot_create¦s  ÿÿ zSimArray.fs_snapshot_createcCs:|j ¡|j t |¡t |¡¡| ¡}|j ¡|SrE)rr—rcrr¡rŸr§r˜)rvrXr r«r˜r r r!Úfs_snapshot_delete°s ÿ zSimArray.fs_snapshot_deletec CsL|j ¡d}|rt |¡}|j t |¡||||¡| ¡}|j ¡|SrE)rr—rr¡rbrŸr§r˜) rvrXr r_r`rar«rZr˜r r r!Úfs_snapshot_restore¹s  þ zSimArray.fs_snapshot_restorecCsht |¡}|dur|j ¡|j |¡gkrR|j |¡gkrR|durN|j ¡dS|durd|j ¡dS)NFT)rrŸrr—rQrWr)rvrXr_r«rÀrNr r r!Úfs_child_dependencyÉs  ÿ  zSimArray.fs_child_dependencycCsb|j ¡|j||dd�dur*ttjdƒ‚t |¡}|j |¡|j  |¡|  ¡}|j  ¡|S)z… Assuming API defination is break all clone relationship and remove all snapshot of this source file system. TrÆFz9No snapshot or fs clone target found for this file system) rr—rÞr rrrrŸrprdr§r˜)rvrXr_r«rhr˜r r r!Úfs_child_dependency_rm×s þ    zSimArray.fs_child_dependency_rmc CsBt|d|d|d|d|d|d|d|d|d |d ƒ S) NZ lsm_exp_idrÑrr‚rqrrrsr€r�rƒ)r )rtr r r!Ú_sim_exp_2_lsmês     üzSimArray._sim_exp_2_lsmcCsdd„|j ¡DƒS)NcSsg|]}t |¡‘qSr )rràrvr r r!r®ôr:z$SimArray.exports..)rryr°r r r!ÚexportsòszSimArray.exportsc CsL|j ¡|j t |¡|||||||| ¡ } |j | ¡} |j ¡t | ¡SrE)rr—r†rrŸr}r˜rà) rvrXrrqrrrsr€r�r‚rƒr«r|rtr r r!Ú fs_exportös ý  zSimArray.fs_exportcCs*|j ¡|j t |¡¡|j ¡dSrE)rr—r‡rr¤r˜)rvr…r«r r r!Ú fs_unexport s  zSimArray.fs_unexportcCs"t|d|d|d|dtjƒS)NZ lsm_ag_idr�r3r>)rr]ršr6r r r!Ú _sim_ag_2_lsm s þzSimArray._sim_ag_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE©rrär:r r r!r× r:zSimArray.ags..)rJrr<rªr r r!rF sz SimArray.agscCsP|tjkrttjdƒ‚|j ¡|j |||¡}|j |¡}|j  ¡t   |¡SrÉ) r]ršr rr¶rr—rGrr˜rrä)rvr�r?r>r»r«Z new_sim_ag_idÚ new_sim_agr r r!Úaccess_group_create s     zSimArray.access_group_createcCs*|j ¡|j t |¡¡|j ¡dSrE)rr—rHrr¥r˜)rvrr«r r r!Úaccess_group_delete& s  zSimArray.access_group_deletecCsDt |¡}|j ¡|j |||¡|j |¡}|j ¡t |¡SrE)rr¥rr—rIrr˜rä)rvrr?r>r«ròrær r r!Úaccess_group_initiator_add- s     z#SimArray.access_group_initiator_addcCsBt |¡}|j ¡|j ||¡|j |¡}|j ¡t |¡SrE)rr¥rr—rJrr˜rä)rvrr?r>r«ròr7r r r!Úaccess_group_initiator_delete6 s     z&SimArray.access_group_initiator_deletecCs2|j ¡|j t |¡t |¡¡|j ¡dSrE)rr—r rržr¥r˜©rvrrr«r r r!Ú volume_maskC s  ÿ zSimArray.volume_maskcCs2|j ¡|j t |¡t |¡¡|j ¡dSrE)rr—r!rržr¥r˜rër r r!Ú volume_unmaskK s  ÿ zSimArray.volume_unmaskcCs6|j ¡|jjt |¡d�}|j ¡dd„|DƒS)N)ròcSsg|]}t |¡‘qSr rºr«r r r!r®[ r:z?SimArray.volumes_accessible_by_access_group..)rr—rórr¥r)rvrr«rór r r!Ú"volumes_accessible_by_access_groupS s  ÿ z+SimArray.volumes_accessible_by_access_groupcCs6|j ¡|jjt |¡d�}|j ¡dd„|DƒS)N)røcSsg|]}t |¡‘qSr rår:r r r!r®c r:z.)rr—r<rržr)rvrr«r<r r r!Úaccess_groups_granted_to_volume] s  ÿ z(SimArray.access_groups_granted_to_volumecCs,|j ¡|j |||||¡|j ¡dSrE)rr—rEr˜)rvr?rArBrCrDr«r r r!Úiscsi_chap_authe s  ÿ zSimArray.iscsi_chap_authcCs.t|d|d|d|d|d|dtjƒS)NZ lsm_tgt_idr‘r’r“r”r•)r r]rš)Zsim_tgtr r r!Ú_sim_tgt_2_lsms s  üzSimArray._sim_tgt_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE)rrñ©r¬Útr r r!r×} r:z(SimArray.target_ports..)rJrrˆrªr r r!Ú target_ports{ szSimArray.target_portscCsÞ|j t |jttjdƒ¡¡}tj }t j }|dt j krH|j |d¡}|d}|d}|d}|}|t jksx|t jkr†|||||gS|t jkr¤ttjd|dƒ‚|t jks¸|t jkrÀtj }nt|d |ƒ}|||||gS) Nršrår�rNrOræz;volume_raid_info(): Got unsupported RAID_TYPE_MIXED pool %sr¹rP)rrãrr—rr rrâr]rérZOPT_IO_SIZE_UNKNOWNrrìZRAID_TYPE_UNKNOWNrëZRAID_TYPE_MIXEDrrVrTrp)rvÚlsm_volrýZ min_io_sizeZ opt_io_sizerNrOrær r r!Úvolume_raid_info s@ þÿ ÿ ÿ ÿþ ÿzSimArray.volume_raid_infocCsp|j t |jttjdƒ¡¡}|d}g}|tj kr@|dg}n"|tj kr\|j  |d¡}ntj }|d||fS)NršråZparent_lsm_pool_idr€rN) rrãrr—r€r rrârrìrêrÝZMEMBER_TYPE_UNKNOWN)rvZlsm_poolrýråZ member_idsr r r!Úpool_member_info¥ s þÿ   zSimArray.pool_member_infocCs$|jtjkrttjdƒ‚tjtjfSrÉ)r€r]ršr rr¶r”r•)rvr·r 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|jƒ‚qbz&|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 |jttjdƒ¡‘qS)zDisk not found)rr—r€r rZNOT_FOUND_DISKrÖr r r!r®Ë sþÿz/SimArray.volume_raid_create..z'Disk %s is not in DISK.STATUS_FREE mode)r�rNrŒr�rŽrærr¹rùiTrG)rÀrÁ)r]r”r rr%rZVCR_STRIP_SIZE_DEFAULTrèr•rr—r‚rr½Z DISK_NOT_FREEr€ržrrŸr r¡rrrrãrÂrÇrÌr˜rr¨) rvr�rNr…ræZ pool_namerŒZdiskrÜrrýrørr r r!Úvolume_raid_create½ sb ÿ  ÿ ý þÿù þ  ø  zSimArray.volume_raid_createcCs&t |jttjdƒ¡}|j |¡}dSrœ©rr—r€r rrörrÌ©rvÚvolumer«Z sim_volume_idrr r r!Úvolume_ident_led_onò s  þ zSimArray.volume_ident_led_oncCs&t |jttjdƒ¡}|j |¡}dSrœrúrûr r r!Úvolume_ident_led_offû s  þ zSimArray.volume_ident_led_offcCs"t|d|d|d|dtjƒS)NZ lsm_bat_idr�rr‚)rr]rš)Úsim_batr r r!Ú_sim_bat_2_lsm s ÿzSimArray._sim_bat_2_lsmcCstdd„|j ¡DƒƒS)Ncss|]}t |¡VqdSrE)rrròr r r!r× r:z%SimArray.batteries..)rJrr‰rªr r r!r– szSimArray.batteriescCsØ|j t |jttjdƒ¡¡}tj }tj }d}|j  ¡D]}|dt j kr8d}q8|dtjkrj|r”tj}n*|dtjkr€tj}n|dtjkr”tj}|dtjkrªtj}n|dtjkr¾tj}|d||d||dgS)Nr�Fr‚Trrr)rrÌrr—r€r rrörZ WRITE_CACHE_STATUS_WRITE_THROUGHZREAD_CACHE_STATUS_DISABLEDr‰rrœr’ZWRITE_CACHE_STATUS_WRITE_BACKZWRITE_CACHE_POLICY_WRITE_BACKZWRITE_CACHE_POLICY_UNKNOWNZWRITE_CACHE_STATUS_UNKNOWNr“ZREAD_CACHE_STATUS_ENABLEDZREAD_CACHE_POLICY_UNKNOWNZREAD_CACHE_STATUS_UNKNOWN)rvrõrZwrite_cache_statusZread_cache_statusZflag_battery_okrÿr r r!Úvolume_cache_info s> þÿÿÿýzSimArray.volume_cache_infocCs<|j ¡t |jttjdƒ¡}|j ||¡|j  ¡dSrœ) rr—rr—r€r rrörŒr˜)rvrür‹r«rør r r!Ú!volume_physical_disk_cache_update2 s  þz*SimArray.volume_physical_disk_cache_updatecCs<|j ¡t |jttjdƒ¡}|j ||¡|j  ¡dSrœ) rr—rr—r€r rrör�r˜)rvrür�r«rør r r!Ú volume_write_cache_policy_update; s  þz)SimArray.volume_write_cache_policy_updatecCs<|j ¡t |jttjdƒ¡}|j ||¡|j  ¡dSrœ) rr—rr—r€r rrörŽr˜)rvrür�r«rør 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)VrQrRrSrfr½ÚtempfileZ gettempdirr¦r\r—r™r›ržrŸr¡r¤r¥r#ryr§r¬r­r¯r±r´rr¸r¨rr¼rär¿r…rÂrÄrÅrÈrÊrËrÍrÎrÏrÐr©rÓrÔrÕrÖr×rØrªrÚrÛrÜrÝrÞrßràrárârãrärFrçrèrérêrìrírîrïrðrñrôrör÷rørùrýrþrr–rrrrr r r r!rêsH ÿ                      ù   û  û       û               ö       ü     ú    %   4     $  r)r)rrfr¿rZlsmrrrrrrrr r r r r rrrrr#r,r5Úobjectr6r]rr r r r!Ús2 D 6