import importlib.util import tarfile from pathlib import Path import pytest spec = importlib.util.spec_from_file_location("build_slice", Path(__file__).parents[1] / "build-slice.py") bs = importlib.util.module_from_spec(spec) spec.loader.exec_module(bs) def put(root: Path, rel: str, text: str): p = root / rel p.parent.mkdir(parents=True, exist_ok=True) p.write_text(text) @pytest.fixture def repo(tmp_path): put(tmp_path, "clusters/a/kustomization.yaml", "resources:\n - ./flux-system\n - ./layers.yaml\n") put(tmp_path, "clusters/a/flux-system/kustomization.yaml", "resources:\n - gotk-sync.yaml\n") put(tmp_path, "clusters/a/flux-system/gotk-sync.yaml", "apiVersion: kustomize.toolkit.fluxcd.io/v1\nkind: Kustomization\nspec:\n path: ./clusters/a\n") put(tmp_path, "clusters/a/layers.yaml", "apiVersion: kustomize.toolkit.fluxcd.io/v1\nkind: Kustomization\nspec:\n path: ./layers/a/00-vault\n") put(tmp_path, "layers/a/00-vault/kustomization.yaml", "resources:\n - ../../../infrastructure/vault/contour-template\n") put(tmp_path, "infrastructure/vault/contour-template/kustomization.yaml", "resources:\n - ../base\npatches:\n - path: vault.yaml\n") put(tmp_path, "infrastructure/vault/contour-template/vault.yaml", "kind: HelmRelease\n") put(tmp_path, "infrastructure/vault/base/kustomization.yaml", "resources:\n - helmrelease.yaml\n") put(tmp_path, "infrastructure/vault/base/helmrelease.yaml", "kind: HelmRelease\n") put(tmp_path, "infrastructure/vault/base/unused.yaml", "kind: ConfigMap\n") put(tmp_path, "infrastructure/vault/uralkal/kustomization.yaml", "resources:\n - ../base\n") put(tmp_path, "clusters/b/kustomization.yaml", "resources:\n - ../../infrastructure/vault/uralkal\n") return tmp_path def test_slice_follows_flux_paths_and_skips_foreign(repo): files, entries = bs.collect(repo, "clusters/a") names = {str(f) for f in files} assert "infrastructure/vault/base/helmrelease.yaml" in names assert "infrastructure/vault/contour-template/vault.yaml" in names assert "layers/a/00-vault/kustomization.yaml" in names assert not any("uralkal" in n or n.startswith("clusters/b") for n in names) assert "infrastructure/vault/base/unused.yaml" not in names assert entries == ["clusters/a", "layers/a/00-vault"] def test_remote_reference_stops_build(repo): put(repo, "clusters/a/kustomization.yaml", "resources:\n - https://github.com/x/y//z\n") with pytest.raises(bs.SliceError, match="удалённая ссылка"): bs.collect(repo, "clusters/a") def test_dangling_reference_stops_build(repo): put(repo, "clusters/a/kustomization.yaml", "resources:\n - ./missing.yaml\n") with pytest.raises(bs.SliceError, match="никуда не ведёт"): bs.collect(repo, "clusters/a") def test_tar_is_byte_identical_across_runs(repo, tmp_path_factory): files, _ = bs.collect(repo, "clusters/a") out1 = tmp_path_factory.mktemp("o") / "s.tar" out2 = tmp_path_factory.mktemp("o") / "s.tar" bs.write_tar(repo, files, out1) (repo / "clusters/a/layers.yaml").touch() bs.write_tar(repo, files, out2) assert out1.read_bytes() == out2.read_bytes() with tarfile.open(out1) as t: assert all(m.mtime == 0 for m in t.getmembers()) pspec = importlib.util.spec_from_file_location("publish_slices", Path(__file__).parents[1] / "publish-slices.py") ps = importlib.util.module_from_spec(pspec) pspec.loader.exec_module(ps) def test_only_installer_contours_are_connected(tmp_path): put(tmp_path, "clusters/stand/flux-system/gotk-sync.yaml", f"apiVersion: source.toolkit.fluxcd.io/v1\nkind: GitRepository\nspec:\n url: {ps.INSTALLER_GITEA_URL}\n") put(tmp_path, "clusters/vad/flux-system/gotk-sync.yaml", "apiVersion: source.toolkit.fluxcd.io/v1\nkind: GitRepository\nspec:\n url: http://192.168.8.141:31361/infra/iac.git\n") put(tmp_path, "clusters/old/flux-system/gotk-sync.yaml", "apiVersion: source.toolkit.fluxcd.io/v1\nkind: GitRepository\nspec:\n url: https://gitlab.sarex.io/infra/iac.git\n") assert ps.connected_contours(tmp_path) == ["stand"]