ó
ÍÿŠTc           @   sÒ   d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z y* d  d l m Z d  d l m Z e Z Wn e k
 r· e Z n Xd	 e f d
 „  ƒ  YZ d S(   iÿÿÿÿN(   t   threads(   t   Accumulator(   t   CoverageMonitor(   t   get_active_device_info(   t   MonitorPlugin(   t   Ring(   t   Scoutt
   SwiftUsagec           B   s’   e  Z d  Z d Z d Z d d e j d d „ Z d „  Z d „  Z e	 d	 „ Z
 e	 d
 „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sÅ   Plugin reporting Swift cluster usage.

    This only works if the client runs on a Swift node.  It requires the
    'python-swift' package to be installed (which is installed on swift nodes).

    s   swift-usaget   storagei   i<   s   /etc/swift/object.ring.gzc         C   sC   | |  _  | |  _ | |  _ | |  _ t |  _ g  |  _ t |  _ d  S(   N(	   t	   _intervalt   _monitor_intervalt   _create_timet   _swift_ringt	   has_swiftt
   _has_swiftt   _swift_usage_pointst   Truet   active(   t   selft   intervalt   monitor_intervalt   create_timet
   swift_ring(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyt   __init__   s    						c         C   sª   t  t |  ƒ j | ƒ t |  j |  j ƒ |  _ t |  j d d d |  j	 ƒ|  _
 |  j j j |  j |  j
 j ƒ |  j j j d |  j
 j d d ƒ|  j d |  j t ƒ d  S(   Ngš™™™™™é?s   Swift device usage snapshotR   t   stopt   priorityiÐ  s   swift-usage(   t   superR   t   registerR   t   _persistR	   t   _accumulateR   t   run_intervalR   t   _monitort   registryt   reactort
   call_everyR
   t   logt   call_ont   call_on_acceptedt   send_messageR   (   R   R    (    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR   +   s    "c         C   s.   |  j  } g  |  _  | r* i d d 6| d 6Sd  S(   Ns   swift-usaget   types   data-points(   R   (   R   t   usage_points(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyt   create_message7   s    		c         C   s8   |  j  ƒ  } | r4 |  j j j | |  j d | ƒn  d  S(   Nt   urgent(   R)   R    t   brokerR&   t   _session_id(   R   R*   t   message(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR&   =   s    c         C   s    |  j  j j d |  j | ƒ d  S(   Ns   swift-usage(   R    R+   t   call_if_acceptedR&   (   R   R*   (    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyt   exchangeC   s    c         C   sR   |  j  ƒ  s d  S|  j j ƒ  |  j ƒ  } t j |  j | ƒ } | j |  j ƒ | S(   N(	   t   _should_runR   t   pingt   _get_recon_hostR    t   deferToThreadt   _perform_recon_callt   addCallbackt   _handle_usage(   R   t   hostt   deferred(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyt   runG   s    c         C   sM   |  j  s t S|  j s0 t j d ƒ t |  _  t St j j |  j ƒ sI t St	 S(   s%   Return whether the plugin should run.sH   This machine does not appear to be a Swift machine. Deactivating plugin.(
   R   t   FalseR   t   loggingt   infot   ost   patht   existsR   R   (   R   (    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR0   R   s    			c         C   s[   |  j  ƒ  } t |  j ƒ } x9 | j D]. } | r% | d | k r% | d | d f Sq% Wd S(   s'   Return a tuple with Recon (host, port).t   ipt   portN(   t   _get_local_ipsR   R   t   devs(   R   t	   local_ipst   ringt   dev(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR2   e   s
    c         C   s   g  t  ƒ  D] } | d ^ q
 S(   s0   Return a list of IP addresses for local devices.t
   ip_address(   R   (   R   t   device(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyRB   m   s    c         C   sB   | s
 d St  d ƒ } | j | ƒ \ } } } | d k r> | Sd S(   s/   Get usage information from Swift Recon service.Nt	   diskusageiÈ   (   R   t   scout(   R   R7   RJ   t   _t
   disk_usaget   code(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR4   r   s    c         C   sM  t  |  j ƒ  ƒ } t ƒ  } xÎ | D]Æ } | d s8 q" n  | d } | j | ƒ g  } xD d D]< } d | | f } |  j | | | | ƒ }	 | j |	 ƒ q\ Wt | ƒ r" |	 d | g }
 |
 j d „  | Dƒ ƒ |  j j t	 |
 ƒ ƒ q" q" Wt |  j
 j d	 d ƒ ƒ } x& | | D] } |  j
 j d
 | ƒ qW|  j
 j d	 t | ƒ ƒ d  S(   Nt   mountedRH   t   sizet   availt   useds   usage.%s.%si    c         s   s   |  ] } t  | d  ƒ Vq d S(   i   N(   t   int(   t   .0t
   step_value(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pys	   <genexpr>“   s    t   devicess   usage.%s(   s   sizeRP   RQ   (    (   RR   R   t   sett   addR   t   appendt   allt   extendR   t   tupleR   t   gett   removet   list(   R   RL   t	   timestampRU   t   usageRH   t   step_valuest   keyt   persist_keyRT   t   pointt   current_devices(    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR6   }   s*    	

i  (   t   __name__t
   __module__t   __doc__t   persist_namet   scopet   timeR   R   R)   R:   R&   R/   R9   R0   R2   RB   R4   R6   (    (    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyR      s    
							(   R;   Rk   R=   t   twisted.internetR    t   landscape.accumulateR   t   landscape.lib.monitorR   t   landscape.lib.networkR   t   landscape.monitor.pluginR   t   swift.common.ringR   t   swift.cli.reconR   R   R   t   ImportErrorR:   R   (    (    (    s@   /usr/lib/python2.7/dist-packages/landscape/monitor/swiftusage.pyt   <module>   s   

