o
    va                     @   s   d 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
 ddlmZ dd	lmZ dd
lmZ ddlmZ G dd deZdS )z!Cassandra/Scylla interface class.    N)datetime)Number)logger)GlancesExport)	iteritems)PlainTextAuthProvider)Cluster)uuid_from_time)InvalidRequestc                       s>   e Zd ZdZd fdd	Zdd Zdd Z fd	d
Z  ZS )Exportz6This class manages the Cassandra/Scylla export module.Nc                    sv   t t| j||d d| _d| _d| _d| _d| _d| _| j	dg dg dd| _
| j
s1td |  \| _| _dS )	zInit the Cassandra export IF.)configargsN      	cassandra)hostportkeyspace)protocol_versionreplication_factortableusernamepassword)Zmandatoriesoptions)superr   __init__r   r   r   r   r   r   Z	load_confexport_enablesysexitinitclustersession)selfr   r   	__class__ C/usr/lib/python3/dist-packages/glances/exports/glances_cassandra.pyr   (   s   
zExport.__init__c              
   C   s`  | j sdS t| j| jd}zt| jgt| jt| j|d}|	 }W n# t
yF } ztd| j| j|f  td W Y d}~nd}~ww z|| j W n. ty} } z"td| j d| j| jf }|| || j W Y d}~nd}~ww td|jj|j | j z|d	| j  W ||fS  t
y   td
| j  Y ||fS w )z,Init the connection to the Cassandra server.N)r   r   )r   r   auth_providerz0Cannot connect to Cassandra cluster '%s:%s' (%s)r   z+Create keyspace {} on the Cassandra clusterz_CREATE KEYSPACE %s WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': '%s' }zBStats will be exported to Cassandra cluster {} ({}) in keyspace {}zCREATE TABLE %s (plugin text, time timeuuid, stat map<text,float>, PRIMARY KEY (plugin, time)) WITH CLUSTERING ORDER BY (time DESC)z Cassandra table %s already exist)r   r   r   r   r   r   intr   r   Zconnect	Exceptionr   Zcriticalr   r   Zset_keyspacer   r
   infoformatr   executeZmetadataZcluster_nameZ	all_hostsr   debug)r"   r'   r    r!   ecr%   r%   r&   r   D   sL   
zExport.initc              
   C   s   t d| dd tt|| D }zd| j}| j|}| j	||t
t |f W dS  tyO } zt d|| W Y d}~dS d}~ww )z*Write the points to the Cassandra cluster.zExport {} stats to Cassandrac                 S   s$   i | ]\}}t |tr|t|qS r%   )
isinstancer   float).0kvr%   r%   r&   
<dictcomp>r   s   $ z!Export.export.<locals>.<dictcomp>z4INSERT INTO {} (plugin, time, stat) VALUES (?, ?, ?)z(Cannot export {} stats to Cassandra ({})N)r   r-   r+   dictzipr   r   r!   Zpreparer,   r	   r   Znowr)   error)r"   namecolumnsZpointsdataZstmtZqueryr.   r%   r%   r&   exportm   s   
 zExport.exportc                    s&   | j   | j  tt|   dS )z"Close the Cassandra export module.N)r!   Zshutdownr    r   r   r   )r"   r#   r%   r&   r      s   

zExport.exit)NN)	__name__
__module____qualname____doc__r   r   r<   r   __classcell__r%   r%   r#   r&   r   $   s    )r   )r@   r   r   Znumbersr   Zglances.loggerr   Zglances.exports.glances_exportr   Zglances.compatr   Zcassandra.authr   Zcassandra.clusterr   Zcassandra.utilr	   r   r
   r   r%   r%   r%   r&   <module>   s   