Commit e1ecca03 authored by Mathieu Coupé's avatar Mathieu Coupé
Browse files

Merge branch...

Merge branch '7-invalid-type-for-arguments-of-pipelines-keep-per-mr-and-pipelines-keep-per-tag' into 'main'

Resolve "Invalid type for arguments of --pipelines-keep-per-mr and --pipelines-keep-per-tag"

Closes #6 and #7

See merge request to-be-continuous/tools/gitlab-butler!32
parents 84d1157f a9ca070b
Loading
Loading
Loading
Loading
+27 −16
Original line number Diff line number Diff line
@@ -17,8 +17,7 @@ LOGGER = Logger(__name__)
def to_url(api_url: str) -> str:
    return api_url[0:-7] if api_url.endswith("/api/v4") else api_url


def run() -> None:
def generate_parser():
    # define command parser
    parser = argparse.ArgumentParser(
        prog="gitlab-butler",
@@ -96,13 +95,13 @@ def run() -> None:
    )
    parser.add_argument(
        "--pipelines-keep-per-tag",
        type=str,
        type=int,
        default=int(os.getenv("PIPELINES_KEEP_PER_TAG", "5")),
        help="number of pipelines to keep per tag (⚠ tag MUST still exist)",
    )
    parser.add_argument(
        "--pipelines-keep-per-mr",
        type=str,
        type=int,
        default=int(os.getenv("PIPELINES_KEEP_PER_MR", "1")),
        help="number of pipelines to keep per merge request (⚠ MR MUST still exist)",
    )
@@ -112,6 +111,26 @@ def run() -> None:
        default=int(os.getenv("PIPELINES_DELETE_OLDER_THAN", "30")),
        help="max age (in days) after which pipelines are deleted (unless they are kept by a keep rule)",
    )
    return parser

def generate_cfg(args):
    # build default config
    cfg = ButlerCfg()
    cfg.pipelines.delete_older_than = args.pipelines_delete_older_than
    cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag
    cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr
    if args.pipelines_keep_per_branch:
        cfg.pipelines.keep.per_branch.by_name = {
            branch: int(n)
            for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch]
        }
    if args.verbose:
        print(f"Default configuration: {cfg}")
    return cfg

def run() -> None:
    # build parser
    parser = generate_parser()

    # parse command and args
    args = parser.parse_args()
@@ -169,18 +188,8 @@ def run() -> None:
    )
    print()

    # build default config
    cfg = ButlerCfg()
    cfg.pipelines.delete_older_than = args.pipelines_delete_older_than
    cfg.pipelines.keep.per_tag.any_tag = args.pipelines_keep_per_tag
    cfg.pipelines.keep.per_merge_request.any_mr = args.pipelines_keep_per_mr
    if args.pipelines_keep_per_branch:
        cfg.pipelines.keep.per_branch = {
            branch: int(n)
            for (branch, n) in [b.split(":") for b in args.pipelines_keep_per_branch]
        }
    if args.verbose:
        print(f"Default configuration: {cfg}")
    # build configuration from args
    cfg = generate_cfg(args)

    butler = Butler(
        Gitlab(
@@ -223,3 +232,5 @@ def run() -> None:

    if len(butler.errors) > 0:
        exit(128)

+70 −0
Original line number Diff line number Diff line
from gitlab_butler.butlercfg import ButlerCfg
from gitlab_butler.main import generate_cfg, generate_parser


class TestButlerCfg:

    def validate_cfg(self, cfg):
        """
        Validate configuration
        :param cfg:
        :return:
        """
        assert isinstance(cfg, ButlerCfg)
        assert isinstance(cfg.enabled, bool)
        assert isinstance(cfg.pipelines, ButlerCfg.PipelinesCfg)
        assert isinstance(cfg.pipelines.enabled, bool)
        assert isinstance(cfg.pipelines.keep, ButlerCfg.PipelinesCfg.KeepCfg)
        assert isinstance(cfg.pipelines.delete_older_than, int)

        # branches
        assert isinstance(cfg.pipelines.keep.per_branch.enabled, bool)
        assert isinstance(cfg.pipelines.keep.per_branch.default_branch, int)
        assert isinstance(cfg.pipelines.keep.per_branch.protected_branches, int)
        assert isinstance(cfg.pipelines.keep.per_branch.any_branch, int)
        assert isinstance(cfg.pipelines.keep.per_branch.by_name, dict)

        # tags
        assert isinstance(cfg.pipelines.keep.per_tag.enabled, bool)
        assert isinstance(cfg.pipelines.keep.per_tag.any_tag, int)
        assert isinstance(cfg.pipelines.keep.per_tag.by_name, dict)

        # mr
        assert isinstance(cfg.pipelines.keep.per_merge_request.enabled, bool)
        assert isinstance(cfg.pipelines.keep.per_merge_request.any_mr, int)
        assert isinstance(cfg.pipelines.keep.per_merge_request.by_status, dict)

    def test_default_cfg(self):
            cfg = ButlerCfg()
            self.validate_cfg(cfg)

    def test_cfg_with_values(self):
            cfg = ButlerCfg()
            cfg.pipelines.delete_older_than = 10
            cfg.pipelines.keep.per_tag.any_tag = 10
            cfg.pipelines.keep.per_merge_request.any_mr = 10
            self.validate_cfg(cfg)

    def test_build_cfg_from_default_args(self):
        cfg = generate_cfg(generate_parser().parse_args([]))
        self.validate_cfg(cfg)

    def test_build_cfg_from_args_keep_pipelines_per_branch(self):
        cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10']))
        self.validate_cfg(cfg)
        assert cfg.pipelines.keep.per_branch.by_name == {'main': 10}

        cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-branch', 'main:10', '--pipelines-keep-per-branch', 'master:5']))
        self.validate_cfg(cfg)
        assert cfg.pipelines.keep.per_branch.by_name == {'main': 10, 'master': 5}

    def test_build_cfg_from_args_keep_pipelines_per_tag(self):
        cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-tag', '5']))
        self.validate_cfg(cfg)
        assert cfg.pipelines.keep.per_tag.any_tag == 5

    def test_build_cfg_from_args_keep_pipelines_per_mr(self):
        cfg = generate_cfg(generate_parser().parse_args(['--pipelines-keep-per-mr', '5']))
        self.validate_cfg(cfg)
        assert cfg.pipelines.keep.per_merge_request.any_mr == 5