diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/base-runtime.yaml b/base-runtime.yaml new file mode 100644 index 0000000..592b2e1 --- /dev/null +++ b/base-runtime.yaml @@ -0,0 +1,1499 @@ +document: modulemd +version: 1 +data: + summary: The base application runtime and hardware abstraction layer + description: >- + A project closely linked to the Modularity Initiative, Base Runtime + is about defining the common shared package and feature set of the + operating system, providing both the hardware enablement layer and + the minimal application runtime environment other modules can build + upon. + license: + module: [ MIT ] + dependencies: + buildrequires: + bootstrap: f26 + shim: master + references: + community: https://fedoraproject.org/wiki/BaseRuntime + documentation: https://github.com/fedora-modularity/base-runtime + tracker: https://github.com/fedora-modularity/base-runtime/issues + profiles: + container: + rpms: + - bash + - coreutils-single + - filesystem + - glibc-minimal-langpack + - libcrypt + - microdnf + - rpm + - shadow-utils + - sssd-client + - util-linux + buildroot: + rpms: + - bash + - bzip2 + - coreutils + - cpio + - diffutils + - fedora-modular-release + - findutils + - gawk + - gcc + - gcc-c++ + - grep + - gzip + - info + - make + - patch + - redhat-rpm-config + - rpm-build + - sed + - shadow-utils + - tar + - unzip + - util-linux + - which + - xz + srpm-buildroot: + rpms: + - bash + - fedora-modular-release + - fedpkg-minimal + - gnupg2 + - redhat-rpm-config + - rpm-build + - shadow-utils + api: + rpms: [ + # acl + acl, libacl, libacl-devel, + # attr + attr, libattr, libattr-devel, + # audit + audispd-plugins, audispd-plugins-zos, audit, audit-libs, + audit-libs-devel, audit-libs-static, audit-libs-python3, + # babeltrace + babeltrace, libbabeltrace, python3-babeltrace, + # basesystem + basesystem, + # bash + bash, bash-doc, + # bc + bc, + # binutils + binutils, binutils-devel, + # byacc + byacc, + # bzip2 + bzip2, bzip2-devel, bzip2-libs, bzip2-static, + # c-ares + c-ares, c-ares-devel, + # ca-certificates + ca-certificates, + # chkconfig + chkconfig, + # coreutils + coreutils, coreutils-common, coreutils-single, + # cpio + cpio, + # cracklib + cracklib, cracklib-devel, cracklib-dicts, + # crypto-policies + crypto-policies, + # cryptsetup + cryptsetup, cryptsetup-devel, cryptsetup-libs, cryptsetup-python3, + cryptsetup-reencrypt, veritysetup, + # curl + curl, libcurl, libcurl-devel, + # cyrus-sasl + cyrus-sasl, cyrus-sasl-devel, cyrus-sasl-gs2, + cyrus-sasl-gssapi, cyrus-sasl-ldap, cyrus-sasl-lib, + cyrus-sasl-md5, cyrus-sasl-ntlm, cyrus-sasl-plain, + cyrus-sasl-scram, + # dbus + dbus, dbus-devel, dbus-doc, dbus-libs, dbus-tests, + # device-mapper-persistent-data + device-mapper-persistent-data, + # diffutils + diffutils, + # dracut + dracut, dracut-caps, dracut-config-generic, dracut-config-rescue, + dracut-tools, + # dtc + dtc, libfdt, libfdt-devel, + # dwz + dwz, + # e2fsprogs + e2fsprogs, e2fsprogs-devel, e2fsprogs-libs, e2fsprogs-static, + libcom_err, libcom_err-devel, libss, libss-devel, + # efibootmgr + efibootmgr, + # efivar + efivar, efivar-devel, efivar-libs, + # elfutils + elfutils, elfutils-default-yama-scope, elfutils-devel, + elfutils-devel-static, elfutils-libelf, elfutils-libelf-devel, + elfutils-libelf-devel-static, elfutils-libs, + # emacs + emacs-filesystem, + # expat + expat, expat-devel, expat-static, + # extlinux-bootloader + extlinux-bootloader, + # fbset + fbset, + # fedora-logos + fedora-logos, fedora-logos-httpd, + #fedora-modular-release + fedora-modular-release, + #fedora-modular-repos + fedora-modular-repos, + # fedora-rpm-macros + fedora-rpm-macros, + # fedpkg-minimal + fedpkg-minimal, + # file + file, file-devel, file-libs, python3-magic, + # filesystem + filesystem, + # findutils + findutils, + # flex + flex, flex-devel, flex-doc, + # fpc-srpm-macros + fpc-srpm-macros, + # freetype + freetype, freetype-devel, + # fuse + fuse, fuse-devel, fuse-libs, + # gawk + gawk, gawk-devel, gawk-doc, + # gc + gc, gc-devel, + # gcc + cpp, gcc, gcc-c++, gcc-gdb-plugin, gcc-gfortran, gcc-gnat, gcc-go, + gcc-objc, gcc-objc++, gcc-offload-nvptx, gcc-plugin-devel, libasan, + libasan-static, libatomic, libatomic-static, libcilkrts, + libcilkrts-static, libgcc, libgccjit, libgccjit-devel, libgfortran, + libgfortran-static, libgnat, libgnat-devel, libgnat-static, libgo, + libgo-devel, libgo-static, libgomp, libgomp-offload-nvptx, libitm, + libitm-devel, libitm-static, liblsan, liblsan-static, libmpx, + libmpx-static, libobjc, libquadmath, libquadmath-devel, + libquadmath-static, libstdc++, libstdc++-devel, libstdc++-docs, + libstdc++-static, libtsan, libtsan-static, libubsan, + libubsan-static, + # gdb + gdb, gdb-doc, gdb-gdbserver, gdb-headless, + # gdbm + gdbm, gdbm-devel, + # gettext + gettext, gettext-common-devel, gettext-devel, gettext-libs, + # ghc-srpm-macros + ghc-srpm-macros, + # glib2 + glib2, glib2-doc, glib2-tests, + # glibc + glibc, glibc-all-langpacks, glibc-common, glibc-devel, + glibc-headers, glibc-langpack-aa, glibc-langpack-af, + glibc-langpack-ak, glibc-langpack-am, glibc-langpack-an, + glibc-langpack-anp, glibc-langpack-ar, glibc-langpack-as, + glibc-langpack-ast, glibc-langpack-ayc, glibc-langpack-az, + glibc-langpack-be, glibc-langpack-bem, glibc-langpack-ber, + glibc-langpack-bg, glibc-langpack-bhb, glibc-langpack-bho, + glibc-langpack-bn, glibc-langpack-bo, glibc-langpack-br, + glibc-langpack-brx, glibc-langpack-bs, glibc-langpack-byn, + glibc-langpack-ca, glibc-langpack-ce, glibc-langpack-chr, + glibc-langpack-cmn, glibc-langpack-crh, glibc-langpack-cs, + glibc-langpack-csb, glibc-langpack-cv, glibc-langpack-cy, + glibc-langpack-da, glibc-langpack-de, glibc-langpack-doi, + glibc-langpack-dv, glibc-langpack-dz, glibc-langpack-el, + glibc-langpack-en, glibc-langpack-eo, glibc-langpack-es, + glibc-langpack-et, glibc-langpack-eu, glibc-langpack-fa, + glibc-langpack-ff, glibc-langpack-fi, glibc-langpack-fil, + glibc-langpack-fo, glibc-langpack-fr, glibc-langpack-fur, + glibc-langpack-fy, glibc-langpack-ga, glibc-langpack-gd, + glibc-langpack-gez, glibc-langpack-gl, glibc-langpack-gu, + glibc-langpack-gv, glibc-langpack-ha, glibc-langpack-hak, + glibc-langpack-he, glibc-langpack-hi, glibc-langpack-hne, + glibc-langpack-hr, glibc-langpack-hsb, glibc-langpack-ht, + glibc-langpack-hu, glibc-langpack-hy, glibc-langpack-ia, + glibc-langpack-id, glibc-langpack-ig, glibc-langpack-ik, + glibc-langpack-is, glibc-langpack-it, glibc-langpack-iu, + glibc-langpack-ja, glibc-langpack-ka, glibc-langpack-kk, + glibc-langpack-kl, glibc-langpack-km, glibc-langpack-kn, + glibc-langpack-ko, glibc-langpack-kok, glibc-langpack-ks, + glibc-langpack-ku, glibc-langpack-kw, glibc-langpack-ky, + glibc-langpack-lb, glibc-langpack-lg, glibc-langpack-li, + glibc-langpack-lij, glibc-langpack-ln, glibc-langpack-lo, + glibc-langpack-lt, glibc-langpack-lv, glibc-langpack-lzh, + glibc-langpack-mag, glibc-langpack-mai, glibc-langpack-mg, + glibc-langpack-mhr, glibc-langpack-mi, glibc-langpack-mk, + glibc-langpack-ml, glibc-langpack-mn, glibc-langpack-mni, + glibc-langpack-mr, glibc-langpack-ms, glibc-langpack-mt, + glibc-langpack-my, glibc-langpack-nan, glibc-langpack-nb, + glibc-langpack-nds, glibc-langpack-ne, glibc-langpack-nhn, + glibc-langpack-niu, glibc-langpack-nl, glibc-langpack-nn, + glibc-langpack-nr, glibc-langpack-nso, glibc-langpack-oc, + glibc-langpack-om, glibc-langpack-or, glibc-langpack-os, + glibc-langpack-pa, glibc-langpack-pap, glibc-langpack-pl, + glibc-langpack-ps, glibc-langpack-pt, glibc-langpack-quz, + glibc-langpack-raj, glibc-langpack-ro, glibc-langpack-ru, + glibc-langpack-rw, glibc-langpack-sa, glibc-langpack-sat, + glibc-langpack-sc, glibc-langpack-sd, glibc-langpack-se, + glibc-langpack-sgs, glibc-langpack-shs, glibc-langpack-si, + glibc-langpack-sid, glibc-langpack-sk, glibc-langpack-sl, + glibc-langpack-so, glibc-langpack-sq, glibc-langpack-sr, + glibc-langpack-ss, glibc-langpack-st, glibc-langpack-sv, + glibc-langpack-sw, glibc-langpack-szl, glibc-langpack-ta, + glibc-langpack-tcy, glibc-langpack-te, glibc-langpack-tg, + glibc-langpack-th, glibc-langpack-the, glibc-langpack-ti, + glibc-langpack-tig, glibc-langpack-tk, glibc-langpack-tl, + glibc-langpack-tn, glibc-langpack-tr, glibc-langpack-ts, + glibc-langpack-tt, glibc-langpack-ug, glibc-langpack-uk, + glibc-langpack-unm, glibc-langpack-ur, glibc-langpack-uz, + glibc-langpack-ve, glibc-langpack-vi, glibc-langpack-wa, + glibc-langpack-wae, glibc-langpack-wal, glibc-langpack-wo, + glibc-langpack-xh, glibc-langpack-yi, glibc-langpack-yo, + glibc-langpack-yue, glibc-langpack-zh, glibc-langpack-zu, + glibc-locale-source, glibc-minimal-langpack, glibc-nss-devel, + glibc-static, libcrypt, libcrypt-nss, nscd, nss_db, nss_hesiod, + nss_nis, + # gmp + gmp, gmp-c++, gmp-devel, gmp-static, + # gnat-srpm-macros + gnat-srpm-macros, + # gnupg2 + gnupg2, + # gnutls + gnutls, gnutls-c++, + # go-srpm-macros + go-srpm-macros, + # gobject-introspection + gobject-introspection, + # gpart + gpart, + # gpgme + gpgme, gpgme-devel, gpgmepp, gpgmepp-devel, python3-gpg, + # grep + grep, + # grub2 + grub2, grub2-efi, grub2-efi-modules, grub2-tools, + # grubby + grubby, + # guile + guile, guile-devel, + # gzip + gzip, + # hfsutils + hfsutils, hfsutils-devel, + # iproute + iproute, iproute-devel, iproute-doc, + # iptables + iptables, iptables-devel, iptables-libs, iptables-services, + iptables-utils, + # iputils, + iputils, iputils-ninfod, + # isl + isl, isl-devel, + # kernel + kernel, kernel-PAE, kernel-PAE-core, kernel-PAE-modules, + kernel-PAE-modules-extra, kernel-PAEdebug, kernel-PAEdebug-core, + kernel-PAEdebug-modules, kernel-PAEdebug-modules-extra, + kernel-bootwrapper, kernel-core, kernel-cross-headers, + kernel-debug, kernel-debug-core, kernel-debug-modules, + kernel-debug-modules-extra, kernel-headers, kernel-lpae, + kernel-lpae-core, kernel-lpae-modules, kernel-lpae-modules-extra, + kernel-modules, kernel-modules-extra, kernel-tools-libs, + # keyutils + keyutils, keyutils-libs, keyutils-libs-devel, + # kmod + kmod, kmod-devel, kmod-libs, + # krb5 + krb5-devel, krb5-libs, krb5-pkinit, krb5-workstation, libkadm5, + # libaio + libaio, libaio-devel, + # libarchive + bsdcat, bsdcpio, bsdtar, libarchive, libarchive-devel, + # libassuan + libassuan, libassuan-devel, + # libatomic_ops + libatomic_ops, libatomic_ops-devel, libatomic_ops-static, + # libcap + libcap, libcap-devel, libcap-static, + # libcap-ng + libcap-ng, libcap-ng-devel, libcap-ng-python3, libcap-ng-utils, + # libcroco + libcroco, + # libdb + libdb, libdb-cxx, libdb-cxx-devel, libdb-devel, libdb-devel-doc, + libdb-devel-static, libdb-java, libdb-java-devel, libdb-sql, + libdb-sql-devel, libdb-tcl, libdb-tcl-devel, libdb-utils, + # libdnf + libdnf, python3-hawkey, + # libev + libev, libev-devel, libev-libevent-devel, libev-source, + # libffi + libffi, libffi-devel, + # libgcrypt + libgcrypt, libgcrypt-devel, + # libgpg-error + libgpg-error, libgpg-error-devel, + # libidn + libidn, libidn-devel, + # libidn2 + libidn2, libidn2-devel, + # libipt + libipt, libipt-devel, + # libksba + libksba, libksba-devel, + # libmetalink + libmetalink, libmetalink-devel, + # libmnl + libmnl, libmnl-devel, libmnl-static, + # libmpc + compat-libmpc, libmpc, libmpc-devel, + # libnetfilter_conntrack + libnetfilter_conntrack, libnetfilter_conntrack-devel, + # libnfnetlink + libnfnetlink, libnfnetlink-devel, + # libpcap + libpcap, libpcap-devel, + # libpeas + libpeas, + # libpng + libpng, libpng-devel, libpng-static, libpng-tools, + # libpsl + libpsl, libpsl-devel, psl, psl-make-dafsa, + # libpwquality + libpwquality, libpwquality-devel, python3-pwquality, + # librepo + librepo, python3-librepo, + # librtas + librtas, librtas-devel, + # libseccomp + libseccomp, libseccomp-devel, libseccomp-static, + # libselinux + libselinux, libselinux-devel, libselinux-python3, + libselinux-static, libselinux-utils, + # libsemanage + libsemanage, libsemanage-devel, libsemanage-python3, + libsemanage-static, + # libsepol + libsepol, libsepol-devel, libsepol-static, + # libservicelog + libservicelog, libservicelog-devel, + # libsigsegv + libsigsegv, libsigsegv-devel, libsigsegv-static, + # libsolv + libsolv, libsolv-demo, libsolv-devel, libsolv-tools, python3-solv, + ruby-solv, + # libssh2 + libssh2, libssh2-docs, + # libtasn1 + libtasn1, libtasn1-devel, libtasn1-tools, + # libtool + libtool-ltdl, libtool-ltdl-devel, + # libunistring + libunistring, libunistring-devel, + # libutempter + libutempter, libutempter-devel, + # libverto + libverto, libverto-devel, libverto-glib, libverto-glib-devel, + libverto-libev, libverto-libev-devel, + # libvpd + libvpd, libvpd-devel, + # libxml2 + libxml2, libxml2-devel, libxml2-static, python3-libxml2, + # linux-firmware + iwl100-firmware, iwl1000-firmware, iwl105-firmware, + iwl135-firmware, iwl2000-firmware, iwl2030-firmware, + iwl3160-firmware, iwl3945-firmware, iwl4965-firmware, + iwl5000-firmware, iwl5150-firmware, iwl6000-firmware, + iwl6000g2a-firmware, iwl6000g2b-firmware, iwl6050-firmware, + iwl7260-firmware, libertas-sd8686-firmware, + libertas-sd8787-firmware, libertas-usb8388-firmware, + libertas-usb8388-olpc-firmware, linux-firmware, + # lsvpd + lsvpd, + # lua + lua, lua-devel, lua-libs, lua-static, + # lvm2 + device-mapper, device-mapper-devel, device-mapper-event, + device-mapper-event-devel, device-mapper-event-libs, + device-mapper-libs, lvm2, lvm2-devel, lvm2-libs, lvm2-python3-libs, + # lz4 + lz4, lz4-devel, lz4-libs, lz4-static, + # lzo + lzo, lzo-devel, lzo-minilzo, + # m4 + m4, + # mactel-boot + mactel-boot, + # make + make, make-devel, + # memtest86+ + memtest86+, + # microdnf + microdnf, + # mokutil + mokutil, + # mpfr + mpfr, mpfr-devel, + # mtools + mtools, + # ncurses + ncurses, ncurses-base, ncurses-c++-libs, ncurses-compat-libs, + ncurses-devel, ncurses-libs, ncurses-static, ncurses-term, + # nettle + nettle, nettle-devel, + # nghttp2 + libnghttp2, libnghttp2-devel, nghttp2, + # npth + npth, npth-devel, + # nspr + nspr, nspr-devel, + # nss + nss, nss-devel, nss-pkcs11-devel, nss-sysinit, nss-tools, + # nss-pem + nss-pem, + # nss-softokn + nss-softokn, nss-softokn-devel, nss-softokn-freebl, + nss-softokn-freebl-devel, + # nss-util + nss-util, nss-util-devel, + # ocaml-srpm-macros + ocaml-srpm-macros, + # openldap + openldap, openldap-clients, openldap-devel, + # openssl + openssl, openssl-devel, openssl-libs, openssl-static, + # os-prober + os-prober, + # p11-kit + p11-kit, p11-kit-devel, p11-kit-server, p11-kit-trust, + # pam + pam, pam-devel, + # patch + patch, + # pcre + pcre, pcre-cpp, pcre-devel, pcre-doc, pcre-static, pcre-tools, + pcre-utf16, pcre-utf32, + # perl-srpm-macros + perl-srpm-macros, + # pkgconf + libpkgconf, libpkgconf-devel, pkgconf, pkgconf-m4, + pkgconf-pkg-config, + # popt + popt, popt-devel, popt-static, + # powerpc-utils + powerpc-utils, + # ppc64-utils + ppc64-utils, + # procps-ng + procps-ng, procps-ng-devel, procps-ng-i18n, + # pth + pth, pth-devel, + # publicsuffix-list + publicsuffix-list, publicsuffix-list-dafsa, + # pyparsing + pyparsing-doc, python3-pyparsing, + # python-appdirs + python3-appdirs, + # python-packaging + python-packaging-doc, python3-packaging, + # python-pip + python3-pip, + # python-rpm-macros + python-rpm-macros, python-srpm-macros, python2-rpm-macros, + python3-rpm-macros, + # python-setuptools + python3-setuptools, + # python-six + python3-six, + # python3 + python3, python3-devel, python3-libs, system-python, + system-python-libs, + # qrencode + qrencode, qrencode-devel, qrencode-libs, + # qt5 + qt5-srpm-macros, + # readline + readline, readline-devel, readline-static, + # redhat-rpm-config + redhat-rpm-config, + # rpm + python3-rpm, rpm, rpm-apidocs, rpm-build, rpm-build-libs, + rpm-devel, rpm-libs, rpm-plugin-ima, rpm-plugin-selinux, + rpm-plugin-syslog, rpm-plugin-systemd-inhibit, rpm-sign, + # sed + sed, + # setup + setup, + # sg3_utils + sg3_utils, sg3_utils-devel, sg3_utils-libs, + # sgml-common + sgml-common, xml-common, + # shadow-utils + shadow-utils, + # shim-signed + shim, + # sqlite + lemon, sqlite, sqlite-devel, sqlite-doc, sqlite-libs, + # sssd + sssd-client, libsss_idmap, libsss_idmap-devel, libsss_nss_idmap, + libsss_nss_idmap-devel, python3-libsss_nss_idmap, + # syslinux + syslinux, syslinux-devel, syslinux-extlinux, + syslinux-extlinux-nonlinux, syslinux-nonlinux, syslinux-tftpboot, + # systemd + systemd, systemd-container, systemd-devel, systemd-libs, + systemd-pam, systemd-tests, systemd-udev, + # tar + tar, + # tcp_wrappers, + tcp_wrappers, tcp_wrappers-devel, tcp_wrappers-libs, + # texinfo + info, + # tzdata + tzdata, tzdata-java, + # uboot-tools + uboot-images-armv7, uboot-images-armv8, uboot-images-qemu, + uboot-tools, + # unzip + unzip, + # ustr + ustr, ustr-debug, ustr-debug-static, ustr-devel, ustr-static, + # util-linux + libblkid, libblkid-devel, libfdisk, libfdisk-devel, libmount, + libmount-devel, libsmartcols, libsmartcols-devel, libuuid, + libuuid-devel, python3-libmount, util-linux, uuidd, + # which + which, + # xz + xz, xz-devel, xz-libs, xz-lzma-compat, xz-static, + # zip + zip, + # zlib + minizip, minizip-devel, zlib, zlib-devel, zlib-static, + ] + filter: + rpms: [ + # audit + audit-libs-python, + # babeltrace + libbabeltrace-devel, + # chkconfig + ntsysv, + # cracklib + cracklib-python, + # cryptsetup + cryptsetup-python, + # cyrus-sasl + cyrus-sasl-sql, + # dbus + dbus-x11, + # dracut + dracut-fips, dracut-fips-aesni, dracut-live, dracut-network, + # emacs + emacs, emacs-common, emacs-nox, emacs-terminal, + # fbset + modeline2fb, + # file + python-magic, + # freetype + freetype-demos, + # gettext + emacs-gettext, msghack, + # glib2 + glib2-devel, glib2-fam, glib2-static, + # glibc + glibc-benchtests, glibc-utils, + # gnupg2 + gnupg2-smime, + # gnutls + gnutls-dane, gnutls-devel, gnutls-guile, gnutls-utils, + # gobject-introspection + gobject-introspection-devel, + # gpgme + python2-gpg, qgpgme, qgpgme-devel, + # grub2 + grub2-starfield-theme, + # hfsutils + hfsutils-x11, + # iproute + iproute-tc, + # iptables + iptables-compat, + # kernel + kernel-PAE-devel, kernel-PAEdebug-devel, kernel-debug-devel, + kernel-devel, kernel-lpae-devel, kernel-tools, + kernel-tools-libs-devel, perf, python-perf, + # krb5 + krb5-server, krb5-server-ldap, + # libcap-ng + libcap-ng-python, + # libcroco + libcroco-devel, + # libdnf + libdnf-devel, python2-hawkey, + # libidn + libidn-java, libidn-javadoc, + # libpeas + libpeas-devel, libpeas-gtk, libpeas-loader-python, + libpeas-loader-python3, + # libpwquality + python-pwquality, + # librepo + librepo-devel, python2-librepo, + # libselinux + libselinux-python, libselinux-ruby, + # libsemanage + libsemanage-python, + # libsolv + perl-solv, python2-solv, + # libssh2 + libssh2-devel, + # libtool + libtool, + # libverto + libverto-libevent, libverto-libevent-devel, libverto-tevent, + libverto-tevent-devel, + # libxml2 + python-libxml2, + # lvm2 + cmirror, cmirror-standalone, lvm2-cluster, + lvm2-cluster-standalone, lvm2-dbusd, lvm2-lockd, + lvm2-python-libs, + # openldap + openldap-servers, + # openssl + openssl-perl, + # pyparsing + pyparsing, python2-pyparsing, + # python-appdirs + python2-appdirs, + # python-packaging + python2-packaging, + # python-pip + python2-pip, + # python-setuptools + python2-setuptools, + # python-six + python2-six, + # python3 + python3-debug, python3-test, python3-tkinter, python3-tools, + # qt5 + qt5, qt5-devel, qt5-rpm-macros, + # redhat-rpm-config + kernel-rpm-macros, + # rpm + python2-rpm, rpm-cron, + # sqlite + sqlite-analyzer, sqlite-tcl, + # sssd + libipa_hbac, libipa_hbac-devel, libsss_autofs, libsss_idmap-devel, + libsss_nss_idmap-devel, libsss_simpleifp, libsss_simpleifp-devel, + libsss_sudo, python2-libipa_hbac, python2-libsss_nss_idmap, + python2-sss, python2-sssdconfig, python2-sss-murmur, + python3-libipa_hbac, python3-sss, python3-sssdconfig, + python3-sss-murmur, sssd, sssd-ad, sssd-common, sssd-common-pac, + sssd-dbus, sssd-ipa, sssd-krb5, sssd-krb5-common, sssd-ldap, + sssd-libwbclient, sssd-libwbclient-devel, sssd-nfs-idmap, + sssd-proxy, sssd-tools, sssd-winbind-idmap, + # syslinux + syslinux-perl, + # systemd + systemd-journal-remote, + # texinfo + texinfo, texinfo-tex, + # util-linux + util-linux-user, + ] + components: + rpms: + # acl-2.2.52-13.fc26 + acl: + rationale: Autogenerated by Base Runtime tools. + ref: 1b70d5975cbe16d4fd4e14de4e132e5b8bc39c53 + # attr-2.4.47-18.fc26 + attr: + rationale: Autogenerated by Base Runtime tools. + ref: deabbc4e2a74e993af0be267b13c431a3ace0558 + # audit-2.7.6-1.fc26 + audit: + rationale: Autogenerated by Base Runtime tools. + ref: 123b93c75de810d79d2f8906e1ab9fb96b22b69e + # babeltrace-1.5.2-2.fc26 + babeltrace: + rationale: Autogenerated by Base Runtime tools. + ref: f5c9540efbc66493e8644391405f5dc0815d1ad1 + # basesystem-11-3.fc26 + basesystem: + rationale: Autogenerated by Base Runtime tools. + ref: e4a05b3ab23f2972f922ec38527b7c923ed4154c + # bash-4.4.12-4.fc26 + bash: + rationale: Autogenerated by Base Runtime tools. + ref: 31a9b53e1921c6aa5f2bed0872c1cd906d3080d6 + # bc-1.06.95-18.fc26 + bc: + rationale: Autogenerated by Base Runtime tools. + ref: 2cdfa698bfc045918bbc39456a952532fc9de6ff + # binutils-2.27-21.fc26 + binutils: + rationale: Autogenerated by Base Runtime tools. + ref: d3157973ba5cd05eba8d17ead87acf50a7fe4610 + # byacc-1.9.20170201-1.fc26 + byacc: + rationale: Autogenerated by Base Runtime tools. + ref: 624e59d1c7d612410ec9ef022f66da794118afcf + # bzip2-1.0.6-22.fc26 + bzip2: + rationale: Autogenerated by Base Runtime tools. + ref: 3ea5d7bdb1c334d2e6efeb9ec81b8ee8ef13d984 + # c-ares-1.12.0-2.fc26 + c-ares: + rationale: Autogenerated by Base Runtime tools. + ref: b74febc36bd5c5496d8f384710c84c88c10c3d82 + # ca-certificates-2017.2.14-1.0.fc26 + ca-certificates: + rationale: Autogenerated by Base Runtime tools. + ref: 9506435bd8bb4a5a09797e070a7f60332acc9752 + # chkconfig-1.10-1.fc26 + chkconfig: + rationale: Autogenerated by Base Runtime tools. + ref: adc3f7d5577bf51a26355748921864a6e7277ee5 + # coreutils-8.27-5.fc26 + coreutils: + rationale: Autogenerated by Base Runtime tools. + ref: e00cb1843f7384b4682280a1a56cef58bdc8106f + # cpio-2.12-4.fc26 + cpio: + rationale: Autogenerated by Base Runtime tools. + ref: 6c6d3ddaea11e8635b2dec97769fb7a0d8324ae5 + # cracklib-2.9.6-5.fc26 + cracklib: + rationale: Autogenerated by Base Runtime tools. + ref: 2edb3e61e337926a92d56ffe84bd8cdb0f625586 + # crypto-policies-20170330-3.git55b66da.fc26 + crypto-policies: + rationale: Autogenerated by Base Runtime tools. + ref: 8c8ca98c2ef702dc75cb52a01c121bed0d2c588d + # cryptsetup-1.7.5-1.fc26 + cryptsetup: + rationale: Autogenerated by Base Runtime tools. + ref: b64fb92578bcf24d2a2d2e6e73823e3447f367e7 + # curl-7.53.1-7.fc26 + curl: + rationale: Autogenerated by Base Runtime tools. + ref: 5ac5f7bdc933a64f7284a0e4dc03f07aad001f2b + # cyrus-sasl-2.1.26-32.fc26 + cyrus-sasl: + rationale: Autogenerated by Base Runtime tools. + ref: 75a23b2fea6cff96154f180dde30b9c675b48364 + # dbus-1:1.11.12-1.fc26 + dbus: + rationale: Autogenerated by Base Runtime tools. + ref: d750f7d4a535541eb15b4f37deb74e3e30313989 + # device-mapper-persistent-data-0.6.3-5.fc26 + device-mapper-persistent-data: + rationale: Autogenerated by Base Runtime tools. + ref: 678a17f85d392b3e438bce06485e3227ee73e82d + # device-mapper-persistent-data-0.6.3-5.fc26 + device-mapper-persistent-data: + rationale: Autogenerated by Base Runtime tools. + ref: 678a17f85d392b3e438bce06485e3227ee73e82d + # diffutils-3.5-3.fc26 + diffutils: + rationale: Autogenerated by Base Runtime tools. + ref: 165207b40bc5d50fe8432236661c7e5d0f3bfd80 + # dracut-044-182.fc26 + dracut: + rationale: Needed to boot the system. + ref: 04d6319f7600ca18a9a0da517052af6e56986657 + # dtc-1.4.4-1.fc26 + dtc: + rationale: Autogenerated by Base Runtime tools. + ref: 05b2b5605b108427497ee77a67204ec50dcfa986 + # dwz-0.12-3.fc26 + dwz: + rationale: Autogenerated by Base Runtime tools. + ref: 6340a7adad2fb11e81a01f8e8b2e2a4fe3e990ca + # e2fsprogs-1.43.4-2.fc26 + e2fsprogs: + rationale: Autogenerated by Base Runtime tools. + ref: 55a0c09e0e30ab1fb7306bc48f5842f08d58201d + # efibootmgr-15-1.fc27 + efibootmgr: + rationale: Autogenerated by Base Runtime tools. + ref: 5070dfa0d2504f4299bfc5c2e5e8c390cd0d3235 + # efivar-31-1.fc27 + efivar: + rationale: Autogenerated by Base Runtime tools. + ref: 9af50adeeb29e1b72dbade00cbda990a3a37454d + # elfutils-0.169-1.fc26 + elfutils: + rationale: Autogenerated by Base Runtime tools. + ref: e67242de84610b0b4c7842b151288936f8a13b03 + # emacs-1:25.2-2.fc26 + emacs: + rationale: Autogenerated by Base Runtime tools. + ref: 42fa24ab12901a5a00bd7e672a2576193adf574e + # expat-2.2.0-2.fc26 + expat: + rationale: Autogenerated by Base Runtime tools. + ref: 9af336b7b5c64a6c66fa1d094747e1c307c73c7f + # extlinux-bootloader-1.2-1.fc27 + extlinux-bootloader: + rationale: Autogenerated by Base Runtime tools. + ref: 2e6df0d2403786d119028b5fe28fffdd5f99c3df + # fbset-2.1-41.fc27 + fbset: + rationale: Autogenerated by Base Runtime tools. + ref: e086d17001901320260df464954bc8aa3a4ae05e + # fedora-logos-26.0.1-1.fc26 + fedora-logos: + rationale: Autogenerated by Base Runtime tools. + ref: 1263b8501f117be5b06f61ad12f895dab19d0c1a + fedora-modular-release: + rationale: Autogenerated by Base Runtime tools. + ref: db937d42cebde417a4002ed2ce8578c63f2b114c + fedora-modular-repos: + rationale: Autogenerated by Base Runtime tools. + ref: 7b674e149f00959cc693fb1c30ff06fe39a436b8 + # fedora-rpm-macros-26-2.fc26 + fedora-rpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: d168f4a539efef42dcf48a5e9f4a178b258aba06 + # fedpkg-minimal-1.1.0-8.fc26 + fedpkg-minimal: + rationale: Autogenerated by Base Runtime tools. + ref: 026cc9ca12187f6204cf32c552225865eb71f184 + # file-5.30-6.fc26 + file: + rationale: Autogenerated by Base Runtime tools. + ref: 678277ca4c8c45887882b3172af91205ed1da6f0 + # filesystem-3.2-40.fc26 + filesystem: + rationale: Autogenerated by Base Runtime tools. + ref: ed1bc54acfa044b782ecbed596311d79db7a9c8a + # findutils-4.6.0-12.fc26 + findutils: + rationale: Autogenerated by Base Runtime tools. + ref: 339b378e9b6a084791e323389daa071f1e7f07ac + # flex-2.6.1-3.fc26 + flex: + rationale: Autogenerated by Base Runtime tools. + ref: 26fe0dfe580bba78517ca44cb4bd755be0cde4f5 + # fpc-srpm-macros-1.1-2.fc26 + fpc-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: 3f0e8216425fcde8fb9abb7bb1eb1bafe33017f0 + # freetype-2.7.1-6.fc26 + freetype: + rationale: Autogenerated by Base Runtime tools. + ref: d3647a0d5dd9e39ced0ffbe119c3078bfb86a7bf + # fuse-2.9.7-2.fc26 + fuse: + rationale: Autogenerated by Base Runtime tools. + ref: 74f133fbe7eb042fadb508a39dbc699543736b5c + # gawk-4.1.4-3.fc26 + gawk: + rationale: Autogenerated by Base Runtime tools. + ref: 63f2ac8ac41274519602f03ef1f718ae0b2c8e4d + # gc-7.6.0-4.fc27 + # Plus additional patch to skip tests on armv7hl + gc: + rationale: Autogenerated by Base Runtime tools. + ref: ee9803b67c37b1a86b2f1f2a3389c3902e659b9f + # gcc-7.1.1-1.fc26 + gcc: + rationale: Autogenerated by Base Runtime tools. + ref: 872d384f80797c6aef5269d069f83cb0bb2edd9f + # gdb-7.12.50.20170226-4.fc26 + gdb: + rationale: Autogenerated by Base Runtime tools. + ref: 0fffd6c99de26517095a9dd81054b3713e12cfde + # gdbm-1.13-1.fc26 + gdbm: + rationale: Autogenerated by Base Runtime tools. + ref: 587a5c1d117d991df4caac5e1b7a73198b4902a0 + # gettext-0.19.8.1-9.fc26 + gettext: + rationale: Autogenerated by Base Runtime tools. + ref: df498733241ad35d2e7025c9b2ad5c394e6e595d + # ghc-srpm-macros-1.4.2-5.fc26 + ghc-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: b57d95b6c5cbc8086653c53b0324629915204b37 + # glib2-2.52.2-2.fc26 + glib2: + rationale: Autogenerated by Base Runtime tools. + ref: 15854645a451f349662f7de7d6dae2fa86c84cd2 + # glibc-2.25-6.fc26 + glibc: + rationale: Autogenerated by Base Runtime tools. + ref: a2f7bb78767003033384a9f2030ac92cb7212d87 + # gmp-1:6.1.2-4.fc26 + gmp: + rationale: Autogenerated by Base Runtime tools. + ref: fe04d46fce3c3596ad631710d26531aa359e375f + # gnat-srpm-macros-4-2.fc26 + gnat-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: 443d027b8b0a710d1852f275555de9f3b3270016 + # gnupg2-2.1.20-2.fc26 + gnupg2: + rationale: Autogenerated by Base Runtime tools. + ref: 9c42951fbea8754e3f666f804253c21051119e53 + # gnutls-3.5.12-2.fc26 + gnutls: + rationale: Autogenerated by Base Runtime tools. + ref: 2c3737eddb535d743eac6d266a861f365d9df864 + # go-srpm-macros-2-8.fc26 + go-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: 0b6060827d9dcd4cf9c05454b7e57912284b2970 + # gobject-introspection-1.52.1-1.fc26 + gobject-introspection: + rationale: Autogenerated by Base Runtime tools. + ref: 55bfa0b68eaa76ee7712b34c88c0a2d4128bce7e + # gpart-0.3-3.fc26 + gpart: + rationale: Autogenerated by Base Runtime tools. + ref: 79d2bc74e0b725328e8c298c4b57caa45c125310 + # gpgme-1.9.0-1.fc27 + gpgme: + rationale: Autogenerated by Base Runtime tools. + ref: 80cb2f5e13b902e63785d307e0cffbe0d773a76c + # grep-3.0-1.fc26 + grep: + rationale: Autogenerated by Base Runtime tools. + ref: c232695f408106307c43b2954c732a5a6bb352ba + # grub2-2.02-0.38.fc26 + grub2: + rationale: Autogenerated by Base Runtime tools. + ref: 819251656a468b2f06137bc98b4487af8e2af6f0 + # grubby-8.40-4.fc26 + grubby: + rationale: Autogenerated by Base Runtime tools. + ref: c7f3e950d7d406f96794ef6933f883595af1954d + # guile-2.0.14-1.fc26 + guile: + rationale: Autogenerated by Base Runtime tools. + ref: 2df74f173026ec917b11c940e8bb29cb2903d07e + # gzip-1.8-2.fc26 + gzip: + rationale: Autogenerated by Base Runtime tools. + ref: cd306eb7f9bfce3b27372269d7b092812c312e9d + # hfsutils-3.2.6-31.fc26 + hfsutils: + rationale: Autogenerated by Base Runtime tools. + ref: 5a2f18ddbd21481a64771fe5c05b3926625b8a1e + # iproute-4.11.0-1.fc26 + iproute: + rationale: Autogenerated by Base Runtime tools. + ref: 74656075ed5ad4ed7270b8aeb6afa2a4ef914fc7 + # iptables-1.6.1-2.fc26 + iptables: + rationale: Autogenerated by Base Runtime tools. + ref: 7ee46ed2f5172db5f6e158009062ef99c3eebb48 + # iputils-20161105-2.fc26 + iputils: + rationale: Autogenerated by Base Runtime tools. + ref: 3be51cc88526fbf29d67dd1de80366b416140975 + # isl-0.16.1-1.fc26 + isl: + rationale: Autogenerated by Base Runtime tools. + ref: 113dc22c621070f014f09ff0cd1abbe09ad99a61 + # kernel-4.11.0-2.fc26 + kernel: + rationale: Autogenerated by Base Runtime tools. + ref: f2ae1bd31e1a9eccb8d80a7087aee1c19518ef74 + # keyutils-1.5.10-1.fc26 + keyutils: + rationale: Autogenerated by Base Runtime tools. + ref: 7162e158eb6bdd78c28b2add1c9289668cacc937 + # kmod-24-1.fc26 + kmod: + rationale: Autogenerated by Base Runtime tools. + ref: 95d16ea378aefae832e728bc37a9c1a16453902a + # krb5-1.15.1-8.fc26 + krb5: + rationale: Autogenerated by Base Runtime tools. + ref: 3cae6ae5c37a3c500c074241f794716c1e6fdc90 + # libaio-0.3.110-7.fc26 + libaio: + rationale: Autogenerated by Base Runtime tools. + ref: db11cf2785cee8d274c6640edf9a7078c2509012 + # libarchive-3.2.2-4.fc26 + libarchive: + rationale: Autogenerated by Base Runtime tools. + ref: 7446b2e86d798e2e7672a3f41a333e3182c7b1dc + # libassuan-2.4.3-2.fc26 + libassuan: + rationale: Autogenerated by Base Runtime tools. + ref: 7e26da2408be409d2791b8fa0033f0443181798a + # libatomic_ops-7.4.4-2.fc26 + libatomic_ops: + rationale: Autogenerated by Base Runtime tools. + ref: 3eeefda8bed2c0c359a1ac993bc1ff2b0cc18145 + # libcap-2.25-5.fc26 + libcap: + rationale: Autogenerated by Base Runtime tools. + ref: f17ad4c828018a730449494514a33150cf5d520b + # libcap-ng-0.7.8-3.fc26 + libcap-ng: + rationale: Autogenerated by Base Runtime tools. + ref: a7b3901d3112e947ac2060b9fc82bc9d3a4d49f0 + # libcroco-0.6.12-1.fc26 + libcroco: + rationale: Autogenerated by Base Runtime tools. + ref: 75818f466e8ffa31ca95ef3b33dd63279376f24d + # libdb-5.3.28-17.fc26 + libdb: + rationale: Autogenerated by Base Runtime tools. + ref: 607172865e43570dde11c1f49de14474f47e837a + # libdnf-0.9.2-1.fc26 + libdnf: + rationale: Autogenerated by Base Runtime tools. + ref: 8a2c2ce0fe8899d18e8dfb88dd61fc0b13ab6616 + # libev-4.24-2.fc26 + libev: + rationale: Autogenerated by Base Runtime tools. + ref: f7b1bcaebb7d48ff0519b1517bf83645f09ccef0 + # libffi-3.1-10.fc26 + libffi: + rationale: Autogenerated by Base Runtime tools. + ref: 2455877bfe4cab9dd9eaf206cb5bcb44804a0a1c + # libgcrypt-1.7.6-2.fc26 + libgcrypt: + rationale: Autogenerated by Base Runtime tools. + ref: 396c70cd7ad79ee8d8bd672f4fbc3cc4f04fb8d7 + # libgpg-error-1.25-2.fc26 + libgpg-error: + rationale: Autogenerated by Base Runtime tools. + ref: a7b12bf545320fd71f2f7d319ac200ee5d8ab02c + # libidn-1.33-2.fc26 + libidn: + rationale: Autogenerated by Base Runtime tools. + ref: 7275bd926ff5ecf7ed8eb2af5601ef6953a78352 + # libidn2-2.0.2-1.fc26 + libidn2: + rationale: Autogenerated by Base Runtime tools. + ref: a0ad03b679f30f30e5b196a85d700f4c17b26dd9 + # libipt-1.5-2.fc26 + libipt: + rationale: Autogenerated by Base Runtime tools. + ref: 718f83351b0a2fe7f24f45370ca7b9f224b723f1 + # libksba-1.3.5-3.fc26 + libksba: + rationale: Autogenerated by Base Runtime tools. + ref: 343c435d424b7cfded4a8c3fb94e86ca18771109 + # libmetalink-0.1.3-2.fc26 + libmetalink: + rationale: Autogenerated by Base Runtime tools. + ref: 14d998a17d45a384c2b9391536b3294efaeb6390 + # libmnl-1.0.4-2.fc26 + libmnl: + rationale: Autogenerated by Base Runtime tools. + ref: 0fecaca66472a4f11fbac306aaded65a354dcfab + # libmpc-1.0.2-6.fc26 + libmpc: + rationale: Autogenerated by Base Runtime tools. + ref: 54ced8ff789bdaa32de7836e82a5b0d481d36bce + # libnetfilter_conntrack-1.0.6-2.fc26 + libnetfilter_conntrack: + rationale: Autogenerated by Base Runtime tools. + ref: 0e59521eaee1763e46d0a48e0ad6e5d02fc67e59 + # libnfnetlink-1.0.1-9.fc26 + libnfnetlink: + rationale: Autogenerated by Base Runtime tools. + ref: 3e3ab7c13aac49047432b6f4ceb42ef1ed48c483 + # libpcap-1.8.1-3.fc26 + libpcap: + rationale: Autogenerated by Base Runtime tools. + ref: 46f5217d492c46a62147c48803012d9cce92e059 + # libpeas-1.20.0-5.fc26 + libpeas: + rationale: Autogenerated by Base Runtime tools. + ref: f479ecc4041fb2b836b1270b9d117f3ffed12e1f + # libpng-1.6.28-2.fc26 + libpng: + rationale: Autogenerated by Base Runtime tools. + ref: 2eef5ca8cb026b1dbe4d6191749eda3d5177483a + # libpsl-0.17.0-2.fc26 + libpsl: + rationale: Autogenerated by Base Runtime tools. + ref: 76ef0f56ec9d386fc981462fccc4338f987bc4d6 + # libpwquality-1.3.0-8.fc26 + libpwquality: + rationale: Autogenerated by Base Runtime tools. + ref: 9bf5174c3324e63969c676415890a1a1c8aca5f6 + # librepo-1.7.20-3.fc26 + librepo: + rationale: Autogenerated by Base Runtime tools. + ref: 372bbc1d15e4a53309229619aa763030d2ebd24d + # librtas-2.0.1-1.fc26 + librtas: + rationale: Autogenerated by Base Runtime tools. + ref: 587c426391de5ea208e77d1522e8f07705f5a211 + # libseccomp-2.3.2-1.fc26 + libseccomp: + rationale: Autogenerated by Base Runtime tools. + ref: 857113eb64e504f9123c52ae82c815b2ceeb2fd0 + # libselinux-2.6-6.fc26 + libselinux: + rationale: Autogenerated by Base Runtime tools. + ref: ea9eee161ed07911c9c672b0e598509e39cac679 + # libsemanage-2.6-4.fc26 + libsemanage: + rationale: Autogenerated by Base Runtime tools. + ref: 64efa5b6db085bcd5868189a4600ec6985e79196 + # libsepol-2.6-1.fc26 + libsepol: + rationale: Autogenerated by Base Runtime tools. + ref: 99653f4b762884baef7c64a867ffc0bb4eccb392 + # libservicelog-1.1.17-1.fc26 + libservicelog: + rationale: Autogenerated by Base Runtime tools. + ref: ec8fd481ac4ade036094f164c59beaa0bf96893d + # libsigsegv-2.11-1.fc26 + libsigsegv: + rationale: Autogenerated by Base Runtime tools. + ref: 0bca2e2c40a26940b5a1787e03d97dd11f369bb6 + # libsolv-0.6.27-1.fc26 + libsolv: + rationale: Autogenerated by Base Runtime tools. + ref: e6ddcf95315f088b176c6eafa58c9c969f969293 + # libssh2-1.8.0-2.fc26 + libssh2: + rationale: Autogenerated by Base Runtime tools. + ref: e44a6af4ac5f823db5654f18f7db7cf9f1b176d9 + # libtasn1-4.10-2.fc26 + libtasn1: + rationale: Autogenerated by Base Runtime tools. + ref: 47170124b65abe7d2d3c7f9ba8fda5aa615ada92 + # libtool-2.4.6-17.fc26 + libtool: + rationale: Autogenerated by Base Runtime tools. + ref: a18bf3932e524978d0e52732c749e9ad7741a04a + # libunistring-0.9.7-1.fc26 + libunistring: + rationale: Autogenerated by Base Runtime tools. + ref: ee6fd5523361a7764c52116b72d184c1fb02f4ab + # libutempter-1.1.6-9.fc26 + libutempter: + rationale: Autogenerated by Base Runtime tools. + ref: 0d4613714e458f3c691160032a4b1578a86b5367 + # libverto-0.2.6-7.fc26 + libverto: + rationale: Autogenerated by Base Runtime tools. + ref: 521cea8b5a829197c1f6a55f605fc4b995b5184e + # libvpd-2.2.5-5.fc26 + libvpd: + rationale: Autogenerated by Base Runtime tools. + ref: 7d949c746837b1d38bc6869cc0f2750542a68cbf + # libxml2-2.9.4-2.fc26 + libxml2: + rationale: Autogenerated by Base Runtime tools. + ref: 5fda684ac196f90b263658654775c736a6cea3dc + # linux-firmware-20170313-72.git695f2d6d.fc26 + linux-firmware: + rationale: Autogenerated by Base Runtime tools. + ref: e9184d656d8d91e1350c3d056ff6bea12acbe294 + # lsvpd-1.7.8-1.fc26 + lsvpd: + rationale: Autogenerated by Base Runtime tools. + ref: a386ac9b2d49b759b041102f359b83cb564aaa47 + # lua-5.3.4-1.fc26 + lua: + rationale: Autogenerated by Base Runtime tools. + ref: b7447739b8d3a722a2d8e7305690b6ac3c548882 + # lvm2-2.02.168-6.fc26 + lvm2: + rationale: Autogenerated by Base Runtime tools. + ref: f033fa0c98533c822a4e94a337c4f398748f5956 + # lz4-1.7.5-3.fc26 + lz4: + rationale: Autogenerated by Base Runtime tools. + ref: b1b71dd0916da639745125b93f3a7c1f7dde692a + # lzo-2.08-9.fc26 + lzo: + rationale: Autogenerated by Base Runtime tools. + ref: f507e1f182375aff98c810c2dde30770c54d1465 + # m4-1.4.18-3.fc26 + m4: + rationale: Autogenerated by Base Runtime tools. + ref: 720144b905662d90fb6fc44da11e157742dd8087 + # mactel-boot-0.9-14.fc26 + mactel-boot: + rationale: Autogenerated by Base Runtime tools. + ref: 129a7f0b78d99f20df2b52d72dc24b6a87e7f82e + # make-4.2.1-2.fc26 + make: + rationale: Autogenerated by Base Runtime tools. + ref: 966e01fab75b418a684d097b0596ee7159c80739 + # memtest86+-5.01-16.fc26 + memtest86+: + rationale: Autogenerated by Base Runtime tools. + ref: dcb748b13e9e02d8c1be26274b138a6c56ce309b + # microdnf-2-2.fc26 + microdnf: + rationale: Autogenerated by Base Runtime tools. + ref: 13625aae6d2d565110ab614402424544b9905de0 + # mokutil-0.3.0-4.fc26 + mokutil: + rationale: Autogenerated by Base Runtime tools. + ref: 802dd0c3c70005a9e7832d7274e4c0df282f8bb0 + # mpfr-3.1.5-3.fc26 + mpfr: + rationale: Autogenerated by Base Runtime tools. + ref: dc787f1468a5903a751bbde73d6a7b1c4af008d6 + # mtools-4.0.18-11.fc26 + mtools: + rationale: Autogenerated by Base Runtime tools. + ref: 90349496f4f041ba4c1396479b921f994cac5164 + # ncurses-6.0-8.20170212.fc26 + ncurses: + rationale: Autogenerated by Base Runtime tools. + ref: 7750f0de472f697700b7e92e0a4b9cd68b85f42f + # nettle-3.3-2.fc26 + nettle: + rationale: Autogenerated by Base Runtime tools. + ref: c3f0481ad7c462e298c3f85fc692059275077806 + # nghttp2-1.21.1-1.fc26 + nghttp2: + rationale: Autogenerated by Base Runtime tools. + ref: bb1e82241f49d2573f95fe44c74bde6ce6721ae4 + # npth-1.3-2.fc26 + npth: + rationale: Autogenerated by Base Runtime tools. + ref: 2333696ca8fe50890aa1627319aef56c72205e79 + # nspr-4.14.0-2.fc26 + nspr: + rationale: Autogenerated by Base Runtime tools. + ref: b7b8b1387c1f0bd70eb17ab6d4349f55bc43dea5 + # nss-3.30.2-1.0.fc26 + nss: + rationale: Autogenerated by Base Runtime tools. + ref: 8a895b4021590b012f932e819932847a602c0923 + # nss-pem-1.0.3-3.fc26 + nss-pem: + rationale: Autogenerated by Base Runtime tools. + ref: 7d778d532a8711da5a5c3473c6b9bca516269007 + # nss-softokn-3.30.2-1.0.fc26 + nss-softokn: + rationale: Autogenerated by Base Runtime tools. + ref: 9ac2cf8e660d0bffaf8a7ac93faa75d7bd3ca8ba + # nss-util-3.30.2-1.0.fc26 + nss-util: + rationale: Autogenerated by Base Runtime tools. + ref: e1d76810773c1144e489f2ed464076b963a51a2f + # ocaml-srpm-macros-4-2.fc26 + ocaml-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: 21de03ba74f07120a082206a9bd2e77bc8863ccd + # openldap-2.4.44-10.fc26 + openldap: + rationale: Autogenerated by Base Runtime tools. + ref: af30ccf247c0814d1902d2f3ebd87b4f8f806efc + # openssl-1.1.0e-1.fc26 + openssl: + rationale: Autogenerated by Base Runtime tools. + ref: c676ac32d544254b1d40d8579de8d1fb33c18305 + # os-prober-1.74-1.fc26 + os-prober: + rationale: Autogenerated by Base Runtime tools. + ref: 4f972d5e7e48396df27114d5ecc6ac319fb3d88e + # p11-kit-0.23.5-1.fc26 + p11-kit: + rationale: Autogenerated by Base Runtime tools. + ref: 2bd6b57929716fc8d36383f7c9a6afef1b693e03 + # pam-1.3.0-2.fc26 + pam: + rationale: Autogenerated by Base Runtime tools. + ref: d6023f89c8072fef926c992b540db7f202e00f9f + # patch-2.7.5-4.fc26 + patch: + rationale: Autogenerated by Base Runtime tools. + ref: 4a664207f1325f1eefbb9f29f1160d85a1549827 + # pcre-8.40-7.fc26 + pcre: + rationale: Autogenerated by Base Runtime tools. + ref: a82fb773cc7257b952cb45add94a8d9091698873 + # perl-srpm-macros-1-21.fc26 + perl-srpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: 15a1edf29c159f252d7e3ef91c0b01c14ac47fbc + # pkgconf-1.3.6-1.fc26 + pkgconf: + rationale: Autogenerated by Base Runtime tools. + ref: 11de9e4874ece462059d6b1be5597c76a720f2b0 + # popt-1.16-8.fc26 + popt: + rationale: Autogenerated by Base Runtime tools. + ref: d9302725fdbde901827f2677d06765394ad5ad92 + # powerpc-utils-1.3.3-1.fc26 + powerpc-utils: + rationale: Autogenerated by Base Runtime tools. + ref: 69110066d7dfcca05db3ef30db98bd918f3b14a2 + # ppc64-utils-0.14-22.fc26 + ppc64-utils: + rationale: Autogenerated by Base Runtime tools. + ref: 46d3f9b89571ad915864a86ff96d48a47ec65e8c + # procps-ng-3.3.10-13.fc26 + procps-ng: + rationale: Autogenerated by Base Runtime tools. + ref: e54875d55a6b845a707004d29bffa11377321d15 + # pth-2.0.7-28.fc26 + pth: + rationale: Autogenerated by Base Runtime tools. + ref: 4a65b57e8c1352a94ccf369d365d4f375119ef51 + # publicsuffix-list-20170424-1.fc26 + publicsuffix-list: + rationale: Autogenerated by Base Runtime tools. + ref: 5f2e19d78452fc2adcdc7bc694e8e9b74495dd1f + # pyparsing-2.1.10-3.fc26 + pyparsing: + rationale: Autogenerated by Base Runtime tools. + ref: 5c83231e278a97a1cfca6bfddb36d2fffa221b8b + # python-appdirs-1.4.0-10.fc26 + python-appdirs: + rationale: Autogenerated by Base Runtime tools. + ref: 7bb99cfef2a51c7258e6ee1d122a77cf6939347a + # python-packaging-16.8-4.fc26 + python-packaging: + rationale: Autogenerated by Base Runtime tools. + ref: 2f8a444b2cb5d4e4a578d01acffc7ae1eeef8d0b + # python-pip-9.0.1-9.fc26 + python-pip: + rationale: Autogenerated by Base Runtime tools. + ref: d6fcf17a6e6686f638b77b1a485469a991ddbb57 + # python-rpm-macros-3-20.fc26 + python-rpm-macros: + rationale: Autogenerated by Base Runtime tools. + ref: f37b53c3973f842f60f3d423755c51d62b99390d + # python-setuptools-35.0.1-1.fc26 + python-setuptools: + rationale: Autogenerated by Base Runtime tools. + ref: c64e6d09b77e572e28683c6d2c43584141981714 + # python-six-1.10.0-8.fc26 + python-six: + rationale: Autogenerated by Base Runtime tools. + ref: d309bdfbb853cc7b2145903d1edcc86d8370981b + # python3-3.6.1-6.fc26 + python3: + rationale: Autogenerated by Base Runtime tools. + ref: 63656420a36841328aabcc11bee3306c0a4c372e + # qrencode-3.4.2-7.fc26 + qrencode: + rationale: Autogenerated by Base Runtime tools. + ref: b9d183a507f4985a4dffd5eaecab31a265d21828 + # qt5-5.8.0-2.fc26 + qt5: + rationale: Autogenerated by Base Runtime tools. + ref: 92761aa95897e47b97892c2efb2f6816b33f1bf4 + # readline-7.0-5.fc26 + readline: + rationale: Autogenerated by Base Runtime tools. + ref: af6675659ad82a7f43af4e35f400e4bbdbae6d49 + # redhat-rpm-config-63-1.fc26 + redhat-rpm-config: + rationale: Autogenerated by Base Runtime tools. + ref: 4914809dca206e1016d45a0c8a4b8424beb4ad80 + # rpm-4.13.0.1-4.fc26 + rpm: + rationale: Autogenerated by Base Runtime tools. + ref: b1ad85bc8cda6dc7d36058712f593f0600d5d13f + # sed-4.4-1.fc26 + sed: + rationale: Autogenerated by Base Runtime tools. + ref: 575a3ba668dd1ad996ca088e7efee9a522e94947 + # setup-2.10.5-2.fc26 + setup: + rationale: Autogenerated by Base Runtime tools. + ref: 338c72bc4e4fc6fa950f899bf4253b32de1dff60 + # sg3_utils-1.42-1.fc26 + sg3_utils: + rationale: Autogenerated by Base Runtime tools. + ref: 630e26d15c7b7c1c9b0ec50a764092c3551f1948 + # sgml-common-0.6.3-45.fc26 + sgml-common: + rationale: Autogenerated by Base Runtime tools. + ref: 81d7064b0e7da6e0e5593829ed72c9ce17108b7b + # shadow-utils-4.3.1-3.fc26 + shadow-utils: + rationale: Autogenerated by Base Runtime tools. + ref: ba9340caf5a3f86043659dd5dc83d9280cd38185 + # shim-signed-0.8-10.1.* + shim-signed: + rationale: Autogenerated by Base Runtime tools. + ref: bb890e80b23392d1ac40c5dbb3770acfa1ef5d6c + # sssd-1.15.2-3.fc26 + sssd: + rationale: Latest stable. Fix test failures. + ref: 90107469a76e6bb7247bfb29a40bade398dcf4bf + # sqlite-3.18.0-1.fc26 + sqlite: + rationale: Autogenerated by Base Runtime tools. + ref: 2beb9f1c3fd168b6421b300ff04a97d1b78362d7 + # syslinux-6.04-0.2.fc26 + syslinux: + rationale: Autogenerated by Base Runtime tools. + ref: f793e3a0a39cf86dd5fff0448010b978583e4de2 + # systemd-233-3.fc26 + systemd: + rationale: Autogenerated by Base Runtime tools. + ref: e47c648430180ca132ec753e535e1ec2c0bd3bff + # tar-1.29-4.fc26 + tar: + rationale: Autogenerated by Base Runtime tools. + ref: 353f951667464c0d8174edb4a6a13ed2aa1b9b46 + # tcp_wrappers-7.6-85.fc26 + tcp_wrappers: + rationale: Autogenerated by Base Runtime tools. + ref: 3aa22b5bed459758a32a802982ef6a8066f71fb0 + # texinfo-6.3-3.fc26 + texinfo: + rationale: Autogenerated by Base Runtime tools. + ref: 31373332adea8f4c4f13683538a6e81f64af222e + # tzdata-2017b-1.fc26 + tzdata: + rationale: Autogenerated by Base Runtime tools. + ref: 6089ddc1ae9cda8c2fbc1340cdd10a45502bf909 + # uboot-tools-2017.05-0.4.rc2.fc26 + uboot-tools: + rationale: Autogenerated by Base Runtime tools. + ref: e965f7ea51ec8bc1b2b4fdbad5374835361d31ab + # unzip-6.0-33.fc26 + unzip: + rationale: Autogenerated by Base Runtime tools. + ref: cd6cf59f9b2b795841815ad0b9dcda743aee83e7 + # ustr-1.0.4-22.fc26 + ustr: + rationale: Autogenerated by Base Runtime tools. + ref: 18c0ac45798d46e511baa373b01b718fb14afd3c + # util-linux-2.29.1-2.fc26 + util-linux: + rationale: Autogenerated by Base Runtime tools. + ref: 04f1d57f74fd4738d2c462a2302031bc92a186b9 + # which-2.21-2.fc26 + which: + rationale: Autogenerated by Base Runtime tools. + ref: dc514d1e2ee14fa06ec5a185a96264d01e5b8def + # xz-5.2.3-2.fc26 + xz: + rationale: Autogenerated by Base Runtime tools. + ref: c27811574cdf7de35217ea27b8add4c0130de53e + # zip-3.0-18.fc26 + zip: + rationale: Autogenerated by Base Runtime tools. + ref: 11ae231a18e54790f3f41ead4efaa56dfd9fb2f1 + # zlib-1.2.11-2.fc26 + zlib: + rationale: Autogenerated by Base Runtime tools. + ref: 9f014e30021753dbf9ee115487fcfa9d3f0fbc0a diff --git a/dead.package b/dead.package deleted file mode 100644 index cfb6fca..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -Unsupported diff --git a/jargon.txt b/jargon.txt new file mode 100644 index 0000000..ee031b7 --- /dev/null +++ b/jargon.txt @@ -0,0 +1,4 @@ +Autogenerated +enablement +Modularity +Runtime diff --git a/sources b/sources new file mode 100644 index 0000000..e69de29 diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..4077a68 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,7 @@ +MODULE_LINT=/usr/share/moduleframework/tools/modulelint/*.py +CMD=MODULE=nspawn python -m avocado run smoke.py $(MODULE_LINT) + +check: + $(CMD) + +all: check diff --git a/tests/brtconfig.py b/tests/brtconfig.py new file mode 100644 index 0000000..f6352ff --- /dev/null +++ b/tests/brtconfig.py @@ -0,0 +1,102 @@ +""" +get configuration parameters for base runtime smoke testing +""" + +import os +import logging +from moduleframework import module_framework + + +def get_mockcfg(self): + """ + Get the path to the base runtime mock configuration file + + This is provided by the avocado 'mockcfg' parameter if supplied, + otherwise it is set to "resources/base-runtime-mock.cfg" relative to + the test script directory. + """ + + script_dir = os.path.abspath(os.path.dirname(__file__)) + self.log.info("running script from directory: %s" % script_dir) + + mockcfg = self.params.get('mockcfg', default=os.path.join( + script_dir, "resources", "base-runtime-mock.cfg")) + mockcfg = str(mockcfg) + + if not mockcfg.endswith(".cfg"): + self.error("mock configuration file %s must have the extension '.cfg'" % + mockcfg) + + if not os.path.isfile(mockcfg): + self.error("mock configuration file %s does not exist" % + mockcfg) + + self.log.info("mock configuration file: %s" % mockcfg) + + return mockcfg + + +def get_compiler_test_dir(self): + """ + Get the path to the base runtime compiler test resource directory + + This is provided by the avocado 'compiler-test-dir' parameter if supplied, + otherwise it is set to "resources/hello-world" relative to + the test script directory. + """ + + script_dir = os.path.abspath(os.path.dirname(__file__)) + self.log.info("running script from directory: %s" % script_dir) + + compdir = self.params.get( + 'compiler-test-dir', default=os.path.join(script_dir, "resources", "hello-world")) + compdir = str(compdir) + + if not os.path.isdir(compdir): + self.error("Compiler test resource directory %s does not exist" % compdir) + + self.log.info("Compiler test resource directory: %s" % compdir) + + return compdir + + +def get_docker_image_name(self): + """ + Get the name to use for the base runtime docker image + """ + + container_helper = module_framework.ContainerHelper() + #It tries to get the name from URL env variable + #If URL is not defined it tries to get the name from config.yaml + image_name = container_helper.getDockerInstanceName() + if not image_name: + self.error("Could not find docker image name to use") + + self.log.info("base runtime image name: %s" % image_name) + + return image_name + +def get_docker_labels(self): + """ + From config file get the labels that should be added to the image + """ + + config = module_framework.get_config() + if not config: + self.error("Could not get config file") + if 'module' not in config.keys(): + self.error("Config file does not have module section") + if 'docker' not in config['module'].keys(): + self.error("Config file does not have docker module section") + + docker_cfg = config['module']['docker'] + if 'labels' not in docker_cfg.keys(): + return None + return docker_cfg['labels'] + +def get_test_profile(self): + """ + From config file get the labels that should be added to the image + """ + + return "container" diff --git a/tests/cleanup.py b/tests/cleanup.py new file mode 100644 index 0000000..098737b --- /dev/null +++ b/tests/cleanup.py @@ -0,0 +1,75 @@ +""" +cleanup docker container/images and mock root for smoke testing +""" + +import logging +import subprocess +import re + + +log = logging.getLogger('avocado.test') + +def cleanup_docker_and_mock(mockcfg, img_name): + + # Clean-up old test artifacts (docker containers, image, mock root) + + docker_containerlist_cmdline = 'docker ps --filter=ancestor=%s -a -q' % img_name + try: + containerlist = subprocess.check_output(docker_containerlist_cmdline, + stderr = subprocess.STDOUT, shell = True) + except subprocess.CalledProcessError as e: + log.error("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + raise + else: + log.info("docker container list with '%s' succeeded with output:\n%s" % + (docker_containerlist_cmdline, containerlist)) + + if containerlist: + containers = re.sub('[\r\n]+', ' ', containerlist) + log.info("docker containers using image %s need to be removed: %s\n" % + (img_name, containers)); + docker_teardown_cmdline = 'docker rm -f %s' % containers + try: + docker_teardown_output = subprocess.check_output(docker_teardown_cmdline, + stderr = subprocess.STDOUT, shell = True) + except subprocess.CalledProcessError as e: + log.error("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + raise + else: + log.info("docker container teardown with '%s' succeeded with output:\n%s" % + (docker_teardown_cmdline, docker_teardown_output)) + else: + log.info("no docker containers are using image %s\n" % img_name) + + docker_teardown_cmdline = 'docker rmi %s' % img_name + try: + docker_teardown_output = subprocess.check_output(docker_teardown_cmdline, + stderr = subprocess.STDOUT, shell = True) + except subprocess.CalledProcessError as e: + if "No such image" not in e.output: + log.error("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + raise + else: + log.info("No existing docker image named %s" % img_name) + else: + log.info("docker teardown with '%s' succeeded with output:\n%s" % + (docker_teardown_cmdline, docker_teardown_output)) + + mock_teardown_cmdline = ['mock', '-r', mockcfg, '--scrub=all'] + try: + mock_teardown_output = subprocess.check_output(mock_teardown_cmdline, + stderr = subprocess.STDOUT) + except subprocess.CalledProcessError as e: + log.error("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + raise + log.info("mock teardown with '%s' succeeded with output:\n%s" % + (mock_teardown_cmdline, mock_teardown_output)) + + + + + diff --git a/tests/config.yaml b/tests/config.yaml new file mode 100644 index 0000000..445d5c4 --- /dev/null +++ b/tests/config.yaml @@ -0,0 +1,37 @@ +document: modularity-testing +version: 1 +name: baseruntime +modulemd-url: http://pkgs.fedoraproject.org/cgit/modules/base-runtime.git/plain/base-runtime.yaml +service: + port: +packages: + profiles: + - container + rpms: +default_module: docker +module: + docker: + setup: docker inspect base-runtime-smoke || python ./setup.py + start: + labels: + #Short-term solution as there is no bugzilla component yet + com.redhat.component: "https://github.com/fedora-modularity/base-runtime" + name: "base-runtime" + version: "0" + release: "1" + architecture: "x86_64" + usage: "docker run --rm -it base-runtime/base-runtime bash" + summary: "Minimal application runtime environment other modules can build upon." + url: "https://github.com/fedora-modularity/base-runtime" + FGC: "f26-boltron" + source: http://pkgs.fedoraproject.org/cgit/modules/base-runtime.git + container: docker=base-runtime-smoke + rpm: + setup: echo LANG=C.utf8 > {ROOT}/etc/locale.conf + start: + stop: + status: + repo: https://kojipkgs.fedoraproject.org/compose/latest-Fedora-Modular-26/compose/Server/x86_64/os/ +test: + processrunnig: + - 'ls / | grep bin' diff --git a/tests/resources/base-runtime-mock.cfg b/tests/resources/base-runtime-mock.cfg new file mode 100644 index 0000000..9512f53 --- /dev/null +++ b/tests/resources/base-runtime-mock.cfg @@ -0,0 +1,36 @@ + +config_opts['root'] = 'base-runtime-docker' +config_opts['target_arch'] = 'x86_64' +config_opts['legal_host_arches'] = ('x86_64',) +config_opts['chroot_setup_cmd'] = 'install --setopt=tsflags=nodocs bash coreutils-single filesystem glibc-minimal-langpack libcrypt microdnf rpm shadow-utils sssd-client util-linux' +config_opts['dist'] = '' +config_opts['extra_chroot_dirs'] = [ '/run/lock', ] +config_opts['releasever'] = '' +config_opts['package_manager'] = 'dnf' +config_opts['use_bootstrap_container'] = False + +config_opts['yum.conf'] = """ +[main] +keepcache=1 +debuglevel=2 +reposdir=/dev/null +logfile=/var/log/yum.log +retries=20 +obsoletes=1 +gpgcheck=0 +assumeyes=1 +syslog_ident=mock +syslog_device= +install_weak_deps=0 +metadata_expire=3600 +mdpolicy=group:primary + +# repos + +[buildrepo] +name=base-runtime +baseurl=https://kojipkgs.fedoraproject.org/compose/latest-Fedora-Modular-26/compose/Server/x86_64/os/ +enabled=1 +gpgcheck=0 + +""" diff --git a/tests/resources/hello-world/Makefile b/tests/resources/hello-world/Makefile new file mode 100644 index 0000000..71a429e --- /dev/null +++ b/tests/resources/hello-world/Makefile @@ -0,0 +1,4 @@ +default: hello + +hello: hello.c + gcc -Wall hello.c -o hello diff --git a/tests/resources/hello-world/README.md b/tests/resources/hello-world/README.md new file mode 100644 index 0000000..8b81058 --- /dev/null +++ b/tests/resources/hello-world/README.md @@ -0,0 +1,15 @@ +# compiler sanity smoke test for the Base Runtime docker image + +The internal workings of this test are as follows: + +1. Create a temporary directory. +2. Copy the `hello.sh` script from this resource directory into the temporary directory and make sure it is executable. +3. Place a gzipped tarball of `hello.c` and `Makefile` from this resource directory into the temporary directory with the name `hello.tgz`. + e.g., + `$ tar czf /tmp/random/hello.tgz hello.c Makefile` +4. Run the docker container binding the temporary directory as `/mnt` and run `/mnt/hello.sh`. + e.g., + `$ docker run -v /tmp/random:/mnt:z --rm base-runtime /bin/bash -c /mnt/hello.sh` +5. Clean up the temporary directory upon completion. + + diff --git a/tests/resources/hello-world/hello.c b/tests/resources/hello-world/hello.c new file mode 100644 index 0000000..020484e --- /dev/null +++ b/tests/resources/hello-world/hello.c @@ -0,0 +1,8 @@ +#include + +int +main (void) +{ + printf ("Hello, world!\n"); + return 0; +} diff --git a/tests/resources/hello-world/hello.sh b/tests/resources/hello-world/hello.sh new file mode 100755 index 0000000..b75b9f9 --- /dev/null +++ b/tests/resources/hello-world/hello.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e # exit immediately on any failure +microdnf install tar make gcc 1>&2 +cd /mnt +tar xzvf hello.tgz 1>&2 +make 1>&2 +./hello diff --git a/tests/resources/installed_packages/all_installed_pkgs_docker.txt b/tests/resources/installed_packages/all_installed_pkgs_docker.txt new file mode 100644 index 0000000..ed4a718 --- /dev/null +++ b/tests/resources/installed_packages/all_installed_pkgs_docker.txt @@ -0,0 +1,115 @@ +audit-libs +basesystem +bash +bzip2-libs +ca-certificates +chkconfig +coreutils-single +cracklib +crypto-policies +curl +cyrus-sasl-lib +elfutils-libelf +expat +fedora-modular-release +fedora-modular-repos +filesystem +gawk +glib2 +glibc +glibc-common +glibc-minimal-langpack +gmp +gnupg2 +gnutls +gobject-introspection +gpgme +grep +gzip +info +keyutils-libs +krb5-libs +libacl +libarchive +libassuan +libattr +libblkid +libcap +libcap-ng +libcom_err +libcrypt +libcurl +libdb +libdb-utils +libdnf +libfdisk +libffi +libgcc +libgcrypt +libgpg-error +libidn2 +libksba +libmetalink +libmount +libnghttp2 +libpeas +libpsl +libpwquality +librepo +libselinux +libsemanage +libsepol +libsigsegv +libsmartcols +libsolv +libssh2 +libsss_idmap +libsss_nss_idmap +libtasn1 +libunistring +libutempter +libuuid +libverto +libxml2 +lua-libs +lz4 +lz4-libs +lzo +microdnf +mpfr +ncurses +ncurses-base +ncurses-libs +nettle +npth +nspr +nss +nss-pem +nss-softokn +nss-softokn-freebl +nss-sysinit +nss-tools +nss-util +openldap +openssl-libs +p11-kit +p11-kit-trust +pam +pcre +popt +publicsuffix-list-dafsa +readline +rpm +rpm-libs +rpm-plugin-selinux +sed +setup +shadow-utils +sqlite-libs +sssd-client +systemd-libs +tzdata +ustr +util-linux +xz-libs +zlib diff --git a/tests/resources/installed_packages/all_installed_pkgs_nspawn.txt b/tests/resources/installed_packages/all_installed_pkgs_nspawn.txt new file mode 100644 index 0000000..286f528 --- /dev/null +++ b/tests/resources/installed_packages/all_installed_pkgs_nspawn.txt @@ -0,0 +1,150 @@ +acl +audit-libs +basesystem +bash +binutils +bzip2-libs +ca-certificates +chkconfig +coreutils-single +cpp +cracklib +cracklib-dicts +crypto-policies +cryptsetup-libs +curl +cyrus-sasl-lib +dbus +dbus-libs +device-mapper +device-mapper-libs +diffutils +elfutils-default-yama-scope +elfutils-libelf +elfutils-libs +emacs-filesystem +expat +fedora-modular-release +fedora-modular-repos +filesystem +gawk +gc +gcc +glib2 +glibc +glibc-common +glibc-devel +glibc-headers +glibc-minimal-langpack +gmp +gnupg2 +gnutls +gobject-introspection +gpgme +grep +guile +gzip +info +iptables-libs +isl +kernel-headers +keyutils-libs +kmod-libs +krb5-libs +libacl +libarchive +libassuan +libatomic_ops +libattr +libblkid +libcap +libcap-ng +libcom_err +libcrypt +libcurl +libdb +libdb-utils +libdnf +libfdisk +libffi +libgcc +libgcrypt +libgomp +libgpg-error +libidn +libidn2 +libksba +libmetalink +libmount +libmpc +libnghttp2 +libsss_idmap +libsss_nss_idmap +libpcap +libpeas +libpsl +libpwquality +librepo +libseccomp +libselinux +libsemanage +libsepol +libsigsegv +libsmartcols +libsolv +libssh2 +libstdc++ +libtasn1 +libtool-ltdl +libunistring +libutempter +libuuid +libverto +libxml2 +lua-libs +lz4 +lz4-libs +lzo +make +microdnf +mpfr +ncurses +ncurses-base +ncurses-libs +nettle +npth +nspr +nss +nss-pem +nss-softokn +nss-softokn-freebl +nss-sysinit +nss-tools +nss-util +openldap +openssl-libs +p11-kit +p11-kit-trust +pam +pcre +popt +publicsuffix-list-dafsa +qrencode-libs +readline +rpm +rpm-libs +rpm-plugin-selinux +sed +setup +shadow-utils +sqlite-libs +sssd-client +systemd +systemd-libs +systemd-pam +tar +tzdata +ustr +util-linux +xz-libs +zlib diff --git a/tests/resources/os_release/os_release.sh b/tests/resources/os_release/os_release.sh new file mode 100755 index 0000000..39a009a --- /dev/null +++ b/tests/resources/os_release/os_release.sh @@ -0,0 +1,96 @@ +#!/bin/bash +set -e # exit immediately on any failure + +. /etc/os-release + +EXP_NAME="Fedora Modular" +EXP_VERSION="26 (Twenty Six)" +EXP_ID="fedora-modular" +EXP_ID_LIKE="fedora" +EXP_VERSION_ID="26" +EXP_PRETTY_NAME="Fedora Modular 26 (Twenty Six)" +EXP_ANSI_COLOR="0;34" +EXP_CPE_NAME="cpe:/o:fedoraproject:fedora-modular:26" +EXP_HOME_URL="https://fedoraproject.org/" +EXP_BUG_REPORT_URL="https://bugzilla.redhat.com/" +EXP_REDHAT_BUGZILLA_PRODUCT="Fedora" +EXP_REDHAT_BUGZILLA_PRODUCT_VERSION="26" +EXP_REDHAT_SUPPORT_PRODUCT="Fedora" +EXP_REDHAT_SUPPORT_PRODUCT_VERSION="26" +EXP_PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy" + +if [[ $NAME != $EXP_NAME ]]; then + echo "FAIL: Expected NAME to be '$EXP_NAME', but it is '$NAME'" + exit 1 +fi + +if [[ $VERSION != $EXP_VERSION ]]; then + echo "FAIL: Expected VERSION to be '$EXP_VERSION', but it is '$VERSION'" + exit 1 +fi + +if [[ $ID != $EXP_ID ]]; then + echo "FAIL: Expected ID to be '$EXP_ID', but it is '$ID'" + exit 1 +fi + +if [[ $ID_LIKE != $EXP_ID_LIKE ]]; then + echo "FAIL: Expected ID_LIKE to be '$EXP_ID_LIKE', but it is '$ID_LIKE'" + exit 1 +fi + +if [[ $VERSION_ID != $EXP_VERSION_ID ]]; then + echo "FAIL: Expected VERSION_ID to be '$EXP_VERSION_ID', but it is '$VERSION_ID'" + exit 1 +fi + +if [[ $PRETTY_NAME != $EXP_PRETTY_NAME ]]; then + echo "FAIL: Expected PRETTY_NAME to be '$EXP_PRETTY_NAME', but it is '$PRETTY_NAME'" + exit 1 +fi + +if [[ $ANSI_COLOR != $EXP_ANSI_COLOR ]]; then + echo "FAIL: Expected ANSI_COLOR to be '$EXP_ANSI_COLOR', but it is '$ANSI_COLOR'" + exit 1 +fi + +if [[ $CPE_NAME != $EXP_CPE_NAME ]]; then + echo "FAIL: Expected CPE_NAME to be '$EXP_CPE_NAME', but it is '$CPE_NAME'" + exit 1 +fi + +if [[ $HOME_URL != $EXP_HOME_URL ]]; then + echo "FAIL: Expected HOME_URL to be '$EXP_HOME_URL', but it is '$HOME_URL'" + exit 1 +fi + +if [[ $BUG_REPORT_URL != $EXP_BUG_REPORT_URL ]]; then + echo "FAIL: Expected BUG_REPORT_URL to be '$EXP_BUG_REPORT_URL', but it is '$BUG_REPORT_URL'" + exit 1 +fi + +if [[ $REDHAT_BUGZILLA_PRODUCT != $EXP_REDHAT_BUGZILLA_PRODUCT ]]; then + echo "FAIL: Expected REDHAT_BUGZILLA_PRODUCT to be '$EXP_REDHAT_BUGZILLA_PRODUCT', but it is '$REDHAT_BUGZILLA_PRODUCT'" + exit 1 +fi + +if [[ $REDHAT_BUGZILLA_PRODUCT_VERSION != $EXP_REDHAT_BUGZILLA_PRODUCT_VERSION ]]; then + echo "FAIL: Expected REDHAT_BUGZILLA_PRODUCT_VERSION to be '$EXP_REDHAT_BUGZILLA_PRODUCT_VERSION', but it is '$REDHAT_BUGZILLA_PRODUCT_VERSION'" + exit 1 +fi + +if [[ $REDHAT_SUPPORT_PRODUCT != $EXP_REDHAT_SUPPORT_PRODUCT ]]; then + echo "FAIL: Expected REDHAT_SUPPORT_PRODUCT to be '$EXP_REDHAT_SUPPORT_PRODUCT', but it is '$REDHAT_SUPPORT_PRODUCT'" + exit 1 +fi + +if [[ $REDHAT_SUPPORT_PRODUCT_VERSION != $EXP_REDHAT_SUPPORT_PRODUCT_VERSION ]]; then + echo "FAIL: Expected REDHAT_SUPPORT_PRODUCT_VERSION to be '$EXP_REDHAT_SUPPORT_PRODUCT_VERSION', but it is '$REDHAT_SUPPORT_PRODUCT_VERSION'" + exit 1 +fi + +if [[ $PRIVACY_POLICY_URL != $EXP_PRIVACY_POLICY_URL ]]; then + echo "FAIL: Expected PRIVACY_POLICY_URL to be '$EXP_PRIVACY_POLICY_URL', but it is '$PRIVACY_POLICY_URL'" + exit 1 +fi + diff --git a/tests/setup.py b/tests/setup.py new file mode 100755 index 0000000..d7b1acf --- /dev/null +++ b/tests/setup.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python + +import os +import subprocess +import re +import sys +import configparser +import tempfile + +from avocado import main +from avocado import Test +from moduleframework import module_framework + +import cleanup +import brtconfig + + +class BaseRuntimeSetupDocker(Test, module_framework.CommonFunctions): + + def setUp(self): + + self.mockcfg = brtconfig.get_mockcfg(self) + self.br_image_name = brtconfig.get_docker_image_name(self) + + def _process_mockcfg(self): + + profile_name = brtconfig.get_test_profile(self) + mockcfg = self.mockcfg + + mock_root = '' + mockcfg_lines = [] + #Regex to get packages that are configured on mockcfg to be installed + chroot_setup_pkg_regex = re.compile("config_opts\s*\[\s*'chroot_setup_cmd'\s*\]\s*=" + "\s*'install --setopt=tsflags=nodocs\s*(.*)\s*'") + chroot_setup_pkgs = None + with open(mockcfg, 'r') as mock_cfgfile: + found_setup_cmd = False + for line in mock_cfgfile: + mockcfg_lines.append(line) + if re.match("config_opts\s*\[\s*'root'\s*\]", line) is not None: + mock_root = line.split('=')[1].split("'")[1] + if re.match("config_opts\s*\[\s*'chroot_setup_cmd'\s*\]", line) is not None: + found_setup_cmd = True + #Check if there are packages defined on chroot_setup_cmd + m = chroot_setup_pkg_regex.match(line) + if m: + chroot_setup_pkgs = sorted(m.group(1).split()) + if len(mock_root) == 0: + self.error("mock configuration file %s does not specify mock root" % + mockcfg) + self.log.info("mock root: %s" % mock_root) + self.mock_root = mock_root + + if not found_setup_cmd: + self.error("mock configuration file %s does not define chroot_setup_cmd" % mockcfg) + + #Need to get all packages that need to be installed + mod_yaml = self.getModulemdYamlconfig() + if not mod_yaml: + self.error("Could not read modulemd Yaml file") + + if "data" not in mod_yaml.keys(): + self.error("'data' key was not found in modulemd Yaml file") + + if "profiles" not in mod_yaml["data"].keys(): + self.error("'profiles' key was not found in 'data' section") + + if profile_name not in mod_yaml["data"]["profiles"].keys(): + self.error("'%s' key was not found in 'profiles' section" % profile_name) + + base_profile = mod_yaml["data"]["profiles"][profile_name] + if "rpms" not in base_profile.keys(): + self.error("'rpms' key was not found in '%s' profile" % profile_name) + + req_pkgs = base_profile["rpms"] + if not req_pkgs: + self.error("Could not find any package to be installed in the image") + + #Only update mockcfg if the list of packages changed + if cmp(chroot_setup_pkgs, sorted(req_pkgs)): + #Need to change chroot_setup_cmd line on mockcfg file + setup_cmd = "install --setopt=tsflags=nodocs " + setup_cmd += " ".join(req_pkgs) + with open(mockcfg, 'w') as mock_cfgfile: + for line in mockcfg_lines: + if re.match("config_opts\s*\[\s*'chroot_setup_cmd'\s*\]", line) is not None: + line = "config_opts['chroot_setup_cmd'] = '%s'\n" % setup_cmd + mock_cfgfile.write(line) + + #Test will exit with WARN to inform the config file has changed + self.log.warning("List of packages to be installed by mock changed") + + def _run_command(self, cmd): + try: + cmd_output = subprocess.check_output( + cmd, stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError as e: + self.error("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + else: + self.log.info("command '%s' succeeded with output:\n%s" % + (cmd, cmd_output)) + + def _set_dnf_conf(self): + filename = "/etc/dnf/dnf.conf" + path = "/var/lib/mock/" + self.mock_root + "/root" + filename + + conf = "EOF\n" + conf += "[main]\n" + conf += "gpgcheck=1\n" + conf += "installonly_limit=3\n" + conf += "clean_requirements_on_remove=True\n" + conf += "EOF\n" + + cmd = "sudo tee %s << %s" % (path, conf) + self._run_command(cmd) + + + def testCreateDockerImage(self): + + self._process_mockcfg() + + # Clean-up any old test artifacts (docker containers, image, mock root) + # first: + try: + cleanup.cleanup_docker_and_mock(self.mockcfg, self.br_image_name) + except: + self.error("artifact cleanup failed") + else: + self.log.info("artifact cleanup successful") + + # Initialize chroot with mock + self._run_command('mock -r %s --init' % self.mockcfg) + + self._set_dnf_conf() + + # check if "sudo" allows us to tar up the chroot without a password + # Note: this must be configured in "sudoers" to work! + tar_cmd = "tar -C /var/lib/mock/%s/root -c ." % self.mock_root + try: + cmd_output = subprocess.check_output( + "sudo -n %s >/dev/null" % tar_cmd, + stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError as e: + # no luck using "sudo", warn and proceed as ordinary user without + # it + self.log.info("command '%s' returned exit status %d; output:\n%s" % + (e.cmd, e.returncode, e.output)) + self.log.warning("NO SUDO RIGHTS TO RUN COMMAND '%s' AS ROOT" % + tar_cmd) + self.log.warning("GENERATED DOCKER IMAGE '%s' MAY BE INCOMPLETE!" % + self.br_image_name) + else: + # "sudo" works, so use it + tar_cmd = "sudo -n " + tar_cmd + + img_scratch = "%s-scratch" % self.br_image_name + # Import mock chroot as a docker image + self._run_command("%s | docker import - %s" % + (tar_cmd, img_scratch)) + + docker_labels = brtconfig.get_docker_labels(self) + #Dockerfile to use when building final image + dockerfile = 'EOF\n' + dockerfile += 'FROM %s\n' % img_scratch + #Set default locale to C.utf8 + dockerfile += 'ENV LANG C.utf8\n' + if docker_labels: + for key in docker_labels.keys(): + dockerfile += 'LABEL %s="%s"\n' % (key, docker_labels[key]) + dockerfile += 'EOF\n' + + # Build final image with extra information from dockerfile + self._run_command("docker build -t %s - << %s" % + (self.br_image_name, dockerfile)) + #Remove temporary image + self._run_command("docker rmi %s" % img_scratch) + +if __name__ == "__main__": + main() diff --git a/tests/smoke.py b/tests/smoke.py new file mode 100644 index 0000000..cdd6ce2 --- /dev/null +++ b/tests/smoke.py @@ -0,0 +1,468 @@ +#!/usr/bin/env python + +import os +import subprocess +import re +import shutil +import stat +import tarfile +import tempfile + +from avocado import main +from moduleframework import module_framework + +import brtconfig + + +class BaseRuntimeSmokeTest(module_framework.AvocadoTest): + """ + :avocado: enable + """ + + def setUp(self): + super(self.__class__, self).setUp() + self.compiler_resource_dir = brtconfig.get_compiler_test_dir(self) + self.compiler_test_dir = None + + def _check_cmd_result(self, cmd, return_code, cmd_output, expect_pass=True): + """ + Check based on return code if command passed or failed as expected + """ + if return_code == 0 and expect_pass: + self.log.info("command '%s' succeeded with output:\n%s" % + (cmd, cmd_output)) + return True + elif return_code != 0 and not expect_pass: + self.log.info("command '%s' failed as expected with output:\n%s" % + (cmd, cmd_output)) + return True + self.error("command '%s' returned unexpected exit status %d; output:\n%s" % + (cmd, return_code, cmd_output)) + return False + + def testSmoke(self): + """ + Run several smoke tests + """ + + # TODO: fill this "placeholder" with actual, complete, smoke tests: + + smoke_pass = [ + "echo 'Hello, World!'", + "cat /etc/redhat-release", + "rpm -q glibc"] + + smoke_fail = [ + "exit 1"] + + for cmd in smoke_pass: + cmd_result = self.run("%s" % cmd, ignore_status=True) + cmd_output = cmd_result.stdout + cmd_result.stderr + self._check_cmd_result(cmd, cmd_result.exit_status, cmd_output) + + for cmd in smoke_fail: + cmd_result = self.run("%s" % cmd, ignore_status=True) + cmd_output = cmd_result.stdout + cmd_result.stderr + self._check_cmd_result(cmd, cmd_result.exit_status, cmd_output, expect_pass=False) + + + def _get_all_installed_pkgs(self): + try: + cmd_result = self.run("rpm -qa --qf='%{{name}}\n'") + except BaseException as details: + self.error("Could not get all installed packages (%s)" % details) + except: + self.error("Could not get all installed packages") + output_list = cmd_result.stdout.split("\n") + #remove empty string from the list + return [item for item in output_list if item] + + def testRequiredPackages(self): + """ + Check if all required packages defined on yaml file are installed + """ + + profile_name = brtconfig.get_test_profile(self) + mod_yaml = self.getModulemdYamlconfig() + if not mod_yaml: + self.error("Could not read modulemd Yaml file") + + if "data" not in mod_yaml.keys(): + self.error("'data' key was not found in modulemd Yaml file") + + if "profiles" not in mod_yaml["data"].keys(): + self.error("'profiles' key was not found in 'data' section") + + if profile_name not in mod_yaml["data"]["profiles"].keys(): + self.error("'%s' key was not found in 'profiles' section" % profile_name) + + base_profile = mod_yaml["data"]["profiles"][profile_name] + if "rpms" not in base_profile.keys(): + self.error("'rpms' key was not found in '%s' profile" % profile_name) + + req_pkgs = base_profile["rpms"] + if not req_pkgs: + self.error("No rpm is defined for container") + + installed_pkgs = self._get_all_installed_pkgs() + + for req_pkg in req_pkgs: + if req_pkg not in installed_pkgs: + self.error("Required package '%s' is not installed" % req_pkg) + + def testInstalledPackages(self): + """ + Check if only the expected packages are installed on module + """ + + expected_pkgs = None + + if not self.moduleType: + self.error("moduleType is not defined") + + all_installed_pkgs_path = ("resources/installed_packages/all_installed_pkgs_%s.txt" + % self.moduleType) + try: + with open(all_installed_pkgs_path) as f: + expected_pkgs = f.read().splitlines() + except: + self.error("Could not read the expected installed packages list") + + if not expected_pkgs: + self.error("List of expected installed packages is empty") + + installed_pkgs = self._get_all_installed_pkgs() + if not installed_pkgs: + self.error("It seems there is no package installed in the module") + + for pkg in installed_pkgs: + if pkg not in expected_pkgs: + self.error("Did not expect to have package '%s' installed" % pkg) + + def testInstallAllPackages(self): + """ + Check if all packages that we ship are able to be installed on module + """ + + profile_name = brtconfig.get_test_profile(self) + mod_yaml = self.getModulemdYamlconfig() + if not mod_yaml: + self.error("Could not read modulemd Yaml file") + + if "data" not in mod_yaml.keys(): + self.error("'data' key was not found in modulemd Yaml file") + + if "api" not in mod_yaml["data"].keys(): + self.error("'api' key was not found in 'data' section") + + if "rpms" not in mod_yaml["data"]["api"].keys(): + self.error("'rpms' key was not found in 'api'") + + all_api_pkgs = mod_yaml["data"]["api"]["rpms"] + + repo_path = None + mod_dep = self.getModuleDependencies() + mod_name = "baseruntime" + if mod_dep and mod_name in mod_dep.keys(): + if "urls" in mod_dep[mod_name].keys(): + if len(mod_dep[mod_name]["urls"]) != 1: + self.error("Expected exactly 1 repo url for %s" % mod_name) + repo_path = mod_dep[mod_name]["urls"][0] + + + # docker uses the repo defined on mock cfg + if self.moduleType == "docker": + mockcfg = "" + with open(brtconfig.get_mockcfg(self)) as f: + mockcfg = f.read() + for line in mockcfg.split("\n"): + m = re.match("baseurl=(\S+)", line) + if m: + repo_path = m.group(1) + + if not repo_path: + self.error("Could not find repo to query the packages") + + #Query all available packages in our repo + query_repo_cmd = "repoquery -a --qf '%%{{name}}' --repofrompath=0,%s --repoid=0" % repo_path + all_repo_pkgs = self.runHost(query_repo_cmd).stdout.split("\n") + + all_avail_pkgs = [] + #Available packages are the ones from API that are available on repo + for pkg in all_api_pkgs: + if pkg in all_repo_pkgs: + all_avail_pkgs.append(pkg) + + skip_pkg_image = {} + skip_pkg_image["docker"] = ["kernel", "dracut"] + skip_pkg_image["nspawn"] = ["kernel", "dracut"] + conflict_pkgs = { + "coreutils" : "coreutils-single", + "libcrypt-nss" : "libcrypt" + } + + #Try to install packages that have conflicting packages installed + for pkg in conflict_pkgs.keys(): + self.run("microdnf remove %s" % conflict_pkgs[pkg]) + self.run("rpm -q %s" % pkg) + self.run("microdnf remove %s" % pkg) + self.run("rpm -q %s" % conflict_pkgs[pkg]) + + pkgs_2_install = [] + for pkg in all_avail_pkgs: + if pkg in conflict_pkgs.keys(): + continue + #Do not install packages such as dracut* on docker. + skip = False + for skip_pkg in skip_pkg_image[self.moduleType]: + if pkg.startswith(skip_pkg): + skip = True + if not skip: + pkgs_2_install.append(pkg) + self.run("microdnf install %s > /dev/null" % " ".join(pkgs_2_install)) + + + def testUserManipulation(self): + """ + Check if can add, remove and modify user + """ + + #We want to run multiple commands using same docker container + new_user = "usertest" + pass_cmds = [] + #Create new user + pass_cmds.append("adduser %s" % new_user) + #Make sure user is created + pass_cmds.append("cat /etc/passwd | grep %s" % new_user) + pass_cmds.append("ls /home/%s" % new_user) + #set user password + pass_cmds.append("usermod --password testpassword %s" % new_user) + #Test new user functionality + pass_cmds.append('su - %s -c "touch ~/testfile.txt"' % new_user) + #Make sure the file was created by the correct user + pass_cmds.append("ls -allh /home/%s/testfile.txt | grep '%s %s'" % + (new_user, new_user, new_user)) + #Remove user + pass_cmds.append("userdel -r %s" % new_user) + for cmd in pass_cmds: + cmd_result = self.run("%s" % cmd, ignore_status=True) + cmd_output = cmd_result.stdout + cmd_result.stderr + self._check_cmd_result(cmd, cmd_result.exit_status, cmd_output) + + fail_cmds = [] + #Make sure user is removed + fail_cmds.append("ls /home/%s" % new_user) + fail_cmds.append("cat /etc/passwd | grep usertest") + #relying on __del__ from BaseRuntimeRunCmd to remove container + for cmd in fail_cmds: + cmd_result = self.run("%s" % cmd, ignore_status=True) + cmd_output = cmd_result.stdout + cmd_result.stderr + self._check_cmd_result(cmd, cmd_result.exit_status, cmd_output, expect_pass=False) + + def testOsRelease(self): + """ + Check if OS release information is correct + """ + + test_path = "resources/os_release/os_release.sh" + dest_path = "/tmp/os_release.sh" + try: + self.copyTo(test_path, dest_path) + except: + self.error("Could not copy test file from %s to module %s" % + (test_path, dest_path)) + + try: + self.run(dest_path) + except: + self.error("%s failed" % dest_path) + + try: + self.run("rm -f %s" % dest_path) + except: + self.error("Could not delete %s" % dest_path) + + def test_glibc_i18n(self): + """ + Test glibc support to internationalization + """ + + lang_default = { + #cmd : cmd_output + "ls /invalid_path" : "ls: cannot access '/invalid_path': No such file or directory", + "cp invalid_file tmp" : "cp: cannot stat 'invalid_file': No such file or directory", + "date -u -d \"2017-03-31\"" : "Fri Mar 31 00:00:00 UTC 2017", + "touch file; yes | rm -i file" : "rm: remove regular empty file 'file'?", + "numfmt --grouping 1234567890.98" : "1234567890.98" + } + + lang_english = { + "LC_ALL=en_US ls /invalid_path" : "ls: cannot access '/invalid_path': No such file or directory", + "LC_ALL=en_US cp invalid_file tmp" : "cp: cannot stat 'invalid_file': No such file or directory", + "LC_ALL=en_US date -u -d \"2017-03-31\"" : "Fri Mar 31 00:00:00 UTC 2017", + "touch file; yes | LC_ALL=en_US rm -i file" : "rm: remove regular empty file 'file'?", + "LC_ALL=en_US numfmt --grouping 1234567890.98" : "1,234,567,890.98" + } + + lang_spanish = { + "LC_ALL=es_ES ls /invalid_path" : "No existe el fichero o el directorio", + "LC_ALL=es_ES cp invalid_file tmp" : "No existe el fichero o el directorio", + "LC_ALL=es_ES date -u -d \"2017-03-31\"" : "vie mar 31 00:00:00 UTC 2017", + "LC_ALL=es_ES numfmt --grouping 1234567890,98" : "1.234.567.890,98" + } + + langs = {} + langs["default"] = { + "pkg" : "glibc-minimal-langpack", + "cmds" : lang_default + } + + langs["english"] = { + "pkg" : "glibc-langpack-en", + "cmds" : lang_english + } + + langs["spanish"] = { + "pkg" : "glibc-langpack-es", + "cmds" : lang_spanish + } + + #Check if C.utf8 is the default locale + self.run("echo $LANG | grep 'C.utf8'") + + for i18n in langs.keys(): + lang = langs[i18n] + self.log.info("Testing %s" % lang["pkg"]) + + install_package = True + # glibc-minimal-langpack is installed by default + if lang["pkg"] == "glibc-minimal-langpack": + install_package = False + + if install_package: + try: + self.run("microdnf install %s" % lang["pkg"]) + except: + self.error("Could not install %s" % lang["pkg"]) + + for cmd in lang["cmds"].keys(): + cmd_result = self.run("%s" % cmd, ignore_status=True) + output = cmd_result.stdout + output += cmd_result.stderr + output = output.strip() + #search for pattern as Spanish might have special characters + if not re.search(lang["cmds"][cmd], output): + self.error("'%s'expected output '%s', but got '%s'" % + (cmd, lang["cmds"][cmd], output)) + + if install_package: + try: + self.run("microdnf remove %s" % lang["pkg"]) + except: + self.error("Could not remove %s" % lang["pkg"]) + + def test_dnf(self): + """ + Check if DNF is able to install a package + """ + package = "tar" + self.run("microdnf install dnf") + self.run("dnf install -y %s" % package) + self.run("dnf remove -y %s" % package) + self.run("microdnf remove dnf") + + def _prepare_compiler_test_directory(self): + + # create a temporary directory + tmpdir = tempfile.mkdtemp() + + self.log.info("Compiler test temporary directory is %s" % tmpdir) + + # Copy the `hello.sh` script from this resource directory into the + # temporary directory + src = os.path.join(self.compiler_resource_dir, "hello.sh") + dest = os.path.join(tmpdir, "hello.sh") + try: + shutil.copy(src, dest) + except shutil.Error as e: + self.log.info('Error: %s' % e) + except IOError as e: + self.log.info('Error: %s' % e.strerror) + + # make sure destination script is executable + st = os.stat(dest) + os.chmod(dest, st.st_mode | stat.S_IEXEC) + + # Place a gzipped tarball of `hello.c` and `Makefile` from the + # resource directory into the temporary directory with the name + # `hello.tgz`. + dest = os.path.join(tmpdir, "hello.tgz") + tar = tarfile.open(dest, "w:gz") + for f in ["hello.c", "Makefile"]: + src = os.path.join(self.compiler_resource_dir, f) + tar.add(src, arcname=f) + tar.close() + + self.compiler_test_dir = tmpdir + + def _cleanup_compiler_test_directory(self): + + # clean up the temporary directory + if self.compiler_test_dir: + self.log.info("cleaning up compiler test directory") + shutil.rmtree(self.compiler_test_dir, ignore_errors=True) + + def testCompiler(self): + """ + Run a basic C compiler test on our docker image. + + This actually tests the integration of several things, including the + ability to install packages, extract a gzipped tarball, run make to + compile a very simple C program, and run the compiled executable. + """ + + self._prepare_compiler_test_directory() + + #The test dir should be the same one used on hello.sh + mod_compiler_test_dir = "/mnt" + + #Make sure there is a container running + #TODO: Remove start() once https://pagure.io/modularity-testing-framework/issue/8 is fixed + self.start() + + try: + self.copyTo("%s/." % self.compiler_test_dir, mod_compiler_test_dir) + except: + self.error("Could not copy test files from %s to module %s" % + (self.compiler_test_dir, mod_compiler_test_dir)) + + cmdline = "%s/hello.sh" % mod_compiler_test_dir + cmd_result = self.run("%s" % cmdline, ignore_status=True) + test_stdout = cmd_result.stdout + test_stderr = cmd_result.stderr + if cmd_result.exit_status: + self.error("command '%s' returned exit status %d; output:\n%s\nstderr:\n%s" % + (cmdline, cmd_result.exit_status, test_stdout, test_stderr)) + + self.log.info("command '%s' succeeded with output:\n%s\nstderr:\n%s" % + (cmdline, test_stdout, test_stderr)) + + # make sure we get exactly what we expect on stdout + # (all other output from commands in the script were sent to stderr) + expected_stdout = 'Hello, world!\n' + self.log.info("checking that compiler test returned expected output: %s" % + repr(expected_stdout)) + if test_stdout != expected_stdout: + self.error("compiler test did not return unexpected output: %s" % + repr(test_stdout)) + + def tearDown(self): + """ + Tear-down + """ + super(self.__class__, self).tearDown() + + self._cleanup_compiler_test_directory() + +if __name__ == "__main__": + main() diff --git a/tests/teardown.py b/tests/teardown.py new file mode 100755 index 0000000..3db11fc --- /dev/null +++ b/tests/teardown.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import os +import subprocess +import re + +from avocado import main +from avocado import Test + +import cleanup +import brtconfig + + +class BaseRuntimeTeardownDocker(Test): + + def setUp(self): + + self.mockcfg = brtconfig.get_mockcfg(self) + self.br_image_name = brtconfig.get_docker_image_name(self) + + def testRemoveDockerImage(self): + + # Clean-up old test artifacts (docker containers, image, mock root) + try: + cleanup.cleanup_docker_and_mock(self.mockcfg, self.br_image_name) + except: + self.error("artifact cleanup failed") + else: + self.log.info("artifact cleanup successful") + +if __name__ == "__main__": + main()