Ryan Harper has proposed merging ~raharper/cloud-init:fix/fedora-build into cloud-init:master.
Commit message: Add a fedora packaging specfile and adjust tools Fedora has a python3 version of cloud-init downstream available. This branch takes that as a starting point and adjusts it to work with our jinja template format and building from master. This branch also updates the systemd/cloud-init-generator.tmpl file to specify the path to ds-identify with the libexec prefix used on redhat based systems. For non-systemd versions of redhat el. al, this is a non issue, however for python3 systems, it means that the systemd generator does not invoke ds-identify and will keep cloud-init disabled. Requested reviews: cloud-init commiters (cloud-init-dev) For more details, see: https://code.launchpad.net/~raharper/cloud-init/+git/cloud-init/+merge/368845 -- Your team cloud-init commiters is requested to review the proposed merge of ~raharper/cloud-init:fix/fedora-build into cloud-init:master.
diff --git a/packages/brpm b/packages/brpm index a154ef2..5c56a2c 100755 --- a/packages/brpm +++ b/packages/brpm @@ -108,7 +108,7 @@ def main(): parser.add_argument("-d", "--distro", dest="distro", help="select distro (default: %(default)s)", metavar="DISTRO", default='redhat', - choices=('redhat', 'suse')) + choices=('fedora', 'redhat', 'suse')) parser.add_argument('--srpm', help='Produce a source rpm', action='store_true') diff --git a/packages/fedora/cloud-init.spec.in b/packages/fedora/cloud-init.spec.in new file mode 100644 index 0000000..0487d90 --- /dev/null +++ b/packages/fedora/cloud-init.spec.in @@ -0,0 +1,170 @@ +## template: jinja +%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} + +%define use_systemd (0%{?fedora} && 0%{?fedora} >= 18) || (0%{?rhel} && 0%{?rhel} >= 7) + +%if %{use_systemd} +%define init_system systemd +%else +%define init_system sysvinit +%endif + +# See: http://www.zarb.org/~jasonc/macros.php +# Or: http://fedoraproject.org/wiki/Packaging:ScriptletSnippets +# Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html + +Name: cloud-init +Version: {{rpm_upstream_version}} +Release: 1{{subrelease}}%{?dist} +Summary: Cloud instance init scripts + +Group: System Environment/Base +License: Dual-licensed GPLv3 or Apache 2.0 +URL: http://launchpad.net/cloud-init + +Source0: {{archive_name}} +BuildArch: noarch +BuildRoot: %{_tmppath} + +BuildRequires: pkgconfig(systemd) +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: systemd + +# For tests +BuildRequires: iproute +BuildRequires: python3-configobj +# https://bugzilla.redhat.com/show_bug.cgi?id=1695953 +BuildRequires: python3-distro +# https://bugzilla.redhat.com/show_bug.cgi?id=1417029 +BuildRequires: python3-httpretty >= 0.8.14-2 +BuildRequires: python3-jinja2 +BuildRequires: python3-jsonpatch +BuildRequires: python3-jsonschema +BuildRequires: python3-mock +BuildRequires: python3-nose +BuildRequires: python3-oauthlib +BuildRequires: python3-prettytable +BuildRequires: python3-pyserial +BuildRequires: python3-PyYAML +BuildRequires: python3-requests +BuildRequires: python3-six +BuildRequires: python3-unittest2 +# dnf is needed to make cc_ntp unit tests work +# https://bugs.launchpad.net/cloud-init/+bug/1721573 +BuildRequires: /usr/bin/dnf + +Requires: e2fsprogs +Requires: iproute +Requires: libselinux-python3 +Requires: net-tools +Requires: policycoreutils-python3 +Requires: procps +Requires: python3-configobj +# https://bugzilla.redhat.com/show_bug.cgi?id=1695953 +Requires: python3-distro +Requires: python3-jinja2 +Requires: python3-jsonpatch +Requires: python3-jsonschema +Requires: python3-oauthlib +Requires: python3-prettytable +Requires: python3-pyserial +Requires: python3-PyYAML +Requires: python3-requests +Requires: python3-six +Requires: shadow-utils +Requires: util-linux +Requires: xfsprogs + +%{?systemd_requires} + +# System util packages needed +%ifarch %{?ix86} x86_64 ia64 +Requires: dmidecode +%endif + + +%description +Cloud-init is a set of init scripts for cloud instances. Cloud instances +need special scripts to run during initialization to retrieve and install +ssh keys and to let the user run various scripts. + + +%prep +%setup -q -n {{source_name}} + +# Change shebangs +sed -i -e 's|#!/usr/bin/env python|#!/usr/bin/env python3|' \ + -e 's|#!/usr/bin/python|#!/usr/bin/python3|' tools/* cloudinit/ssh_util.py + + +%build +%py3_build + + +%install +%py3_install -- --init-system=systemd + +python3 tools/render-cloudcfg --variant fedora > $RPM_BUILD_ROOT/%{_sysconfdir}/cloud/cloud.cfg + +mkdir -p $RPM_BUILD_ROOT/var/lib/cloud + +mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d +cp -p tools/21-cloudinit.conf $RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d/21-cloudinit.conf + +# patch in the full version to version.py +version_pys=$(cd "$RPM_BUILD_ROOT" && find . -name version.py -type f) +[ -n "$version_pys" ] || + { echo "failed to find 'version.py' to patch with version." 1>&2; exit 1; } +( cd "$RPM_BUILD_ROOT" && + sed -i "s,@@PACKAGED_VERSION@@,%{version}-%{release}," $version_pys ) + +%check +nosetests-%{python3_version} tests/unittests/ + + +%post +%systemd_post cloud-config.service cloud-config.target cloud-final.service cloud-init.service cloud-init.target cloud-init-local.service + + +%preun +%systemd_preun cloud-config.service cloud-config.target cloud-final.service cloud-init.service cloud-init.target cloud-init-local.service + + +%postun +%systemd_postun cloud-config.service cloud-config.target cloud-final.service cloud-init.service cloud-init.target cloud-init-local.service + + +%files +%license LICENSE LICENSE-Apache2.0 LICENSE-GPLv3 +%doc ChangeLog +%doc doc/* +%config(noreplace) %{_sysconfdir}/cloud/cloud.cfg +%dir %{_sysconfdir}/cloud/cloud.cfg.d +%config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/*.cfg +%doc %{_sysconfdir}/cloud/cloud.cfg.d/README +%dir %{_sysconfdir}/cloud/templates +%config(noreplace) %{_sysconfdir}/cloud/templates/* +%dir %{_sysconfdir}/rsyslog.d +%config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf +%{_sysconfdir}/NetworkManager/dispatcher.d/hook-network-manager +%{_sysconfdir}/dhcp/dhclient-exit-hooks.d/hook-dhclient +/lib/udev/rules.d/66-azure-ephemeral.rules +%{_unitdir}/cloud-config.service +%{_unitdir}/cloud-final.service +%{_unitdir}/cloud-init.service +%{_unitdir}/cloud-init-local.service +%{_unitdir}/cloud-config.target +%{_unitdir}/cloud-init.target +/usr/lib/systemd/system-generators/cloud-init-generator +%{python3_sitelib}/* +%{_libexecdir}/%{name} +%{_bindir}/cloud-init* +%{_bindir}/cloud-id +%{_datadir}/bash-completion/completions/cloud-init +%dir /var/lib/cloud + + +%changelog +* Fri Jun 14 2019 Ryan Harper <ryan.har...@canonical.com> +- Adapt Fedora cloud-init.spec for upstream diff --git a/packages/pkg-deps.json b/packages/pkg-deps.json index 72409dd..9257199 100644 --- a/packages/pkg-deps.json +++ b/packages/pkg-deps.json @@ -62,6 +62,51 @@ "sudo" ] }, + "fedora" : { + "build-requires" : [ + "python3-devel", + "python3-distro", + "python3-prettytable", + "python3-pyserial", + "python3-setuptools", + "rpm-build" + ], + "renames" : { + "jinja2" : { + "3" : "python3-jinja2" + }, + "jsonschema" : { + "3" : "python3-jsonschema" + }, + "pyflakes" : { + "2" : "pyflakes", + "3" : "python3-pyflakes" + }, + "pyyaml" : { + "2" : "PyYAML", + "3" : "python3-PyYAML" + }, + "pyserial" : { + "2" : "pyserial", + "3" : "python3-pyserial" + }, + "requests" : { + "3" : "python3-requests" + }, + "six" : { + "3" : "python3-six" + } + }, + "requires" : [ + "e2fsprogs", + "iproute", + "net-tools", + "procps", + "rsyslog", + "shadow-utils", + "sudo" + ] + }, "suse" : { "renames" : { "pyyaml" : { diff --git a/systemd/cloud-init-generator.tmpl b/systemd/cloud-init-generator.tmpl index cfa5eb5..45efa24 100755 --- a/systemd/cloud-init-generator.tmpl +++ b/systemd/cloud-init-generator.tmpl @@ -82,7 +82,12 @@ default() { } check_for_datasource() { - local ds_rc="" dsidentify="/usr/lib/cloud-init/ds-identify" + local ds_rc="" +{% if variant in ["redhat", "fedora", "centos"] %} + local dsidentify="/usr/libexec/cloud-init/ds-identify" +{% else %} + local dsidentify="/usr/lib/cloud-init/ds-identify" +{% endif %} if [ ! -x "$dsidentify" ]; then debug 1 "no ds-identify in $dsidentify. _RET=$FOUND" return 0 diff --git a/tools/read-dependencies b/tools/read-dependencies index b4656e6..0b94880 100755 --- a/tools/read-dependencies +++ b/tools/read-dependencies @@ -23,6 +23,7 @@ DEFAULT_REQUIREMENTS = 'requirements.txt' # Map the appropriate package dir needed for each distro choice DISTRO_PKG_TYPE_MAP = { 'centos': 'redhat', + 'fedora': 'fedora', 'redhat': 'redhat', 'debian': 'debian', 'ubuntu': 'debian', @@ -51,17 +52,41 @@ MAYBE_RELIABLE_YUM_INSTALL = [ """, 'reliable-yum-install'] +MAYBE_RELIABLE_DNF_INSTALL = [ + 'sh', '-c', + """ + error() { echo "$@" 1>&2; } + n=0; max=10; + bcmd="dnf install --downloadonly --assumeyes --setopt=keepcache=1" + while n=$(($n+1)); do + error ":: running $bcmd $* [$n/$max]" + $bcmd "$@" + r=$? + [ $r -eq 0 ] && break + [ $n -ge $max ] && { error "gave up on $bcmd"; exit $r; } + nap=$(($n*5)) + error ":: failed [$r] ($n/$max). sleeping $nap." + sleep $nap + done + error ":: running dnf install --cacheonly --assumeyes $*" + dnf install --cacheonly --assumeyes "$@" + """, + 'reliable-dnf-install'] + + ZYPPER_INSTALL = [ 'zypper', '--non-interactive', '--gpg-auto-import-keys', 'install', '--auto-agree-with-licenses'] DRY_DISTRO_INSTALL_PKG_CMD = { 'centos': ['yum', 'install', '--assumeyes'], + 'fedora': ['dnf', 'install', '--assumeyes'], 'redhat': ['yum', 'install', '--assumeyes'], } DISTRO_INSTALL_PKG_CMD = { 'centos': MAYBE_RELIABLE_YUM_INSTALL, + 'fedora': MAYBE_RELIABLE_DNF_INSTALL, 'redhat': MAYBE_RELIABLE_YUM_INSTALL, 'debian': ['apt', 'install', '-y'], 'ubuntu': ['apt', 'install', '-y'], @@ -73,6 +98,7 @@ DISTRO_INSTALL_PKG_CMD = { # List of base system packages required to enable ci automation CI_SYSTEM_BASE_PKGS = { 'common': ['make', 'sudo', 'tar'], + 'fedora': ['python3-tox'], 'redhat': ['python-tox'], 'centos': ['python-tox'], 'ubuntu': ['devscripts', 'python3-dev', 'libssl-dev', 'tox', 'sbuild'], diff --git a/tools/run-container b/tools/run-container index 1d24e15..1aa7c09 100755 --- a/tools/run-container +++ b/tools/run-container @@ -218,9 +218,10 @@ get_os_info() { { error "Unable to determine OS_NAME/OS_VERSION"; return 1; } } -yum_install() { +_rpm_install() { + install_cmd="$1"; shift; local n=0 max=10 ret - bcmd="yum install --downloadonly --assumeyes --setopt=keepcache=1" + bcmd="$install_cmd install --downloadonly --assumeyes --setopt=keepcache=1" while n=$((n+1)); do error ":: running $bcmd $* [$n/$max]" $bcmd "$@" @@ -231,8 +232,16 @@ yum_install() { error ":: failed [$ret] ($n/$max). sleeping $nap." sleep $nap done - error ":: running yum install --cacheonly --assumeyes $*" - yum install --cacheonly --assumeyes "$@" + error ":: running $install_cmd install --cacheonly --assumeyes $*" + $install_cmd install --cacheonly --assumeyes "$@" +} + +yum_install() { + _rpm_install "yum" "$@" +} + +dnf_install() { + _rpm_install "dnf" "$@" } zypper_install() { @@ -250,6 +259,7 @@ apt_install() { install_packages() { get_os_info || return case "$OS_NAME" in + fedora) dnf_install "$@";; centos) yum_install "$@";; opensuse) zypper_install "$@";; debian|ubuntu) apt_install "$@";; @@ -517,15 +527,16 @@ main() { local build_pkg="" build_srcpkg="" pkg_ext="" distflag="" case "$OS_NAME" in centos) distflag="--distro=redhat";; + fedora) distflag="--distro=fedora";; opensuse) distflag="--distro=suse";; esac case "$OS_NAME" in debian|ubuntu) - build_pkg="./packages/bddeb -d" + build_pkg="./packages/bddeb -d" build_srcpkg="./packages/bddeb -S -d" pkg_ext=".deb";; - centos|opensuse) + centos|fedora|opensuse|redhat) build_pkg="./packages/brpm $distflag" build_srcpkg="./packages/brpm $distflag --srpm" pkg_ext=".rpm";;
_______________________________________________ Mailing list: https://launchpad.net/~cloud-init-dev Post to : cloud-init-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~cloud-init-dev More help : https://help.launchpad.net/ListHelp