
    Vh,                     v   d dl mZmZmZ eZdZd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mZ d dlmZ d d	lmZ d d
lmZ  e       ZdZdZdZdZdZdZ e	j>                  d      e	j@                  d   Z e	j>                  d      e	j@                  d   Z e	j>                  d      e	j@                  d   Z e	j>                  d      e	j@                  d   Z e	j>                  d      e	j@                  d   Z e	j>                  d      e	j@                  d   Z G d de!      Z" G d d      Z# G d de      Z$y)    )absolute_importdivisionprint_functiona  
name: grafana_dashboard
author: Thierry Salle (@seuf)
short_description: list or search grafana dashboards
description:
  - This lookup returns a list of grafana dashboards with possibility to filter them by query.
options:
  grafana_url:
    description: url of grafana.
    env:
      - name: GRAFANA_URL
    default: http://127.0.0.1:3000
  grafana_api_key:
    description:
      - Grafana API key.
      - When C(grafana_api_key) is set, the options C(grafana_user), C(grafana_password) and C(grafana_org_id) are ignored.
    env:
      - name: GRAFANA_API_KEY
  grafana_user:
    description: grafana authentication user.
    env:
      - name: GRAFANA_USER
    default: admin
  grafana_password:
    description:  grafana authentication password.
    env:
      - name: GRAFANA_PASSWORD
    default: admin
  grafana_org_id:
    description: grafana organisation id.
    env:
      - name: GRAFANA_ORG_ID
    default: 1
  search:
    description: optional filter for dashboard search.
    env:
      - name: GRAFANA_DASHBOARD_SEARCH
  validate_certs:
    description: flag to control SSL certificate validation
    type: boolean
    default: true
  ca_path:
    description: string of the file system path to CA cert bundle to use for validation
    type: string
aC  
- name: get project foo grafana dashboards
  set_fact:
    grafana_dashboards: "{{ lookup('grafana_dashboard', 'grafana_url=http://grafana.company.com grafana_user=admin grafana_password=admin search=foo') }}"

- name: get all grafana dashboards
  set_fact:
    grafana_dashboards: "{{ lookup('grafana_dashboard', 'grafana_url=http://grafana.company.com grafana_api_key=' ~ grafana_api_key) }}"

- name: get project foo grafana dashboards (validate SSL certificates of the instance with custom CA Certificate Bundle)
  set_fact:
    grafana_dashboards: |
        {{
            lookup(
              'grafana_dashboard',
              'grafana_url=https://grafana.company.com grafana_user=admin grafana_password=admin search=foo',
              validate_certs=true,
              ca_path='/path/to/chain.crt'
            )
        }}
N)AnsibleError)
LookupBase)basic_auth_headeropen_urlSSLValidationError)	to_native)	HTTPError)Displayzhttp://127.0.0.1:3000admin   GRAFANA_URLGRAFANA_API_KEYGRAFANA_USERGRAFANA_PASSWORDGRAFANA_ORG_IDGRAFANA_DASHBOARD_SEARCHc                       e Zd Zy)GrafanaAPIExceptionN)__name__
__module____qualname__     v/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/grafana/plugins/lookup/grafana_dashboard.pyr   r   q   s    r   r   c                   $    e Zd Zd Zd Zd Zd Zy)
GrafanaAPIc                 d   |j                  dt              | _        |j                  dt              | _        |j                  dt
              | _        |j                  dt              | _        |j                  dt              | _
        |j                  dt              | _        || _        || _        y )Ngrafana_urlgrafana_api_keygrafana_usergrafana_passwordgrafana_org_idsearch)getANSIBLE_GRAFANA_URLr!   ANSIBLE_GRAFANA_API_KEYr"   ANSIBLE_GRAFANA_USERr#   ANSIBLE_GRAFANA_PASSWORDr$   ANSIBLE_GRAFANA_ORG_IDr%    ANSIBLE_GRAFANA_DASHBOARD_SEARCHr&   validate_certsca_path)selfr.   r/   kwargss       r   __init__zGrafanaAPI.__init__v   s    !::m5HI%zz*;=TU"JJ~7KL &

+=?W X$jj)9;QRjj+KL,r   c           	         	 t        | j                  d| j                  |d| j                  | j                        }|j                         dk7  r2t        d| j                  dt        |j                                     y # t
        $ r)}t        d| j                  dt        |            d }~wt        $ r)}t        d| j                  dt        |            d }~ww xY w)	Nz/api/user/using/POSTheadersmethodr.   r/   z!Unable to switch to organization z : -Unable to validate server's certificate with :    )r	   r!   r%   r.   r/   r   r   r   r
   getcodestr)r0   r6   res       r   grafana_switch_organisationz&GrafanaAPI.grafana_switch_organisation   s    	*.*:*:D<O<OP#22A" 99;#%&&AIIK(8:    	%&&	!6  " 	%<<1/ 	s#   =B 	C'$B22C'>$C""C'c                     ddi}| j                   rd| j                   z  |d<   |S t        | j                  | j                        |d<   | j	                  |       |S )Nzcontent-typezapplication/json; charset=utf8z	Bearer %sAuthorization)r"   r   r#   r$   r?   )r0   r6   s     r   grafana_headerszGrafanaAPI.grafana_headers   si    !#CD'2T5I5I'IGO$  (9!!4#8#8(GO$ ,,W5r   c           	         | j                         }g }	 | j                  r>t        | j                  d| j                  |d| j                  | j
                        }n1t        d| j                  z  |d| j                  | j
                        }|j                         dk(  r&	 t        j                  |j                               }|S t        d
t        |j                               z        # t        $ r}t        dt        |      z        d }~wt        $ r)}t        d| j
                  dt        |            d }~ww xY w# t        $ r}t        d	t        |      z        d }~ww xY w)Nz/api/search?query=GETr5   z%s/api/search/z Unable to search dashboards : %sr8   r9   r:   zUnable to parse json list %sz&Unable to list grafana dashboards : %s)rB   r&   r	   r!   r.   r/   r   r   r   r
   r;   jsonloadsread	Exceptionr<   )r0   r6   dashboard_listr=   r>   s        r   grafana_list_dashboardsz"GrafanaAPI.grafana_list_dashboards   sQ   &&(	{{040@0@$++N# #'#6#6 LL $t'7'77# #'#6#6 LL 99;#Y!%AFFH!5 	 &83qyy{;KK   	Y%&H9UV<&WXX! 	%<<1/ 	  Y)*H9UV<*WXXYs<   A;C- ##E -	E6DE$D==E	E*E%%E*N)r   r   r   r2   r?   rB   rJ   r   r   r   r   r   u   s    2
'r   r   c                       e Zd ZddZy)LookupModuleNc                 N   | j                  ||       |d   j                  d      }i }g }|D ]  }	 |j                  dd      \  }}	|	||<    t	        d
| j                  d      | j                  d      d	|}
|
j                         }|S # t        $ r t        d|z        w xY w)N)var_optionsdirectr    =r   zFgrafana_dashboard lookup plugin needs key=value pairs, but received %sr.   r/   )r.   r/   r   )set_optionssplit
ValueErrorr   r   
get_optionrJ   )r0   terms	variablesr1   grafana_argsgrafana_dictretparamkeyvaluegrafanas              r   runzLookupModule.run   s    Yv>Qx~~c*! 	&E"[[a0
U !&L	&  
??+;<OOI.
 
 --/
  "\ s   BB$)N)r   r   r   r_   r   r   r   rL   rL      s    r   rL   )%
__future__r   r   r   type__metaclass__DOCUMENTATIONEXAMPLESrE   osansible.errorsr   ansible.plugins.lookupr   ansible.module_utils.urlsr   r	   r
   ansible.module_utils._textr   +ansible.module_utils.six.moves.urllib.errorr   ansible.utils.displayr   displayr(   r)   r*   r+   r,   r-   getenvenvironrH   r   r   rL   r   r   r   <module>ro      sY   A @,\,  	 ' - U U 0 A )
) .   "  #'  299]'**]3299+ jj):;299^(::n5299 ,!zz*<=299*ZZ(89299'(4')zz2L'M$	) 	W Wt: r   