Reduce code duplication

Signed-off-by: Pedro Algarvio <palgarvio@vmware.com>
This commit is contained in:
Pedro Algarvio 2023-07-21 10:56:25 +01:00 committed by Pedro Algarvio
parent b5c19eb996
commit ae80dcddae
7 changed files with 101 additions and 134 deletions

View file

@ -0,0 +1,16 @@
import shutil
import pytest
from tests.support.pytest.formulas import SaltStackFormula
@pytest.fixture(scope="module")
def saltstack_formula(tmp_path_factory, base_env_state_tree_root_dir):
zipfiles_dir = tmp_path_factory.mktemp("fomulas-zips")
try:
yield SaltStackFormula.with_default_paths(
zipfiles_dir, base_env_state_tree_root_dir
)
finally:
shutil.rmtree(zipfiles_dir, ignore_errors=True)

View file

@ -1,47 +1,20 @@
"""
Tests using docker formula
"""
import shutil
from pathlib import Path
from zipfile import ZipFile
import pytest
import requests
import salt.utils.files
@pytest.fixture(scope="module")
def modules(loaders):
def _formula(saltstack_formula):
with saltstack_formula(name="docker-formula", tag="2.4.2") as formula:
yield formula
@pytest.fixture(scope="module")
def modules(loaders, _formula):
return loaders.modules
@pytest.fixture(scope="module")
def formula_tag():
return "2.4.2"
@pytest.fixture(scope="module")
def repo_url(formula_tag):
return f"https://github.com/saltstack-formulas/docker-formula/archive/refs/tags/v{formula_tag}.zip"
@pytest.fixture(scope="module", autouse=True)
def docker_repo(state_tree, base_env_state_tree_root_dir, formula_tag, repo_url):
local_filename = Path(repo_url.split("/")[-1])
zip_path = state_tree / local_filename
with requests.get(repo_url, allow_redirects=True, stream=True) as req:
req.raise_for_status()
with salt.utils.files.fopen(zip_path, "wb") as fho:
for chunk in req.iter_content(chunk_size=8192):
fho.write(chunk)
with ZipFile(zip_path) as zip_obj:
zip_obj.extractall(state_tree)
extract_path = state_tree / f"docker-formula-{formula_tag}"
shutil.move(extract_path / "docker", base_env_state_tree_root_dir)
return str(base_env_state_tree_root_dir)
def test_docker_formula(modules):
ret = modules.state.sls("docker", test=True)
for staterun in ret:

View file

@ -1,47 +1,20 @@
"""
Tests using nginx formula
"""
import shutil
from pathlib import Path
from zipfile import ZipFile
import pytest
import requests
import salt.utils.files
@pytest.fixture(scope="module")
def modules(loaders):
def _formula(saltstack_formula):
with saltstack_formula(name="nginx-formula", tag="2.8.1") as formula:
yield formula
@pytest.fixture(scope="module")
def modules(loaders, _formula):
return loaders.modules
@pytest.fixture(scope="module")
def formula_tag():
return "2.8.1"
@pytest.fixture(scope="module")
def repo_url(formula_tag):
return f"https://github.com/saltstack-formulas/nginx-formula/archive/refs/tags/v{formula_tag}.zip"
@pytest.fixture(scope="module", autouse=True)
def nginx_repo(state_tree, base_env_state_tree_root_dir, formula_tag, repo_url):
local_filename = Path(repo_url.split("/")[-1])
zip_path = state_tree / local_filename
with requests.get(repo_url, allow_redirects=True, stream=True) as req:
req.raise_for_status()
with salt.utils.files.fopen(zip_path, "wb") as fho:
for chunk in req.iter_content(chunk_size=8192):
fho.write(chunk)
with ZipFile(zip_path) as zip_obj:
zip_obj.extractall(state_tree)
extract_path = state_tree / f"nginx-formula-{formula_tag}"
shutil.move(extract_path / "nginx", base_env_state_tree_root_dir)
return str(base_env_state_tree_root_dir)
def test_formula(modules):
ret = modules.state.sls("nginx", test=True)
for staterun in ret:

View file

@ -1,47 +1,21 @@
"""
Tests using salt formula
"""
import shutil
from pathlib import Path
from zipfile import ZipFile
import pytest
import requests
import salt.utils.files
@pytest.fixture(scope="module")
def modules(loaders):
def _formula(saltstack_formula):
with saltstack_formula(name="salt-formula", tag="1.12.0") as formula:
yield formula
@pytest.fixture(scope="module")
def modules(loaders, _formula):
return loaders.modules
@pytest.fixture(scope="module")
def formula_tag():
return "1.12.0"
@pytest.fixture(scope="module")
def repo_url(formula_tag):
return f"https://github.com/saltstack-formulas/salt-formula/archive/refs/tags/v{formula_tag}.zip"
@pytest.fixture(scope="module", autouse=True)
def salt_repo(state_tree, base_env_state_tree_root_dir, formula_tag, repo_url):
local_filename = Path(repo_url.split("/")[-1])
zip_path = state_tree / local_filename
with requests.get(repo_url, allow_redirects=True, stream=True) as req:
req.raise_for_status()
with salt.utils.files.fopen(zip_path, "wb") as fho:
for chunk in req.iter_content(chunk_size=8192):
fho.write(chunk)
with ZipFile(zip_path) as zip_obj:
zip_obj.extractall(state_tree)
extract_path = state_tree / f"salt-formula-{formula_tag}"
shutil.move(extract_path / "salt", base_env_state_tree_root_dir)
return str(base_env_state_tree_root_dir)
def test_salt_formula(modules):
# Master Formula
ret = modules.state.sls("salt.master", test=True)

View file

@ -1,47 +1,21 @@
"""
Tests using users formula
"""
import shutil
from pathlib import Path
from zipfile import ZipFile
import pytest
import requests
import salt.utils.files
@pytest.fixture(scope="module")
def modules(loaders):
def _formula(saltstack_formula):
with saltstack_formula(name="users-formula", tag="0.48.8") as formula:
yield formula
@pytest.fixture(scope="module")
def modules(loaders, _formula):
return loaders.modules
@pytest.fixture(scope="module")
def formula_tag():
return "0.48.8"
@pytest.fixture(scope="module")
def repo_url(formula_tag):
return f"https://github.com/saltstack-formulas/users-formula/archive/refs/tags/v{formula_tag}.zip"
@pytest.fixture(scope="module", autouse=True)
def users_repo(state_tree, base_env_state_tree_root_dir, formula_tag, repo_url):
local_filename = Path(repo_url.split("/")[-1])
zip_path = state_tree / local_filename
with requests.get(repo_url, allow_redirects=True, stream=True) as req:
req.raise_for_status()
with salt.utils.files.fopen(zip_path, "wb") as fho:
for chunk in req.iter_content(chunk_size=8192):
fho.write(chunk)
with ZipFile(zip_path) as zip_obj:
zip_obj.extractall(state_tree)
extract_path = state_tree / f"users-formula-{formula_tag}"
shutil.move(extract_path / "users", base_env_state_tree_root_dir)
return str(base_env_state_tree_root_dir)
def test_users_formula(modules):
# sudo
ret = modules.state.sls("users.sudo", test=True)

View file

@ -34,6 +34,7 @@ import types
import attr
import pytest
import requests
import tornado.ioloop
import tornado.web
from pytestshellutils.exceptions import ProcessFailed
@ -1896,3 +1897,15 @@ class Keys:
def __exit__(self, *_):
shutil.rmtree(str(self.priv_path.parent), ignore_errors=True)
@pytest.helpers.register
def download_file(url, dest, auth=None):
# NOTE the stream=True parameter below
with requests.get(url, allow_redirects=True, stream=True, auth=auth) as r:
r.raise_for_status()
with salt.utils.files.fopen(dest, "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
return dest

View file

@ -0,0 +1,44 @@
import functools
import pathlib
import shutil
import zipfile
import attr
import pytest
@attr.s(slots=True, frozen=True)
class SaltStackFormula:
"""
Class representing a saltstack formula.
"""
name: str = attr.ib()
tag: str = attr.ib()
tmp_path: pathlib.Path = attr.ib()
state_tree_path: pathlib.Path = attr.ib()
url: str = attr.ib()
@url.default
def _default_url(self):
return f"https://github.com/saltstack-formulas/{self.name}/archive/refs/tags/v{self.tag}.zip"
def __enter__(self):
target_path = self.state_tree_path / f"{self.name}-{self.tag}"
if not target_path.exists():
zipfile_path = pytest.helpers.download_file(
self.url, self.tmp_path / self.url.split("/")[-1]
)
with zipfile.ZipFile(zipfile_path) as zip_obj:
zip_obj.extractall(self.tmp_path)
shutil.move(self.tmp_path / f"{self.name}-{self.tag}", target_path)
return self
def __exit__(self, *_):
pass
@classmethod
def with_default_paths(cls, tmp_path, state_tree_path):
return functools.partial(
cls, tmp_path=tmp_path, state_tree_path=state_tree_path
)