-P`c@sddlmZddlZddlZddlmZyddlZWne k rgddlZnXddl m Z ddl m Z mZmZmZddlZdejfdYZdejfd YZd eeefd YZed d dedd dedd dedd dedd dedd dedd dedd ddefdYZejdZed d dedd d ed!d d"edd d#edd d$ed%d d&edd ded'd d(edd dd)efd*YZed d dedd d+edd d,ed-d d.edd dd/efd0YZed d dedd d1ed2d d3ed4d d5edd ded-d d6edd dedd d7ed8d d9ed:d d;d<efd=YZed d dedd d>ed2d d3ed4d d?ed'd d@edd dAedd ddBefdCYZed d dedd dDedEd dFedd ddGefdHYZed d dedId dJedKd dLedMd dNedOd dPedQd dRedSd dTedUd dVedWd dXedYd dZedd d[d\efd]YZed^d d_ed`d daedbd d$dcefddYZ ed d deedd dfedgd dhedid djedd dedd d[dkefdlYZ!ed d deedmd dnedod dpedqd dredsd dtedud dvedd dedd d[dwefdxYZ"dyefdzYZ#ed d dedd d ed{d d|edd d}edd dedd dd~efdYZ$e%dkrndS(i(tABCMetaN(twith_metaclass(t WHITESPACE(t get_classtdefault_propertyt ErrorNumbertLsmErrort DataEncodercBseZdZdZRS(s? Custom json encoder for objects derived form ILsmData cCs<t|ts.tdtt|n |jSdS(Nsincorrect class type:(t isinstancetIDatat ValueErrortstrttypet_to_dict(tselftmy_class((s-/usr/lib/python2.7/site-packages/lsm/_data.pytdefault*s(t__name__t __module__t__doc__R(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR%st DataDecodercBsJeZdZedZedZedZejdZ RS(s? Custom json decoder for objects derived from ILsmData cCsXi}d|kr$tj|}n0x-|jD]\}}tj|||tj|S|SdS(s) Decodes the parsed json N(R R"RR#RR!(te((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt__decodeTs   cCstjtj|S(N(RRtjsontloads(Rt json_stringt_w((s-/usr/lib/python2.7/site-packages/lsm/_data.pytdecode`s( RRRt staticmethodR#R!RRtmatchR.(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR1s  R cBs/eZdZdZedZdZRS(s? Base class functionality of serializable classes. cCsqi|jjd6}xWt|jjD]@\}}t|tr[|j||d(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt size_bytesscCs+|jdkr$ttjdn|jS(s String. SCSI VPD83 ID. New in version 1.3. Only available for DAS(direct attached storage) systems. The VPD83 ID could be used in 'lsm.SCSI.disk_paths_of_vpd83()' when physical disk is exposed to OS directly. RCs5Disk.vpd83 is not supported by current disk or plugin(RORRt NO_SUPPORT(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pytvpd83s  cCs+|jdkr$ttjdn|jS(sP String. Disk location in storage topology. New in version 1.3. RCs:Disk.location property is not supported by this plugin yet(RPRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pytlocation&s  cCs.|jtjkr'ttjdn|jS(s Integer. New in version 1.3. Disk rotation speed - revolutions per minute(RPM): -1 (LSM_DISK_RPM_UNKNOWN): Unknown RPM 0 (LSM_DISK_RPM_NON_ROTATING_MEDIUM): Non-rotating medium (e.g., SSD) 1 (LSM_DISK_RPM_ROTATING_UNKNOWN_SPEED): Rotational disk with unknown speed >1: Normal rotational disk (e.g., HDD) s,Disk.rpm is not supported by this plugin yet(RQRBtRPM_NO_SUPPORTRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pytrpm1s  cCs.|jtjkr'ttjdn|jS(s Integer. New in version 1.3. Link type, possible values are: lsm.Disk.LINK_TYPE_UNKNOWN Failed to detect link type lsm.Disk.LINK_TYPE_FC Fibre Channel lsm.Disk.LINK_TYPE_SSA Serial Storage Architecture, Old IBM tech. lsm.Disk.LINK_TYPE_SBP Serial Bus Protocol, used by IEEE 1394. lsm.Disk.LINK_TYPE_SRP SCSI RDMA Protocol lsm.Disk.LINK_TYPE_ISCSI Internet Small Computer System Interface lsm.Disk.LINK_TYPE_SAS Serial Attached SCSI lsm.Disk.LINK_TYPE_ADT Automation/Drive Interface Transport Protocol, often used by Tape. lsm.Disk.LINK_TYPE_ATA PATA/IDE or SATA. lsm.Disk.LINK_TYPE_USB USB disk. lsm.Disk.LINK_TYPE_SOP SCSI over PCI-E lsm.Disk.LINK_TYPE_PCIE PCI-E, e.g. NVMe s2Disk.link_type is not supported by this plugin yet(RRRBtLINK_TYPE_NO_SUPPORTRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt link_typeDs  cCs|jS(N(R;(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR8isiiiiii i@iiiiiii iiiiii i@N(GRRRtSUPPORTED_SEARCH_KEYStBLOCK_COUNT_NOT_FOUNDtBLOCK_SIZE_NOT_FOUNDt TYPE_UNKNOWNt TYPE_OTHERtTYPE_ATAt TYPE_SATAtTYPE_SAStTYPE_FCtTYPE_SOPt TYPE_SCSItTYPE_LUNt TYPE_NL_SAStTYPE_HDDtTYPE_SSDt TYPE_HYBRIDtSTATUS_UNKNOWNt STATUS_OKt STATUS_OTHERtSTATUS_PREDICTIVE_FAILUREt STATUS_ERRORtSTATUS_REMOVEDtSTATUS_STARTINGtSTATUS_STOPPINGtSTATUS_STOPPEDtSTATUS_INITIALIZINGtSTATUS_MAINTENANCE_MODEtSTATUS_SPARE_DISKtSTATUS_RECONSTRUCTt STATUS_FREERXt RPM_UNKNOWNtRPM_NON_ROTATING_MEDIUMtRPM_ROTATING_UNKNOWN_SPEEDRZtLINK_TYPE_UNKNOWNt LINK_TYPE_FCt LINK_TYPE_SSAt LINK_TYPE_SBPt LINK_TYPE_SRPtLINK_TYPE_ISCSIt LINK_TYPE_SASt LINK_TYPE_ADTt LINK_TYPE_ATAt LINK_TYPE_USBt LINK_TYPE_SOPtLINK_TYPE_PCIEtLED_STATUS_UNKNOWNtLED_STATUS_IDENT_ONtLED_STATUS_IDENT_OFFtLED_STATUS_IDENT_UNKNOWNtLED_STATUS_FAULT_ONtLED_STATUS_FAULT_OFFtLED_STATUS_FAULT_UNKNOWNtLINK_SPEED_UNKNOWNtHEALTH_STATUS_UNKNOWNtHEALTH_STATUS_FAILtHEALTH_STATUS_WARNtHEALTH_STATUS_GOODtNoneRStpropertyRTRVRWRYR[R8(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRBs     %s*(?:^6[0-9a-f]{31})|(?:^[235][0-9a-f]{15})$sUser given nameRVs"Vital product page 0x83 identifiersVolume block sizesNumber of blockst admin_states$Enabled or disabled by administratortpool_idsPool identifierRLcBs|eZdZdddgZdZdZdZdZdZdZ d Z dZ dZ d Z d ZdZd Zd ZdZdZdZd Zd Zd ZdZdZdZdZdZdZdZdZd Z d Z!d Z"d Z#d Z$d Z%dZ&dZ'dZ(d Z)dZ*dZ+d Z,dZ-dZ.d Z/dZ0dZ1d Z2dZ3dZ4dZ5ddZ7e8dZ9dZ:e;dZ<RS(s Represents a volume. R9R@Riiiiiiiii iii2i<i3i=iiic Cs||_||_|rAtj| rAttjd|n||_||_||_ ||_ ||_ ||_ | |_ dS(Ns^Incorrect format of VPD 0x83 NAA(3) string: '%s', expecting 32 or 16 lower case hex characters(RDRERLRMRRRNRORGRHt _admin_stateRJt_pool_idRK( RRDRERORGRHRRJRRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs          cCs|j|jS(s' Volume size in bytes. (R=R>(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRTscCs|jS(N(R;(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR8scCs|rtj|rtStS(sI Returns True if string is valid vpd 0x83 representation (t_vol_regex_vpd83R0tTruetFalse(tvpd((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRMsN(=RRRR\tREPLICATE_UNKNOWNtREPLICATE_CLONEtREPLICATE_COPYtREPLICATE_MIRROR_SYNCtREPLICATE_MIRROR_ASYNCtPROVISION_UNKNOWNtPROVISION_THINtPROVISION_FULLtPROVISION_DEFAULTtADMIN_STATE_DISABLEDtADMIN_STATE_ENABLEDtRAID_TYPE_UNKNOWNtRAID_TYPE_RAID0tRAID_TYPE_RAID1tRAID_TYPE_RAID3tRAID_TYPE_RAID4tRAID_TYPE_RAID5tRAID_TYPE_RAID6tRAID_TYPE_RAID10tRAID_TYPE_RAID15tRAID_TYPE_RAID16tRAID_TYPE_RAID50tRAID_TYPE_RAID60tRAID_TYPE_RAID51tRAID_TYPE_RAID61tRAID_TYPE_JBODtRAID_TYPE_MIXEDtRAID_TYPE_OTHERtSTRIP_SIZE_UNKNOWNtDISK_COUNT_UNKNOWNtMIN_IO_SIZE_UNKNOWNtOPT_IO_SIZE_UNKNOWNtVCR_STRIP_SIZE_DEFAULTtWRITE_CACHE_POLICY_UNKNOWNtWRITE_CACHE_POLICY_WRITE_BACKtWRITE_CACHE_POLICY_AUTOt WRITE_CACHE_POLICY_WRITE_THROUGHtWRITE_CACHE_STATUS_UNKNOWNtWRITE_CACHE_STATUS_WRITE_BACKt WRITE_CACHE_STATUS_WRITE_THROUGHtREAD_CACHE_POLICY_UNKNOWNtREAD_CACHE_POLICY_ENABLEDtREAD_CACHE_POLICY_DISABLEDtREAD_CACHE_STATUS_UNKNOWNtREAD_CACHE_STATUS_ENABLEDtREAD_CACHE_STATUS_DISABLEDtPHYSICAL_DISK_CACHE_UNKNOWNtPHYSICAL_DISK_CACHE_ENABLEDtPHYSICAL_DISK_CACHE_DISABLEDt$PHYSICAL_DISK_CACHE_USE_DISK_SETTINGRRSRRTR8R/RM(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRLrsp   sUser defined system namesEnumerated status of systemt status_infos#Detail status information of systemtSystemcBseZd ZdZdZdZdZdZdZdZ dZ dZ dZ dZ ddddd Zed Zed Zed ZRS(iiiiiiiiRCc Cs||_||_||_||_||_||_|dkrQtj|_ n ||_ |dkrutj |_ n ||_ dS(N( RDRERIt _status_infoRKt _fw_versionRRtREAD_CACHE_PCT_NO_SUPPORTt_read_cache_pcttMODE_NO_SUPPORTt_mode( RRDRERIRRKRRR((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRS s         cCs+|jdkr$ttjdn|jS(s String. Firmware version string. New in version 1.3. On some system, it might contain multiple version strings, example: "Package: 23.32.0-0009, FW: 3.440.05-3712" RCs7System.fw_version() is not supported by this plugin yet(RRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt fw_versions  cCs.|jtjkr'ttjdn|jS(sQ Integer(enumerated value). System mode. New in version 1.3. Only available for HW RAID systems at this time. Possible values: * lsm.System.MODE_HARDWARE_RAID The logical volume(aka, RAIDed virtual disk) can be exposed to OS while hardware RAID card is handling the RAID algorithm. Physical disk can not be exposed to OS directly. * lsm.System.MODE_HBA The physical disks can be exposed to OS directly. SCSI enclosure service might be exposed to OS also. s/System.mode is not supported by this plugin yet(RRRRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pytmode)s  cCs.|jtjkr'ttjdn|jS(s Integer. Read cache percentage. New in version 1.3. Possible values: * 0-100 The read cache percentage. The write cache percentage will then be 100 - read_cache_pct s9System.read_cache_pct is not supported by this plugin yet(RRRRRRU(R((s-/usr/lib/python2.7/site-packages/lsm/_data.pytread_cache_pct=s   iiiiii N(RRRlRmRptSTATUS_DEGRADEDRoRnRt MODE_UNKNOWNtMODE_HARDWARE_RAIDtMODE_HBARtREAD_CACHE_PCT_UNKNOWNRRSRRRR(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRs" sUser supplied namet total_spacesTotal space in bytest free_spacesFree space in bytessText explaining statussPlug-in private datat element_typesWhat pool can be used fortunsupported_actionss"What cannot be done with this pooltPoolcBseZdZddgZdZdZdZdZdZdZ dZ dZ dZ dZ dZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd ZdZdZdZd%dZRS(&s# Pool specific information R9R@iiiiiiii ii i i iic Cs^||_||_||_||_||_||_||_||_| |_| |_ dS(N( RDREt _element_typet_unsupported_actionst _total_spacet _free_spaceRIRRJRK( RRDRERRRRRIRRJRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs         iiiii i@iiiiiiii iii i@iN(RRRR\tTOTAL_SPACE_NOT_FOUNDtFREE_SPACE_NOT_FOUNDtELEMENT_TYPE_POOLtELEMENT_TYPE_VOLUMEtELEMENT_TYPE_FStELEMENT_TYPE_DELTAtELEMENT_TYPE_VOLUME_FULLtELEMENT_TYPE_VOLUME_THINtELEMENT_TYPE_SYS_RESERVEDtUNSUPPORTED_VOLUME_GROWtUNSUPPORTED_VOLUME_SHRINKRlRmRnRRpRttSTATUS_RECONSTRUCTINGtSTATUS_VERIFYINGRutSTATUS_GROWINGtMEMBER_TYPE_UNKNOWNtMEMBER_TYPE_OTHERtMEMBER_TYPE_DISKtMEMBER_TYPE_POOLRRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRMs8 sFile system namesFree space availables$What pool the file system resides ons System IDt FileSystemcBs#eZdddgZddZRS(R9R@RcCsC||_||_||_||_||_||_||_dS(N(RDRERRRRJRK(RRDRERRRRJRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs      N(RRR\RRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRss Snapshot namettss#Time stamp the snapshot was createdt FsSnapshotcBseZddZRS(cCs.||_||_t||_||_dS(N(RDREtintt_tsRK(RRDRERRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs  N(RRRRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRstfs_idsFilesystem that is exportedt export_paths Export pathtauthsAuthentication typetroots!List of hosts with no_root_squashtrws*List of hosts with Read & Write privilegestros'List of hosts with Read only privilegestanonuidsUID for anonymous user idtanongidsGID for anonymous group idtoptionss"String containing advanced optionssPlugin private datat NfsExportcBs,eZddgZdZdZddZRS(R9Riic Csg||_||_||_||_||_||_||_||_| |_| |_ | |_ dS(N( RDt_fs_idt _export_patht_autht_roott_rwt_rot_anonuidt_anongidt_optionsRK( RRDR R R RRRRRRRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs          N(RRR\tANON_UID_GID_NAtANON_UID_GID_ERRORRRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR s t src_blocksSource logical block addresst dest_blocks!Destination logical block addresst block_countt BlockRangecBseZdZRS(cCs||_||_||_dS(N(t _src_blockt _dest_blockt _block_count(RRRR((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs  (RRRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRssUnique instance identifiersAccess group nametinit_idssList of initiator IDst init_typesInitiator typet AccessGroupcBseZddgZdZdZdZdZdZd dZ e dZ e j d e jZe d ed Ze ed ZRS( R9R@iiiiicCsC||_||_tj||_||_||_||_dS(N(RDRERt_standardize_init_listt _init_idst _init_typeRJRK(RRDRER!R"RJRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs     cCs_g}xR|D]J}tj|\}}}|rA|j|q ttjd|q W|S(NsInvalid initiator ID %s(Rtinitiator_id_verifyR RRRN(RRtitvalidRtinit_id((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR s  sR ^(0x|0X)?([0-9A-Fa-f]{2}) (([\.:\-])?[0-9A-Fa-f]{2}){7}$ cCs|jds-|jds-|jdr[|dksH|tjkr[ttj|fSntjjt|r|dks|tjkrttjtj |fSn|rt t j d|nt ddfS(s Public method which can be used to verify an initiator id :param init_id: :param init_type: :param raise_exception: Will throw a LsmError INVALID_ARGUMENT if not a valid initiator address :return:(Bool, init_type, init_id) Note: init_id will be returned in normalized format if it's a WWPN tiqnteuitnaasInitiator id '%s' is invalidN(t startswithRRtINIT_TYPE_ISCSI_IQNRt _regex_wwpnR0R tINIT_TYPE_WWPNt_wwpn_to_lsm_typeRRRNR(R&Rtraise_exception((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR#s     cCstjjt|ryt|}|j}tjdd|}tjdd|}djtjd|}|S|rt t j d|ndS(s Convert provided WWPN string into LSM standard one: LSM WWPN format: ^(?:[0-9a-f]{2}:){7}[0-9a-f]{2}$ LSM WWPN Example: 10:00:00:00:c9:95:2f:de Acceptable WWPN format is: ^[0x|0X]{0,1}(:?[0-9A-Fa-f]{2}[\.\-:]{0,1}){7}[0-9A-Fa-f]{2}$ Acceptable WWPN example: 10:00:00:00:c9:95:2f:de 10:00:00:00:C9:95:2F:DE 10-00-00-00-C9-95-2F-DE 10-00-00-00-c9-95-2f-de 10.00.00.00.C9.95.2F.DE 10.00.00.00.c9.95.2f.de 0x10000000c9952fde 0X10000000C9952FDE 10000000c9952fde 10000000C9952FDE Return the LSM WWPN Return None if raise_error is False and not a valid WWPN. t0xRCs [^0-9a-f]t:s..sInvalid WWPN Initiator: %sN( RR,R0R tlowertretsubtjointfindallRRRNR(twwpnt raise_errorts((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR.+s   N(RRR\tINIT_TYPE_UNKNOWNtINIT_TYPE_OTHERR-R+tINIT_TYPE_ISCSI_WWPN_MIXEDRRSR/R R3tcompiletXR,RR#RR.(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRs   t port_typesTarget port typetservice_addresssTarget port service addresstnetwork_addresssTarget port network addresstphysical_addresssTarget port physical addresst physical_namesTarget port physical port namet TargetPortcBs8eZddgZdZdZdZdZddZRS(R9R@iiiic CsL||_||_||_||_||_||_||_||_dS(N(RDt _port_typet_service_addresst_network_addresst_physical_addresst_physical_nameRJRK( RRDRERFRGRHRIRJRK((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSbs       N( RRR\R`Rdt TYPE_FCOEt TYPE_ISCSIRRS(((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRDRs  t CapabilitiescBs]eZdZdZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1Z4d2Z5d3Z6d4Z7d5Z8d6Z9d7Z:d8Z;d9Z<d:Z=d;Z>d<Z?d=Z@d>ZAd?ZBd@ZCdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNdLZOdMZPdNZQdOZRdPZSdQZTdRZUdSZVdTZWd\dUZYdVZZdWZ[e\dXZ]e^dYZ_edZZ`d[ZaRS(]iiiiiiiiiiiiiiii!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i5i6i7i8i9i:i;i<i=i>i?i@iAiBidieifigihiiijikiminioipiqirixiyizi{i|iiiiiiiiiiiiiiiiiiiicCs;i|jjd6djg|jD]}d|^q d6S(NRRCs%02xtcap(R1RR5t_cap(Rtb((s-/usr/lib/python2.7/site-packages/lsm/_data.pyR scCs=|dk r'ttj||_nttj|_dS(N(Rt bytearraytbinasciit unhexlifyRNRLt_NUM(RRN((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRSs cCs|j|tjkS(N(tgetRLt SUPPORTED(Rt capability((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt supportedscCs'|t|jkrtjS|j|S(N(tlenRNRLt UNSUPPORTED(RRV((s-/usr/lib/python2.7/site-packages/lsm/_data.pyRTscCst}xttjjD]o\}}t|tjrt|t kr|ddkrtj |ko|tj knr||| string name iR4( R"RRLR2RRtsixt string_typesR Rt_CAP_NUM_BEGINRS(tlsm_cap_to_str_convtc_strtc_int((s-/usr/lib/python2.7/site-packages/lsm/_data.pyt_lsm_cap_to_str_dicts "$"cCsstj}|r|Si}xPt|jD]<}|j|tjkr/||krk||||s   "  31+.{"R  1<( 4%j+*%