diff --git a/.copier-answers.yml b/.copier-answers.yml index 5f1518e..761f955 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,22 +1,28 @@ # Autogenerated. Do not edit this by hand, use `copier update`. --- -_commit: 0.2.6 +_commit: 0.3.7 _src_path: https://github.com/lkubb/salt-extension-copier author: EITR Technologies, LLC author_email: devops@eitr.tech -docs_url: '' +coc_contact: devops@eitr.tech +copyright_begin: 2024 +deploy_docs: rolling +docs_url: https://salt-extensions.github.io/saltext-grafana/ +integration_name: Grafana license: apache loaders: - module - state -max_salt_version: 3006 +max_salt_version: 3007 no_saltext_namespace: false package_name: grafana project_name: grafana python_requires: '3.8' -salt_version: '3005' +salt_version: '3006' source_url: https://github.com/salt-extensions/saltext-grafana ssh_fixtures: false summary: Salt Extension for interacting with Grafana +test_containers: true tracker_url: https://github.com/salt-extensions/saltext-grafana/issues url: https://github.com/salt-extensions/saltext-grafana +workflows: org diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c612d7a..47c40ed 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,11 +1,21 @@ name: Pull Request or Push -on: [push, pull_request] +on: + push: + branches: + - 'main' # Run on pushes to main + tags-ignore: + - '*' # Ignore pushes to tags + pull_request: jobs: - ci: + call_central_workflow: name: CI uses: salt-extensions/central-artifacts/.github/workflows/ci.yml@main + with: + deploy-docs: true permissions: contents: write + id-token: write + pages: write pull-requests: read diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index 9f86b4e..dab0796 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -3,24 +3,31 @@ name: Tagged Releases on: push: tags: - - "v*" + - "v*" # Only tags starting with "v" for "v1.0.0", etc. jobs: - ci: + get_tag_version: runs-on: ubuntu-latest + outputs: + version: ${{ steps.get_version.outputs.version }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Extract tag name id: get_version - run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/v})" >> $GITHUB_ENV + run: echo "version=$(echo ${GITHUB_REF#refs/tags/v})" >> $GITHUB_OUTPUT - - name: CI - uses: salt-extensions/central-artifacts/.github/workflows/ci.yml@main - with: - release: true - version: ${{ env.VERSION }} - permissions: - contents: write - pull-requests: read + call_central_workflow: + needs: get_tag_version + uses: salt-extensions/central-artifacts/.github/workflows/ci.yml@main + with: + deploy-docs: true + release: true + version: ${{ needs.get_tag_version.outputs.version }} + permissions: + contents: write + id-token: write + pages: write + pull-requests: read + secrets: inherit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8b17125..4702f73 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ minimum_pre_commit_version: 2.4.0 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: check-merge-conflict # Check for files that contain merge conflict strings. - id: trailing-whitespace # Trims trailing whitespace. @@ -56,7 +56,7 @@ repos: args: [--silent, -E, fix_docstrings] - repo: https://github.com/asottile/pyupgrade - rev: v2.37.2 + rev: v3.15.2 hooks: - id: pyupgrade name: Rewrite Code to be Py3.8+ @@ -65,35 +65,35 @@ repos: ] exclude: src/saltext/grafana/version.py - - repo: https://github.com/asottile/reorder_python_imports - rev: v3.10.0 + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 hooks: - - id: reorder-python-imports + - id: isort args: [ - --py38-plus, + --py 38, ] - exclude: src/saltext/grafana/version.py + exclude: src/saltext/grafana/(__init__|version).py - repo: https://github.com/psf/black - rev: 22.6.0 + rev: 24.2.0 hooks: - id: black args: [-l 100] exclude: src/saltext/grafana/version.py - repo: https://github.com/adamchainz/blacken-docs - rev: v1.12.1 + rev: 1.16.0 hooks: - id: blacken-docs args: [--skip-errors] files: ^(docs/.*\.rst|src/saltext/grafana/.*\.py)$ additional_dependencies: - - black==22.6.0 + - black==24.2.0 # <---- Formatting ----------------------------------------------------------------------------- # ----- Security ------------------------------------------------------------------------------> - repo: https://github.com/PyCQA/bandit - rev: "1.7.4" + rev: 1.7.8 hooks: - id: bandit alias: bandit-salt @@ -101,7 +101,7 @@ repos: args: [--silent, -lll, --skip, B701] exclude: src/saltext/grafana/version.py - repo: https://github.com/PyCQA/bandit - rev: "1.7.4" + rev: 1.7.8 hooks: - id: bandit alias: bandit-tests @@ -112,7 +112,7 @@ repos: # ----- Code Analysis -------------------------------------------------------------------------> - repo: https://github.com/saltstack/mirrors-nox - rev: v2021.6.12 + rev: v2022.11.21 hooks: - id: nox alias: lint-src @@ -125,7 +125,7 @@ repos: - -- - repo: https://github.com/saltstack/mirrors-nox - rev: v2021.6.12 + rev: v2022.11.21 hooks: - id: nox alias: lint-tests diff --git a/.pre-commit-hooks/make-autodocs.py b/.pre-commit-hooks/make-autodocs.py index acb5459..4760e3f 100644 --- a/.pre-commit-hooks/make-autodocs.py +++ b/.pre-commit-hooks/make-autodocs.py @@ -3,7 +3,6 @@ import subprocess from pathlib import Path - repo_path = Path(subprocess.check_output(["git", "rev-parse", "--show-toplevel"]).decode().strip()) src_dir = repo_path / "src" / "saltext" / "grafana" doc_dir = repo_path / "docs" diff --git a/CODE-OF-CONDUCT.md b/CODE-OF-CONDUCT.md new file mode 100644 index 0000000..e8c1d58 --- /dev/null +++ b/CODE-OF-CONDUCT.md @@ -0,0 +1,127 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in Salt +Extension Modules for Grafana project and our community a +harassment-free experience for everyone, regardless of age, body size, visible +or invisible disability, ethnicity, sex characteristics, gender identity and +expression, level of experience, education, socio-economic status, nationality, +personal appearance, race, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at devops@eitr.tech. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1f944a6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,14 @@ +Thanks for your interest in contributing to the Salt Extension Modules for +Grafana! We welcome any contribution, large or small - from +adding a new feature to fixing a single letter typo. + +This is a companion to the Salt Project and the [Salt Contributing +Guide][salt-contributing] should be considered the default for this project. +Where this project disagrees with the Salt Project, the guidelines here take +precedence. Where this project is silent, the Salt guidelines should be used. + +See the **Contributing** section in the [README][README.md] for a quickstart. + + +[README.md]: README.md +[salt-contributing]: https://docs.saltproject.io/en/master/topics/development/contributing.html diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..316043f --- /dev/null +++ b/NOTICE @@ -0,0 +1,10 @@ +Salt Extension Modules for Grafana +Copyright 2024 EITR Technologies, LLC + +This product is licensed to you under the Apache 2.0 license (the "License"). +You may not use this product except in compliance with the Apache 2.0 License. + +This product may include a number of subcomponents with separate copyright +notices and license terms. Your use of these subcomponents is subject to the +terms and conditions of the subcomponent's license, as noted in the LICENSE +file. diff --git a/README.md b/README.md index 9deafb9..179eaf3 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ Salt Extension for interacting with Grafana ## Security -If you think you've found a security vulnerability, see +If you think you have found a security vulnerability, see [Salt's security guide][security]. ## User Documentation This README is for people aiming to contribute to the project. If you just want to get started with the extension, check out the -module docstrings (for now, documentation is coming!). +[User Documentation][docs]. ## Contributing @@ -64,11 +64,11 @@ these areas: You could also contribute in other ways: * Writing blog posts -* Posting on social media about how you used Salt+Grafana to solve your +* Posting on social media about how you used Salt + Grafana to solve your problems, including videos * Giving talks at conferences * Publishing videos -* Asking/answering questions in IRC, Slack, or email groups +* Asking/answering questions in IRC, Discord or email groups Any of these things are super valuable to our community, and we sincerely appreciate every contribution! @@ -84,3 +84,4 @@ that's where you'll find the rest of the documentation. [PRs]: https://github.com/salt-extensions/saltext-grafana/pulls [discussions]: https://github.com/salt-extensions/saltext-grafana/discussions [comments]: https://conventionalcomments.org/ +[docs]: https://salt-extensions.github.io/saltext-grafana/ diff --git a/docs/_ext/saltdomain.py b/docs/_ext/saltdomain.py new file mode 100644 index 0000000..7a85489 --- /dev/null +++ b/docs/_ext/saltdomain.py @@ -0,0 +1,18 @@ +""" +Copied/distilled from Salt doc/_ext/saltdomain.py in order to be able +to use Salt's custom doc refs. +""" + + +def setup(app): + app.add_crossref_type( + directivename="conf_master", + rolename="conf_master", + indextemplate="pair: %s; conf/master", + ) + app.add_crossref_type( + directivename="conf_minion", + rolename="conf_minion", + indextemplate="pair: %s; conf/minion", + ) + return {"parallel_read_safe": True, "parallel_write_safe": True} diff --git a/docs/conf.py b/docs/conf.py index a07e4e2..8aaee7e 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,12 +42,12 @@ # -- Project information ----------------------------------------------------- this_year = datetime.datetime.today().year -if this_year == 2021: - copyright_year = 2021 +if this_year == 2024: + copyright_year = "2024" else: - copyright_year = f"2021 - {this_year}" + copyright_year = f"2024 - {this_year}" project = dist.metadata["Summary"] -author = dist.metadata["Author"] +author = dist.metadata.get("Author") if author is None: # Core metadata is serialized differently with pyproject.toml: @@ -79,6 +79,8 @@ # -- General configuration --------------------------------------------------- +linkcheck_ignore = [r"http://localhost:\d+"] + # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. @@ -92,6 +94,7 @@ "sphinx.ext.coverage", "sphinx_copybutton", "sphinxcontrib.spelling", + "saltdomain", "sphinxcontrib.towncrier.ext", "myst_parser", "sphinx_inline_tabs", diff --git a/docs/topics/installation.md b/docs/topics/installation.md index d7925a7..f99d807 100644 --- a/docs/topics/installation.md +++ b/docs/topics/installation.md @@ -22,15 +22,7 @@ pip install saltext-grafana ``` ::: -:::{important} -Currently, there is [an issue][issue-second-saltext] where the installation of a Saltext fails silently -if the environment already has another one installed. You can workaround this by -removing all Saltexts and reinstalling them in one transaction. -::: - :::{hint} Saltexts are not distributed automatically via the fileserver like custom modules, they need to be installed on each node you want them to be available on. ::: - -[issue-second-saltext]: https://github.com/saltstack/salt/issues/65433 diff --git a/noxfile.py b/noxfile.py index 162afac..c76a262 100755 --- a/noxfile.py +++ b/noxfile.py @@ -19,17 +19,17 @@ nox.options.error_on_missing_interpreters = False # Python versions to test against -PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10") +PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10", "3.11", "3.12") # Be verbose when running under a CI context CI_RUN = ( os.environ.get("JENKINS_URL") or os.environ.get("CI") or os.environ.get("DRONE") is not None ) PIP_INSTALL_SILENT = CI_RUN is False -SKIP_REQUIREMENTS_INSTALL = "SKIP_REQUIREMENTS_INSTALL" in os.environ +SKIP_REQUIREMENTS_INSTALL = os.environ.get("SKIP_REQUIREMENTS_INSTALL", "0") == "1" EXTRA_REQUIREMENTS_INSTALL = os.environ.get("EXTRA_REQUIREMENTS_INSTALL") -COVERAGE_VERSION_REQUIREMENT = "coverage==5.2" -SALT_REQUIREMENT = os.environ.get("SALT_REQUIREMENT") or "salt>=3005" +COVERAGE_REQUIREMENT = os.environ.get("COVERAGE_REQUIREMENT") or "coverage==7.5.1" +SALT_REQUIREMENT = os.environ.get("SALT_REQUIREMENT") or "salt>=3006" if SALT_REQUIREMENT == "salt==master": SALT_REQUIREMENT = "git+https://github.com/saltstack/salt.git@master" @@ -89,9 +89,7 @@ def _install_requirements( # Always have the wheel package installed session.install("--progress-bar=off", "wheel", silent=PIP_INSTALL_SILENT) if install_coverage_requirements: - session.install( - "--progress-bar=off", COVERAGE_VERSION_REQUIREMENT, silent=PIP_INSTALL_SILENT - ) + session.install("--progress-bar=off", COVERAGE_REQUIREMENT, silent=PIP_INSTALL_SILENT) if install_salt: session.install("--progress-bar=off", SALT_REQUIREMENT, silent=PIP_INSTALL_SILENT) diff --git a/pyproject.toml b/pyproject.toml index dd257b4..996432c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,13 +28,17 @@ classifiers = [ "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", ] requires-python = ">= 3.8" dynamic = ["version"] -dependencies = [] +dependencies = [ + "salt>=3006", +] [project.readme] file = "README.md" @@ -42,6 +46,7 @@ content-type = "text/markdown" [project.urls] Homepage = "https://github.com/salt-extensions/saltext-grafana" +Documentation = "https://salt-extensions.github.io/saltext-grafana/" Source = "https://github.com/salt-extensions/saltext-grafana" Tracker = "https://github.com/salt-extensions/saltext-grafana/issues" @@ -70,8 +75,9 @@ lint = [ "saltpylint", ] tests = [ - "pytest>=6.1.0", - "pytest-salt-factories>=1.0.0rc19", + "pytest>=7.2.0", + "pytest-salt-factories>=1.0.0; sys_platform == 'win32'", + "pytest-salt-factories[docker]>=1.0.0; sys_platform != 'win32'", ] [project.entry-points."salt.loader"] @@ -101,42 +107,48 @@ build_dir = "build/sphinx" [tool.black] line-length = 100 +[tool.isort] +force_single_line = true +skip = ["src/saltext/grafana/__init__.py"] +profile = "black" +line_length = 100 + [tool.towncrier] - package = "saltext.grafana" - filename = "CHANGELOG.md" - template = "changelog/.template.jinja" - directory = "changelog/" - start_string = "# Changelog\n" - underlines = ["", "", ""] - title_format = "## {version} ({project_date})" - issue_format = "[#{issue}](https://github.com/salt-extensions/saltext-grafana/issues/{issue})" - - [[tool.towncrier.type]] - directory = "removed" - name = "Removed" - showcontent = true - - [[tool.towncrier.type]] - directory = "deprecated" - name = "Deprecated" - showcontent = true - - [[tool.towncrier.type]] - directory = "changed" - name = "Changed" - showcontent = true - - [[tool.towncrier.type]] - directory = "fixed" - name = "Fixed" - showcontent = true - - [[tool.towncrier.type]] - directory = "added" - name = "Added" - showcontent = true - - [[tool.towncrier.type]] - directory = "security" - name = "Security" - showcontent = true +package = "saltext.grafana" +filename = "CHANGELOG.md" +template = "changelog/.template.jinja" +directory = "changelog/" +start_string = "# Changelog\n" +underlines = ["", "", ""] +title_format = "## {version} ({project_date})" +issue_format = "[#{issue}](https://github.com/salt-extensions/saltext-grafana/issues/{issue})" + +[[tool.towncrier.type]] +directory = "removed" +name = "Removed" +showcontent = true + +[[tool.towncrier.type]] +directory = "deprecated" +name = "Deprecated" +showcontent = true + +[[tool.towncrier.type]] +directory = "changed" +name = "Changed" +showcontent = true + +[[tool.towncrier.type]] +directory = "fixed" +name = "Fixed" +showcontent = true + +[[tool.towncrier.type]] +directory = "added" +name = "Added" +showcontent = true + +[[tool.towncrier.type]] +directory = "security" +name = "Security" +showcontent = true diff --git a/src/saltext/grafana/modules/__init__.py b/src/saltext/grafana/modules/__init__.py index 95433ea..e69de29 100644 --- a/src/saltext/grafana/modules/__init__.py +++ b/src/saltext/grafana/modules/__init__.py @@ -1,3 +0,0 @@ -""" -Execution Module Directory -""" diff --git a/src/saltext/grafana/states/__init__.py b/src/saltext/grafana/states/__init__.py index a3d87d2..e69de29 100644 --- a/src/saltext/grafana/states/__init__.py +++ b/src/saltext/grafana/states/__init__.py @@ -1,3 +0,0 @@ -""" -States Directory -""" diff --git a/src/saltext/grafana/states/grafana.py b/src/saltext/grafana/states/grafana.py index aa1c1a1..62c38c8 100644 --- a/src/saltext/grafana/states/grafana.py +++ b/src/saltext/grafana/states/grafana.py @@ -165,6 +165,7 @@ they exist in dashboards. The module will not manage rows that are not defined, allowing users to manage their own custom rows. """ + import copy import salt.utils.json diff --git a/src/saltext/grafana/states/grafana4_dashboard.py b/src/saltext/grafana/states/grafana4_dashboard.py index f64fff9..e82a4d6 100644 --- a/src/saltext/grafana/states/grafana4_dashboard.py +++ b/src/saltext/grafana/states/grafana4_dashboard.py @@ -51,6 +51,7 @@ title: Imaginary type: graph """ + import copy import salt.utils.json @@ -165,14 +166,14 @@ def present( if updated_needed: if __opts__["test"]: ret["result"] = None - ret[ - "comment" - ] = "Dashboard {} is set to be updated, changes={}".format( # pylint: disable=consider-using-f-string - name, - salt.utils.json.dumps( - _dashboard_diff(_cleaned(new_dashboard), _cleaned(old_dashboard)), - indent=4, - ), + ret["comment"] = ( + "Dashboard {} is set to be updated, changes={}".format( # pylint: disable=consider-using-f-string + name, + salt.utils.json.dumps( + _dashboard_diff(_cleaned(new_dashboard), _cleaned(old_dashboard)), + indent=4, + ), + ) ) return ret diff --git a/src/saltext/grafana/states/grafana4_datasource.py b/src/saltext/grafana/states/grafana4_datasource.py index 783e04f..b3b2503 100644 --- a/src/saltext/grafana/states/grafana4_datasource.py +++ b/src/saltext/grafana/states/grafana4_datasource.py @@ -42,6 +42,7 @@ - basic_auth_password: mypass - is_default: true """ + from salt.utils.dictdiffer import deep_diff diff --git a/src/saltext/grafana/states/grafana4_org.py b/src/saltext/grafana/states/grafana4_org.py index acf7012..9d1fa4f 100644 --- a/src/saltext/grafana/states/grafana4_org.py +++ b/src/saltext/grafana/states/grafana4_org.py @@ -41,6 +41,7 @@ - state: "" - country: "" """ + import salt.utils.dictupdate as dictupdate from requests.exceptions import HTTPError from salt.utils.dictdiffer import deep_diff @@ -189,10 +190,10 @@ def present( ) elif role != db_users[username]["role"]: if __opts__["test"]: - ret[ - "comment" - ] = "Org {} user {} role will be updated".format( # pylint: disable=consider-using-f-string - name, username + ret["comment"] = ( + "Org {} user {} role will be updated".format( # pylint: disable=consider-using-f-string + name, username + ) ) return ret __salt__["grafana4.update_org_user"]( diff --git a/src/saltext/grafana/states/grafana4_user.py b/src/saltext/grafana/states/grafana4_user.py index 33c0082..060f2ec 100644 --- a/src/saltext/grafana/states/grafana4_user.py +++ b/src/saltext/grafana/states/grafana4_user.py @@ -36,6 +36,7 @@ - fullname: Foo Bar - is_admin: true """ + import salt.utils.dictupdate as dictupdate from salt.utils.dictdiffer import deep_diff diff --git a/src/saltext/grafana/states/grafana_dashboard.py b/src/saltext/grafana/states/grafana_dashboard.py index 44488f3..78c537c 100644 --- a/src/saltext/grafana/states/grafana_dashboard.py +++ b/src/saltext/grafana/states/grafana_dashboard.py @@ -36,6 +36,7 @@ they exist in dashboards. The module will not manage rows that are not defined, allowing users to manage their own custom rows. """ + import copy import requests @@ -150,14 +151,14 @@ def present( if updated_needed: if __opts__["test"]: ret["result"] = None - ret[ - "comment" - ] = "Dashboard {} is set to be updated, changes={}".format( # pylint: disable=consider-using-f-string - name, - salt.utils.json.dumps( - _dashboard_diff(_cleaned(new_dashboard), _cleaned(old_dashboard)), - indent=4, - ), + ret["comment"] = ( + "Dashboard {} is set to be updated, changes={}".format( # pylint: disable=consider-using-f-string + name, + salt.utils.json.dumps( + _dashboard_diff(_cleaned(new_dashboard), _cleaned(old_dashboard)), + indent=4, + ), + ) ) return ret diff --git a/src/saltext/grafana/states/grafana_datasource.py b/src/saltext/grafana/states/grafana_datasource.py index 98ebc04..22212bc 100644 --- a/src/saltext/grafana/states/grafana_datasource.py +++ b/src/saltext/grafana/states/grafana_datasource.py @@ -23,6 +23,7 @@ - basic_auth_password: mypass - is_default: true """ + import requests diff --git a/tests/conftest.py b/tests/conftest.py index 6932e12..47d380a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,9 +2,9 @@ import os import pytest -from saltext.grafana import PACKAGE_ROOT from saltfactories.utils import random_string +from saltext.grafana import PACKAGE_ROOT # Reset the root logger to its default level(because salt changed it) logging.root.setLevel(logging.WARNING) diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 3e3fa4a..b3b6ced 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,3 +1,5 @@ +import os + import pytest import salt.config @@ -17,6 +19,7 @@ def minion_opts(tmp_path): dirpath.mkdir(parents=True) opts[name] = str(dirpath) opts["log_file"] = "logs/minion.log" + opts["conf_file"] = os.path.join(opts["conf_dir"], "minion") return opts @@ -35,6 +38,7 @@ def master_opts(tmp_path): dirpath.mkdir(parents=True) opts[name] = str(dirpath) opts["log_file"] = "logs/master.log" + opts["conf_file"] = os.path.join(opts["conf_dir"], "master") return opts @@ -54,4 +58,5 @@ def syndic_opts(tmp_path): dirpath.mkdir(parents=True) opts[name] = str(dirpath) opts["log_file"] = "logs/syndic.log" + opts["conf_file"] = os.path.join(opts["conf_dir"], "syndic") return opts diff --git a/tests/unit/states/test_grafana.py b/tests/unit/states/test_grafana.py index 603b99b..9c18f91 100644 --- a/tests/unit/states/test_grafana.py +++ b/tests/unit/states/test_grafana.py @@ -1,6 +1,7 @@ """ :codeauthor: Jayesh Kariya """ + from unittest.mock import MagicMock from unittest.mock import patch