B
    è?F[¨?  ã               @   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   ú1lib/python3.7/site-packages/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   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   r   r   Úget_name0   s    zCommandLineGetter.get_namec             C   s*   |  dd ¡s&tddd}t  |¡|d< d S )NÚsizez	Size (GB))r   r   )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_point)r   r   r   r
   )r   r   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Údevice)r   r   r   r
   )r   r   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 Statez	Size (GB)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Úlenr0   r1   r   r   r   r   r2   r3   )r   r   r1   r   Zvolr   Úrsr6   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_connectionr2   r:   r1   r   r/   r*   r   r0   r   r"   r$   r   r3   )r   r   rA   r    r   Zcurrent_volumer5   r6   r   r   r   r@   ‡   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   r9   r   )r   r   r   r   rD   ›   s
    zVolume.get_ec2_connectionc             C   s"   |   ¡ }| | jg¡}|d  ¡ S )Nr   )rD   r:   r1   Úvolume_state)r   r   r<   r   r   r   Ú_volume_state¢   s    zVolume._volume_statec             C   s"   |   ¡ }| | jg¡}|d  ¡ S )Nr   )rD   r:   r1   Úattachment_state)r   r   r<   r   r   r   Ú_attachment_state§   s    zVolume._attachment_statec             C   s2   t | dƒs,|  ¡ }| | jg¡}|d j| _| jS )NZ__sizer   )rF   rD   r:   r1   r    Z_Volume__size)r   r   r<   r   r   r   Ú_size¬   s
    
zVolume._sizec             C   s   | j r| j  d¡ d S )Nzxfsprogs xfsdump)rE   Zinstall)r   r   r   r   Úinstall_xfs³   s    zVolume.install_xfsc             C   sx   |   ¡ }| ¡ }| jg| j }g }x@|D ]8}|j|kr(|jdkr(tj |j¡|_	d|_
| |¡ q(W |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>Å   s    z&Volume.get_snapshots.<locals>.<lambda>)rM   )rD   Zget_all_snapshotsr1   Úpast_volume_idsZprogressr   ZutilsZparse_tsZ
start_timerN   ÚkeepÚappendÚsort)r   r   r<   Zall_volsÚsnapsrA   r   r   r   r?   ·   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)	rI   ÚprintrE   r3   rD   Zattach_volumer1   Úinstance_idr$   )r   rE   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 )NZ	availableZ	detachingzalready detached)	rI   rW   rD   Zdetach_volumer1   rE   rX   r$   r3   )r   Z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 )Nz0server attribute must be set to run this commandzxfs_check %sr8   zbad superblock magic number 0FT)rE   Ú
ValueErrorÚget_cmdshellÚrunr$   ÚcloseÚ
startswith)r   Zuse_cmdÚcmdÚstatusr   r   r   ÚcheckfsÜ   s    

zVolume.checkfsc          	   C   sh   | j d krtdƒ‚t| j  ¡ ƒ>}| j  ¡ }x,| | j¡sXtj d| j ¡ t	 
d¡ q.W W d Q R X d S )Nz0server attribute must be set to run this commandz+%s still does not exist, waiting 10 secondsé
   )rE   r\   r   r]   Úexistsr$   r   ÚlogÚinfoÚtimeZsleep)r   ra   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 d Q R X |S )Nz0server attribute must be set to run this commandz
make_fs...zmkfs -t xfs %s)
rE   r\   r   r]   rc   r   rf   rg   r^   r$   )r   rb   ra   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¡}xb|D ]Z}| 
¡ }|rŒ|d	 | jkrŒ|d
 | jkrŒ| 	d| j ¡ | 	d|d
  ¡ | 	d¡ P qŒW | 	d| j| jf ¡ | 	d| j ¡ W d Q R X d S )Nz0server attribute must be set to run this commandZhandle_mount_pointzmaking directoryzmkdir %szdirectory exists alreadyzmount -lr8   Ú
é   r   z	umount %szmount %s /tmpzchmod 777 /tmpzmount %s %szxfs_growfs %s)rE   r\   r   rf   rg   r   r]   Úisdirr"   r^   Úsplitr$   )r   ra   rb   ÚlinesÚlineÚtr   r   r   Úmountÿ   s*    




zVolume.mountc             C   s:   || _ |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S )N)rE   r3   rL   rY   ri   rj   rr   )r   rE   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)rE   r^   r"   )r   r   r   r   Úfreeze$  s    zVolume.freezec             C   s   | j r| j  d| j ¡S d S )Nz/usr/sbin/xfs_freeze -u %s)rE   r^   r"   )r   r   r   r   Úunfreeze(  s    zVolume.unfreezec             C   s’   z„yN|   ¡  | 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 d |  ¡ }|S )Nz!Snapshot of Volume %s created: %szSnapshot error)rt   rE   rD   Zcreate_snapshotr1   r   r   rf   rg   r   Ú	ExceptionÚ	tracebackÚ
format_excru   )r   rA   rb   r   r   r   rA   ,  s    
zVolume.snapshotc             C   s|   g }xr|D ]j}|r6|r6|j |krt|j |krt| |¡ q
|rP|j |krt| |¡ q
|rj|j |krt| |¡ q
| |¡ q
W |S )N)rN   rT   )r   rV   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	}x,|D ]$}|r¶||jjkr¶d
|_qš|jj}qšW |rô|d j}	|	 ¡ dkrôtj	|	 ¡ d}
|	|
 }	|  ||	|d j¡}t|ƒdkr4x|dd	… D ]}d
|_q$W xZtddƒD ]L}|  ||	| |	¡}t|ƒdkr‚x|dd	… D ]}d
|_qrW |	| }	q@W | j||	d}d	}x2|D ]*}|rÈ||jjkrÈd
|_n|jj}q¨W |rx8|D ]0}|jsâtj d||j| jf ¡ | ¡  qâW |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.

        rl   r8   r>   r   )ÚyearÚmonthÚdayÚtzinfoé   i  )ÚdaysZsecondsNF)r‚   é   )ry   zDeleting %s(%s) for %s)r?   r;   ÚdatetimeÚnowrN   r€   r}   r~   r   Z	timedeltarW   r|   rS   ZweekdayÚranger   rf   rg   r   Údelete)r   r‡   rV   r…   ZmidnightZone_weekZprevious_weekZcurrent_dayr{   Zweek_boundaryZdeltaZpartial_weekÚiZweeks_worthZ	remainderZcurrent_monthr   r   r   Útrim_snapshotsM  sZ    



zVolume.trim_snapshotsc             C   s   d S )Nr   )r   r    r   r   r   Úgrow  s    zVolume.growc             C   s   d S )Nr   )r   rA   r   r   r   Úcopy“  s    zVolume.copyc             C   s   d S )Nr   )r   rN   r   r   r   Úget_snapshot_from_date–  s    zVolume.get_snapshot_from_datec                s2   |r |   ¡  |  ¡ }| | j¡ tt| ƒ ¡  d S )N)r[   rD   Zdelete_volumer1   Úsuperr*   r‡   )r   Zdelete_ebs_volumer   )Ú	__class__r   r   r‡   ™  s
    zVolume.deletec             C   s   d S )Nr   )r   r   r   r   Úarchive   s    zVolume.archive)N)N)N)F)N)NN)F)F)2r'   r(   r)   r   r   r   r2   r"   r$   r1   r   ÚstrrR   r   r	   rE   r   rG   rI   Úintr    Úclassmethodr7   r=   rB   r@   rD   rH   rJ   rK   rL   r?   rY   r[   rc   ri   rj   rr   rs   rt   ru   rA   r|   r‰   rŠ   r‹   rŒ   r‡   r   Ú__classcell__r   r   )rŽ   r   r*   N   sT   














	

Cr*   )Z
__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.ec2rh   rw   Ú
contextlibr   r„   Úobjectr   r*   r   r   r   r   Ú<module>   s   +