diff --git a/changelogs/fragments/1.2.0.yml b/changelogs/fragments/1.2.0.yml new file mode 100644 index 00000000..09e8ba35 --- /dev/null +++ b/changelogs/fragments/1.2.0.yml @@ -0,0 +1,3 @@ +bugfixes: +- Fix issue with url when grafana_url has a trailing slash (#135) +- grafana_dashboard, Fix reference before assignment issue (#146) diff --git a/galaxy.yml b/galaxy.yml index 30b44e33..9261d772 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,6 +1,6 @@ namespace: community name: grafana -version: 1.1.0 +version: 1.2.0 readme: README.md authors: - RĂ©mi REY (@rrey) diff --git a/plugins/modules/grafana_folder.py b/plugins/modules/grafana_folder.py index 973e04ce..2d051707 100644 --- a/plugins/modules/grafana_folder.py +++ b/plugins/modules/grafana_folder.py @@ -28,6 +28,7 @@ short_description: Manage Grafana Folders description: - Create/update/delete Grafana Folders through the Folders API. +requirements: - The Folders API is only available starting Grafana 5 and the module will fail if the server version is lower than version 5. options: name: @@ -43,6 +44,14 @@ default: present type: str choices: ["present", "absent"] + skip_version_check: + description: + - Skip Grafana version check and try to reach api endpoint anyway. + - This parameter can be useful if you enabled `hide_version` in grafana.ini + required: False + type: bool + default: False + version_added: "1.2.0" extends_documentation_fragment: - community.grafana.basic_auth - community.grafana.api_key @@ -156,13 +165,17 @@ from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import fetch_url, basic_auth_header -from ansible_collections.community.grafana.plugins.module_utils.base import grafana_argument_spec, grafana_required_together, grafana_mutually_exclusive, clean_url +import ansible_collections.community.grafana.plugins.module_utils.base as base from ansible.module_utils.six.moves.urllib.parse import quote from ansible.module_utils._text import to_text __metaclass__ = type +class GrafanaError(Exception): + pass + + class GrafanaFolderInterface(object): def __init__(self, module): @@ -174,10 +187,14 @@ def __init__(self, module): else: self.headers["Authorization"] = basic_auth_header(module.params['url_username'], module.params['url_password']) # }}} - self.grafana_url = clean_url(module.params.get("url")) - grafana_version = self.get_version() - if grafana_version["major"] < 5: - self._module.fail_json(failed=True, msg="Folders API is available starting Grafana v5") + self.grafana_url = module.params.get("url") + if module.params.get("skip_version_check") is False: + try: + grafana_version = self.get_version() + except GrafanaError as e: + self._module.fail_json(failed=True, msg=to_text(e)) + if grafana_version["major"] < 5: + self._module.fail_json(failed=True, msg="Folders API is available starting Grafana v5") def _send_request(self, url, data=None, headers=None, method="GET"): if data is not None: @@ -205,8 +222,10 @@ def get_version(self): url = "/api/health" response = self._send_request(url, data=None, headers=self.headers, method="GET") version = response.get("version") - major, minor, rev = version.split(".") - return {"major": int(major), "minor": int(minor), "rev": int(rev)} + if version is not None: + major, minor, rev = version.split(".") + return {"major": int(major), "minor": int(minor), "rev": int(rev)} + raise GrafanaError("Failed to retrieve version from '%s'" % url) def create_folder(self, title): url = "/api/folders" @@ -232,16 +251,17 @@ def setup_module_object(): module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=False, - required_together=grafana_required_together(), - mutually_exclusive=grafana_mutually_exclusive(), + required_together=base.grafana_required_together(), + mutually_exclusive=base.grafana_mutually_exclusive(), ) return module -argument_spec = grafana_argument_spec() +argument_spec = base.grafana_argument_spec() argument_spec.update( name=dict(type='str', aliases=['title'], required=True), state=dict(type='str', default='present', choices=['present', 'absent']), + skip_version_check=dict(type='bool', default=False), ) diff --git a/plugins/modules/grafana_team.py b/plugins/modules/grafana_team.py index c49ca098..158b265a 100644 --- a/plugins/modules/grafana_team.py +++ b/plugins/modules/grafana_team.py @@ -29,6 +29,7 @@ description: - Create/update/delete Grafana Teams through the Teams API. - Also allows to add members in the team (if members exists). +requirements: - The Teams API is only available starting Grafana 5 and the module will fail if the server version is lower than version 5. options: name: @@ -60,6 +61,14 @@ - list of members found on the Team. default: False type: bool + skip_version_check: + description: + - Skip Grafana version check and try to reach api endpoint anyway. + - This parameter can be useful if you enabled `hide_version` in grafana.ini + required: False + type: bool + default: False + version_added: "1.2.0" extends_documentation_fragment: - community.grafana.basic_auth - community.grafana.api_key @@ -162,11 +171,16 @@ from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import fetch_url, basic_auth_header -from ansible_collections.community.grafana.plugins.module_utils.base import grafana_argument_spec, grafana_required_together, grafana_mutually_exclusive, clean_url +from ansible.module_utils._text import to_text +import ansible_collections.community.grafana.plugins.module_utils.base as base __metaclass__ = type +class GrafanaError(Exception): + pass + + class GrafanaTeamInterface(object): def __init__(self, module): @@ -178,10 +192,14 @@ def __init__(self, module): else: self.headers["Authorization"] = basic_auth_header(module.params['url_username'], module.params['url_password']) # }}} - self.grafana_url = clean_url(module.params.get("url")) - grafana_version = self.get_version() - if grafana_version["major"] < 5: - self._module.fail_json(failed=True, msg="Teams API is available starting Grafana v5") + self.grafana_url = module.params.get("url") + if module.params.get("skip_version_check") is False: + try: + grafana_version = self.get_version() + except GrafanaError as e: + self._module.fail_json(failed=True, msg=to_text(e)) + if grafana_version["major"] < 5: + self._module.fail_json(failed=True, msg="Teams API is available starting Grafana v5") def _send_request(self, url, data=None, headers=None, method="GET"): if data is not None: @@ -208,8 +226,10 @@ def get_version(self): url = "/api/health" response = self._send_request(url, data=None, headers=self.headers, method="GET") version = response.get("version") - major, minor, rev = version.split(".") - return {"major": int(major), "minor": int(minor), "rev": int(rev)} + if version is not None: + major, minor, rev = version.split(".") + return {"major": int(major), "minor": int(minor), "rev": int(rev)} + raise GrafanaError("Failed to retrieve version from '%s'" % url) def create_team(self, name, email): url = "/api/teams" @@ -266,18 +286,19 @@ def setup_module_object(): module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=False, - required_together=grafana_required_together(), - mutually_exclusive=grafana_mutually_exclusive(), + required_together=base.grafana_required_together(), + mutually_exclusive=base.grafana_mutually_exclusive(), ) return module -argument_spec = grafana_argument_spec() +argument_spec = base.grafana_argument_spec() argument_spec.update( name=dict(type='str', required=True), email=dict(type='str', required=True), members=dict(type='list', elements='str', required=False), enforce_members=dict(type='bool', default=False), + skip_version_check=dict(type='bool', default=False), )