Move ssh state tests to pytest

This commit is contained in:
krionbsd 2021-02-24 08:25:50 +01:00 committed by Pedro Algarvio
parent 4deb1b3f9a
commit c90fc2fdac
5 changed files with 303 additions and 352 deletions

View file

@ -85,8 +85,8 @@ salt/modules/rabbitmq.py:
- integration.states.test_rabbitmq_vhost
salt/modules/ssh.py:
- unit.states.test_ssh_auth
- unit.states.test_ssh_known_hosts
- pytests.unit.states.test_ssh_auth
- pytests.unit.states.test_ssh_known_hosts
salt/auth/*:
- pytests.integration.cli.test_salt_auth

View file

@ -0,0 +1,159 @@
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
import pytest
import salt.states.ssh_auth as ssh_auth
from tests.support.mock import MagicMock, patch
@pytest.fixture
def configure_loader_modules():
return {ssh_auth: {}}
def test_present():
"""
Test to verifies that the specified SSH key
is present for the specified user.
"""
name = "sshkeys"
user = "root"
source = "salt://ssh_keys/id_rsa.pub"
ret = {"name": name, "changes": {}, "result": True, "comment": ""}
mock = MagicMock(return_value="exists")
mock_data = MagicMock(side_effect=["replace", "new"])
with patch.dict(
ssh_auth.__salt__, {"ssh.check_key": mock, "ssh.set_auth_key": mock_data}
):
with patch.dict(ssh_auth.__opts__, {"test": True}):
comt = "The authorized host key sshkeys is already " "present for user root"
ret.update({"comment": comt})
assert ssh_auth.present(name, user, source) == ret
with patch.dict(ssh_auth.__opts__, {"test": False}):
comt = "The authorized host key sshkeys " "for user root was updated"
ret.update({"comment": comt, "changes": {name: "Updated"}})
assert ssh_auth.present(name, user, source) == ret
comt = "The authorized host key sshkeys " "for user root was added"
ret.update({"comment": comt, "changes": {name: "New"}})
assert ssh_auth.present(name, user, source) == ret
def test_absent():
"""
Test to verifies that the specified SSH key is absent.
"""
name = "sshkeys"
user = "root"
source = "salt://ssh_keys/id_rsa.pub"
ret = {"name": name, "changes": {}, "result": None, "comment": ""}
mock = MagicMock(
side_effect=["User authorized keys file not present", "Key removed"]
)
mock_up = MagicMock(side_effect=["update", "updated"])
with patch.dict(
ssh_auth.__salt__, {"ssh.rm_auth_key": mock, "ssh.check_key": mock_up}
):
with patch.dict(ssh_auth.__opts__, {"test": True}):
comt = "Key sshkeys for user root is set for removal"
ret.update({"comment": comt})
assert ssh_auth.absent(name, user, source) == ret
comt = "Key is already absent"
ret.update({"comment": comt, "result": True})
assert ssh_auth.absent(name, user, source) == ret
with patch.dict(ssh_auth.__opts__, {"test": False}):
comt = "User authorized keys file not present"
ret.update({"comment": comt, "result": False})
assert ssh_auth.absent(name, user, source) == ret
comt = "Key removed"
ret.update({"comment": comt, "result": True, "changes": {name: "Removed"}})
assert ssh_auth.absent(name, user, source) == ret
def test_manage():
"""
Test to verifies that the specified SSH key is absent.
"""
user = "root"
ret = {"name": "", "changes": {}, "result": None, "comment": ""}
mock_rm = MagicMock(
side_effect=["User authorized keys file not present", "Key removed"]
)
mock_up = MagicMock(side_effect=["update", "updated"])
mock_set = MagicMock(side_effect=["replace", "new"])
mock_keys = MagicMock(
return_value={
"somekey": {
"enc": "ssh-rsa",
"comment": "user@host",
"options": [],
"fingerprint": "b7",
}
}
)
with patch.dict(
ssh_auth.__salt__,
{
"ssh.rm_auth_key": mock_rm,
"ssh.set_auth_key": mock_set,
"ssh.check_key": mock_up,
"ssh.auth_keys": mock_keys,
},
):
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {"comment": "", "changes": {}, "result": None}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": True}):
assert ssh_auth.manage("sshid", ["somekey"], user) == ret
comt = "somekey Key set for removal"
ret.update({"comment": comt})
assert ssh_auth.manage("sshid", [], user) == ret
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {"comment": "", "changes": {}, "result": True}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": False}):
ret = {"name": "", "changes": {}, "result": True, "comment": ""}
assert ssh_auth.manage("sshid", ["somekey"], user) == ret
with patch("salt.states.ssh_auth.absent") as call_mocked_absent:
mock_absent = {"comment": "Key removed"}
call_mocked_absent.return_value = mock_absent
ret.update(
{
"comment": "",
"result": True,
"changes": {"somekey": "Key removed"},
}
)
assert ssh_auth.manage("sshid", ["addkey"], user) == ret
# add a key
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {
"comment": "The authorized host key newkey for user {} was added".format(
user
),
"changes": {"newkey": "New"},
"result": True,
}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": False}):
ret = {
"name": "",
"changes": {"newkey": "New"},
"result": True,
"comment": "",
}
assert ssh_auth.manage("sshid", ["newkey", "somekey"], user) == ret

View file

@ -0,0 +1,142 @@
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
import os
import pytest
import salt.states.ssh_known_hosts as ssh_known_hosts
from tests.support.mock import MagicMock, patch
@pytest.fixture
def configure_loader_modules():
return {ssh_known_hosts: {}}
def test_present():
"""
Test to verify that the specified host is known by the specified user.
"""
name = "github.com"
user = "root"
key = "16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48"
fingerprint = [key]
ret = {"name": name, "changes": {}, "result": False, "comment": ""}
with patch.dict(ssh_known_hosts.__opts__, {"test": True}):
with patch.object(os.path, "isabs", MagicMock(return_value=False)):
comt = 'If not specifying a "user", ' 'specify an absolute "config".'
ret.update({"comment": comt})
assert ssh_known_hosts.present(name) == ret
comt = 'Specify either "key" or "fingerprint", not both.'
ret.update({"comment": comt})
assert ssh_known_hosts.present(name, user, key=key, fingerprint=[key]) == ret
comt = 'Required argument "enc" if using "key" argument.'
ret.update({"comment": comt})
assert ssh_known_hosts.present(name, user, key=key) == ret
mock = MagicMock(side_effect=["exists", "add", "update"])
with patch.dict(ssh_known_hosts.__salt__, {"ssh.check_known_host": mock}):
comt = "Host github.com is already in .ssh/known_hosts"
ret.update({"comment": comt, "result": True})
assert ssh_known_hosts.present(name, user) == ret
comt = "Key for github.com is set to be" " added to .ssh/known_hosts"
ret.update({"comment": comt, "result": None})
assert ssh_known_hosts.present(name, user) == ret
comt = "Key for github.com is set to be " "updated in .ssh/known_hosts"
ret.update({"comment": comt})
assert ssh_known_hosts.present(name, user) == ret
with patch.dict(ssh_known_hosts.__opts__, {"test": False}):
result = {"status": "exists", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
comt = "github.com already exists in .ssh/known_hosts"
ret.update({"comment": comt, "result": True})
assert ssh_known_hosts.present(name, user) == ret
result = {"status": "error", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
ret.update({"comment": "", "result": False})
assert ssh_known_hosts.present(name, user) == ret
result = {
"status": "updated",
"error": "",
"new": [{"fingerprint": fingerprint, "key": key}],
"old": "",
}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
comt = "{}'s key saved to .ssh/known_hosts (key: {})".format(name, key)
ret.update(
{
"comment": comt,
"result": True,
"changes": {
"new": [{"fingerprint": fingerprint, "key": key}],
"old": "",
},
}
)
assert ssh_known_hosts.present(name, user, key=key) == ret
comt = "{}'s key saved to .ssh/known_hosts (fingerprint: {})".format(
name, fingerprint
)
ret.update({"comment": comt})
assert ssh_known_hosts.present(name, user) == ret
def test_absent():
"""
Test to verifies that the specified host is not known by the given user.
"""
name = "github.com"
user = "root"
ret = {"name": name, "changes": {}, "result": False, "comment": ""}
with patch.object(os.path, "isabs", MagicMock(return_value=False)):
comt = 'If not specifying a "user", ' 'specify an absolute "config".'
ret.update({"comment": comt})
assert ssh_known_hosts.absent(name) == ret
mock = MagicMock(return_value=False)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.get_known_host_entries": mock}):
comt = "Host is already absent"
ret.update({"comment": comt, "result": True})
assert ssh_known_hosts.absent(name, user) == ret
mock = MagicMock(return_value=True)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.get_known_host_entries": mock}):
with patch.dict(ssh_known_hosts.__opts__, {"test": True}):
comt = "Key for github.com is set to be" " removed from .ssh/known_hosts"
ret.update({"comment": comt, "result": None})
assert ssh_known_hosts.absent(name, user) == ret
with patch.dict(ssh_known_hosts.__opts__, {"test": False}):
result = {"status": "error", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.rm_known_host": mock}):
ret.update({"comment": "", "result": False})
assert ssh_known_hosts.absent(name, user) == ret
result = {"status": "removed", "error": "", "comment": "removed"}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.rm_known_host": mock}):
ret.update(
{
"comment": "removed",
"result": True,
"changes": {"new": None, "old": True},
}
)
assert ssh_known_hosts.absent(name, user) == ret

View file

@ -1,189 +0,0 @@
# -*- coding: utf-8 -*-
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
# Import Salt Libs
import salt.states.ssh_auth as ssh_auth
# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase
class SshAuthTestCase(TestCase, LoaderModuleMockMixin):
"""
Test cases for salt.states.ssh_auth
"""
def setup_loader_modules(self):
return {ssh_auth: {}}
# 'present' function tests: 1
def test_present(self):
"""
Test to verifies that the specified SSH key
is present for the specified user.
"""
name = "sshkeys"
user = "root"
source = "salt://ssh_keys/id_rsa.pub"
ret = {"name": name, "changes": {}, "result": True, "comment": ""}
mock = MagicMock(return_value="exists")
mock_data = MagicMock(side_effect=["replace", "new"])
with patch.dict(
ssh_auth.__salt__, {"ssh.check_key": mock, "ssh.set_auth_key": mock_data}
):
with patch.dict(ssh_auth.__opts__, {"test": True}):
comt = (
"The authorized host key sshkeys is already "
"present for user root"
)
ret.update({"comment": comt})
self.assertDictEqual(ssh_auth.present(name, user, source), ret)
with patch.dict(ssh_auth.__opts__, {"test": False}):
comt = "The authorized host key sshkeys " "for user root was updated"
ret.update({"comment": comt, "changes": {name: "Updated"}})
self.assertDictEqual(ssh_auth.present(name, user, source), ret)
comt = "The authorized host key sshkeys " "for user root was added"
ret.update({"comment": comt, "changes": {name: "New"}})
self.assertDictEqual(ssh_auth.present(name, user, source), ret)
# 'absent' function tests: 1
def test_absent(self):
"""
Test to verifies that the specified SSH key is absent.
"""
name = "sshkeys"
user = "root"
source = "salt://ssh_keys/id_rsa.pub"
ret = {"name": name, "changes": {}, "result": None, "comment": ""}
mock = MagicMock(
side_effect=["User authorized keys file not present", "Key removed"]
)
mock_up = MagicMock(side_effect=["update", "updated"])
with patch.dict(
ssh_auth.__salt__, {"ssh.rm_auth_key": mock, "ssh.check_key": mock_up}
):
with patch.dict(ssh_auth.__opts__, {"test": True}):
comt = "Key sshkeys for user root is set for removal"
ret.update({"comment": comt})
self.assertDictEqual(ssh_auth.absent(name, user, source), ret)
comt = "Key is already absent"
ret.update({"comment": comt, "result": True})
self.assertDictEqual(ssh_auth.absent(name, user, source), ret)
with patch.dict(ssh_auth.__opts__, {"test": False}):
comt = "User authorized keys file not present"
ret.update({"comment": comt, "result": False})
self.assertDictEqual(ssh_auth.absent(name, user, source), ret)
comt = "Key removed"
ret.update(
{"comment": comt, "result": True, "changes": {name: "Removed"}}
)
self.assertDictEqual(ssh_auth.absent(name, user, source), ret)
def test_manage(self):
"""
Test to verifies that the specified SSH key is absent.
"""
user = "root"
ret = {"name": "", "changes": {}, "result": None, "comment": ""}
mock_rm = MagicMock(
side_effect=["User authorized keys file not present", "Key removed"]
)
mock_up = MagicMock(side_effect=["update", "updated"])
mock_set = MagicMock(side_effect=["replace", "new"])
mock_keys = MagicMock(
return_value={
"somekey": {
"enc": "ssh-rsa",
"comment": "user@host",
"options": [],
"fingerprint": "b7",
}
}
)
with patch.dict(
ssh_auth.__salt__,
{
"ssh.rm_auth_key": mock_rm,
"ssh.set_auth_key": mock_set,
"ssh.check_key": mock_up,
"ssh.auth_keys": mock_keys,
},
):
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {"comment": "", "changes": {}, "result": None}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": True}):
# test: expected keys found. No chanages
self.assertDictEqual(
ssh_auth.manage("sshid", ["somekey"], user), ret
)
comt = "somekey Key set for removal"
ret.update({"comment": comt})
# test: unexpected sshkey found. Should be removed.
self.assertDictEqual(ssh_auth.manage("sshid", [], user), ret)
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {"comment": "", "changes": {}, "result": True}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": False}):
# expected keys found. No changes
ret = {"name": "", "changes": {}, "result": True, "comment": ""}
self.assertDictEqual(
ssh_auth.manage("sshid", ["somekey"], user), ret
)
with patch("salt.states.ssh_auth.absent") as call_mocked_absent:
mock_absent = {"comment": "Key removed"}
call_mocked_absent.return_value = mock_absent
ret.update(
{
"comment": "",
"result": True,
"changes": {"somekey": "Key removed"},
}
)
# unexpected sshkey found. Was removed.
self.assertDictEqual(
ssh_auth.manage("sshid", ["addkey"], user), ret
)
# add a key
with patch("salt.states.ssh_auth.present") as call_mocked_present:
mock_present = {
"comment": "The authorized host key newkey for user {} was added".format(
user
),
"changes": {"newkey": "New"},
"result": True,
}
call_mocked_present.return_value = mock_present
with patch.dict(ssh_auth.__opts__, {"test": False}):
# added key newkey
ret = {
"name": "",
"changes": {"newkey": "New"},
"result": True,
"comment": "",
}
self.assertDictEqual(
ssh_auth.manage("sshid", ["newkey", "somekey"], user), ret
)

View file

@ -1,161 +0,0 @@
# -*- coding: utf-8 -*-
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
import os
# Import Salt Libs
import salt.states.ssh_known_hosts as ssh_known_hosts
# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase
class SshKnownHostsTestCase(TestCase, LoaderModuleMockMixin):
"""
Test cases for salt.states.ssh_known_hosts
"""
def setup_loader_modules(self):
return {ssh_known_hosts: {}}
# 'present' function tests: 1
def test_present(self):
"""
Test to verifies that the specified host is known by the specified user.
"""
name = "github.com"
user = "root"
key = "16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48"
fingerprint = [key]
ret = {"name": name, "changes": {}, "result": False, "comment": ""}
with patch.dict(ssh_known_hosts.__opts__, {"test": True}):
with patch.object(os.path, "isabs", MagicMock(return_value=False)):
comt = 'If not specifying a "user", ' 'specify an absolute "config".'
ret.update({"comment": comt})
self.assertDictEqual(ssh_known_hosts.present(name), ret)
comt = 'Specify either "key" or "fingerprint", not both.'
ret.update({"comment": comt})
self.assertDictEqual(
ssh_known_hosts.present(name, user, key=key, fingerprint=[key]), ret
)
comt = 'Required argument "enc" if using "key" argument.'
ret.update({"comment": comt})
self.assertDictEqual(ssh_known_hosts.present(name, user, key=key), ret)
mock = MagicMock(side_effect=["exists", "add", "update"])
with patch.dict(ssh_known_hosts.__salt__, {"ssh.check_known_host": mock}):
comt = "Host github.com is already in .ssh/known_hosts"
ret.update({"comment": comt, "result": True})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
comt = "Key for github.com is set to be" " added to .ssh/known_hosts"
ret.update({"comment": comt, "result": None})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
comt = "Key for github.com is set to be " "updated in .ssh/known_hosts"
ret.update({"comment": comt})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
with patch.dict(ssh_known_hosts.__opts__, {"test": False}):
result = {"status": "exists", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
comt = "github.com already exists in .ssh/known_hosts"
ret.update({"comment": comt, "result": True})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
result = {"status": "error", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
ret.update({"comment": "", "result": False})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
result = {
"status": "updated",
"error": "",
"new": [{"fingerprint": fingerprint, "key": key}],
"old": "",
}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.set_known_host": mock}):
comt = "{0}'s key saved to .ssh/known_hosts (key: {1})".format(
name, key
)
ret.update(
{
"comment": comt,
"result": True,
"changes": {
"new": [{"fingerprint": fingerprint, "key": key}],
"old": "",
},
}
)
self.assertDictEqual(ssh_known_hosts.present(name, user, key=key), ret)
comt = "{0}'s key saved to .ssh/known_hosts (fingerprint: {1})".format(
name, fingerprint
)
ret.update({"comment": comt})
self.assertDictEqual(ssh_known_hosts.present(name, user), ret)
# 'absent' function tests: 1
def test_absent(self):
"""
Test to verifies that the specified host is not known by the given user.
"""
name = "github.com"
user = "root"
ret = {"name": name, "changes": {}, "result": False, "comment": ""}
with patch.object(os.path, "isabs", MagicMock(return_value=False)):
comt = 'If not specifying a "user", ' 'specify an absolute "config".'
ret.update({"comment": comt})
self.assertDictEqual(ssh_known_hosts.absent(name), ret)
mock = MagicMock(return_value=False)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.get_known_host_entries": mock}):
comt = "Host is already absent"
ret.update({"comment": comt, "result": True})
self.assertDictEqual(ssh_known_hosts.absent(name, user), ret)
mock = MagicMock(return_value=True)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.get_known_host_entries": mock}):
with patch.dict(ssh_known_hosts.__opts__, {"test": True}):
comt = (
"Key for github.com is set to be" " removed from .ssh/known_hosts"
)
ret.update({"comment": comt, "result": None})
self.assertDictEqual(ssh_known_hosts.absent(name, user), ret)
with patch.dict(ssh_known_hosts.__opts__, {"test": False}):
result = {"status": "error", "error": ""}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.rm_known_host": mock}):
ret.update({"comment": "", "result": False})
self.assertDictEqual(ssh_known_hosts.absent(name, user), ret)
result = {"status": "removed", "error": "", "comment": "removed"}
mock = MagicMock(return_value=result)
with patch.dict(ssh_known_hosts.__salt__, {"ssh.rm_known_host": mock}):
ret.update(
{
"comment": "removed",
"result": True,
"changes": {"new": None, "old": True},
}
)
self.assertDictEqual(ssh_known_hosts.absent(name, user), ret)