o ckF[?@sddlmZddlmZddlmZmZmZmZm Z ddl m Z ddl m Z ddlZddlZddlZddlZddlmZddlZGdd d eZGd d d eZdS) )print_function)Model)StringPropertyIntegerProperty ListPropertyReferencePropertyCalculatedProperty)Server)propgetN)closingc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)CommandLineGettercCs6|dds|jd}tj|tjjd|d<dSdS)Nregion region_name)choices)getcls find_propertyr botoec2regionsselfparamspropr4/usr/lib/python3/dist-packages/boto/manage/volume.py get_region%s  zCommandLineGetter.get_regioncCs4|ddstdd|jjd}t||d<dSdS)NzonezEC2 Availability Zone)name verbose_namer)rrr get_all_zonesr rrrrget_zone*s zCommandLineGetter.get_zonecC.|dds|jd}t||d<dSdS)Nrrrrr rrrrget_name0  zCommandLineGetter.get_namecCs.|ddstddd}t||d<dSdS)Nsize Size (GB))rr)rrr rrrrget_size5r%zCommandLineGetter.get_sizecCr")N mount_pointr#rrrrget_mount_point:r%z!CommandLineGetter.get_mount_pointcCr")Ndevicer#rrrr get_device?r%zCommandLineGetter.get_devicecCsT||_|||d|_||||||||||dS)Nr ) rrconnectrr!r$r(r*r,)rrrrrrrDs     zCommandLineGetter.getN) __name__ __module__ __qualname__rr!r$r(r*r,rrrrrr #s r cseZdZeddddZedddZedddZeddZed d d Zedd Z e e d Z e edddZede ddZede ddZededdZeddZeddZdMddZdMddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)ZdMd*d+Z dNd-d.Z!dMd/d0Z"d1d2Z#d3d4Z$d5d6Z%d7d8Z&d9d:Z'd;d<Z(d=d>Z)dOd?d@Z*dNdAdBZ+dCdDZ,dEdFZ-dGdHZ.dNfdIdJ Z/dKdLZ0Z1S)PVolumeTName)requireduniquerz EC2 Region)r3rzEC2 Zonez Mount Point)rz Device Namez/dev/sdp)rdefault)r3) item_typevolumeszServer Attached To)collection_namerz Volume State)rcalculated_type use_methodzAttachment Stater'c Kst}||||d}|}|d}|d}|||j}|}||_|j|_|d|_|d|_|d|_ |j|_ |j|_ | |S)Nr rr&rr)r+) r rr- create_volumerrid volume_idr)r+r zone_nameput) rrgetterr rrr& ebs_volumevrrrcreate`s"       z Volume.createcCsbd}tj|}||g}t|dkr/|d}|}|j|_||_|jj|_ |j |_ | |S)Nr) rrconnect_to_regionget_all_volumeslenr<r=rr rrr>r?)rrr=rvolrrsrBrrrcreate_from_volume_idts    zVolume.create_from_volume_idNcCs|d}||||S)N) get_snapshotscreate_from_snapshot)rrr&snapshotrrrcreate_from_latest_snapshots z"Volume.create_from_latest_snapshotcCs||jkr|j}|}|jdus|jdkr#||jgd}|j|_|||j|}t}|j|_|j |_||_ |j |_ |j |_ |j |_ |j|_||S)Nr)r&get_ec2_connectionr>rFr=rr;r1rr<rr)r+rr?)rrrNr&rcurrent_volumerArBrrrrMs" zVolume.create_from_snapshotcCs8|jr|jjSt|dr|jdurtj|j|_|jS)Nr)serverrhasattrrrErrrrrrQs zVolume.get_ec2_connectioncC"|}||jg}|dSNr)rQrFr= volume_staterrrIrrr _volume_state zVolume._volume_statecCrVrW)rQrFr=attachment_staterYrrr_attachment_stater[zVolume._attachment_statecCs2t|ds|}||jg}|dj|_|jS)N__sizer)rTrQrFr=r& _Volume__sizerYrrr_sizes  z Volume._sizecCs|jr |jddSdS)Nzxfsprogs xfsdump)rSinstallrUrrr install_xfsszVolume.install_xfscCst|}|}|jg|j}g}|D]}|j|vr/|jdkr/tj|j|_ d|_ | |q|j ddd|S)zO Returns a list of all completed snapshots for this volume ID. z100%TcSst|j|jSN)cmpdate)xyrrrsz&Volume.get_snapshots..)rd) rQget_all_snapshotsr=past_volume_idsprogressrutilsparse_ts start_timerekeepappendsort)rrrIall_volssnapsrNrrrrLs   zVolume.get_snapshotscCsJ|jdkr tddS|r||_||}||j|jj|jdS)Nattachedzalready attached) r\printrSr?rQ attach_volumer= instance_idr+)rrSrrrrattachs z Volume.attachFcCs\|j}|dks|dus|dkrtddS|}||j|jj|j|d|_|dS)N available detachingzalready detached) r\rurQ detach_volumer=rSrwr+r?)rforcestaterrrrdetachs z Volume.detachcCsX|jdur td|r|}n|j}|d|j}|s!||ddr*dSdS)N0server attribute must be set to run this commandz xfs_check %srDzbad superblock magic number 0FT)rS ValueError get_cmdshellrunr+close startswith)ruse_cmdcmdstatusrrrcheckfss  zVolume.checkfscCs|jdur tdt|j0}|j}||js8tjd|jt d||jrWddSWddS1sCwYdS)Nrz+%s still does not exist, waiting 10 seconds ) rSrr rexistsr+rloginfotimesleep)rrrrrwaits    "z Volume.waitcCs|jdur tdd}t|j$}||s.tjd|d|j }Wd|SWd|S1s9wY|S)Nrz make_fs...zmkfs -t xfs %s) rSrr rrrrrrr+)rrrrrrformats     z Volume.formatcCs2|jdur tdtjdt|jy}|j}||js1tjd| d|jnCtjd| d}|d d}|D].}| }|rs|d |jkrs|d |j krs| d |j| d |d | d nqE| d|j |jf| d|jWddS1swYdS)Nrhandle_mount_pointzmaking directoryzmkdir %szdirectory exists alreadyzmount -lrD rz umount %sz mount %s /tmpzchmod 777 /tmpz mount %s %sz xfs_growfs %s) rSrrrrr risdirr)rsplitr+)rrrlineslinetrrrmounts.        "z Volume.mountcCs:||_||||||dSrc)rSr?rbrxrrr)rrSrrr make_readys zVolume.make_readycC|jr |jd|jSdS)Nz/usr/sbin/xfs_freeze -f %srSrr)rUrrrfreeze$z Volume.freezecCr)Nz/usr/sbin/xfs_freeze -u %srrUrrrunfreeze(rzVolume.unfreezecCszMz'||jdur||j}n|jj|j}tjd|j |fWnt y?tjdtjt YnwW| }|SW| }|S| }|YS)Nz!Snapshot of Volume %s created: %szSnapshot error)rrSrQcreate_snapshotr=rrrrr Exception traceback format_excr)rrNrrrrrN,s$   zVolume.snapshotcCsxg}|D]5}|r|r|j|kr|j|kr||q|r'|j|kr&||q|r4|j|kr3||q||q|Src)rerp)rrs start_dateend_datelsnaprrrget_snapshot_range=s       zVolume.get_snapshot_rangecCs|}t|dkr |S|dd}tj|djj}tj|j|j|j|jd}tj ddd}t |||| ||||}t ||sH|Sd }|D]}|rZ||jjkrZd |_ qL|jj}qL|rx|dj} | dkrxtj | d } | | } | || |dj} t| dkr| dd D]}d |_ qtdd D]!} | || || } t| dkr| dd D]}d |_ q| |} q|j || d }d }|D]}|r||jjkrd |_ q|jj}q|r|D]}|j stjd||j|jf|q|S)a1 Trim the number of snapshots for this volume. This method always keeps the oldest snapshot. It then uses the parameters passed in to determine how many others should be kept. The algorithm is to keep all snapshots from the current day. Then it will keep the first snapshot of the day for the previous seven days. Then, it will keep the first snapshot of the week for the previous four weeks. After than, it will keep the first snapshot of the month for as many months as there are. rrDrKr)yearmonthdaytzinfoi)dayssecondsNF)r)rzDeleting %s(%s) for %s)rLrGdatetimenowrerrrr timedeltarurroweekdayrangerrrrdelete)rrrsrmidnightone_week previous_week current_dayr week_boundarydelta partial_weeki weeks_worth remainder current_monthrrrtrim_snapshotsMs^          zVolume.trim_snapshotscCdSrcr)rr&rrrgrowz Volume.growcCrrcr)rrNrrrcopyrz Volume.copycCrrcr)rrerrrget_snapshot_from_daterzVolume.get_snapshot_from_datecs2|r||}||jtt|dSrc)r~rQ delete_volumer=superr1r)rdelete_ebs_volumer __class__rrrs  z Volume.deletecCrrcrrUrrrarchiveszVolume.archiverc)F)NN)2r.r/r0rrrr>r)r+r=rstrrjrr rSrrXr\intr& classmethodrCrJrOrMrQrZr]r`rbrLrxr~rrrrrrrrNrrrrrrr __classcell__rrrrr1Nsb                 Cr1) __future__rboto.sdb.db.modelrboto.sdb.db.propertyrrrrrboto.manage.serverr boto.manager boto.utilsrboto.ec2rr contextlibr robjectr r1rrrrs     +