1#!/usr/local/bin/python3.8
2# -*- coding: utf-8 -*-
3# Copyright (c) 2017, René Moser <mail@renemoser.net>
4# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6from __future__ import absolute_import, division, print_function
7__metaclass__ = type
8
9
10DOCUMENTATION = r'''
11---
12module: influxdb_query
13short_description: Query data points from InfluxDB
14description:
15  - Query data points from InfluxDB.
16author: "René Moser (@resmo)"
17requirements:
18  - "python >= 2.6"
19  - "influxdb >= 0.9"
20options:
21  query:
22    description:
23      - Query to be executed.
24    required: true
25    type: str
26  database_name:
27    description:
28      - Name of the database.
29    required: true
30    type: str
31extends_documentation_fragment:
32- community.general.influxdb
33
34'''
35
36EXAMPLES = r'''
37- name: Query connections
38  community.general.influxdb_query:
39    hostname: "{{ influxdb_ip_address }}"
40    database_name: "{{ influxdb_database_name }}"
41    query: "select mean(value) from connections"
42  register: connection
43
44- name: Query connections with tags filters
45  community.general.influxdb_query:
46    hostname: "{{ influxdb_ip_address }}"
47    database_name: "{{ influxdb_database_name }}"
48    query: "select mean(value) from connections where region='zue01' and host='server01'"
49  register: connection
50
51- name: Print results from the query
52  ansible.builtin.debug:
53    var: connection.query_results
54'''
55
56RETURN = r'''
57query_results:
58  description: Result from the query
59  returned: success
60  type: list
61  sample:
62    - mean: 1245.5333333333333
63      time: "1970-01-01T00:00:00Z"
64'''
65
66from ansible.module_utils.basic import AnsibleModule
67from ansible.module_utils.common.text.converters import to_native
68from ansible_collections.community.general.plugins.module_utils.influxdb import InfluxDb
69
70
71class AnsibleInfluxDBRead(InfluxDb):
72
73    def read_by_query(self, query):
74        client = self.connect_to_influxdb()
75        try:
76            rs = client.query(query)
77            if rs:
78                return list(rs.get_points())
79        except Exception as e:
80            self.module.fail_json(msg=to_native(e))
81
82
83def main():
84    argument_spec = InfluxDb.influxdb_argument_spec()
85    argument_spec.update(
86        query=dict(type='str', required=True),
87        database_name=dict(required=True, type='str'),
88    )
89    module = AnsibleModule(
90        argument_spec=argument_spec,
91        supports_check_mode=True
92    )
93
94    influx = AnsibleInfluxDBRead(module)
95    query = module.params.get('query')
96    results = influx.read_by_query(query)
97    module.exit_json(changed=True, query_results=results)
98
99
100if __name__ == '__main__':
101    main()
102