
?F[c           @   sI  d  Z  d d l Z d d l m Z d d l m Z m Z d d l m	 Z	 d d l
 m Z m Z m Z m Z d d l m Z d d l m Z d d	 l m Z d d l Z d d l Z d d
 l m Z d d l m Z d d l m Z m Z d d d d d d d g Z d e f d     YZ  d e f d     YZ! d e	 f d     YZ" d S(   s)   
High-level abstraction of an EC2 server
iN(   t   IObject(   t   BotoConfigPatht   Config(   t   Model(   t   StringPropertyt   IntegerPropertyt   BooleanPropertyt   CalculatedProperty(   t   propget(   t   Zone(   t   KeyPair(   t   closing(   t   EC2ResponseError(   t   sixt   StringIOs   m1.smalls   m1.larges	   m1.xlarges	   c1.mediums	   c1.xlarges
   m2.2xlarges
   m2.4xlarget   Bundlerc        	   B   sP   e  Z d  d  Z d   Z d   Z d   Z d d d d d d d e d  Z RS(   t   rootc         C   s;   d d l  m } | |  _ | |  _ | | d | |  _ d  S(   Ni(   t	   SSHClientt   uname(   t   boto.manage.cmdshellR   t   serverR   t
   ssh_client(   t   selfR   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   __init__-   s    		c         C   s   d GH|  j  j   t j j |  \ } } d | |  _ |  j  j | |  j  t j j |  \ } } d | |  _ |  j  j | |  j  d GHd  S(   Ns5   	copying cert and pk over to /mnt directory on servers   /mnt/%ss   ...complete!(   R   t	   open_sftpt   ost   patht   splitt   remote_key_filet   put_filet   remote_cert_file(   R   t   key_filet	   cert_fileR   t   name(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt	   copy_x5093   s    c         C   s   d } |  j  d k r d } n  | d 7} | d |  j |  j f 7} | d |  j j j 7} | d | 7} | d | 7} | d	 7} |  j j d
 k s |  j j d k r | d 7} n
 | d 7} | S(   Nt    R   s   sudo s   ec2-bundle-vol s   -c %s -k %s s   -u %s s   -p %s s   -s %d s   -d /mnt s   m1.smalls	   c1.mediums   -r i386s	   -r x86_64(   R   R   R   R   t   _reservationt   owner_idt   instance_type(   R   t   prefixt   sizet   ssh_keyt   command(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   bundle_image>   s    	

$
c         C   sv   d } |  j  d k r d } n  | d 7} | d | 7} | d | 7} | d |  j j j 7} | d |  j j j 7} | S(	   NR#   R   s   sudo s   ec2-upload-bundle s   -m /mnt/%s.manifest.xml s   -b %s s   -a %s s   -s %s (   R   R   t   ec2t   aws_access_key_idt   aws_secret_access_key(   R   t   bucketR'   R)   R*   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   upload_bundleN   s    	
c	         C   s  t    }	 | s! |	 j d  } n  | s9 |	 j d  } n  | sQ |	 j d  } n  | si |	 j d  } n  | s |	 j d  } n  | s |  j j   } n  |  j | |  | s t   } n  | j d t	  | j d  | r | j d  n  | j |  j
 | | |   | j d	  | j |  j | | |   | j d	  | j d
 t	  | j d  | j   }
 d GH|
 GH|  j j |
  } d | d GHd | d GHd GHd GH|  j j j d | d d | | f  |  _ |  j S(   Ns   Name of S3 buckets   Prefix for AMI files   Path to RSA private key files   Path to RSA public cert files   Size (in MB) of bundled images   sudo mv %s /mnt/boto.cfg; s0   mv ~/.ssh/authorized_keys /mnt/authorized_keys; s   history -c; s   ; s   sudo mv /mnt/boto.cfg %s; s.   mv /mnt/authorized_keys ~/.ssh/authorized_keyss3   running the following command on the remote server:s   	%si    i   s   ...complete!s   registering image...R!   t   image_locations   %s/%s.manifest.xml(   R    t
   get_stringt   get_filenamet   get_intR   t   get_ssh_key_fileR"   R   t   writeR   R+   R0   t   getvalueR   t   runR,   t   register_imaget   image_id(   R   R/   R'   R   R    R(   R)   t   fpt   clear_historyt   iobjectR*   t   t(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   bundleY   sH    	+N(	   t   __name__t
   __module__R   R"   R+   R0   t   Nonet   TrueR?   (    (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR   +   s   			t   CommandLineGetterc           B   sk   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	   Z d
   Z RS(   c         C   sU   g  } xH |  j  j   D]7 } | j j d  d k r | j | j | f  q q W| S(   Nt   pyamii    (   R,   t   get_all_imagest   locationt   findt   append(   R   t   my_amist   ami(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_ami_list   s
    c         C   s   | j  d d   } t | t  r@ t j j |  } | | d <n  | sz |  j j d  } t	 j  | d t j j
 | d <n  | d j   |  _ d  S(   Nt   regiont   region_namet   choices(   t   getRB   t
   isinstancet
   basestringt   botoR,   t
   get_regiont   clst   find_propertyR   t   regionst   connect(   R   t   paramsRM   t   prop(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyRT      s    "c         C   s>   | j  d d   s: |  j j d  } t j  |  | d <n  d  S(   NR!   (   RP   RB   RU   RV   R   (   R   RY   RZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_name   s    c         C   s>   | j  d d   s: |  j j d  } t j  |  | d <n  d  S(   Nt   description(   RP   RB   RU   RV   R   (   R   RY   RZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_description   s    c         C   sG   | j  d d   sC t d d d d d t  } t j  |  | d <n  d  S(   NR&   R!   t   verbose_names   Instance TypeRO   (   RP   RB   R   t   InstanceTypesR   (   R   RY   RZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_instance_type   s    	c         C   sA   | j  d d   s= t d d d d  } t j  |  | d <n  d  S(   Nt   quantityR!   R^   s   Number of Instances(   RP   RB   R   R   (   R   RY   RZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_quantity   s    c         C   sM   | j  d d   sI t d d d d d |  j j  } t j  |  | d <n  d  S(   Nt   zoneR!   R^   s   EC2 Availability ZoneRO   (   RP   RB   R   R,   t   get_all_zonesR   (   R   RY   RZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_zone   s    c         C   s   t  } x | s | j d d   } | sN t d d d d  } t j |  } n  yB |  j j | g  } t |  d k r t } | d | d <n  Wq	 t	 k
 r q	 Xq	 Wd  S(   NRK   R!   R^   t   AMIi   i    (
   t   FalseRP   RB   R   R   R,   RF   t   lenRC   R   (   R   RY   t   validRK   RZ   t   rs(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt
   get_ami_id   s    	c         C   s   | j  d d   } t | t  rf |  j j   } x3 | D]( } | j | k r7 | } | | d <q7 q7 Wn  | s t d d d d d |  j j  } t j  |  | d <n  d  S(   Nt   groupR!   R^   s   EC2 Security GroupRO   (	   RP   RB   RQ   RR   R,   t   get_all_security_groupsR!   R   R   (   R   RY   Rl   t
   group_listt   gRZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt	   get_group   s    c         C   s   | j  d d   } t | t  rl |  j j   } x9 | D]. } | j | k r7 | j } | j | d <q7 q7 Wn  | s t d d d d d |  j j  } t j  |  j | d <n  d  S(   Nt   keypairR!   R^   s   EC2 KeyPairRO   (	   RP   RB   RQ   RR   R,   t   get_all_key_pairsR!   R   R   (   R   RY   Rq   t   key_listt   kRZ   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_key   s    	c         C   s   | |  _  |  j |  | d j   |  _ |  j |  |  j |  |  j |  |  j |  |  j |  |  j	 |  |  j
 |  |  j |  d  S(   NRM   (   RU   RT   RX   R,   R[   R]   R`   Re   Rb   Rk   Rp   Ru   (   R   RU   RY   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyRP      s    	(   R@   RA   RL   RT   R[   R]   R`   Rb   Re   Rk   Rp   Ru   RP   (    (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyRD      s   		
								t   Serverc           B   s  e  Z e d  e d d  Z e d d  Z e d d  Z e d d  Z e d d  Z e	 d d d e
  Z e d d	 d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z e d d d
 e d e  Z g  Z g  Z e d    Z e d5 d5 d5 d   Z  e d d   Z! e d    Z" d5 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(   Z0 d)   Z1 d*   Z2 d+   Z3 d,   Z4 d-   Z5 d.   Z6 d/   Z7 d0   Z8 d1 d2  Z9 d1 d5 d3  Z: d4   Z; RS(6   t   uniqueR^   t   Namet   Descriptions   EC2 Region Names   EC2 Instance IDs   EC2 Elastic IP Addresss   Is This Server Productiont   defaults   AMI IDt   calculated_typet
   use_methods   Availability Zone Names   Public DNS Names   Private DNS Names   Security Groupss   Primary Security Group Names   Key Names   Instance Types   Current Statuss   Server Launch Times   Console Outputc         C   s   | j  d  s | j d  n  | j d d |  | j d d |  | j  d  sd | j d  n  | j d d d  | j d d |  j j j  d  S(   Nt   CredentialsR-   R.   t	   DB_Servert   db_typet   SimpleDBt   db_name(   t   has_sectiont   add_sectiont   sett   _managert   domainR!   (   RU   t   cfgR-   R.   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   add_credentials  s    c         K   s  | r t  d |  } n  | j d  ri x? | j d  D]+ } | | k r7 | j d |  | | <q7 q7 Wn  t   } | j |  |  | j d  } | j   } |  j | | j | j  | j d  }	 | j d  }
 | j d  } | j d  } | d k r| j
 d d	 | j  n  t   } | j |  t | t  rH| j } n  t |
 t  rc|
 j }
 n  |	 j d
 d d | j d d  d |
 d | g d | j d  d | d | j    } g  } d } | j d  } | j } | d k	 rT| j   d k rT| d } d GHt j d  x# | j   d k r:t j d  qW| j |  d | GHn  x | D] } |    } | | _ | d k r| j d  d n	 t |  | _ | j d  | _ | j | _ | j | _ | r| d k r| | _ n  | j    | j! |  | d 7} q[W| S(   sq  
        Create a new instance based on the specified configuration file or the specified
        configuration and the passed in parameters.

        If the config_file argument is not None, the configuration is read from there.
        Otherwise, the cfg argument is used.

        The config file may include other config files with a #import reference. The included
        config files must reside in the same directory as the specified file.

        The logical_volume argument, if supplied, will be used to get the current physical
        volume ID and use that as an override of the value specified in the config file. This
        may be useful for debugging purposes when you want to debug with a production config
        file but a test Volume.

        The dictionary argument may be used to override any EC2 configuration values in the
        config file.
        R   t   EC2RM   RK   Rq   Rl   Rc   t   EBSt   logical_volume_namet	   min_counti   t	   max_countRa   t   key_namet   security_groupsR&   t	   placementt	   user_datai    t
   elastic_ipsE   Waiting for instance to start so we can set its elastic IP address...i   t   runnings.   set the elastic IP of the first instance to %sR!   R#   R\   N("   R   R   t   optionsRP   RD   RX   R   R-   R.   RB   R   R!   R   R6   RQ   R	   R
   R8   R7   t	   instancest   __len__t   timet   sleept   updatet   use_ipR,   t   strR\   RN   t   idt   instance_idR   t   putRI   (   RU   t   config_filet   logical_volumeR   RY   t   optiont   getterRM   R,   RK   t   kpRl   Rc   t   cfg_fpt   reservationt   lt   iR   R   t   instancet   s(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   create  sn     				
		.
R#   c   
      C   s   t  j j   } x | D] } | j   } y | j | g  } Wn g  } n Xt |  d k r |    } | | _ | | _ | | _ | j | _ | | _	 | d | _
 x/ | j
 j D]! }	 |	 j | k r |	 | _ q q W| j   | Sq Wd  S(   Ni   i    (   RS   R,   RW   RX   t   get_all_reservationsRh   R!   R\   RN   R   R$   R   R   t	   _instanceR   RB   (
   RU   R   R!   R\   RW   RM   R,   Rj   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   create_from_instance_id^  s*    
					
c   	      C   s  g  } t  j j   } x | D] } | j   } | j   } x | D] } x | j D] } y4 t t j d | j	   t  j
 j d | j	  WqQ t k
 r |    } | | _ | j	 | _ | j | _ | j	 | _ | | _ | j   | j |  qQ XqQ WqA Wq W| S(   NR   s   Server for %s already exists(   RS   R,   RW   RX   R   R   t   nextRv   RH   R   t   logt   infot   StopIterationR!   RN   R   R$   R   RI   (	   RU   t   serversRW   RM   R,   Rj   R   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   create_from_current_instancesv  s(    			
c         K   sT   t  t |   j | |  d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ |  j	   d  S(   N(
   t   superRv   R   RB   t   ssh_key_fileR,   t	   _cmdshellR$   R   t
   _setup_ec2(   R   R   t   kw(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    					c         C   s  |  j  r |  j r |  j r d  S|  j r|  j rx t j  j   D] } | j |  j k rA | j   |  _  |  j	 r	|  j r	yt |  j  j
 |  j	 g  } t |  d k r xC | d j D]1 } | j |  j	 k r | d |  _ | |  _ q q Wn  Wqt k
 rqXq	qA qA Wqn  d  S(   Ni   i    (   R,   R   R$   R   RN   RS   RW   R!   RX   R   R   Rh   R   R   (   R   RM   Rj   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s"    		c         C   s/   d } |  j  r+ |  j  j   |  j  j } n  | S(   NR#   (   R   R   t   state(   R   t   status(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _status  s
    	c         C   s"   d } |  j  r |  j  j } n  | S(   NR#   (   R   t   public_dns_name(   R   t   hostname(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt	   _hostname  s    	c         C   s"   d } |  j  r |  j  j } n  | S(   NR#   (   R   t   private_dns_name(   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _private_hostname  s    	c         C   s"   d } |  j  r |  j  j } n  | S(   NR#   (   R   R&   (   R   t   it(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _instance_type  s    	c         C   s"   d } |  j  r |  j  j } n  | S(   NR#   (   R   t   launch_time(   R   t   lt(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _launch_time  s    	c         C   s%   d } |  j  r! |  j  j   } n  | S(   NR#   (   R   t   get_console_output(   R   t   co(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _console_output  s    	c         C   s"   g  } |  j  r |  j  j } n  | S(   N(   R$   t   groups(   R   t   gn(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _groups  s    	c         C   s-   |  j    } t |  d k r) | d j Sd S(   Ni   i    R#   (   R   Rh   R   (   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _security_group  s    c         C   s"   d  } |  j r |  j j } n  | S(   N(   RB   R   R   (   R   Rc   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   _zone  s    	c         C   s"   d  } |  j r |  j j } n  | S(   N(   RB   R   R   (   R   t   kn(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt	   _key_name  s    	c         C   s!   t  t |   j   |  j   d  S(   N(   R   Rv   R   R   (   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    c         C   s/   |  j  r t d   n  t t |   j   d  S(   Ns    Can't delete a production server(   t
   productiont
   ValueErrorR   Rv   t   delete(   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    	c         C   s5   |  j  r t d   n  |  j r1 |  j j   n  d  S(   Ns    Can't delete a production server(   R   R   R   t   stop(   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    		c         C   s5   |  j  r t d   n  |  j r1 |  j j   n  d  S(   Ns    Can't delete a production server(   R   R   R   t	   terminate(   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    		c         C   s   |  j  r |  j  j   n  d  S(   N(   R   t   reboot(   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR     s    	c         C   s'   x  |  j  d k r" t j d  q Wd  S(   NR   i   (   R   R   R   (   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   wait   s    c         C   s   |  j  s t j j d  } t j j |  rj t j j | d |  j  } t j j |  rj | |  _  qj n  |  j  s t   } | j	 d  |  _  q n  |  j  S(   Ns   ~/.sshs   %s.pems   Path to OpenSSH Key file(
   R   R   R   t
   expandusert   isdirt   joinR   t   isfileR    R3   (   R   t   ssh_dirt   ssh_fileR=   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR5     s    			c         C   s?   |  j  s8 d d l m } |  j   | j |   |  _  n  |  j  S(   Ni(   t   cmdshell(   R   t   boto.manageR   R5   t   start(   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_cmdshell  s
    	
c         C   s   d  |  _ d  S(   N(   RB   R   (   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   reset_cmdshell  s    c         C   s.   t  |  j     } | j |  } Wd  QX| S(   N(   R   R   R8   (   R   R*   t   cmdR   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyR8     s    R   c         C   s   |  j    t |  |  S(   N(   R5   R   (   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_bundler  s    
c         C   s0   d d l  m } |  j   | |  d | d | S(   Ni(   R   R   t   ssh_pwd(   R   R   R5   (   R   R   R   R   (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   get_ssh_client#  s    
c         C   s   |  j  d |  S(   Ns   apt-get -y install %s(   R8   (   R   t   pkg(    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   install(  s    N(<   R@   RA   R   RC   R!   R\   RN   R   R   R   Rg   R   R   R   t   ami_idRc   R   t   private_hostnamet   listR   t   security_groupR   R&   R   R   t   opent   console_outputt   packagest   pluginst   classmethodR   RB   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R5   R   R   R8   R   R   R   (    (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyRv      sd   P																						(#   t   __doc__t   boto.ec2RS   t   boto.mashups.iobjectR    t   boto.pyami.configR   R   t   boto.sdb.db.modelR   t   boto.sdb.db.propertyR   R   R   R   R   R   t   boto.ec2.zoneR	   t   boto.ec2.keypairR
   R   R   t
   contextlibR   t   boto.exceptionR   t   boto.compatR   R   R_   t   objectR   RD   Rv   (    (    (    s1   lib/python2.7/site-packages/boto/manage/server.pyt   <module>   s$   "	Ue