+++ /dev/null
-default:
- interruptible: true
-
-stages:
- - pkgbuild
- - pkgtest
-
-# pkgbuild {{{
-.pkgbuild: &pkgbuild
- stage: pkgbuild
- tags:
- - lxc
- - amd64
- before_script:
- - git config --global user.name CI
- - git config --global user.email ci@nic
- needs: # https://gitlab.nic.cz/help/ci/yaml/README.md#artifact-downloads-to-child-pipelines
- - pipeline: $PARENT_PIPELINE_ID
- job: archive
- artifacts:
- when: always
- expire_in: '1 day'
- paths:
- - pkg/
-
-.apkgbuild: &apkgbuild # new jinja2 breaks docs (sphinx/breathe)
- - pip3 install -U apkg 'jinja2<3.1'
- - apkg build-dep -y
- - apkg build
-
-.pkgdebrepo: &pkgdebrepo
- - apt-get update
- - apt-get install -y curl gnupg2
- - echo "deb http://download.opensuse.org/repositories/home:/CZ-NIC:/$OBS_REPO/$DISTROTEST_REPO/ /" > /etc/apt/sources.list.d/obs.list
- - curl -fsSL "https://download.opensuse.org/repositories/home:CZ-NIC:$OBS_REPO/$DISTROTEST_REPO/Release.key" | gpg --dearmor > /etc/apt/trusted.gpg.d/obs.gpg
- - apt-get update
-
-.debpkgbuild: &debpkgbuild
- - *pkgdebrepo
- - apt-get install -y python3-pip devscripts
- - *apkgbuild
-
-debian-10:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/debian-10
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: Debian_10
- script:
- - *debpkgbuild
-
-debian-11:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/debian-11
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: Debian_11
- script:
- - *debpkgbuild
-
-fedora-34:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/fedora-34
- script:
- - dnf install -y rpm-build python3-pip
- - *apkgbuild
-
-fedora-35:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/fedora-35
- script:
- - dnf install -y rpm-build python3-pip
- - *apkgbuild
-
-rocky-8:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/rocky-8
- script:
- - dnf install -y rpm-build python3-pip epel-release dnf-plugins-core
- - dnf config-manager --set-enabled powertools
- - *apkgbuild
-
-ubuntu-18.04:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/ubuntu-18.04
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: xUbuntu_18.04
- script:
- - *debpkgbuild
-
-ubuntu-20.04:pkgbuild:
- <<: *pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/ubuntu-20.04
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: xUbuntu_20.04
- script:
- - *debpkgbuild
-
-nixos-unstable:pkgbuild:
- <<: *pkgbuild
- # We do NOT use LXC, for now at least.
- parallel:
- matrix:
- - PLATFORM: [ amd64, arm64 ]
- tags:
- - docker
- - linux
- - ${PLATFORM}
- # https://github.com/NixOS/nix/issues/10648#issuecomment-2101993746
- image: docker.io/nixos/nix:latest-${PLATFORM}
-
- variables:
- NIX_PATH: nixpkgs=https://github.com/nixos/nixpkgs/archive/nixos-unstable.tar.gz
- before_script:
- script:
- - nix-build '<nixpkgs>' -QA apkg
- # the image auto-detects as alpine distro
- # If apkg version differs (too much), it will fail to reuse archive and fail.
- - ./result/bin/apkg install -d nix
- - kresd --version
-# }}}
-
-# pkgtest {{{
-.pkgtest: &pkgtest
- stage: pkgtest
- tags:
- - lxc
- - amd64
-
-.debpkgtest: &debpkgtest
- - *pkgdebrepo
- - apt-get install -y knot-dnsutils
- - apt-get install -y $(find ./pkg/pkgs -name '*.deb' | grep -v module | grep -v debug | grep -v devel)
- - systemctl start kresd@1
- - "kdig @127.0.0.1 +edns nic.cz | tee /dev/stderr | grep -qi 'status: NOERROR'"
-
-debian-10:pkgtest:
- <<: *pkgtest
- needs:
- - debian-10:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/debian-10
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: Debian_10
- script:
- - *debpkgtest
-
-debian-11:pkgtest:
- <<: *pkgtest
- needs:
- - debian-11:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/debian-11
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: Debian_11
- script:
- - *debpkgtest
-
-fedora-34:pkgtest:
- <<: *pkgtest
- needs:
- - fedora-34:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/fedora-34
- script:
- - dnf install -y knot-utils findutils
- - dnf install -y $(find ./pkg/pkgs -name '*.rpm' | grep -v module | grep -v debug | grep -v devel)
- - systemctl start kresd@1
- - "kdig @127.0.0.1 +edns nic.cz | tee /dev/stderr | grep -qi 'status: NOERROR'"
-
-fedora-35:pkgtest:
- <<: *pkgtest
- needs:
- - fedora-35:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/fedora-35
- script:
- - dnf install -y knot-utils findutils
- - dnf install -y $(find ./pkg/pkgs -name '*.rpm' | grep -v module | grep -v debug | grep -v devel)
- - systemctl start kresd@1
- - "kdig @127.0.0.1 +edns nic.cz | tee /dev/stderr | grep -qi 'status: NOERROR'"
-
-rocky-8:pkgtest:
- <<: *pkgtest
- needs:
- - rocky-8:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/rocky-8
- script:
- - dnf install -y epel-release
- - dnf install -y knot-utils findutils
- - dnf install -y $(find ./pkg/pkgs -name '*.rpm' | grep -v module | grep -v debug | grep -v devel)
- - systemctl start kresd@1
- - "kdig @127.0.0.1 +edns nic.cz | tee /dev/stderr | grep -qi 'status: NOERROR'"
-
-ubuntu-18.04:pkgtest:
- <<: *pkgtest
- needs:
- - ubuntu-18.04:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/ubuntu-18.04
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: xUbuntu_18.04
- script:
- - *debpkgtest
-
-ubuntu-20.04:pkgtest:
- <<: *pkgtest
- needs:
- - ubuntu-20.04:pkgbuild
- image: $CI_REGISTRY/labs/lxc-gitlab-runner/ubuntu-20.04
- variables:
- OBS_REPO: knot-resolver-build
- DISTROTEST_REPO: xUbuntu_20.04
- script:
- - *debpkgtest
-# }}}
+++ /dev/null
-Requirements
-------------
-
-- ansible
-- vagrant
-- libvirt (+vagrant-libvirt) / virtualbox
-
-Usage
------
-
-`vagrant up` command is configured to trigger ansible provisioning
-which configures OBS repository, installs the knot-resolver package,
-starts the kresd@1 service and finally attempts to use it to resolve
-a domain name. It also tests that DNSSEC validation is turned on.
-
-By default, the *knot-resolver-devel* repo (for knot-resolver) along
-with *knot-resolver-latest* (for knot) is used. To test only the
-*knot-resolver-latest* repo, set it in `repos.yaml` (or use the
-test-distro.sh script which overwrites this file). If you're running
-tests in parallel, they all HAVE TO use the same repo(s).
-
-Run the following command for every distro (aka directory with
-Vagrantfile):
-
-```
-./test-distro.sh knot-resolver-devel debian9
-```
-
-or
-
-```
-./test-distro.sh knot-resolver-testing debian9
-```
-
-or
-
-```
-./test-distro.sh knot-resolver-latest debian9
-```
-
-At the end of the test, the package version that was tested is
-printed out. Make sure you're testing what you intended to.
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-repos:
- - knot-resolver-latest
-distro: "{{ ansible_distribution | replace(' ', '_') }}"
-update_packages: false
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: dnstap_config set up kresd.conf
- blockinfile:
- marker: -- {mark} ANSIBLE MANAGED BLOCK
- block: |
- modules.load('dnstap')
- assert(dnstap)
- path: /etc/knot-resolver/kresd.conf
- insertbefore: BOF
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: doh_config set up kresd.conf
- blockinfile:
- marker: -- {mark} ANSIBLE MANAGED BLOCK
- block: |
- net.listen('127.0.0.1', 44353, { kind = 'doh_legacy' })
- modules.load('http')
- path: /etc/knot-resolver/kresd.conf
- insertbefore: BOF
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: doh2_config set up kresd.conf
- blockinfile:
- marker: -- {mark} ANSIBLE MANAGED BLOCK
- block: |
- net.listen('127.0.0.1', 44354, { kind = 'doh2' })
- path: /etc/knot-resolver/kresd.conf
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Include distribution specific vars
- include_vars: "{{ distro }}.yaml"
-
-- name: Update all packages
- package:
- name: '*'
- state: latest
- when: update_packages|bool
-
-- name: Install packages
- package:
- name: "{{ packages }}"
- state: latest
- # knot-utils may be missing on opensuse (depending on upstream vs downstream pkg)
- failed_when: false
-
-- name: Always print package version at the end
- block:
-
- - include: restart_kresd.yaml
-
- - include: test_udp.yaml
- - include: test_tcp.yaml
- - include: test_tls.yaml
- - include: test_dnssec.yaml
-
- - include: test_kres_cache_gc.yaml
-
- - name: Test DoH (new implementation)
- block:
- - include: configure_doh2.yaml
- - include: restart_kresd.yaml
- - include: test_doh2.yaml
-
- - name: Test DoH (legacy)
- block:
- - name: Install knot-resolver-module-http
- package:
- name: knot-resolver-module-http
- state: latest
-
- - include: configure_doh.yaml
- when: ansible_distribution in ["CentOS", "Rocky", "Fedora", "Debian", "Ubuntu"]
-
- - include: restart_kresd.yaml
- - include: test_doh.yaml
- when: distro in ["Fedora", "Debian", "CentOS", "Rocky"] or (distro == "Ubuntu" and ansible_distribution_major_version|int >= 18)
-
- - name: Test dnstap module
- block:
- - name: Install knot-resolver-module-dnstap
- package:
- name: knot-resolver-module-dnstap
- state: latest
- - include: configure_dnstap.yaml
- - include: restart_kresd.yaml
- when: distro in ["Fedora", "Debian", "CentOS", "Rocky", "Ubuntu"]
-
- always:
-
- - name: Get installed package version
- shell: "{{ show_package_version }}"
- args:
- warn: false
- register: package_version
-
- - name: Show installed version
- debug:
- var: package_version.stdout
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- block:
- - name: Restart kresd@1.service
- service:
- name: kresd@1.service
- state: restarted
- rescue:
- - name: Get kresd@1.service journal
- shell: journalctl -u kresd@1 --since -20s
- register: journal
- - name: Print journal
- debug:
- var: journal
- - name: Restart kresd@*.service failed, see log above
- shell: /bin/false
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: dnssec_test rhybar.cz. +cd returns NOERROR
- tags:
- - test
- shell: kdig +cd @127.0.0.1 rhybar.cz.
- register: res
- failed_when: '"status: NOERROR" not in res.stdout'
-
-- name: dnssec_test rhybar.cz. returns SERVFAIL
- tags:
- - test
- shell: kdig +timeout=16 @127.0.0.1 rhybar.cz.
- register: res
- failed_when: '"status: SERVFAIL" not in res.stdout'
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: doh_test query localhost. A
- get_url:
- url: https://127.0.0.1:44353/doh?dns=1Y0BAAABAAAAAAAACWxvY2FsaG9zdAAAAQAB
- sha256sum: e5c2710e6ecb78c089ab608ad5861b87be0d1c623c4d58b4eee3b21c06aa2008
- dest: /tmp/doh_test
- mode: 0644
- validate_certs: false
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: doh2_test check kdig https support
- shell: kdig --help | grep -q '+\S*https'
- register: kdig_https
- ignore_errors: true
-
-- name: doh2_test query localhost. A
- # use curl instead of ansible builtins (get_url/uri)
- # because they currently use unsupported HTTP/1.1
- shell: |
- curl -k -o /tmp/doh_test https://127.0.0.1:44354/doh?dns=1Y0BAAABAAAAAAAACWxvY2FsaG9zdAAAAQAB
- echo "e5c2710e6ecb78c089ab608ad5861b87be0d1c623c4d58b4eee3b21c06aa2008 /tmp/doh_test" > /tmp/doh_test.sha256
- sha256sum --check /tmp/doh_test.sha256
- args:
- # disable warning about using curl - we know what we're doing
- warn: false
- when: kdig_https is failed
-
-- name: doh2_test kdig localhost. A
- shell: |
- kdig @127.0.0.1 -p 44354 +https nic.cz || exit 1
- kdig @127.0.0.1 -p 44354 +https-get nic.cz || exit 2
- when: kdig_https is succeeded
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: check kres-cache-gc.service is active
- shell: systemctl is-active -q kres-cache-gc.service
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: tcp_test resolve nic.cz
- tags:
- - test
- shell: kdig +tcp @127.0.0.1 nic.cz
- register: res
- failed_when: '"status: NOERROR" not in res.stdout'
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: tls_test resolve nic.cz
- tags:
- - test
- shell: kdig +tls @127.0.0.1 nic.cz
- register: res
- failed_when: '"status: NOERROR" not in res.stdout'
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: udp_test resolve nic.cz
- tags:
- - test
- shell: kdig @127.0.0.1 nic.cz
- register: res
- failed_when: '"status: NOERROR" not in res.stdout'
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: rpm -qi knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-utils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: dpkg -s knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-dnsutils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: rpm -qi knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-utils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: rpm -qi knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-utils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: dpkg -s knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-dnsutils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: rpm -qi knot-resolver | grep '^Version'
-packages:
- - knot-resolver
- - knot-utils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-show_package_version: rpm -qi knot-resolver | grep '^Version'
-update_packages: true
-packages:
- - knot-resolver
- - knot-utils
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_distro: "{{ ansible_distribution | replace(' ', '_') }}"
-obs_repofile_url: "https://download.opensuse.org/repositories/home:CZ-NIC:{{ item }}/{{ obs_repo_version }}/home:CZ-NIC:{{ item }}.repo"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: update CA certificates
- yum:
- name: ca-certificates
- state: latest
-
-- name: Install EPEL
- yum:
- name: epel-release
- state: present
-
-- name: Download repo file(s)
- get_url:
- url: "{{ obs_repofile_url }}"
- dest: /etc/yum.repos.d/home:CZ-NIC:{{ item }}.repo
- mode: 0644
- with_items: "{{ repos }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Add upstream package signing key
- get_url:
- url: https://gitlab.nic.cz/knot/knot-resolver-release/raw/master/cznic-obs.gpg.asc
- dest: /etc/apt/trusted.gpg.d/cznic-obs.gpg.asc
- mode: 0644
-
-- name: Add OBS repo(s)
- apt_repository:
- repo: >
- deb http://download.opensuse.org/repositories/home:/CZ-NIC:/{{ item }}/{{ obs_repo_version }}/ /
- state: present
- update_cache: true
- with_items: "{{ repos }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Download repo file(s)
- get_url:
- url: "{{ obs_repofile_url }}"
- dest: "/etc/yum.repos.d/home:CZ-NIC:{{ item }}.repo"
- mode: 0644
- with_items: "{{ repos }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Install EPEL
- yum:
- name: epel-release
- state: present
-
-- name: Download repo file(s)
- get_url:
- url: "{{ obs_repofile_url }}"
- dest: /etc/yum.repos.d/home:CZ-NIC:{{ item }}.repo
- mode: 0644
- with_items: "{{ repos }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Add upstream package signing key
- apt_key:
- url: https://gitlab.nic.cz/knot/knot-resolver-release/raw/master/cznic-obs.gpg.asc
- state: present
-
-- name: Add OBS repo(s)
- apt_repository:
- repo: >
- deb http://download.opensuse.org/repositories/home:/CZ-NIC:/{{ item }}/{{ obs_repo_version }}/ /
- state: present
- update_cache: true
- with_items: "{{ repos }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Include Debian specific vars
- include_vars: "{{ obs_distro }}_{{ ansible_distribution_major_version }}.yaml"
- when: obs_distro == "Debian"
-
-- name: Include distribution specific vars
- include_vars: "{{ obs_distro }}.yaml"
- when: obs_distro != "Debian"
-
-- name: Configure upstream repositories
- include: "{{ obs_distro }}.yaml"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Install python-xml dependency for zypper_repository
- shell: zypper install -y python-xml
- args:
- warn: false
-
-- name: Add upstream repo(s)
- zypper_repository:
- repo: "{{ obs_repofile_url }}"
- state: present
- disable_gpg_check: true # auto_import_keys is broken
- with_items: "{{ repos }}"
-
-- name: Refresh all repositories
- zypper_repository:
- repo: '*'
- runrefresh: true
- failed_when: false
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- name: Add upstream repo(s)
- zypper_repository:
- repo: "{{ obs_repofile_url }}"
- state: present
- disable_gpg_check: true # auto_import_keys is broken
- with_items: "{{ repos }}"
-
-- name: Refresh all repositories
- zypper_repository:
- repo: '*'
- runrefresh: true
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}_{{ ansible_distribution_major_version }}_EPEL"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}_{{ ansible_distribution_major_version }}"
+++ /dev/null
-Debian_10.yaml
\ No newline at end of file
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}_{{ ansible_distribution_major_version }}.0"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}_{{ ansible_distribution_major_version }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "CentOS_{{ ansible_distribution_major_version }}_EPEL"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "x{{ obs_distro }}_{{ ansible_distribution_version }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}_{{ ansible_distribution_version }}"
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-obs_repo_version: "{{ obs_distro }}"
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "centos/7"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "centos7_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python2"
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- # debian/buster64 requires manual intervention for apt update as of 2019-07-18
- config.vm.box = "generic/debian10"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "debian10_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/debian11"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "debian11_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "debian/stretch64"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "debian9_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "fedora/35-cloud-base"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "fedora35_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python3",
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "fedora/36-cloud-base"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "fedora36_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python3",
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
----
-# SPDX-License-Identifier: GPL-3.0-or-later
-- hosts: all
-
- remote_user: root
- become: true
-
- vars_files:
- - repos.yaml
-
- roles:
- - obs_repos
- - knot_resolver
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/opensuse15"
-
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "leap15_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- libvirt.disk_bus = "sata"
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-repos:
- - knot-resolver-latest
- - knot-resolver-devel
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/rocky8"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "rocky8_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/libexec/platform-python"
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-#!/bin/bash -x
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-# ./test-distro.sh {obs_repo} {distro}
-# Example usage: ./test-distro.sh knot-resolver-devel debian9
-
-pkgtestdir="$(dirname ${0})"
-repofile="$pkgtestdir/repos.yaml"
-
-distro=$2
-repo=$1
-
-# Select repos
-echo -e "repos:\n - $repo" > $repofile
-if [ "$repo" == "knot-resolver-devel" ]; then
- # get Knot DNS from knot-resolver-latest
- echo -e ' - knot-resolver-latest' >> $repofile
-fi
-
-pushd "$pkgtestdir/$distro"
-vagrant destroy -f &>/dev/null
-vagrant up
-ret=$?
-vagrant destroy -f &>/dev/null
-popd
-exit $ret
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/ubuntu1804"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "ubuntu1804_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python3"
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/ubuntu2004"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "ubuntu2004_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python3"
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-
-Vagrant.configure(2) do |config|
-
- config.vm.box = "generic/ubuntu2204"
- config.vm.synced_folder ".", "/vagrant", disabled: true
-
- config.vm.define "ubuntu2204_knot-resolver" do |machine|
- machine.vm.provision "ansible" do |ansible|
- ansible.playbook = "../knot-resolver-pkgtest.yaml"
- ansible.extra_vars = {
- ansible_python_interpreter: "/usr/bin/python3"
- }
- end
- end
-
- config.vm.provider :libvirt do |libvirt|
- libvirt.cpus = 1
- libvirt.memory = 1024
- end
-
- config.vm.provider :virtualbox do |vbox|
- vbox.cpus = 1
- vbox.memory = 1024
- end
-
-end
+++ /dev/null
-../.ansible.cfg
\ No newline at end of file
+++ /dev/null
-.. SPDX-License-Identifier: GPL-3.0-or-later
-
-Packaging tests
-===============
-
-Packaging tests used pytest, docker and each directory with subdirectory *.packaging*
-is called as *component*.
-
-Run tests for all components:
-
-.. code-block::
-
- pytest -r fEsxX tests/packaging
-
-List all components:
-
-.. code-block::
-
- pytest tests/packaging --collect-only
-
-Run test for specific component (*doc/.packaging*):
-
-.. code-block::
-
- pytest -r fEsxX tests/packaging -k test_collect[debian_10-doc/.packaging]
-
-.. note::
-
- For debug add argument :code:`-s`.
-
-daemon/.packaging component
----------------------------
-
-This is special component that is used by all others components.
-For each distribution and version are created two docker images with this component.
-One with building dependencies and one for running dependencies.
-*Build docker image* is tagged as :code:`kr-packaging-tests-<distro><version>-build`
-and *Run docker image* is tagged as :code:`kr-packaging-tests-<distro><version>-run`.
-
-Others components
------------------
-
-All others components are based on *daemon/.packaging* component (docker image).
-When component needs new building dependencies, new running dependencies
-or some scripts that change build or run phase (see `File structure of each component`_),
-new docker image is created.
-*Build docker image* is tagged as :code:`kr-packaging-tests-<distro><version>-<component>-build`
-and *Run docker image* is tagged as :code:`kr-packaging-tests-<distro><version>-<component>-run`.
-
-File structure of each component
-------------------------------------
-
-* <distro>
- * <version>
- * builddeps - list of build dependencies
- * rundeps - list of runtime dependencies
- * pre-build.sh - script called before build phase
- * post-build.sh - script called after build phase
- * pre-run.sh - script called before run phase
- * post-run.sh - script called after run phase
- * install.sh and build.sh - scripts to rewrite standard commands for building and installing knot-resolvers
- * pre-test.sh - script called immediately before testing
-* test.config or test.sh - kresd config test or shell script (one of them must exists)
-
-Commands order to create docker image
--------------------------------------
-
-For *build docker image*:
-
-#. run pre-build.sh
-#. install packages specified in the file *builddeps*
-#. run build.sh
-#. run install.sh
-#. run post-build.sh
-
-For *run docker image*:
-
-#. run pre-run.sh
-#. install packages specified in the file *rundeps*
-#. run pre-test.sh
-#. run test (:code:`kresd -c test.config` or :code:`test.sh`)
-#. run post-build.sh
-
-
-.. note::
-
- knot-resolver builded in *build docker image* is automatically moved to *run docker image*.
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-import pytest
-import os
-
-
-def pytest_configure():
- pytest.KR_PYTESTS_DIR = os.path.dirname(os.path.realpath(__file__))
- pytest.KR_ROOT_DIR = os.path.join(pytest.KR_PYTESTS_DIR, "..", "..")
- pytest.KR_PREFIX = "kr-packaging-tests-"
+++ /dev/null
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-import os
-import pytest
-import docker
-import logging
-from pathlib import Path
-from abc import ABC, abstractmethod
-
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-logger.setLevel(logging.DEBUG)
-client = docker.from_env()
-
-
-class DockerCmdError(Exception):
- """ Raised when shell command in Docker container failed """
- pass
-
-
-class ContainerHandler():
- def __init__(self, image):
- self.img_id = image
- self.container = None
-
- def run(self):
- self.container = client.containers.run(self.img_id, network_mode='host',
- tty=True, detach=True)
- logger.info('Run container ID={}'.format(self.container))
-
- def stop(self):
- self.container.kill()
-
- def exec_cmd(self, cmd, workdir):
- # workaround: When exec_run is called in GitLab CI/CD workdir argument doesn't work.
- inter_cmd = ''
- if workdir is not None:
- inter_cmd = 'cd {}; '.format(workdir)
-
- rcode, out = self.container.exec_run('/bin/sh -c \'' + inter_cmd + cmd + '\'')
- if rcode != 0:
- raise DockerCmdError(rcode, out)
-
- def getFiles(self, output, path):
- strm, stat = self.container.get_archive(path)
- with open(output, 'wb') as ofile:
- for data in strm:
- ofile.write(data)
-
-
-class DockerImages(ABC):
- def __init__(self, version):
- self.version = version
- self.module = None
- self.distro = None
- self.build_id = None
- self.run_id = None
-
- @abstractmethod
- def cmd_pkgs_install(self):
- raise NotImplementedError
-
- @abstractmethod
- def cmd_kresd_install(self):
- raise NotImplementedError
-
- @abstractmethod
- def cmd_kresd_build(self):
- raise NotImplementedError
-
- def readDependencies(self, deps_file):
- """Read dependencies from file"""
- listf = None
- try:
- with open(deps_file, 'r') as f:
- listf = f.read().splitlines()
- except FileNotFoundError:
- pass
-
- return listf
-
- def __genDockerFile(self, path, from_image=None):
- """Generate Dockerfile for build image"""
- if self.module is None:
- raise AttributeError
-
- if from_image is None:
- if os.path.isfile(os.path.join(self.module, self.distro, 'docker-image-name')):
- with open(os.path.join(self.module, self.distro, 'docker-image-name')) as f:
- from_image = f.read()
- else:
- from_image = '{0}:{1}'.format(self.distro, self.version)
-
- distro_dir = os.path.join(self.module, self.distro, self.version)
-
- dockerf = open(os.path.join(path, 'Dockerfile-build'), 'w')
-
- dockerf.write('FROM {}\n'.format(from_image))
- dockerf.write('WORKDIR /root/kresd\n')
- if self.module == 'daemon/.packaging':
- dockerf.write('COPY . /root/kresd\n')
- # when this file doesn't exists, tzdata needs user interaction
- dockerf.write('RUN if [ ! -f /etc/localtime ];' +
- 'then ln -fs /usr/share/zoneinfo/Europe/Prague /etc/localtime; fi\n')
- if os.path.isfile(os.path.join(distro_dir, 'pre-build.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'pre-build.sh')))
- if os.path.isfile(os.path.join(distro_dir, 'builddeps')):
- dockerf.write('RUN {0} {1}\n'.format(self.cmd_pkgs_install(),
- ' '.join(self.readDependencies(os.path.join(distro_dir, 'builddeps')))))
- if os.path.isfile(os.path.join(distro_dir, 'build.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'build.sh')))
- else:
- dockerf.write('RUN {}\n'.format(self.cmd_kresd_build()))
- if os.path.isfile(os.path.join(distro_dir, 'install.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'install.sh')))
- else:
- dockerf.write('RUN {}\n'.format(self.cmd_kresd_install()))
- if os.path.isfile(os.path.join(distro_dir, 'post-build.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'post-build.sh')))
-
- dockerf.close()
-
- def __genDockerFile_run(self, path, build_id, from_image=None):
- """Generate Dockerfile for run image"""
- if self.module is None:
- raise AttributeError
-
- if from_image is None:
- if os.path.isfile(os.path.join(self.module, self.distro, 'docker-image-name')):
- with open(os.path.join(self.module, self.distro, 'docker-image-name')) as f:
- from_image = f.read()
- else:
- from_image = '{0}:{1}'.format(self.distro, self.version)
-
- distro_dir = os.path.join(self.module, self.distro, self.version)
-
- dockerf = open(os.path.join(path, 'Dockerfile-run'), 'w')
-
- dockerf.write('FROM {}\n'.format(from_image))
- dockerf.write('COPY --from={} /root/kresd /root/kresd\n'.format(build_id))
- dockerf.write('WORKDIR /root/kresd\n')
- if os.path.isfile(os.path.join(distro_dir, 'pre-run.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'pre-run.sh')))
- if os.path.isfile(os.path.join(distro_dir, 'rundeps')):
- dockerf.write('RUN {0} {1}\n'.format(self.cmd_pkgs_install(),
- ' '.join(self.readDependencies(os.path.join(distro_dir, 'rundeps')))))
- if os.path.isfile(os.path.join(distro_dir, 'pre-test.sh')):
- dockerf.write('RUN {}\n'.format(os.path.join(distro_dir, 'pre-test.sh')))
-
- dockerf.close()
-
- def build_printing_errors(self, path, dockerfile, network_mode, tag, rm):
- try:
- return client.images.build(path=path, dockerfile=dockerfile,
- network_mode=network_mode, tag=tag, rm=rm)
- except docker.errors.BuildError as e:
- iterable = iter(e.build_log)
- while True:
- try:
- item = next(iterable)
- if item['stream']:
- for l in item['stream'].splitlines():
- stripped = l.strip()
- if stripped:
- logging.error(stripped)
- except StopIteration:
- break
- raise e
-
- def build(self, tmpdir, tag="", from_image=None):
- self.__genDockerFile(tmpdir, from_image=from_image)
-
- logger.debug('tmpdir={}'.format(tmpdir))
- logger.debug('datadir={}'.format(pytest.KR_ROOT_DIR))
- logger.debug('tag={}'.format(tag))
- image = self.build_printing_errors(path=str(pytest.KR_ROOT_DIR),
- dockerfile=os.path.join(tmpdir, 'Dockerfile-build'),
- network_mode='host', tag=tag, rm=True)
- logger.info('"Build image" ID={} created'.format(image[0].short_id))
- self.build_id = image[0].short_id
- return self.build_id
-
- def build_run(self, tmpdir, build_id, from_image=None, tag=""):
- self.__genDockerFile_run(tmpdir, build_id, from_image=from_image)
-
- logger.debug('tmpdir={}'.format(tmpdir))
- logger.debug('datadir={}'.format(tmpdir))
- logger.debug('tag={}'.format(tag))
- image = self.build_printing_errors(path=str(tmpdir),
- dockerfile=os.path.join(tmpdir, 'Dockerfile-run'),
- network_mode='host', tag=tag, rm=True)
- logger.info('"Run image" ID={} created'.format(image[0].short_id))
- self.run_id = image[0].short_id
- return self.run_id
-
-
-class DebianImage(DockerImages):
- def __init__(self, version):
- super().__init__(version)
- self.distro = 'debian'
-
- def cmd_pkgs_install(self):
- return 'apt-get install -y '
-
- def cmd_kresd_install(self):
- return 'ninja -C build_packaging install >/dev/null'
-
- def cmd_kresd_build(self):
- return """\\
- [ -d /root/kresd/build_packaging ] && rm -rf /root/kresd/build_packaging/; \\
- CFLAGS=\"$CFLAGS -Wall -pedantic -fno-omit-frame-pointer\"; \\
- LDFLAGS=\"$LDFLAGS -Wl,--as-needed\"; \\
- meson build_packaging \\
- --buildtype=plain \\
- --prefix=/root/kresd/install_packaging \\
- --libdir=lib \\
- --default-library=static \\
- -Dsystemd_files=enabled \\
- -Dclient=enabled \\
- -Dkeyfile_default=/usr/share/dns/root.key \\
- -Droot_hints=/usr/share/dns/root.hints \\
- -Dinstall_kresd_conf=enabled \\
- -Dunit_tests=enabled \\
- -Dc_args=\"${CFLAGS}\" \\
- -Dc_link_args=\"${LDFLAGS}\"; \\
- ninja -C build_packaging
- """
-
-
-class UbuntuImage(DebianImage):
- def __init__(self, version):
- super().__init__(version)
- self.distro = 'ubuntu'
-
-
-class CentosImage(DockerImages):
- def __init__(self, version):
- super().__init__(version)
- self.distro = 'centos'
-
- def cmd_pkgs_install(self):
- return "yum install -y "
-
- def cmd_kresd_install(self):
- return 'ninja-build -C build_packaging install'
-
- def cmd_kresd_build(self):
- return """\\
- [ -d /root/kresd/build_packaging ] && rm -rf /root/kresd/build_packaging/; \\
- CFLAGS=\"$CFLAGS -Wall -pedantic -fno-omit-frame-pointer\"; \\
- LDFLAGS=\"$LDFLAGS -Wl,--as-needed\"; \\
- meson build_packaging \\
- --buildtype=plain \\
- --prefix=/root/kresd/install_packaging \\
- --sbindir=sbin \\
- --libdir=lib \\
- --includedir=include \\
- --sysconfdir=etc \\
- --default-library=static \\
- -Dsystemd_files=enabled \\
- -Dclient=enabled \\
- -Dunit_tests=enabled \\
- -Dmanaged_ta=enabled \\
- -Dkeyfile_default=/root/kresd/install_packaging/var/lib/knot-resolver/root.keys \\
- -Dinstall_root_keys=enabled \\
- -Dinstall_kresd_conf=enabled; \\
- ninja-build -C build_packaging
- """
-
-
-class FedoraImage(DockerImages):
- def __init__(self, version):
- super().__init__(version)
- self.distro = 'fedora'
-
- def cmd_pkgs_install(self):
- return "dnf install -y "
-
- def cmd_kresd_install(self):
- return 'ninja -C build_packaging install >/dev/null'
-
- def cmd_kresd_build(self):
- return """\\
- [ -d /root/kresd/build_packaging ] && rm -rf /root/kresd/build_packaging/; \\
- CFLAGS=\"$CFLAGS -Wall -pedantic -fno-omit-frame-pointer\"; \\
- LDFLAGS=\"$LDFLAGS -Wl,--as-needed\"; \\
- meson build_packaging \\
- --buildtype=plain \\
- --prefix=/root/kresd/install_packaging \\
- --sbindir=sbin \\
- --libdir=lib \\
- --includedir=include \\
- --sysconfdir=etc \\
- --default-library=static \\
- -Dsystemd_files=enabled \\
- -Dclient=enabled \\
- -Dunit_tests=enabled \\
- -Dmanaged_ta=enabled \\
- -Dkeyfile_default=/root/kresd/install_packaging/var/lib/knot-resolver/root.keys \\
- -Dinstall_root_keys=enabled \\
- -Dinstall_kresd_conf=enabled; \\
- ninja -C build_packaging
- """
-
-
-class LeapImage(FedoraImage):
- def __init__(self, version):
- super().__init__(version)
- self.distro = 'leap'
-
- def cmd_pkgs_install(self):
- return "zypper install -y "
-
-
-def create_distro_image(name, version):
- img = None
-
- if (name == 'debian'):
- img = DebianImage(version)
- elif (name == 'ubuntu'):
- img = UbuntuImage(version)
- elif (name == 'centos'):
- img = CentosImage(version)
- elif (name == 'fedora'):
- img = FedoraImage(version)
- elif (name == 'leap'):
- img = LeapImage(version)
- else:
- img = None
-
- return img
-
-
-def list_dirs(path, exclude=None):
- """return all 'packaging' directories with full path"""
- filtered_dirs = []
-
- for rootpath, dirs, _ in os.walk(path):
-
- if (os.path.basename(rootpath) == '.packaging'):
- fdir = os.path.relpath(rootpath, path)
- if exclude is not None:
- if fdir not in exclude:
- filtered_dirs.append(fdir)
- else:
- filtered_dirs.append(fdir)
-
- return filtered_dirs
-
-
-def list_tests_dirs():
- """return all 'packaging' directories"""
- return list_dirs(pytest.KR_ROOT_DIR)
-
-
-def list_distro_vers(distro_root):
- """
- return list of { 'name': distro_name, 'version': distro_version)
- pairs found in distro_root
- """
- # transform list of paths like TOP/debian/10 into (debian, 10)
- dist_ver = [{'name': p.parts[-2], 'version': p.parts[-1]} for p
- in Path(distro_root).glob('*/*') if p.is_dir()]
-
- return list(dist_ver)
-
-
-MODULES = list_tests_dirs()
-DISTROS = list_distro_vers(os.path.join(pytest.KR_ROOT_DIR, 'daemon/.packaging'))
-DISTROS_NAMES = ['{0}_{1}'.format(distro['name'], distro['version']) for distro in DISTROS]
-
-
-@pytest.fixture(scope='session', params=DISTROS, ids=DISTROS_NAMES)
-def buildenv(request, tmpdir_factory):
- distro = request.param
-
- logger.debug('Creating main images for "{0} {1}"'.format(distro['name'], distro['version']))
- img = create_distro_image(distro['name'], distro['version'])
- if img is None:
- logger.warning('Unknown distro {}'.format(distro['name']))
- else:
- img.module = 'daemon/.packaging'
- tmpdir = tmpdir_factory.mktemp(distro['name']+distro['version'])
- img.build(tmpdir, tag=pytest.KR_PREFIX+distro['name']+distro['version']+'-build')
- img.build_run(tmpdir, img.build_id,
- tag=pytest.KR_PREFIX+distro['name']+distro['version']+'-run')
-
- yield img
-# client.images.remove(img.run_id)
-# client.images.remove(img.build_id)
-
-
-@pytest.mark.parametrize('module', MODULES)
-def test_collect(module, buildenv, tmp_path):
- logger.info(' ### Run test {} ###'.format(module))
-
- if buildenv is None:
- logger.error('Distro "{0} {1}" isn\'t implemented'.format(buildenv.distro,
- buildenv.version))
- assert False
-
- rcode = None
- buildmod = None
- module_dir = os.path.join(pytest.KR_ROOT_DIR, module)
- distro_dir = os.path.join(module_dir, buildenv.distro, buildenv.version)
-
- if os.path.isfile(os.path.join(distro_dir, 'NOTSUPPORTED')):
- pytest.skip('Unsupported linux distribution ({0} {1}:{2})'.format(buildenv.distro, buildenv.version, module))
-
- try:
- if module == 'daemon/.packaging':
- # use main "run image" without changes
- logging.info('Use main "run image"')
- ch = ContainerHandler(buildenv.run_id)
- ch.run()
- elif buildenv is not None:
- if os.path.isfile(os.path.join(distro_dir, 'pre-build.sh')) \
- or os.path.isfile(os.path.join(distro_dir, 'builddeps')):
- # create module specific "build image"
- logger.info('Create new "build image"')
- buildmod = create_distro_image(buildenv.distro, buildenv.version)
- buildmod.module = module
- buildmod.build(tmp_path, from_image=buildenv.build_id,
- tag=pytest.KR_PREFIX+buildmod.distro+buildmod.version+'-' +
- module.replace('/.packaging', '')+'-build')
-
- if buildmod is not None:
- # new build image was made, create new module specific "run image"
- logger.info('Create module specific "run image" from Dockerfile')
- buildmod.build_run(tmp_path, buildmod.build_id,
- tag=pytest.KR_PREFIX+buildmod.distro+buildmod.version+'-' +
- module.replace('/.packaging', '')+'-run', from_image=buildenv.run_id)
- ch = ContainerHandler(buildmod.run_id)
- ch.run()
- elif os.path.isfile(os.path.join(distro_dir, 'pre-run.sh')) \
- or os.path.isfile(os.path.join(distro_dir, 'rundeps')):
- # use main "run image" and apply module specific changes
- logger.info('Apply module specific changes to "run image"')
- buildmod = buildenv
- ch = ContainerHandler(buildmod.run_id)
- ch.run()
-
- if os.path.isfile(os.path.join(distro_dir, 'pre-run.sh')):
- ch.exec_cmd(os.path.join(module, buildenv.distro, buildenv.version,
- 'pre-run.sh'), '/root/kresd/')
-
- if os.path.isfile(os.path.join(distro_dir, 'rundeps')):
- logger.debug(buildmod.cmd_pkgs_install() + ' '.join(
- buildmod.readDependencies(os.path.join(distro_dir, 'rundeps'))))
- ch.exec_cmd(buildmod.cmd_pkgs_install() + ' '.join(
- buildmod.readDependencies(os.path.join(distro_dir, 'rundeps'))),
- '/root/kresd/')
-
- if os.path.isfile(os.path.join(distro_dir, 'pre-test.sh')):
- ch.exec_cmd(os.path.join(module, buildenv.distro, buildenv.version,
- 'pre-test.sh'), '/root/kresd/')
- else:
- # use main "run image" without changes
- logging.info('Use main "run image"')
- ch = ContainerHandler(buildenv.run_id)
- ch.run()
-
- # run test
- if os.path.isfile(os.path.join(module_dir, 'test.config')):
- ch.exec_cmd('/root/kresd/install_packaging/sbin/kresd -n -c ' + os.path.join('..',
- module, 'test.config'), '/root/kresd/install_packaging/')
- elif os.path.isfile(os.path.join(module_dir, 'test.sh')):
- ch.exec_cmd(os.path.join('..', module, 'test.sh'),
- '/root/kresd/install_packaging/')
- else:
- ch.stop()
- ch.container.remove()
- logger.error('Test file (test.config or test.sh) not found')
- assert False
-
- rcode = 0
-
- if os.path.isfile(os.path.join(distro_dir, 'post-run.sh')):
- ch.exec_cmd(os.path.join(module, buildenv.distro, buildenv.version, 'post-run.sh'),
- '/root/kresd/')
-
- except DockerCmdError as err:
- rcode, out = err.args
- logger.debug('rcode: {}'.format(rcode))
- logger.error(out.decode('utf-8'))
- finally:
- ch.stop()
- ch.container.remove()
- if buildmod is not None and buildmod is not buildenv:
- client.images.remove(buildmod.run_id)
- client.images.remove(buildmod.build_id)
-
- assert(rcode == 0)