diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3693c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/mrack-1.10.0.tar.gz +/mrack-1.11.0.tar.gz +/mrack-1.12.0.tar.gz +/mrack-1.12.1.tar.gz +/mrack-1.12.2.tar.gz +/mrack-1.12.3.tar.gz +/mrack-1.13.1.tar.gz +/mrack-1.13.3.tar.gz +/mrack-1.14.0.tar.gz +/mrack-1.14.1.tar.gz +/mrack-1.15.0.tar.gz +/mrack-1.15.1.tar.gz +/mrack-1.16.0.tar.gz +/mrack-1.17.0.tar.gz diff --git a/.packit.yaml b/.packit.yaml new file mode 100644 index 0000000..83f3dee --- /dev/null +++ b/.packit.yaml @@ -0,0 +1,153 @@ +--- +# See the documentation for more information: +# https://packit.dev/docs/configuration/ +specfile_path: mrack.spec + +# add or remove files that should be synced +files_to_sync: + - mrack.spec + - README.md + - .packit.yaml + - gating.yaml + - ci.fmf +# we need to sync tmt for TF to work in Fedora updates + - src: ./tests/smoke/* + dest: ./tests/smoke/ + - src: ./plans/* + dest: ./plans/ + +# Allow dist git reactions on packit and tdudlak commits and PRs +allowed_pr_authors: + - packit + - tdudlak +allowed_committers: + - packit + - tdudlak + +# name in upstream package repository/registry (e.g. in PyPI) +upstream_package_name: mrack +# downstream (Fedora) RPM package name +downstream_package_name: mrack +# mrack uses tag v(ver_number) and we need to make sure packit know what to expect +# see: https://packit.dev/docs/configuration/#upstream_tag_template +upstream_tag_template: "v{version}" + +sync_changelog: true + +actions: + create-archive: + - "python3 setup.py sdist --dist-dir ." + - "sh -c 'echo mrack-$(python3 setup.py --version).tar.gz'" + get-current-version: + - "python3 setup.py --version" + +jobs: + - job: copr_build + trigger: pull_request + release_suffix: "99.dev.{PACKIT_PROJECT_BRANCH}" + targets: [fedora-all, epel-8, epel-9] + + - job: tests + trigger: pull_request + identifier: "upstream-smoke" + targets: [fedora-all, epel-8, epel-9] + + - job: copr_build + trigger: commit + targets: [fedora-all, epel-8, epel-9] + + - job: copr_build + trigger: release + owner: "@freeipa" + project: neoave + targets: [fedora-all, epel-8, epel-9] + + - job: propose_downstream + trigger: release + dist_git_branches: [fedora-all, epel-8, epel-9] + + - job: koji_build + trigger: commit + dist_git_branches: [fedora-all, epel-8, epel-9] + + - job: bodhi_update + trigger: commit + dist_git_branches: [fedora-branched, epel-8, epel-9] # rawhide updates are created automatically + +# # pr_osp +# - &internal_test # use openstack (osp) tests as template for other test cases +# job: tests +# fmf_url: "https://gitlab.cee.redhat.com/idm-ops/mrack-internal-tests" +# fmf_ref: "main" +# use_internal_tf: True +# targets: [fedora-latest-stable] +# identifier: "internal-provisioning-osp" +# trigger: pull_request +# env: +# MRACK_TEST_CASE: "provisioning-osp" + +# - &pr_aws +# <<: *internal_test +# identifier: "internal-provisioning-aws" +# env: +# MRACK_TEST_CASE: "provisioning-aws" + +# - &pr_bkr_cpu +# <<: *internal_test +# identifier: "internal-provisioning-bkr-c9s-req1cpu" +# env: +# MRACK_TEST_CASE: "provisioning-bkr-c9s-req1cpu" + +# - &pr_bkr_ppc64le +# <<: *internal_test +# identifier: "internal-provisioning-bkr-fedora-ppc64le" +# env: +# MRACK_TEST_CASE: "provisioning-bkr-fedora-ppc64le" + +# - &pr_bkr_mem_cpu +# <<: *internal_test +# identifier: "internal-provisioning-bkr-rhel-8-req-2048mem-2cpu" +# env: +# MRACK_TEST_CASE: "provisioning-bkr-rhel-8-req-2048mem-2cpu" + +# - &pr_bkr_mem +# <<: *internal_test +# identifier: "internal-provisioning-bkr-rhel-9-req-4069mem" +# env: +# MRACK_TEST_CASE: "provisioning-bkr-rhel-9-req-4069mem" + +# - &pr_mrack_all_ssh +# <<: *internal_test +# identifier: "internal-all-providers-ssh" +# trigger: pull_request +# env: +# MRACK_TEST_CASE: "all-providers-ssh" + +# # run the same internal tests as in PR for commit in main +# - &main_osp +# <<: *internal_test # pr_osp +# trigger: commit + +# - &main_aws +# <<: *pr_aws +# trigger: commit + +# - &main_bkr_ppc64le +# <<: *pr_bkr_ppc64le +# trigger: commit + +# - &main_bkr_cpu +# <<: *pr_bkr_cpu +# trigger: commit + +# - &main_bkr_mem_cpu +# <<: *pr_bkr_mem_cpu +# trigger: commit + +# - &main_bkr_mem +# <<: *pr_bkr_mem +# trigger: commit + +# - &main_mrack_all_ssh +# <<: *pr_mrack_all_ssh +# trigger: commit diff --git a/README.md b/README.md index 3b5b028..1b411e6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,304 @@ # mrack -The mrack package +![pypi_badge](https://img.shields.io/pypi/v/mrack?label=PyPI&logo=pypi) ![readthedocs_badge](https://img.shields.io/readthedocs/mrack?label=Read%20the%20Docs&logo=read-the-docs) ![badge](https://copr.fedorainfracloud.org/coprs/g/freeipa/neoave/package/mrack/status_image/last_build.png) + +Provisioning library for CI and local multi-host testing supporting multiple +provisioning providers (OpenStack, AWS, libvirt, podman containers, Beaker). + +But in comparison to multi-cloud libraries, the aim is to be able to describe +host from application perspective. E.g.: + +```yaml +network: IPv4 +hosts: +- name: master.testdomain.test + role: master + group: ipaserver + os: fedora-31 +- name: client.testdomain.test + role: client + group: ipaclient + os: fedora-30 +``` + +This is then combined with provisioning configuration where each provider has +defined meaning for `role`, `group`, `os` params which e.g. translates to +flavors, images, ... + +```yaml +provider: openstack # default provider +openstack: + images: + fedora-30: Fedora-Cloud-Base-30-compose-latest + fedora-31: Fedora-Cloud-Base-31 + flavors: + ipaserver: ci.m1.medium + ipaclient: ci.m1.micro + networks: + IPv4: net_ci_4 + IPv6: net_ipv6_only + dual: net_cci_4_6 + keypair: ipa_key +beaker: + distros: + fedora-30: FEDORA-30% + fodora-31: FEDORA-31% +``` + +So then user can quickly change provisioning location just by changing provider +name without needing to redefine the provider/cloud specifics. This is +especially useful for a lot of jobs sharing the same app specific provisioner +configuration. + +```yaml +provider: beaker +``` + +Or each host can use a different provider: + +```yaml +hosts: +- name: master.testdomain.test + role: master + group: ipaserver + os: fedora-31 + provider: openstack + network: dual +- name: client.testdomain.test + role: client + group: ipaclient + os: fedora-30 + provider: beaker +``` + +The output is then Ansible inventory with correct group mapping and information +which allows to SSH to the machines. + +```yaml +all: + children: + ipaserver: + hosts: + f30-1.mrack.test: {} + f33-2.mrack.test: {} + hosts: + f30-1.mrack.test: + ansible_host: 10.0.154.21 + ansible_python_interpreter: /usr/bin/python3 + ansible_ssh_private_key_file: config/id_rsa + ansible_user: fedora + meta_dc_record: DC=mrack,DC=test + meta_domain: mrack.test + meta_fqdn: f30-1.mrack.test + meta_ip: 10.0.154.21 + meta_os: fedora-30 + meta_provider_id: 7c3c28f9-4674-4f7f-b413-00bc0b00d711 + meta_restraint_id: 9 + meta_role: master + f33-2.mrack.test: + ansible_host: ec2-13-15-16-1.eu-central-1.compute.amazonaws.com + ansible_python_interpreter: /usr/bin/python3 + ansible_ssh_private_key_file: config/id_rsa + ansible_user: fedora + meta_dc_record: DC=mrack,DC=test + meta_domain: mrack.test + meta_fqdn: f33-2.mrack.test + meta_ip: 13.15.16.1 + meta_os: fedora-33 + meta_provider_id: i-08c0d4a86c4b7f7ef + meta_restraint_id: 1 + meta_role: master +``` + +## Installation + +mrack can be installed via pip, from [PyPI](https://pypi.org/project/mrack/): + +``` +pip install mrack +``` + +It is also available for Fedora 32+ via [COPR](https://copr.fedorainfracloud.org/coprs/g/freeipa/neoave/package/mrack/): + +``` +# enable the copr at your system +sudo dnf copr enable @freeipa/neoave + +# install mrack package with all supported providers and cli +sudo dnf install mrack + +# install mrack command and e.g. AWS provider +sudo dnf install mrack-cli python3-mrack-aws + +# install mrack library to be later used as an import with support of OpenStack provider: +sudo dnf install python3-mrack-openstack + +``` +--- +**NOTE** + +Above command will install `mrack` package which depends on (contains) following packages: +- mrack-cli +- python3-mracklib +- python3-mrack-aws +- python3-mrack-beaker +- python3-mrack-openstack +- python3-mrack-podman +- python3-mrack-virt + +The `python3-mracklib` is mandatory as it contains core mrack library. +To install only some of `mrack` providers you should install `python3-mrack-{provider_name}`. +To install mrack command a package `mrack-cli` is required. + +--- + +## Run mrack + +In order to use the mrack utility a mrack.conf (e.g. [mrack.conf] from the repository(repo/blob/main/src/mrack/data/mrack.conf)) is needed. + +mrack looks for the config file in following order: +- `./` actual directory +- `~/.mrack/` home directory +- `/etc/mrack/` system directory + +Values from the configuration file could be overriden using mrack utility +options `--mrack-config` `--provisioning-config` `--db` (for more see `mrack --help`). +``` +Usage: mrack [OPTIONS] COMMAND [ARGS]... + + Multihost human friendly provisioner. + +Options: + -c, --mrack-config PATH + -p, --provisioning-config PATH + -d, --db PATH + --debug + --help Show this message and exit. + +Commands: + destroy Destroy provisioned hosts. + list List host tracked by. + output Create outputs - such as Ansible inventory. + ssh SSH to host. + up Provision hosts. +``` + +### Provisioning with mrack + +To provision system from the metadata.yaml either run: +``` +mrack up +``` +or use `up` command's option `--metadata`/`-m` to override path to the metadata file. +``` +mrack up --metadata other-metadata.yaml +``` + +To return resources using mrack run: +``` +mrack destroy +``` +or use `destroy` command's option `--metadata`/`-m` to override path to the metadata file. +``` +mrack destroy --metadata other-metadata.yaml +``` + +### mrack as python library + +```python +# first set up authentication for each provider +# $ export AWS_CONFIG_FILE=`readlink -f ./aws.key` +from mrack.providers import providers +# import all supported providers: +from mrack.providers.aws import PROVISIONER_KEY as AWS +from mrack.providers.aws import AWSProvider +from mrack.providers.beaker import PROVISIONER_KEY as BEAKER +from mrack.providers.beaker import BeakerProvider +from mrack.providers.openstack import PROVISIONER_KEY as OPENSTACK +from mrack.providers.openstack import OpenStackProvider +from mrack.providers.podman import PROVISIONER_KEY as PODMAN +from mrack.providers.podman import PodmanProvider +from mrack.providers.static import PROVISIONER_KEY as STATIC +from mrack.providers.static import StaticProvider +from mrack.providers.virt import PROVISIONER_KEY as VIRT +from mrack.providers.virt import VirtProvider + +# register all supported providers: +providers.register(AWS, AWSProvider) +providers.register(OPENSTACK, OpenStackProvider) +providers.register(BEAKER, BeakerProvider) +providers.register(PODMAN, PodmanProvider) +providers.register(STATIC, StaticProvider) +providers.register(VIRT, VirtProvider) + + +# use global context class +import mrack +global_context = mrack.context.global_context + +# init global context with paths to files +mrack_config = "mrack.conf" +provisioning_config = "provisioning-config.yaml" +db_file = "mrackdb.json" +global_context.init(mrack_config, provisioning_config, db_file) + +# load the metadata to global_context +metadata = "./metadata-f34.yaml" +global_context.init_metadata(metadata) + +# pick default provider: +provider = "aws" + +# create Up action + +from mrack.actions.up import Up + +up_action = Up() +await up_action.init(provider) + +# provision machines: +await up_action.provision() + +# store the output to db or just use the db later on +from mrack.actions.output import Output +output_action = Output() +await output_action.generate_outputs() + +# work with machines... + +# cleanup the machines: +from mrack.actions.destroy import Destroy +destroy_action = Destroy() +await destroy_action.destroy() +``` + +## Contribute + +Projects is using [black](https://github.com/psf/black) formater and [isort](https://github.com/PyCQA/isort) to keep consistent +formatting, [flake8](https://flake8.pycqa.org/en/latest/) and +[pydocstyle](http://pycodestyle.pycqa.org/en/latest/intro.html) to ensure following +Python good practices. + +Contributions (Pull Requests) are welcome. It is expected that they will pass tox tests and code checkers. +Inclusion of the unit tests for the new code is recommended. +Because of that we have configured [pre-commit](https://pre-commit.com/) hook. +Please enable the feature on your local system and use it before sending a patch. +It could save us lot of re-pushing to the PR. + +### Black formatting and isort +Expected formatting can be achieved by running: +``` +$ make format +``` + +Look into [black](https://github.com/psf/black) documentation for possible integration +in editors/IDEs. + +### Testing +Just run tox to execute all tests and linters + +``` +$ tox +# or use make +$ make test +``` diff --git a/README.packit b/README.packit new file mode 100644 index 0000000..2a3acd4 --- /dev/null +++ b/README.packit @@ -0,0 +1,3 @@ +This repository is maintained by packit. +https://packit.dev/ +The file was generated using packit 0.84.0. diff --git a/ci.fmf b/ci.fmf new file mode 100644 index 0000000..c5aa0e0 --- /dev/null +++ b/ci.fmf @@ -0,0 +1 @@ +resultsdb-testcase: separate diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..ad8f991 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,10 @@ +--- !Policy +product_versions: + - fedora-* + - epel-8 + - epel-9 +decision_contexts: + - bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/tests.functional} diff --git a/mrack.spec b/mrack.spec new file mode 100644 index 0000000..5411d19 --- /dev/null +++ b/mrack.spec @@ -0,0 +1,409 @@ +Name: mrack +Version: 1.17.0 +Release: 1%{?dist} +Summary: Multicloud use-case based multihost async provisioner + +License: Apache-2.0 +URL: https://github.com/neoave/mrack +Source0: %{URL}/releases/download/v%{version}/%{name}-%{version}.tar.gz +BuildArch: noarch + +BuildRequires: python3-devel +BuildRequires: python3-click +BuildRequires: python3-pyyaml +BuildRequires: python3-setuptools + +# coma separated list of provider plugins +%global provider_plugins aws,beaker,openstack,podman,virt + +Requires: %{name}-cli = %{version}-%{release} +Requires: python3-%{name}lib = %{version}-%{release} +Requires: python3-%{name}-aws = %{version}-%{release} +Requires: python3-%{name}-beaker = %{version}-%{release} +Requires: python3-%{name}-openstack = %{version}-%{release} +Requires: python3-%{name}-podman = %{version}-%{release} +Requires: python3-%{name}-virt = %{version}-%{release} + +# We filter out the asyncopenstackclient dependency of this package +# so it is not forcing installation of missing dependencies in Fedora +# Once python3-AsyncOpenStackClient is in fedora we can drop this line +%global __requires_exclude asyncopenstackclient +%{?python_disable_dependency_generator} + +%description +mrack is a provisioning tool and a library for CI and local multi-host +testing supporting multiple provisioning providers (e.g. AWS, Beaker, +Openstack). But in comparison to other multi-cloud libraries, +the aim is to be able to describe host from application perspective. + +%package cli +Summary: Command line interface for mrack +Requires: python3-%{name}lib = %{version}-%{release} +Requires: python3-click + +%package -n python3-%{name}lib +Summary: Core mrack libraries +Requires: python3-pyyaml +Recommends: python3-gssapi +Requires: sshpass + +%{?python_provide:%python_provide python3-%{name}lib} + +%package -n python3-%{name}-aws +Summary: AWS provider plugin for mrack +Requires: python3-%{name}lib = %{version}-%{release} +Requires: python3-boto3 +Requires: python3-botocore + +%{?python_provide:%python_provide python3-%{name}-aws} + + +%package -n python3-%{name}-beaker +Summary: Beaker provider plugin for mrack +Requires: python3-%{name}lib = %{version}-%{release} +%if 0%{?rhel} == 8 +# c8s has missing beaker-client package +Recommends: beaker-client +%else +Requires: beaker-client +%endif + +%{?python_provide:%python_provide python3-%{name}-beaker} + + +%package -n python3-%{name}-openstack +Summary: Openstack provider plugin for mrack +Requires: python3-%{name}lib = %{version}-%{release} +Recommends: python3-aiofiles +Recommends: python3-os-client-config +Recommends: python3-AsyncOpenStackClient + +%{?python_provide:%python_provide python3-%{name}-openstack} + + +%package -n python3-%{name}-podman +Summary: Podman provider plugin for mrack +Requires: python3-%{name}lib = %{version}-%{release} +Requires: podman + +%{?python_provide:%python_provide python3-%{name}-podman} + +%package -n python3-%{name}-virt +Summary: Virtualization provider plugin for mrack using testcloud +Requires: python3-%{name}lib = %{version}-%{release} +Requires: testcloud + +%{?python_provide:%python_provide python3-%{name}-virt} + +%description cli +%{name}-cli contains mrack command which functionality +can be extended by installing mrack plugins + +%description -n python3-%{name}lib +python3-%{name}lib contains core mrack functionalities +and static provider which can be used as a library + +%description -n python3-%{name}-aws +%{name}-aws is an additional plugin with AWS provisioning +library extending mrack package + +%description -n python3-%{name}-beaker +%{name}-beaker is an additional plugin with Beaker provisioning +library extending mrack package + +%description -n python3-%{name}-openstack +%{name}-openstack is an additional plugin with OpenStack provisioning +library extending mrack package + +%description -n python3-%{name}-podman +%{name}-podman is an additional plugin with Podman provisioning +library extending mrack package + +%description -n python3-%{name}-virt +%{name}-virt is an additional plugin with Virualization provisioning +library extending mrack package using testcloud + +%prep +%autosetup -p1 -n %{name}-%{version} +# Remove bundled egg-info +rm -r src/%{name}.egg-info + +%build +%py3_build + +%install +%py3_install + +%files +%license LICENSE +%doc README.md +%doc CHANGELOG.md + +%files cli +# the mrack man page RFE: https://github.com/neoave/mrack/issues/197 +%license LICENSE +%doc README.md +%doc CHANGELOG.md +%{_bindir}/%{name} +%{python3_sitelib}/%{name}/{,__pycache__/}run.* + +%files -n python3-%{name}lib +%license LICENSE +%doc README.md +%doc CHANGELOG.md +%{python3_sitelib}/%{name} +%{python3_sitelib}/%{name}-%{version}-py%{python3_version}.egg-info +%exclude %{python3_sitelib}/%{name}/{,__pycache__/}run.* +%exclude %{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}osapi.* +%exclude %{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}testcloud.* +%exclude %{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}podman.* +%exclude %{python3_sitelib}/%{name}/providers/{,__pycache__/}{%{provider_plugins}}.* +%exclude %{python3_sitelib}/%{name}/transformers/{,__pycache__/}{%{provider_plugins}}.* + +%files -n python3-%{name}-aws +%{python3_sitelib}/%{name}/transformers/{,__pycache__/}aws.* +%{python3_sitelib}/%{name}/providers/{,__pycache__/}aws.* + +%files -n python3-%{name}-beaker +%{python3_sitelib}/%{name}/transformers/{,__pycache__/}beaker.* +%{python3_sitelib}/%{name}/providers/{,__pycache__/}beaker.* + +%files -n python3-%{name}-openstack +%{python3_sitelib}/%{name}/transformers/{,__pycache__/}openstack.* +%{python3_sitelib}/%{name}/providers/{,__pycache__/}openstack.* +%{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}osapi.* + +%files -n python3-%{name}-podman +%{python3_sitelib}/%{name}/transformers/{,__pycache__/}podman.* +%{python3_sitelib}/%{name}/providers/{,__pycache__/}podman.* +%{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}podman.* + +%files -n python3-%{name}-virt +%{python3_sitelib}/%{name}/transformers/{,__pycache__/}virt.* +%{python3_sitelib}/%{name}/providers/{,__pycache__/}virt.* +%{python3_sitelib}/%{name}/providers/utils/{,__pycache__/}testcloud.* + +%changelog +* Mon Oct 23 2023 David Pascual Hernandez - 1.17.0-1 +- 5251d90 chore(ci): Temporarely remove packit tests (David Pascual) +- 3a59761 feat(openstack): Append API version to auth_url in credentials (David Pascual) +- 97a5355 chore(release): Update semantic release action name and version (David Pascual) +- 6d6cdc6 chore(release): Upload distribution package to release assets (David Pascual) + +* Mon Oct 09 2023 David Pascual Hernandez - 1.16.0-1 +- e8e20f1 chore(ci): Fix release workflow build step checking out wrong commit (David Pascual) +- 97a7cd0 chore: Bump asyncopenstackclient dependency version (David Pascual) +- 41b12e7 chore: Release version 1.16.0 (github-actions) +- 278d1b1 chore(release): Add PyPI action & extract copr step (Tibor Dudlák) +- 9bbd987 chore: Bump python-semantic-release to v7.34.4 (Tibor Dudlák) +- d6b7298 feat: Add new dependecies to mrack.spec file (David Pascual) +- 7bbda34 feat(OpenStack): Add clouds.yaml as an authentication method (David Pascual) +- a5b32e3 feat(OpenStack): Import publick key on provision (David Pascual) +- 1a29d86 test: fix pylint issues and use isinstance (Tibor Dudlák) +- db74ae0 fix(Beaker): Exception has been thrown as raise missed argument (Tibor Dudlák) +- de027fa docs(Beaker): Add hostRequires documentation section to guides (David Pascual) + +* Tue Sep 19 2023 Tibor Dudlák - 1.16.0-1 +- 278d1b1 chore(release): Add PyPI action & extract copr step (Tibor Dudlák) +- 9bbd987 chore: Bump python-semantic-release to v7.34.4 (Tibor Dudlák) +- d6b7298 feat: Add new dependecies to mrack.spec file (David Pascual) +- 7bbda34 feat(OpenStack): Add clouds.yaml as an authentication method (David Pascual) +- a5b32e3 feat(OpenStack): Import publick key on provision (David Pascual) +- 1a29d86 test: fix pylint issues and use isinstance (Tibor Dudlák) +- db74ae0 fix(Beaker): Exception has been thrown as raise missed argument (Tibor Dudlák) +- de027fa docs(Beaker): Add hostRequires documentation section to guides (David Pascual) + +* Tue Jun 13 2023 Tibor Dudlák - 1.15.1-1 +- 608c763 chore(Packit): Use yaml magic to run same internal tests for PRs and commits to main (Tibor Dudlák) +- 8062a20 refactor: more verbose output when (re)provisioning (Tibor Dudlák) +- 19b52f8 test(OpenStack): Add reprovision with dynamic result tests (Tibor Dudlák) +- fd111f5 fix: Do not reprovision all hosts when server error is detected (Tibor Dudlák) +- 6e499f6 fix: Use lower cooldown time to not be too slow in re-provisioning (Tibor Dudlák) +- e03793c chore(Packit): Add internalt tests per pull request (Tibor Dudlák) +- 44023eb chore(Packit): add missing build job(s) to Packit config (Tibor Dudlák) + +* Tue Apr 18 2023 Tibor Dudlák - 1.15.0-1 +- f9f0e33 test: Add missing strategy_retry test (Tibor Dudlák) +- 121c5db refactor(provider): take max_utilization out to method to ease mocking (Tibor Dudlák) +- dc74ced test: Add missing tests for fixed code from https://github.com/neoave/mrack/pull/245 (Tibor Dudlák) +- 86393ab feat(outputs): preset username and password for windows host in pytest-mh (Tibor Dudlák) +- 4c26b5f feat(outputs): merge nested dictionary instead of overriding it (Tibor Dudlák) +- 4dde2e5 feat(utils): add merge_dict (Tibor Dudlák) +- 5440be1 refactor: fixes _openstack_gather_responses test warnings and exec time (David Pascual) +- e29031b fix: Handle 403 AuthError (out of quota) in openstack provisioning (David Pascual) +- a4e5075 feat: configurable ssh options (Petr Vobornik) +- e9d716e chore: fix docs dependencies in tox run (Petr Vobornik) +- 6f1943b chore: add Markdown support to docs and add design section (Petr Vobornik) +- 88458e1 docs: SSH options design (Petr Vobornik) + +* Thu Mar 16 2023 Tibor Dudlák - 1.14.1-1 +- a9c4e62 fix: mrack not re-provisioning hosts which were destroyed (Tibor Dudlák) +- 17b45e4 fix: Replace coroutines with tasks to avoid RuntimeError (David Pascual) + +* Wed Mar 08 2023 Tibor Dudlák - 1.14.0-1 +- e319b73 refactor(AWS): change variable name typo in get_ip_addresses (Tibor Dudlák) +- d95e65f fix(OpenStack): Add missing await for self._load_limits() method call (Tibor Dudlák) +- d0c2d8f refactor: Update supported providers (Tibor Dudlák) +- 13ad3df fix(outputs): remove config section from pytest-multihost (Tibor Dudlák) +- d3da251 feat(outputs): allow to overwrite ansible layout (Tibor Dudlák) +- d3ac20d feat(outputs): allow to choose which outputs should be generated (Tibor Dudlák) +- 66f2877 feat(outputs): add support for pytest-mh (Tibor Dudlák) +- db633b7 feat(utils): relax condition in get_fqdn (Tibor Dudlák) +- 0735e36 fix(outputs): add host to correct group in layout (Tibor Dudlák) +- b1f5318 feat(utils): add get_os_type (Tibor Dudlák) +- 0ab88e6 refactor(black): reformat code (Tibor Dudlák) + +* Wed Mar 01 2023 Tibor Dudlák - 1.13.3-1 +- 0f62237 fix(OpenStack): await loading limits to not break provisioning (Tibor Dudlák) + +* Wed Mar 01 2023 Tibor Dudlák - 1.13.2-1 +- 06f18d1 fix: Use get method when host error object is a dictionary (Tibor Dudlák) +- fd33d68 fix(Beaker): rerurn common dictionary when validation fails (Tibor Dudlák) +- b6c5ef4 fix(OpenStack): Add exception parameter when validation fails (Tibor Dudlák) +- fa2c779 fix(OpenStack): load limits properly by one method (Tibor Dudlák) +- 61e515f chore: change back mrack dist release to 1 (Tibor Dudlák) + +* Tue Feb 21 2023 Tibor Dudlák - 1.13.1-1 +- 1421b37 fix(MrackConfig): Fix MrackConfig class properties (Tibor Dudlák) + +* Fri Feb 17 2023 Tibor Dudlák - 1.13.0-1 +- 72cc2f3 test: add extra dnf options when dealing with rhel/epel 8 (Tibor Dudlák) +- 32a754b chore: set packit to sync changelog as well (Tibor Dudlák) +- b0512b4 chore: sync fedora spec to upstream to maintain changelog history for fedora (Tibor Dudlák) +- be7b50a chore: Generate proper changelog from commit history when releasing (Tibor Dudlák) +- 98f4035 chore: Bump python-semantic-release to latest (Tibor Dudlák) +- a0e76dd test(OpenStack): Fixup the network spread tests (Tibor Dudlák) +- 88b9332 test(OpenStack): rewrite network alloaction tests (Tibor Dudlák) +- 777862f feat(OpenStack): Provide a way to disable network spreading (Tibor Dudlák) +- ff7331d fix(OpenStack): fix condition for network to get in interval (Tibor Dudlák) +- 943316d fix: fqdn in name is ignored and mrack guesses the name instead #237 (Tibor Dudlák) +- 46141dc feat(AWS): Add utilization check method (Tibor Dudlák) +- bb80060 feat(OpenStack): Add utilization check method (Tibor Dudlák) +- 55f9c2c feat: Do not use same sleep for every mrack run (Tibor Dudlák) +- 6ce3927 test(AnsibleInventory): global level output values override (Tibor Dudlák) +- a7a896a feat(AnsibleInventory): Allow additional global level values (Tibor Dudlák) +- 91c562c feat(AnsibleInventory): Allow additional domain level ansible inventory values (Tibor Dudlák) +- 109b03c test(OpenStack): Update calls in openststack tests (Tibor Dudlák) +- 4467cc2 refactor(OpenStack): make private openstack methods truly private (Tibor Dudlák) +- 72b9b9c chore: use custom release_suffix for PR testing via packit (Petr Vobornik) +- f3f734a chore: disable pylint pre-commit hook (Petr Vobornik) +- 4aa9b0a chore(Packit): Add synchronization of tmt plans and tests (Tibor Dudlák) +- 02c3e01 chore(Packit): Configure users on whose actions packit is allowed to be run (Tibor Dudlák) +- cf14ed9 chore(Packit): Add missing ci.fmf to synced files (Tibor Dudlák) + +* Tue Dec 13 2022 Tibor Dudlák - 1.12.3-4 +- chore: Add add tmt tests and plans and add them to sync (Tibor Dudlák) + +* Tue Dec 13 2022 Tibor Dudlák - 1.12.3-3 +- chore: Add fmf/version and allowed users to run packit (Tibor Dudlák) + +* Tue Dec 13 2022 Tibor Dudlák - 1.12.3-2 +- chore: Add ci.fmf to the repo (Tibor Dudlák) + +* Tue Dec 13 2022 Packit - 1.12.3-1 +- chore: Release version 1.12.3 (github-actions) +- chore(Packit): Enable copr build for commit to main only. (Tibor Dudlák) +- chore(Packit): Enable TF tests job to run on pull request. (Tibor Dudlák) +- chore(Packit): Add fedora gating.yaml to synced files. (Tibor Dudlák) +- chore(TestingFarm): Add gating for fedora workflow (Tibor Dudlák) +- fix: Add cache decorator for older python versions. (Tibor Dudlák) +- fix(mrack.spec): Missing dependency in c8s for beaker-client (Tibor Dudlák) +- chore(Packit): enable epel-8 and epel-9 updates and tests (Tibor Dudlák) +- fix(AWS): refactor sources to be py3.6 compatible (Tibor Dudlák) + +* Fri Dec 02 2022 Packit - 1.12.2-1 +- chore: Release version 1.12.2 (github-actions) +- chore: Use python 3.10 in GH actions (Tibor Dudlák) +- refactor: pylint fixes related to Python 3.10 (Tibor Dudlák) +- test: Fix test_utils.py to be included in pytest run (Tibor Dudlák) +- chore(pytest): add missing python_path when using pytest >=7.0.0 (Tibor Dudlák) +- test: Add test for value_to_bool util function (Tibor Dudlák) +- fix: Owner requirement boolean parsing from string (Tibor Dudlák) +- chore(Packit): Add upstream_tag_template to .packit.yaml (Tibor Dudlák) + +* Thu Nov 24 2022 Tibor Dudlák - 1.12.1-1 +- Released upstream version 1.12.1 + +* Mon Nov 14 2022 Tibor Dudlák - 1.12.0-1 +- Released upstream version 1.12.0 + +* Thu Nov 03 2022 Tibor Dudlák - 1.11.0-1 +- Released upstream version 1.11.0 + +* Wed Oct 26 2022 Tibor Dudlák - 1.10.0-1 +- Released upstream version 1.10.0 + +* Thu Oct 20 2022 Tibor Dudlák - 1.9.1-1 +- Released upstream version 1.9.1 + +* Wed Oct 12 2022 Tibor Dudlák - 1.9.0-1 +- Released upstream version 1.9.0 + +* Mon Oct 10 2022 Tibor Dudlák - 1.8.1-1 +- Released upstream version 1.8.1 + +* Mon Oct 10 2022 Tibor Dudlák - 1.8.0-1 +- Released upstream version 1.8.0 + +* Tue Sep 20 2022 Tibor Dudlák - 1.7.0-1 +- Released upstream version 1.7.0 + +* Wed Jul 27 2022 Tibor Dudlák - 1.6.0-1 +- Released upstream version 1.6.0 + +* Fri Jul 08 2022 Tibor Dudlák - 1.5.0-1 +- Released upstream version 1.5.0 + +* Fri Jun 17 2022 David Pascual Hernandez - 1.4.1-1 +- Released upstream version 1.4.1 + +* Thu May 05 2022 Tibor Dudlák - 1.4.0-1 +- Released upstream version 1.4.0 + +* Tue Apr 05 2022 Tibor Dudlák - 1.3.1-1 +- Released upstream version 1.3.1 + +* Fri Apr 01 2022 David Pascual Hernandez - 1.3.0-1 +- Released upstream version 1.3.0 + +* Wed Dec 15 2021 Tibor Dudlák - 1.2.0-1 +- Released upstream version 1.2.0 + +* Thu Nov 25 2021 Tibor Dudlák - 1.1.1-1 +- Released upstream version 1.1.1 + +* Tue Nov 23 2021 Tibor Dudlák - 1.1.0-1 +- Released upstream version 1.1.0 + +* Fri Sep 03 2021 Tibor Dudlák - 1.0.0-1 +- Released upstream version 1.0.0 + +* Thu Jul 01 2021 Tibor Dudlák - 0.14.0-1 +- Released upstream version 0.14.0 + +* Tue Jun 08 2021 Francisco Triviño - 0.13.0-1 +- Released upstream version 0.13.0 + +* Thu May 13 2021 Tibor Dudlák - 0.12.0-1 +- Released upstream version 0.12.0 + +* Fri May 07 2021 Tibor Dudlák - 0.11.0-1 +- Released upstream version 0.11.0 + +* Fri Apr 30 2021 Bhavik Bhavsar - 0.10.0-1 +- Released upstream version 0.10.0 + +* Mon Apr 19 2021 Armando Neto - 0.9.0-1 +- Released upstream version 0.9.0 + +* Thu Apr 15 2021 Armando Neto - 0.8.0-1 +- Released upstream version 0.8.0 + +* Tue Mar 23 2021 Armando Neto - 0.7.1-1 +- Released upstream version 0.7.1 + +* Mon Mar 22 2021 Tibor Dudlák - 0.7.0-1 +- Released upstream version 0.7.0 + +* Thu Feb 04 2021 Armando Neto - 0.6.0-1 +- Initial package. diff --git a/plans/tests.fmf b/plans/tests.fmf new file mode 100644 index 0000000..65199d8 --- /dev/null +++ b/plans/tests.fmf @@ -0,0 +1,9 @@ +summary: Smoke test for mrack +discover: + how: fmf +prepare: +- how: shell + script: + - dnf remove -y `rpm -qa | grep mrack` +execute: + how: tmt diff --git a/sources b/sources new file mode 100644 index 0000000..3cc046c --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (mrack-1.17.0.tar.gz) = 719e7bb52683da16718de246ca92d93fe887136d0783c7c79b4630b92318108c73038e1822cc1aa90225e542d4371564ce8e87e1504fcd93c518262b0db437fa diff --git a/tests/smoke/main.fmf b/tests/smoke/main.fmf new file mode 100644 index 0000000..b465d57 --- /dev/null +++ b/tests/smoke/main.fmf @@ -0,0 +1,8 @@ +summary: Run Smoke tests +test: ./smoke-test.sh +enabled: true +path: /tests/smoke +require: +- which +framework: beakerlib +duration: 10m diff --git a/tests/smoke/smoke-test.sh b/tests/smoke/smoke-test.sh new file mode 100755 index 0000000..b49361c --- /dev/null +++ b/tests/smoke/smoke-test.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# Author: Tibor Dudlák + +. /usr/share/beakerlib/beakerlib.sh || ( echo "FAILED to source beakerlib" && exit 1 ) + +export DNF_EXTRA_OPTIONS=$([[ `rpm --eval '%{?dist}' | grep .el8` > /dev/null ]] && echo "--nobest") + +install_package () { + rlPhaseStartSetup "Installing $1" + rlRun "dnf install -y $1 $DNF_EXTRA_OPTIONS" + rlPhaseEnd +} + +print_and_remove_mrack_log(){ + rlPhaseStartTest "Print and remove mrack.log" + rlRun "cat mrack.log && rm -f mrack.log" + rlPhaseEnd +} + +rm_mracklog_run_mrack_up () { + rlPhaseStartTest "Remove mrack.log and run mrack up" + rlRun "rm -f mrack.log" + rlRun "mrack up 2>&1 | grep 'Installed providers:'" + rlPhaseEnd +} + +rlJournalStart + rlPhaseStartSetup "Check required packages and absence of mrack" + rlAssertRpm "which" + rlRun "dnf remove -y `rpm -qa | grep mrack` || true" + rlPhaseEnd + + rlPhaseStartTest "mrack should not be pre-installed on system" + rlRun "python3 -c \"import mrack\"" 1 + rlPhaseEnd + + install_package "python3-mracklib" + + rlPhaseStartTest "mrack command NOT present on system" + rlRun "which mrack 2>&1 | grep -i 'no' | grep 'mrack'" + rlPhaseEnd + + install_package "mrack-cli" + + rlPhaseStartTest "mrack command present on system" + rlRun "which mrack | grep 'bin/mrack'" + rlRun "mrack --version" + rlPhaseEnd + + install_package "python3-mrack-beaker" + + rm_mracklog_run_mrack_up + + install_package "mrack" + + rm_mracklog_run_mrack_up + + print_and_remove_mrack_log + + rlPhaseStartSetup "Reinstall mrack" + rlRun "dnf reinstall mrack -y" + rlPhaseEnd + + rm_mracklog_run_mrack_up + + print_and_remove_mrack_log + +rlJournalEnd