From e3b5c1e76e7ea23060de7dfa4cfc6746179c2e3b Mon Sep 17 00:00:00 2001 From: Jasper Aikema Date: Tue, 9 Jul 2024 15:44:57 +0200 Subject: [PATCH] Add logoutQuietly function --- contents/salt.py | 24 +++++++++++++ contents/tests/test_authenticate.py | 2 +- contents/tests/test_logout.py | 53 +++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 contents/tests/test_logout.py diff --git a/contents/salt.py b/contents/salt.py index d1db9df..c54f7ad 100644 --- a/contents/salt.py +++ b/contents/salt.py @@ -53,3 +53,27 @@ def authenticate(self): return None else: raise Exception(f"Unexpected failure interacting with salt-api {response.text()}") + + def logoutQuietly(self, authToken): + """ + Remove or invalidate sessions + :header authToken: The token of the session + """ + + headers = { + "X-Auth-Token": authToken, + } + + url = f"{self.endpoint}/logout" + + logger.info("Logging out with salt-api endpoint: [%s]", url) + + try: + requests.post(url, + headers=headers) + except requests.exceptions.ConnectionError as e: + logger.warning("Encountered exception (%s) while trying to logout. Ignoring...", e) + pass + + except InterruptedError: + logger.warning("Interrupted while trying to logout.") diff --git a/contents/tests/test_authenticate.py b/contents/tests/test_authenticate.py index 1f5be86..2bb65d2 100644 --- a/contents/tests/test_authenticate.py +++ b/contents/tests/test_authenticate.py @@ -1,4 +1,4 @@ -import sys,os,time +import sys, os, time import unittest import json from unittest import mock diff --git a/contents/tests/test_logout.py b/contents/tests/test_logout.py new file mode 100644 index 0000000..5c41fb0 --- /dev/null +++ b/contents/tests/test_logout.py @@ -0,0 +1,53 @@ +import sys, os +import unittest +from requests.exceptions import ConnectionError +from unittest import mock + +sys.path.append(os.getcwd()) +from contents.salt import SaltApiNodeStepPlugin + + +class TestSaltApiNodeStepPlugin(unittest.TestCase): + + def setUp(self): + + self.PARAM_ENDPOINT = "https://localhost" + self.PARAM_EAUTH = "pam" + self.PARAM_MINION_NAME = "minion" + self.PARAM_FUNCTION = "some.function" + self.PARAM_USER = "user" + self.PARAM_PASSWORD = "password&!@$*" + self.AUTH_TOKEN = "123qwe" + self.OUTPUT_JID = "20130213093536481553" + self.HOST_RESPONSE = "\"some response\"" + + self.plugin = SaltApiNodeStepPlugin(self.PARAM_ENDPOINT, self.PARAM_USER, self.PARAM_PASSWORD) + + @mock.patch('requests.post') + def test_logout(self, mock_post): + mock_post.return_value.status_code = 200 + mock_post.return_value.json.return_value = {} + + result = self.plugin.logoutQuietly(self.AUTH_TOKEN) + + self.assertIsNone(result) + mock_post.assert_called_once_with( + self.PARAM_ENDPOINT+'/logout', + headers={"X-Auth-Token": self.AUTH_TOKEN} + ) + + @mock.patch('requests.post') + def test_logout_throws_IOException_remains_quiet(self, mock_post): + mock_post.side_effect = ConnectionError('test ConnectionError') + + result = self.plugin.logoutQuietly(self.AUTH_TOKEN) + + self.assertIsNone(result) + + @mock.patch('requests.post') + def test_logout_throws_interrupted_exception_remains_quiet(self, mock_post): + mock_post.side_effect = InterruptedError('test InterruptedError') + + result = self.plugin.logoutQuietly(self.AUTH_TOKEN) + + self.assertIsNone(result)