U
    W¨+d¨?  ã                   @   s¤   d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlZd dlZd dlZd dlZd dlmZ d dlZG dd	„ d	eƒZG d
d„ deƒZdS )é    )Úprint_function)ÚModel)ÚStringPropertyÚIntegerPropertyÚListPropertyÚReferencePropertyÚCalculatedProperty)ÚServer)ÚpropgetN)Úclosingc                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚCommandLineGetterc                 C   s2   |  dd ¡s.| j d¡}tj |tjjd|d< d S )NÚregionÚregion_name)Úchoices)ÚgetÚclsÚfind_propertyr
   ÚbotoÚec2Zregions©ÚselfÚparamsÚprop© r   ú6/tmp/pip-unpacked-wheel-dlxw5sjy/boto/manage/volume.pyÚ
get_region%   s    zCommandLineGetter.get_regionc                 C   s0   |  dd ¡s,tdd| jjd}t  |¡|d< d S )NÚzonezEC2 Availability Zone)ÚnameÚverbose_namer   )r   r   r   Zget_all_zonesr
   r   r   r   r   Úget_zone*   s
    ÿzCommandLineGetter.get_zonec                 C   s*   |  dd ¡s&| j d¡}t  |¡|d< d S )Nr   ©r   r   r   r
   r   r   r   r   Úget_name0   s    zCommandLineGetter.get_namec                 C   s*   |  dd ¡s&tddd}t  |¡|d< d S )NÚsizeú	Size (GB))r   r   )r   r   r
   r   r   r   r   Úget_size5   s    zCommandLineGetter.get_sizec                 C   s*   |  dd ¡s&| j d¡}t  |¡|d< d S )NÚmount_pointr    r   r   r   r   Úget_mount_point:   s    z!CommandLineGetter.get_mount_pointc                 C   s*   |  dd ¡s&| j d¡}t  |¡|d< d S )NÚdevicer    r   r   r   r   Ú
get_device?   s    zCommandLineGetter.get_devicec                 C   sT   || _ |  |¡ |d  ¡ | _|  |¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )Nr   )	r   r   Úconnectr   r   r!   r$   r&   r(   )r   r   r   r   r   r   r   D   s    




zCommandLineGetter.getN)
Ú__name__Ú
__module__Ú__qualname__r   r   r!   r$   r&   r(   r   r   r   r   r   r   #   s   r   c                       sŒ  e Zd ZeddddZedddZedddZeddZed	d
dZeddZ	e
edZeedddZededdZededdZededdZedd„ ƒZedd„ ƒZdMdd„ZdNdd„Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdOd*d+„Z dPd-d.„Z!dQd/d0„Z"d1d2„ Z#d3d4„ Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)dRd?d@„Z*dSdAdB„Z+dCdD„ Z,dEdF„ Z-dGdH„ Z.dT‡ fdIdJ„	Z/dKdL„ Z0‡  Z1S )UÚVolumeTÚName)ÚrequiredÚuniquer   z
EC2 Region)r/   r   zEC2 ZonezMount Point)r   zDevice Namez/dev/sdp)r   Údefault)r/   )Z	item_typeZvolumeszServer Attached To)Zcollection_namer   zVolume State)r   Zcalculated_typeZ
use_methodzAttachment Stater#   c           	      K   sš   t ƒ }| | |¡ | d¡}| ¡ }| d¡}| d¡}| ||j¡}| ƒ }||_|j|_| d¡|_| d¡|_| d¡|_	|j|_
|j|_| ¡  |S )Nr   r   r"   r   r%   r'   )r   r   r)   Úcreate_volumer   r   ÚidÚ	volume_idr%   r'   r   Ú	zone_nameÚput)	r   r   Úgetterr   r   r   r"   Ú
ebs_volumeÚvr   r   r   Úcreate`   s"    


zVolume.createc                 C   sb   d }t j |¡}| |g¡}t|ƒdkr^|d }| ƒ }|j|_||_|jj|_	|j
|_| ¡  |S )Né   r   )r   r   Úconnect_to_regionÚget_all_volumesÚlenr3   r4   r   r   r   r   r5   r6   )r   r   r4   r   Zvolr   Úrsr9   r   r   r   Úcreate_from_volume_idt   s    
zVolume.create_from_volume_idNc                 C   s   |   ¡ d }|  |||¡S )Néÿÿÿÿ)Úget_snapshotsÚcreate_from_snapshot)r   r   r"   Úsnapshotr   r   r   Úcreate_from_latest_snapshotƒ   s    z"Volume.create_from_latest_snapshotc                 C   sž   || j k r| j }|  ¡ }| jd ks,| jdkrF| | jg¡d }|j| _| || j|¡}tƒ }| j|_|j	|_||_
| j|_| j|_| j|_| j|_| ¡  |S )NÚ r   )r"   Úget_ec2_connectionr5   r=   r4   r   r2   r-   r   r3   r   r%   r'   r   r6   )r   r   rD   r"   r   Zcurrent_volumer8   r9   r   r   r   rC   ‡   s"    
zVolume.create_from_snapshotc                 C   s8   | j r| j jS t| dƒr"| jd kr2tj | j¡| _| jS )Nr   )Úserverr   Úhasattrr   r<   r   ©r   r   r   r   rG   ›   s
    zVolume.get_ec2_connectionc                 C   s"   |   ¡ }| | jg¡}|d  ¡ S ©Nr   )rG   r=   r4   Úvolume_state©r   r   r?   r   r   r   Ú_volume_state¢   s    zVolume._volume_statec                 C   s"   |   ¡ }| | jg¡}|d  ¡ S rK   )rG   r=   r4   Úattachment_staterM   r   r   r   Ú_attachment_state§   s    zVolume._attachment_statec                 C   s2   t | dƒs,|  ¡ }| | jg¡}|d j| _| jS )NZ__sizer   )rI   rG   r=   r4   r"   Z_Volume__sizerM   r   r   r   Ú_size¬   s
    
zVolume._sizec                 C   s   | j r| j  d¡ d S )Nzxfsprogs xfsdump)rH   ÚinstallrJ   r   r   r   Úinstall_xfs³   s    zVolume.install_xfsc                 C   st   |   ¡ }| ¡ }| jg| j }g }|D ]8}|j|kr&|jdkr&tj |j¡|_	d|_
| |¡ q&|jdd„ d |S )zO
        Returns a list of all completed snapshots for this volume ID.
        z100%Tc                 S   s   t | j|jƒS ©N)ÚcmpÚdate)ÚxÚyr   r   r   Ú<lambda>Å   ó    z&Volume.get_snapshots.<locals>.<lambda>)rU   )rG   Zget_all_snapshotsr4   Úpast_volume_idsÚprogressr   ÚutilsZparse_tsÚ
start_timerV   ÚkeepÚappendÚsort)r   r   r?   Zall_volsÚsnapsrD   r   r   r   rB   ·   s    

zVolume.get_snapshotsc                 C   sJ   | j dkrtdƒ d S |r(|| _|  ¡  |  ¡ }| | j| jj| j¡ d S )NZattachedzalready attached)	rO   ÚprintrH   r6   rG   Zattach_volumer4   Úinstance_idr'   )r   rH   r   r   r   r   ÚattachÈ   s    
zVolume.attachFc                 C   s\   | j }|dks|d ks|dkr*tdƒ d S |  ¡ }| | j| jj| j|¡ d | _|  ¡  d S )NÚ	availableZ	detachingzalready detached)	rO   rc   rG   Zdetach_volumer4   rH   rd   r'   r6   )r   ÚforceÚstater   r   r   r   ÚdetachÒ   s    zVolume.detachc                 C   sX   | j d krtdƒ‚|r|}n
| j  ¡ }| d| j ¡}|sB| ¡  |d  d¡rTdS dS )Nú0server attribute must be set to run this commandzxfs_check %sr;   zbad superblock magic number 0FT)rH   Ú
ValueErrorÚget_cmdshellÚrunr'   ÚcloseÚ
startswith)r   Zuse_cmdÚcmdÚstatusr   r   r   ÚcheckfsÜ   s    

zVolume.checkfsc              	   C   sd   | j d krtdƒ‚t| j  ¡ ƒ:}| j  ¡ }| | j¡sVtj d| j ¡ t	 
d¡ q,W 5 Q R X d S )Nrj   z+%s still does not exist, waiting 10 secondsé
   )rH   rk   r   rl   Úexistsr'   r   ÚlogÚinfoÚtimeÚsleep)r   rp   r   r   r   Úwaitë   s    

zVolume.waitc              	   C   sZ   | j d krtdƒ‚d }t| j  ¡ ƒ,}|  |¡sLtj d¡ | d| j	 ¡}W 5 Q R X |S )Nrj   z
make_fs...zmkfs -t xfs %s)
rH   rk   r   rl   rr   r   ru   rv   rm   r'   )r   rq   rp   r   r   r   Úformatõ   s    

zVolume.formatc              	   C   s  | j d krtdƒ‚tj d¡ t| j  ¡ ƒæ}| j  ¡ }| | j¡sbtj d¡ | 	d| j ¡ n†tj d¡ | 	d¡}|d  
d¡}|D ]\}| 
¡ }|rŠ|d	 | jkrŠ|d
 | jkrŠ| 	d| j ¡ | 	d|d
  ¡ | 	d¡  qèqŠ| 	d| j| jf ¡ | 	d| j ¡ W 5 Q R X d S )Nrj   Zhandle_mount_pointzmaking directoryzmkdir %szdirectory exists alreadyzmount -lr;   Ú
é   r   z	umount %szmount %s /tmpzchmod 777 /tmpzmount %s %szxfs_growfs %s)rH   rk   r   ru   rv   r   rl   Úisdirr%   rm   Úsplitr'   )r   rp   rq   ÚlinesÚlineÚtr   r   r   Úmountÿ   s*    



zVolume.mountc                 C   s:   || _ |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S rT   )rH   r6   rS   re   ry   rz   r‚   )r   rH   r   r   r   Ú
make_ready  s    zVolume.make_readyc                 C   s   | j r| j  d| j ¡S d S )Nz/usr/sbin/xfs_freeze -f %s©rH   rm   r%   rJ   r   r   r   Úfreeze$  s    zVolume.freezec                 C   s   | j r| j  d| j ¡S d S )Nz/usr/sbin/xfs_freeze -u %sr„   rJ   r   r   r   Úunfreeze(  s    zVolume.unfreezec              	   C   sž   d z„zN|  ¡  | jd kr*|  ¡  | j¡}n| jj | j¡}tj 	d| j
|f ¡ W n0 tk
r‚   tj 	d¡ tj 	t ¡ ¡ Y nX W 5 |   ¡ }|£  S X  )Nz!Snapshot of Volume %s created: %szSnapshot error)r†   r…   rH   rG   Zcreate_snapshotr4   r   r   ru   rv   r   Ú	ExceptionÚ	tracebackÚ
format_exc)r   rq   rD   r   r   r   rD   ,  s    
zVolume.snapshotc                 C   sx   g }|D ]j}|r4|r4|j |krr|j |krr| |¡ q|rN|j |krr| |¡ q|rh|j |krr| |¡ q| |¡ q|S rT   )rV   r`   )r   rb   Z
start_dateÚend_dateÚlÚsnapr   r   r   Úget_snapshot_range=  s    

zVolume.get_snapshot_rangec                 C   s  |   ¡ }t|ƒdkr|S |dd… }tj |d jj¡}tj|j|j|j|jd}tj	ddd}t
|| |ƒ |  ||| |¡}t
|ƒ |s|S d	}|D ]$}|r´||jjkr´d
|_q˜|jj}q˜|rð|d j}	|	 ¡ dkrðtj	|	 ¡ d}
|	|
 }	|  ||	|d j¡}t|ƒdkr,|dd	… D ]}d
|_qtddƒD ]H}|  ||	| |	¡}t|ƒdkrt|dd	… D ]}d
|_qf|	| }	q6| j||	d}d	}|D ]*}|r¶||jjkr¶d
|_n|jj}q–|rþ|D ]0}|jsÌtj d||j| jf ¡ | ¡  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.

        r|   r;   rA   r   )ÚyearÚmonthÚdayÚtzinfoé   i  )ÚdaysÚsecondsNF)r“   é   )rŠ   zDeleting %s(%s) for %s)rB   r>   ÚdatetimeÚnowrV   r‘   rŽ   r   r   Ú	timedeltarc   r   r_   ÚweekdayÚranger   ru   rv   r   Údelete)r   r›   rb   r—   ZmidnightZone_weekZprevious_weekZcurrent_dayrŒ   Zweek_boundaryÚdeltaZpartial_weekÚiZweeks_worthÚ	remainderZcurrent_monthr   r   r   Útrim_snapshotsM  s^     ÿ



zVolume.trim_snapshotsc                 C   s   d S rT   r   )r   r"   r   r   r   Úgrow  s    zVolume.growc                 C   s   d S rT   r   )r   rD   r   r   r   Úcopy“  s    zVolume.copyc                 C   s   d S rT   r   )r   rV   r   r   r   Úget_snapshot_from_date–  s    zVolume.get_snapshot_from_datec                    s2   |r |   ¡  |  ¡ }| | j¡ tt| ƒ ¡  d S rT   )ri   rG   Zdelete_volumer4   Úsuperr-   r›   )r   Zdelete_ebs_volumer   ©Ú	__class__r   r   r›   ™  s
    zVolume.deletec                 C   s   d S rT   r   rJ   r   r   r   Úarchive   s    zVolume.archive)N)N)N)F)N)NN)F)F)2r*   r+   r,   r   r   r   r5   r%   r'   r4   r   Ústrr[   r   r	   rH   r   rL   rO   Úintr"   Úclassmethodr:   r@   rE   rC   rG   rN   rP   rQ   rS   rB   re   ri   rr   ry   rz   r‚   rƒ   r…   r†   rD   r   rŸ   r    r¡   r¢   r›   r¦   Ú__classcell__r   r   r¤   r   r-   N   sf   


ÿ ÿ ÿ ÿ










	

Cr-   )Ú
__future__r   Zboto.sdb.db.modelr   Zboto.sdb.db.propertyr   r   r   r   r   Zboto.manage.serverr	   Zboto.manager
   Z
boto.utilsr   Zboto.ec2rw   rˆ   Ú
contextlibr   r–   Úobjectr   r-   r   r   r   r   Ú<module>   s   +