Source code for saltext.vault.states.vault

"""
Statefully manage Vault policies.

.. important::
    This module requires the general :ref:`Vault setup <vault-setup>`.
"""

import difflib
import logging

from salt.exceptions import CommandExecutionError

log = logging.getLogger(__name__)


[docs] def policy_present(name, rules): """ Ensure a Vault policy with the given name and rules is present. name The name of the policy rules Rules formatted as in-line HCL .. code-block:: yaml demo-policy: vault.policy_present: - name: foo/bar - rules: | path "secret/top-secret/*" { policy = "deny" } path "secret/not-very-secret/*" { policy = "write" } """ ret = {"name": name, "changes": {}, "result": True, "comment": ""} try: existing_rules = __salt__["vault.policy_fetch"](name) except CommandExecutionError as err: ret["result"] = False ret["comment"] = f"Failed to read policy: {err}" return ret if existing_rules == rules: ret["comment"] = "Policy exists, and has the correct content" return ret diff = "".join( difflib.unified_diff((existing_rules or "").splitlines(True), rules.splitlines(True)) ) ret["changes"] = {name: diff} if __opts__["test"]: ret["result"] = None ret["comment"] = "Policy would be " + ("created" if existing_rules is None else "updated") return ret try: __salt__["vault.policy_write"](name, rules) ret["comment"] = "Policy has been " + ("created" if existing_rules is None else "updated") return ret except CommandExecutionError as err: return { "name": name, "changes": {}, "result": False, "comment": f"Failed to write policy: {err}", }
[docs] def policy_absent(name): """ Ensure a Vault policy with the given name and rules is absent. name The name of the policy """ ret = {"name": name, "changes": {}, "result": True, "comment": ""} try: existing_rules = __salt__["vault.policy_fetch"](name) except CommandExecutionError as err: ret["result"] = False ret["comment"] = f"Failed to read policy: {err}" return ret if existing_rules is None: ret["comment"] = "Policy is already absent" return ret ret["changes"] = {"deleted": name} if __opts__["test"]: ret["result"] = None ret["comment"] = "Policy would be deleted" return ret try: if not __salt__["vault.policy_delete"](name): raise CommandExecutionError( "Policy was initially reported as existent, but seemed to be " "absent while deleting." ) ret["comment"] = "Policy has been deleted" return ret except CommandExecutionError as err: return { "name": name, "changes": {}, "result": False, "comment": f"Failed to delete policy: {err}", }