diff --git a/roles/cobald/library/influx_bucket.py b/roles/cobald/library/influx_bucket.py new file mode 100755 index 0000000..53c6dcc --- /dev/null +++ b/roles/cobald/library/influx_bucket.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python +import requests +from ansible.module_utils.basic import AnsibleModule + +DOCUMENTATION = r''' +--- +module: influx2_bucket +short_description: create bucket in influxdb2 +description: create bucket in influxdb2 +notes: + - just works with influxdb version 2 + - does not remove buckets + - no way to configure data retention + +options: + base: + description: URL for path, e.g. `https://localhost:8086` + type: str + required: True + org: + description: influxdb2 organisation + type: str + required: True + auth_token: + description: influxdb2 authentication token + type: str + required: True + name: + description: name of the bucket + type: str + required: True + force: + description: force creation even if bucket already exists + (adds a new one) + type: bool + required: False + default: False +author: + - Thorsten M. (@thoto) +''' + +EXAMPLES = r''' +- name: "fetch auth token" + raw: influx auth list --user my-user --hide-headers | cut -f 3 + register: influx_token_fetch + delegate_to: ed-influxdb-2 + +- name: "create bucket" + influx_bucket: + base: "http://localhost:8086" + org: "my-org" + token: "{{influx_token_fetch.stdout_lines[0]}}" + name: "bucky" +''' + + +def get_org_id(base, org_name, h): + ro = requests.get("{base}/api/v2/orgs".format(base=base), headers=h, + json={"org": org_name}) + ro.raise_for_status() + org_id = [o["id"] for o in ro.json()["orgs"] if o["name"] == org_name] + return org_id[0] + + +class Bucket: + def __init__(self, base, h, org, description, name): + self.base = base + self.h = h + self.org_id = get_org_id(base, org, h) + self.description = description + self.name = name + + self.result = None + self.f = None + + def check(self): + ra = requests.get("{base}/api/v2/buckets".format( + base=self.base), + params={"orgID": self.org_id, "name": self.name}, + headers=self.h) + if ra.status_code == 404: + # orgID + name -> 404 on empty set. Just name -> 200 but buckets=[] + x = [] + else: + ra.raise_for_status() + x = [i for i in ra.json()["buckets"] + if self.name == i["name"] and i["orgID"] == self.org_id] + assert(len(x) == 1 or len(x) == 0) + + update = None + if len(x) == 0: # create + self.result = None + self.f = lambda: self._create({ + "orgID": self.org_id, + "description": self.description, + "name": self.name, + "retentionRules": [] + }) + else: + self.result = x[0] + if self.description == x[0]["description"]: + return False # everything matches -> no change needed + else: + self.result = x[0] + update = {"id": x[0]["id"], + "description": self.description} + self.f = lambda: self._update(**update) + return True + + def run(self): + if not self.f: + self.check() + self.f() + + def _update(self, id, description): + ra = requests.patch( + "{base}/api/v2/buckets/{id}".format( + base=self.base, id=id), + headers=self.h, json={"description": description}) + ra.raise_for_status() + return ra + + def _create(self, data): + ra = requests.post("{base}/api/v2/buckets".format(base=self.base), + headers=self.h, json=data) + ra.raise_for_status() + self.result = ra.json() + return ra + + +if __name__ == "__main__": + result = dict(changed=False, message="") + module = AnsibleModule( + argument_spec=dict( + base=dict(type="str", required=True), + org=dict(type="str", required=True), + auth_token=dict(type="str", required=True), + name=dict(type="str", required=True), + description=dict(type="str", default=""), + force=dict(type="bool", default=False), + ), + supports_check_mode=True + ) + h = {"Authorization": "Token {token}".format( + token=module.params["auth_token"])} + b = Bucket(module.params["base"], h, org=module.params["org"], + description=module.params["description"], + name=module.params["name"]) + + changed = b.check() + if b.result: + result['bucket_id'] = b.result["id"] + result['changed'] = changed + + if module.check_mode: + module.exit_json(**result) + + if changed or module.params["force"]: + b.run() + result['bucket_id'] = b.result["id"] + module.exit_json(**result) diff --git a/roles/cobald/library/influx_dashboard.py b/roles/cobald/library/influx_dashboard.py index ef5a1cc..b4b80f4 100755 --- a/roles/cobald/library/influx_dashboard.py +++ b/roles/cobald/library/influx_dashboard.py @@ -23,7 +23,7 @@ options: description: influxdb2 organisation type: str required: True - token: + auth_token: description: influxdb2 authentication token type: str required: True @@ -51,7 +51,7 @@ EXAMPLES = r''' influx_dashboard: base: "http://localhost:8086" org: "my-org" - token: "{{influx_token_fetch.stdout_lines[0]}}" + auth_token: "{{influx_token_fetch.stdout_lines[0]}}" data: "{{lookup('file', 'influxdb-dashboard-cobald.json')}}" ''' @@ -126,7 +126,7 @@ if __name__ == "__main__": argument_spec=dict( base=dict(type="str", required=True), org=dict(type="str", required=True), - token=dict(type="str", required=True), + auth_token=dict(type="str", required=True), data=dict(type="json", required=True), force=dict(type="bool", default=False), ), @@ -134,7 +134,7 @@ if __name__ == "__main__": ) dashboard = parse_dashboard_template(module.params["data"]) auth = get_auth(module.params["base"], module.params["org"], - module.params["token"]) + module.params["auth_token"]) changed, x = check(module.params["base"], auth, dashboard) result['changed'] = changed