HEX
Server: Apache
System: Linux nc-ph-4101.simplemoneygoals.com 5.14.0-503.21.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Jan 12 09:45:05 EST 2025 x86_64
User: dailygoldindex (1004)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //lib64/python3.9/site-packages/sim_plugin/__pycache__/simarray.cpython-39.pyc
a

V��dɀ�@s�ddlZddlZddlZddlZddlZddlmZddlmZmZm	Z	m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZdd�Zdd�Zdd	�ZGd
d�de�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	jdt|���WYd}~n�d}~0ty�t|d�tur�t|dd�r�|dj���Ynjt�y4}zPt|d�tu�rt|dd��r|dj��tt	jdt|���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.<locals>.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�ejd	d�ejd
d�ej
dd�ejdd�ejd
d�ejdd�ejdd�iZejdd�ejdd�ejdd�ejdd�ejdd�ej	dd�ej
dd�ejdd�ejdd�ej
dd�ejdd�ejdd�ejdd�ejdd�iZedd��Zd S)!�PoolRAIDcCs|dkSr-r ��xr r r!�<lambda>B�zPoolRAID.<lambda>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
dZd	Ze
jZejZejZejZd
ZdZd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�Z<dEdF�Z=dGdH�Z>e?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}|d7}|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_connr5Zrow_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��td�}td�}td�}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)Zdisk_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!�
<listcomp>�sz'BackStore._data_add.<locals>.<listcomp>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_idZcolumn_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
}|dtjkr�|�	|d�}|d}nJ|dtj
kr�|�|d�}|d}n$|dtj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!�	<genexpr>cs�z1BackStore.lsm_disk_ids_of_pool.<locals>.<genexpr>�
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�Zsim_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|�Wn6tj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
|�dS)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.<locals>.<genexpr>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.<locals>.<genexpr>rzvol_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.<locals>.<genexpr>�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.<locals>.<genexpr>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.<locals>.<listcomp>r�)rvr��sim_agsr r r!r<�s�
zBackStore.sim_agsc
CsTz|�d|||d��Wn6tjyN}zttjd|��WYd}~n
d}~00dS)N�inits)r��	init_typeZowner_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)NrKzFile System)r�NOT_FOUND_FSr�)rv�	sim_fs_idZraise_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.<locals>.<genexpr>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.<locals>.<genexpr>�	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��Zed	d
��Zedd��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�d<d=��Z%ed�d>d?��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��Z<edldm��Z=edndo��Z>ed�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|tjd��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)NzJOB_ID_%0*d)rr�r]rs)rvr�Zsim_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.<locals>.<genexpr>)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.<locals>.<genexpr>)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.<locals>.<genexpr>)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_diskZdisk_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.<locals>.<genexpr>)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�)
rvZdst_pool_idr/r-Znew_vol_namer�r,Zsrc_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.<locals>.<genexpr>)rJrrLr�r r r!�fsJszSimArray.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_resizecCs�|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.<locals>.<genexpr>)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.<locals>.<listcomp>)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.<locals>.<genexpr>)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.<locals>.<listcomp>)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<SimArray.access_groups_granted_to_volume.<locals>.<listcomp>)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.<locals>.<genexpr>)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�Zmin_io_sizeZopt_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]"}|jtj
@sbttjd|j��qbz&|j	j|||tjtjtjB|d�}Wn6tjy�}	zttjd|��WYd}	~	n
d}	~	00|j	�|�}
|j|
d	||
d
dtjd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.<locals>.<listcomp>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.<locals>.<genexpr>)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
rrr
rrrrr#r,r5�objectr6r]rr r r r!�<module>s2D
6