o
    ȷe?                     @   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   s6   | dd s| jd}tj |tjjd|d< d S d S )Nregionregion_name)choices)getclsfind_propertyr
   botoec2regionsselfparamsprop r   I/var/www/ideatree/venv/lib/python3.10/site-packages/boto/manage/volume.py
get_region%   s   zCommandLineGetter.get_regionc                 C   s4   | dd stdd| jjd}t ||d< d S d S )NzonezEC2 Availability Zone)nameverbose_namer   )r   r   r   get_all_zonesr
   r   r   r   r   get_zone*   s   zCommandLineGetter.get_zonec                 C   .   | dd s| jd}t ||d< d S d S )Nr   r   r   r   r
   r   r   r   r   get_name0      zCommandLineGetter.get_namec                 C   s.   | dd stddd}t ||d< d S d S )Nsize	Size (GB))r   r   )r   r   r
   r   r   r   r   get_size5   r%   zCommandLineGetter.get_sizec                 C   r"   )Nmount_pointr#   r   r   r   r   get_mount_point:   r%   z!CommandLineGetter.get_mount_pointc                 C   r"   )Ndevicer#   r   r   r   r   
get_device?   r%   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dMddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdMd*d+Z dNd-d.Z!dMd/d0Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)dOd?d@Z*dNdAdBZ+dCdD Z,dEdF Z-dGdH Z.dN fdIdJ	Z/dKdL Z0  Z1S )PVolumeTName)requireduniquer   z
EC2 Region)r3   r   zEC2 ZonezMount Point)r   zDevice Namez/dev/sdp)r   default)r3   )	item_typevolumeszServer Attached To)collection_namer   zVolume State)r   calculated_type
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lenr<   r=   r   r   r   r   r>   r?   )r   r   r=   r   volr   rsrB   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 u s| jdkr#|| jgd }|j| _||| j|}t }| j|_|j	|_||_
| j|_| j|_| j|_| j|_|  |S )N r   )r&   get_ec2_connectionr>   rF   r=   r   r;   r1   r   r<   r   r)   r+   r   r?   )r   r   rN   r&   r   current_volumerA   rB   r   r   r   rM      s"   
zVolume.create_from_snapshotc                 C   s8   | j r| j jS t| dr| jd u rtj| j| _| jS )Nr   )serverr   hasattrr   rE   r   r   r   r   r   rQ      s
   zVolume.get_ec2_connectionc                 C   "   |   }|| jg}|d  S Nr   )rQ   rF   r=   volume_stater   r   rI   r   r   r   _volume_state      zVolume._volume_statec                 C   rV   rW   )rQ   rF   r=   attachment_staterY   r   r   r   _attachment_state   r[   zVolume._attachment_statec                 C   s2   t | ds|  }|| jg}|d j| _| jS )N__sizer   )rT   rQ   rF   r=   r&   _Volume__sizerY   r   r   r   _size   s
   
zVolume._sizec                 C   s   | j r| j d d S d S )Nzxfsprogs xfsdump)rS   installrU   r   r   r   install_xfs   s   zVolume.install_xfsc                 C   st   |   }| }| jg| j }g }|D ]}|j|v 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>   s    z&Volume.get_snapshots.<locals>.<lambda>)rd   )rQ   get_all_snapshotsr=   past_volume_idsprogressr   utilsparse_ts
start_timere   keepappendsort)r   r   rI   all_volssnapsrN   r   r   r   rL      s   


zVolume.get_snapshotsc                 C   sJ   | j dkrtd d S |r|| _|   |  }|| j| jj| j d S )Nattachedzalready attached)	r\   printrS   r?   rQ   attach_volumer=   instance_idr+   )r   rS   r   r   r   r   attach   s   
zVolume.attachFc                 C   s\   | j }|dks|d u s|dkrtd d S |  }|| j| jj| j| d | _|   d S )N	available	detachingzalready detached)	r\   ru   rQ   detach_volumer=   rS   rw   r+   r?   )r   forcestater   r   r   r   detach   s   zVolume.detachc                 C   sX   | j d u r	td|r|}n| j  }|d| j }|s!|  |d dr*dS dS )N0server attribute must be set to run this commandzxfs_check %srD   zbad superblock magic number 0FT)rS   
ValueErrorget_cmdshellrunr+   close
startswith)r   use_cmdcmdstatusr   r   r   checkfs   s   

zVolume.checkfsc                 C   s   | j d u r	tdt| j  0}| j  }|| js8tjd| j  t	
d || jrW d    d S W d    d S 1 sCw   Y  d S )Nr   z+%s still does not exist, waiting 10 seconds
   )rS   r   r   r   existsr+   r   loginfotimesleep)r   r   r   r   r   wait   s   


"zVolume.waitc                 C   s   | j d u r	tdd }t| j  $}| |s.tjd |d| j	 }W d    |S W d    |S 1 s9w   Y  |S )Nr   z
make_fs...zmkfs -t xfs %s)
rS   r   r   r   r   r   r   r   r   r+   )r   r   r   r   r   r   format   s   



zVolume.formatc                 C   s2  | j d u r	tdtjd t| j  y}| j  }|| js1tjd |	d| j  nCtjd |	d}|d 
d}|D ].}|
 }|rs|d	 | jkrs|d
 | jkrs|	d| j  |	d|d
   |	d  nqE|	d| j| jf  |	d| j  W d    d S 1 sw   Y  d S )Nr   handle_mount_pointzmaking directoryzmkdir %szdirectory exists alreadyzmount -lrD   
   r   z	umount %szmount %s /tmpzchmod 777 /tmpzmount %s %szxfs_growfs %s)rS   r   r   r   r   r   r   isdirr)   r   splitr+   )r   r   r   lineslinetr   r   r   mount   s.   



"zVolume.mountc                 C   s:   || _ |   |   |   |   |   |   d S rc   )rS   r?   rb   rx   r   r   r   )r   rS   r   r   r   
make_ready  s   zVolume.make_readyc                 C      | j r| j d| j S d S )Nz/usr/sbin/xfs_freeze -f %srS   r   r)   rU   r   r   r   freeze$     zVolume.freezec                 C   r   )Nz/usr/sbin/xfs_freeze -u %sr   rU   r   r   r   unfreeze(  r   zVolume.unfreezec                 C   s   zMz'|    | jd u r|  | j}n| jj| j}tjd| j	|f  W n t
y?   tjd tjt  Y nw W |  }|S W |  }|S |  }|     Y S )Nz!Snapshot of Volume %s created: %szSnapshot error)r   rS   rQ   create_snapshotr=   r   r   r   r   r   	Exception	traceback
format_excr   )r   rN   r   r   r   r   rN   ,  s$   
zVolume.snapshotc                 C   sx   g }|D ]5}|r|r|j |kr|j |kr|| q|r'|j |kr&|| q|r4|j |kr3|| q|| q|S rc   )re   rp   )r   rs   
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
| |sH|S d	}|D ]}|rZ||jjkrZd
|_qL|jj}qL|rx|d j}	|	 dkrxtj	|	 d}
|	|
 }	| ||	|d j}t|dkr|dd	 D ]}d
|_qtddD ]!}| ||	| |	}t|dkr|dd	 D ]}d
|_q|	| }	q| j||	d}d	}|D ]}|r||jjkrd
|_q|jj}q|r|D ]}|jst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   rD   rK   r   )yearmonthdaytzinfo   i  )dayssecondsNF)r      )r   zDeleting %s(%s) for %s)rL   rG   datetimenowre   r   r   r   r   	timedeltaru   r   ro   weekdayranger   r   r   r   delete)r   r   rs   r   midnightone_weekprevious_weekcurrent_dayr   week_boundarydeltapartial_weekiweeks_worth	remaindercurrent_monthr   r   r   trim_snapshotsM  s^   



zVolume.trim_snapshotsc                 C      d S rc   r   )r   r&   r   r   r   grow     zVolume.growc                 C   r   rc   r   )r   rN   r   r   r   copy  r   zVolume.copyc                 C   r   rc   r   )r   re   r   r   r   get_snapshot_from_date  r   zVolume.get_snapshot_from_datec                    s2   |r|    |  }|| j tt|   d S rc   )r~   rQ   delete_volumer=   superr1   r   )r   delete_ebs_volumer   	__class__r   r   r     s
   zVolume.deletec                 C   r   rc   r   rU   r   r   r   archive  s   zVolume.archiverc   )F)NN)2r.   r/   r0   r   r   r   r>   r)   r+   r=   r   strrj   r   r	   rS   r   rX   r\   intr&   classmethodrC   rJ   rO   rM   rQ   rZ   r]   r`   rb   rL   rx   r~   r   r   r   r   r   r   r   rN   r   r   r   r   r   r   r   __classcell__r   r   r   r   r1   N   sb    













	

Cr1   )
__future__r   boto.sdb.db.modelr   boto.sdb.db.propertyr   r   r   r   r   boto.manage.serverr	   boto.manager
   
boto.utilsr   boto.ec2r   r   
contextlibr   r   objectr   r1   r   r   r   r   <module>   s   +