From e10a83f95f7c5b9836d73efb4d30c7f67e8ab474 Mon Sep 17 00:00:00 2001 From: Daniel Bergamin Date: Mon, 18 May 2026 12:44:46 +1000 Subject: [PATCH 1/2] Initial cut for VictoriaMetrics datasource support --- .../add-datasource-type-victoriametrics.yml | 2 + plugins/modules/grafana_datasource.py | 21 ++++- .../targets/grafana_datasource/tasks/main.yml | 1 + .../tasks/victoriametrics.yml | 91 +++++++++++++++++++ 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/add-datasource-type-victoriametrics.yml create mode 100644 tests/integration/targets/grafana_datasource/tasks/victoriametrics.yml diff --git a/changelogs/fragments/add-datasource-type-victoriametrics.yml b/changelogs/fragments/add-datasource-type-victoriametrics.yml new file mode 100644 index 00000000..3d41103a --- /dev/null +++ b/changelogs/fragments/add-datasource-type-victoriametrics.yml @@ -0,0 +1,2 @@ +minor_changes: + - grafana_datasource - add support for VictoriaMetrics datasource type diff --git a/plugins/modules/grafana_datasource.py b/plugins/modules/grafana_datasource.py index 89c9bfd0..fb6be5de 100644 --- a/plugins/modules/grafana_datasource.py +++ b/plugins/modules/grafana_datasource.py @@ -50,6 +50,7 @@ - tempo - quickwit-quickwit-datasource - alertmanager + - victoriametrics-metrics-datasource type: str ds_url: description: @@ -185,7 +186,7 @@ default: '@timestamp' time_interval: description: - - Minimum group by interval for C(influxdb), C(elasticsearch) or C(prometheus) datasources. + - Minimum group by interval for C(influxdb), C(elasticsearch), C(prometheus) or C(victoriametrics-metrics-datasource) datasources. - for example C(>10s). type: str interval: @@ -480,6 +481,16 @@ basic_auth_user: "thruk-user" basic_auth_password: "******" +- name: grafana - create victoriametrics datasource + community.grafana.grafana_datasource: + name: victoriametrics + grafana_url: "https://grafana.company.com" + grafana_user: "admin" + grafana_password: "xxxxxx" + ds_type: victoriametrics-metrics-datasource + ds_url: "http://victoriametrics:8428" + access: proxy + # handle secure data - workflow example # this will create/update the datasource but dont update the secure data on updates # so you can assert if all tasks are changed=False @@ -681,7 +692,12 @@ def get_datasource_payload(data, org_id=None): es_version = ES_VERSION_MAPPING.get(data["es_version"]) json_data["esVersion"] = es_version - if data["ds_type"] in ["elasticsearch", "influxdb", "prometheus"]: + if data["ds_type"] in [ + "elasticsearch", + "influxdb", + "prometheus", + "victoriametrics-metrics-datasource", + ]: if data.get("time_interval"): json_data["timeInterval"] = data["time_interval"] @@ -839,6 +855,7 @@ def setup_module_object(): "tempo", "quickwit-quickwit-datasource", "alertmanager", + "victoriametrics-metrics-datasource", ] ), ds_url=dict(type="str"), diff --git a/tests/integration/targets/grafana_datasource/tasks/main.yml b/tests/integration/targets/grafana_datasource/tasks/main.yml index 524f4d38..f0dfbb94 100644 --- a/tests/integration/targets/grafana_datasource/tasks/main.yml +++ b/tests/integration/targets/grafana_datasource/tasks/main.yml @@ -14,3 +14,4 @@ - redis - azure - uid + - victoriametrics diff --git a/tests/integration/targets/grafana_datasource/tasks/victoriametrics.yml b/tests/integration/targets/grafana_datasource/tasks/victoriametrics.yml new file mode 100644 index 00000000..9a984e28 --- /dev/null +++ b/tests/integration/targets/grafana_datasource/tasks/victoriametrics.yml @@ -0,0 +1,91 @@ +--- +- name: Create victoriametrics datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victoriametrics + org_id: "1" + ds_type: victoriametrics-metrics-datasource + ds_url: http://victoriametrics:8428 + access: proxy + time_interval: "15s" + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - result.changed + - not result.datasource.isDefault + - result.datasource.jsonData.timeInterval == '15s' + - result.datasource.name == 'datasource-victoriametrics' + - result.datasource.orgId == 1 + - ('password' not in result.datasource) or (result.datasource.password == '') + - result.datasource.type == 'victoriametrics-metrics-datasource' + - result.datasource.url == 'http://victoriametrics:8428' + - result.datasource.user == '' + - not result.datasource.withCredentials + - result.msg == 'Datasource datasource-victoriametrics created' + +- name: Create victoriametrics datasource (idempotency) + register: result + community.grafana.grafana_datasource: + name: datasource-victoriametrics + org_id: "1" + ds_type: victoriametrics-metrics-datasource + ds_url: http://victoriametrics:8428 + access: proxy + time_interval: "15s" + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - not result.changed + +- name: Update victoriametrics datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victoriametrics + org_id: "1" + ds_type: victoriametrics-metrics-datasource + ds_url: http://victoriametrics:8428 + access: proxy + time_interval: "30s" + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - result.changed + - not result.datasource.isDefault + - result.datasource.jsonData.timeInterval == '30s' + - result.datasource.name == 'datasource-victoriametrics' + - result.datasource.orgId == 1 + - ('password' not in result.datasource) or (result.datasource.password == '') + - result.datasource.type == 'victoriametrics-metrics-datasource' + - result.datasource.url == 'http://victoriametrics:8428' + - result.datasource.user == '' + - not result.datasource.withCredentials + - result.msg == 'Datasource datasource-victoriametrics updated' + +- name: Delete victoriametrics datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victoriametrics + state: absent + +- ansible.builtin.assert: + that: + - result.changed + +- name: Delete victoriametrics datasource (idempotency) + register: result + community.grafana.grafana_datasource: + name: datasource-victoriametrics + state: absent + +- ansible.builtin.assert: + that: + - not result.changed From 1eaca07d5be04d7236b2742156d62ae089665c47 Mon Sep 17 00:00:00 2001 From: Daniel Bergamin Date: Mon, 18 May 2026 13:57:29 +1000 Subject: [PATCH 2/2] add VictoriaLogs datasource support --- .../add-datasource-type-victorialogs.yml | 2 + plugins/modules/grafana_datasource.py | 12 +++ tests/integration/inventory | 2 + .../targets/grafana_datasource/tasks/main.yml | 1 + .../grafana_datasource/tasks/victorialogs.yml | 87 +++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 changelogs/fragments/add-datasource-type-victorialogs.yml create mode 100644 tests/integration/inventory create mode 100644 tests/integration/targets/grafana_datasource/tasks/victorialogs.yml diff --git a/changelogs/fragments/add-datasource-type-victorialogs.yml b/changelogs/fragments/add-datasource-type-victorialogs.yml new file mode 100644 index 00000000..cd37c1a4 --- /dev/null +++ b/changelogs/fragments/add-datasource-type-victorialogs.yml @@ -0,0 +1,2 @@ +minor_changes: + - grafana_datasource - add support for VictoriaLogs datasource type diff --git a/plugins/modules/grafana_datasource.py b/plugins/modules/grafana_datasource.py index fb6be5de..8f28a1d5 100644 --- a/plugins/modules/grafana_datasource.py +++ b/plugins/modules/grafana_datasource.py @@ -51,6 +51,7 @@ - quickwit-quickwit-datasource - alertmanager - victoriametrics-metrics-datasource + - victoriametrics-logs-datasource type: str ds_url: description: @@ -491,6 +492,16 @@ ds_url: "http://victoriametrics:8428" access: proxy +- name: grafana - create victorialogs datasource + community.grafana.grafana_datasource: + name: victorialogs + grafana_url: "https://grafana.company.com" + grafana_user: "admin" + grafana_password: "xxxxxx" + ds_type: victoriametrics-logs-datasource + ds_url: "http://victorialogs:9428" + access: proxy + # handle secure data - workflow example # this will create/update the datasource but dont update the secure data on updates # so you can assert if all tasks are changed=False @@ -856,6 +867,7 @@ def setup_module_object(): "quickwit-quickwit-datasource", "alertmanager", "victoriametrics-metrics-datasource", + "victoriametrics-logs-datasource", ] ), ds_url=dict(type="str"), diff --git a/tests/integration/inventory b/tests/integration/inventory new file mode 100644 index 00000000..669bcffc --- /dev/null +++ b/tests/integration/inventory @@ -0,0 +1,2 @@ +[testgroup] +testhost ansible_connection="local" ansible_pipelining="yes" ansible_python_interpreter="/home/vivdev/.pyenv/versions/3.9.18/bin/python3.9" diff --git a/tests/integration/targets/grafana_datasource/tasks/main.yml b/tests/integration/targets/grafana_datasource/tasks/main.yml index f0dfbb94..b84dffa9 100644 --- a/tests/integration/targets/grafana_datasource/tasks/main.yml +++ b/tests/integration/targets/grafana_datasource/tasks/main.yml @@ -15,3 +15,4 @@ - azure - uid - victoriametrics + - victorialogs diff --git a/tests/integration/targets/grafana_datasource/tasks/victorialogs.yml b/tests/integration/targets/grafana_datasource/tasks/victorialogs.yml new file mode 100644 index 00000000..cb078fa4 --- /dev/null +++ b/tests/integration/targets/grafana_datasource/tasks/victorialogs.yml @@ -0,0 +1,87 @@ +--- +- name: Create victorialogs datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victorialogs + org_id: "1" + ds_type: victoriametrics-logs-datasource + ds_url: http://victorialogs:9428 + access: proxy + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - result.changed + - not result.datasource.isDefault + - result.datasource.name == 'datasource-victorialogs' + - result.datasource.orgId == 1 + - ('password' not in result.datasource) or (result.datasource.password == '') + - result.datasource.type == 'victoriametrics-logs-datasource' + - result.datasource.url == 'http://victorialogs:9428' + - result.datasource.user == '' + - not result.datasource.withCredentials + - result.msg == 'Datasource datasource-victorialogs created' + +- name: Create victorialogs datasource (idempotency) + register: result + community.grafana.grafana_datasource: + name: datasource-victorialogs + org_id: "1" + ds_type: victoriametrics-logs-datasource + ds_url: http://victorialogs:9428 + access: proxy + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - not result.changed + +- name: Update victorialogs datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victorialogs + org_id: "1" + ds_type: victoriametrics-logs-datasource + ds_url: http://victorialogs:9428 + access: proxy + with_credentials: true + +- ansible.builtin.debug: + var: result + +- ansible.builtin.assert: + that: + - result.changed + - not result.datasource.isDefault + - result.datasource.name == 'datasource-victorialogs' + - result.datasource.orgId == 1 + - ('password' not in result.datasource) or (result.datasource.password == '') + - result.datasource.type == 'victoriametrics-logs-datasource' + - result.datasource.url == 'http://victorialogs:9428' + - result.datasource.user == '' + - result.datasource.withCredentials + - result.msg == 'Datasource datasource-victorialogs updated' + +- name: Delete victorialogs datasource + register: result + community.grafana.grafana_datasource: + name: datasource-victorialogs + state: absent + +- ansible.builtin.assert: + that: + - result.changed + +- name: Delete victorialogs datasource (idempotency) + register: result + community.grafana.grafana_datasource: + name: datasource-victorialogs + state: absent + +- ansible.builtin.assert: + that: + - not result.changed