Summary: Cluster-based virtualization management software
Name: ganeti
-Version: 2.8.1
-Release: 0.2
+Version: 2.9.3
+Release: 0.9
License: GPL v2
Group: Applications/System
-Source0: https://ganeti.googlecode.com/files/%{name}-%{version}.tar.gz
-# Source0-md5: ade147740c2f630e0cdbb14a70e9c3ef
+Source0: http://downloads.ganeti.org/releases/2.9/%{name}-%{version}.tar.gz
+# Source0-md5: 0542ca872bf2d57284359fcc8dc565ef
Source1: %{name}.tmpfiles
Source2: %{name}-confd.init
Source3: %{name}-masterd.init
Source5: %{name}-rapi.init
Source6: %{name}-luxid.init
Source7: %{name}-mond.init
+Source8: %{name}.sysconfig
Patch0: fix-no-kvm.patch
Patch1: systemd.patch
Patch2: daemon-util-use-service.patch
+Patch3: mtl.patch
+Patch4: use-vm-openvswitch-link.patch
URL: https://code.google.com/p/ganeti/
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: ghc-hinotify
BuildRequires: ghc-hslogger >= 1.2.3
BuildRequires: ghc-json
-BuildRequires: ghc-snap-server
BuildRequires: ghc-regex-pcre
+BuildRequires: ghc-snap-server
+BuildRequires: ghc-temporary
BuildRequires: ghc-utf8-string
BuildRequires: gmp-devel
BuildRequires: hlint
BuildRequires: hscolour
+BuildRequires: pandoc
BuildRequires: python
BuildRequires: python-affinity
BuildRequires: python-bitarray
+BuildRequires: python-coverage
BuildRequires: python-devel
BuildRequires: python-distribute
BuildRequires: python-ipaddr
+BuildRequires: python-mock >= 1.0.1
BuildRequires: python-modules
BuildRequires: python-paramiko
+BuildRequires: python-pep8
BuildRequires: python-pyOpenSSL
BuildRequires: python-pycurl
BuildRequires: python-pyinotify
Requires(post,preun,postun): systemd-units >= 38
Requires: bridge-utils
Requires: drbdsetup >= 8.0.12
-Requires: drbd-udev
Requires: iproute2
Requires: iputils-arping
Requires: lvm2
Requires: openssh-server
Requires: python
Requires: python-affinity
+Requires: python-bitarray
Requires: python-devel
Requires: python-distribute
+Requires: python-ipaddr
Requires: python-modules
Requires: python-paramiko
Requires: python-pycurl
Requires: python-simplejson
Requires: rc-scripts
Requires: socat
+Requires: sudo
Requires: systemd-units >= 0.38
#Suggests: ganeti-instance-debootstrap
-Suggests: qemu-kvm
+Suggests: qemu
Suggests: xen
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
%patch0 -p1
%patch1 -p1
%patch2 -p1
+%patch3 -p1
+%patch4 -p1
%build
%{__aclocal} -I autotools
%configure \
IP_PATH=/sbin/ip \
DOT=/usr/bin/dot \
+ PYCOVERAGE=/usr/bin/coverage-%{py_ver} \
PYLINT=/usr/bin/pylint \
SOCAT=/usr/bin/socat \
QEMUIMG_PATH=/usr/bin/qemu-img \
--enable-syslog \
- --enable-htools-rapi \
- --enable-confd=python \
+ --enable-confd \
+ --enable-monitoring \
--enable-socat-escape \
--with-ssh-initscript=/etc/rc.d/init.d/sshd \
- --with-ssh-config-dir=/stc/ssh \
- --with-xen-cmd=xl \
- --with-kvm-path=/usr/bin/qemu-kvm
+ --with-ssh-config-dir=/etc/ssh \
+ --with-kvm-path=/usr/bin/qemu-kvm \
+ --enable-restricted-commands \
+ --with-user-prefix="gnt-" \
+ --with-group-prefix="gnt-" \
+ --with-export-dir=/var/lib/ganeti/export \
+ --with-iallocator-search-path=%{_libdir}/ganeti/iallocators \
+ --with-os-search-path=/srv/ganeti/os,%{_libdir}/ganeti/os,%{_datadir}/ganeti/os \
+ --with-extstorage-search-path=/srv/ganeti/extstorage,%{_libdir}/ganeti/extstorage,%{_datadir}/ganeti/extstorage
%{__make}
%install
rm -rf $RPM_BUILD_ROOT
install -d $RPM_BUILD_ROOT{%{systemdunitdir},%{systemdtmpfilesdir}} \
- $RPM_BUILD_ROOT/etc/{ganeti,cron.d,bash_completion.d,sysconfig,rc.d/init.d}
+ $RPM_BUILD_ROOT/etc/{ganeti,cron.d,bash_completion.d,sysconfig,rc.d/init.d,sudoers.d,logrotate.d}
%{__make} install \
DESTDIR=$RPM_BUILD_ROOT
-install -d $RPM_BUILD_ROOT%{_datadir}/ganeti/os
+install -d $RPM_BUILD_ROOT{%{_libdir},%{_datadir}}/ganeti/{os,extstorage}
cp -p %{SOURCE1} $RPM_BUILD_ROOT%{systemdtmpfilesdir}/ganeti.conf
install -p %{SOURCE2} $RPM_BUILD_ROOT/etc/rc.d/init.d/ganeti-confd
%{__sed} -i -e 's|@LIBDIR@|%{_libdir}|g' $RPM_BUILD_ROOT/etc/rc.d/init.d/ganeti-*
+cp -p %{SOURCE8} $RPM_BUILD_ROOT/etc/sysconfig/ganeti
+
cp -p doc/examples/bash_completion $RPM_BUILD_ROOT/etc/bash_completion.d/ganeti
cp -p doc/examples/ganeti.cron $RPM_BUILD_ROOT/etc/cron.d/ganeti
-cp -p doc/examples/ganeti.default $RPM_BUILD_ROOT/etc/sysconfig/ganeti
-cp -p doc/examples/ganeti.target $RPM_BUILD_ROOT%{systemdunitdir}
cp -p doc/examples/ganeti.target $RPM_BUILD_ROOT%{systemdunitdir}
cp -p doc/examples/ganeti-{noded,masterd,rapi,confd,luxid,mond}.service $RPM_BUILD_ROOT%{systemdunitdir}
+cp -p doc/examples/ganeti.sudoers $RPM_BUILD_ROOT/etc/sudoers.d/ganeti
+cp -p doc/examples/ganeti.logrotate $RPM_BUILD_ROOT/etc/logrotate.d/ganeti
+cp -p doc/examples/gnt-config-backup $RPM_BUILD_ROOT%{_sbindir}
%py_postclean
%clean
rm -rf $RPM_BUILD_ROOT
+%pre
+%groupadd -g 300 gnt-masterd
+%groupadd -g 301 gnt-confd
+%groupadd -g 302 gnt-luxid
+%groupadd -g 303 gnt-rapi
+%groupadd -g 304 gnt-daemons
+%groupadd -g 305 gnt-admin
+%useradd -u 300 -d /var/lib/ganeti -g gnt-masterd -G gnt-daemons,gnt-confd,gnt-admin -c "Ganeti Masterd User" gnt-masterd
+%useradd -u 301 -d /var/lib/ganeti -g gnt-confd -G gnt-daemons -c "Ganeti Confd User" gnt-confd
+%useradd -u 302 -d /var/lib/ganeti -g gnt-luxid -G gnt-daemons,gnt-confd,gnt-masterd -c "Ganeti Luxid User" gnt-luxid
+%useradd -u 303 -d /var/lib/ganeti -g gnt-rapi -G gnt-daemons,gnt-admin -c "Ganeti RAPI User" gnt-rapi
+
%post
/sbin/chkconfig --add ganeti-noded
%service ganeti-noded restart
%systemd_preun ganeti.target ganeti-noded.service ganeti-masterd.service ganeti-rapi.service ganeti-confd.service ganeti-luxid.service ganeti-mond.service
%postun
+if [ "$1" = "0" ]; then
+ %userremove gnt-rapi
+ %userremove gnt-luxid
+ %userremove gnt-confd
+ %userremove gnt-masterd
+ %groupremove gnt-admin
+ %groupremove gnt-masterd
+ %groupremove gnt-rapi
+ %groupremove gnt-luxid
+ %groupremove gnt-confd
+ %groupremove gnt-daemons
+fi
%systemd_reload
%files
%attr(754,root,root) /etc/rc.d/init.d/ganeti-noded
%attr(754,root,root) /etc/rc.d/init.d/ganeti-rapi
%config(noreplace) %verify(not md5 mtime size) /etc/sysconfig/ganeti
+%config(noreplace) %verify(not md5 mtime size) /etc/sudoers.d/ganeti
%dir %{_sysconfdir}/ganeti
%{systemdunitdir}/ganeti.target
%{systemdunitdir}/ganeti-confd.service
%{systemdunitdir}/ganeti-rapi.service
%{systemdtmpfilesdir}/ganeti.conf
/etc/cron.d/ganeti
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/logrotate.d/ganeti
%dir %{_datadir}/ganeti
+%dir %{_datadir}/ganeti/extstorage
%dir %{_datadir}/ganeti/os
%dir %{_libdir}/ganeti
%attr(755,root,root) %{_libdir}/ganeti/check-cert-expired
%attr(755,root,root) %{_libdir}/ganeti/import-export
%attr(755,root,root) %{_libdir}/ganeti/kvm-ifup
%attr(755,root,root) %{_libdir}/ganeti/mon-collector
+%attr(755,root,root) %{_libdir}/ganeti/net-common
%attr(755,root,root) %{_libdir}/ganeti/node-daemon-setup
%attr(755,root,root) %{_libdir}/ganeti/prepare-node-join
+%attr(755,root,root) %{_libdir}/ganeti/vif-ganeti
+%dir %{_libdir}/ganeti/extstorage
%dir %{_libdir}/ganeti/iallocators
+%dir %{_libdir}/ganeti/os
%dir %{_libdir}/ganeti/tools
%attr(755,root,root) %{_libdir}/ganeti/tools/burnin
%attr(755,root,root) %{_libdir}/ganeti/tools/cfgshell
%attr(755,root,root) %{_sbindir}/ganeti-watcher
%attr(755,root,root) %{_sbindir}/gnt-backup
%attr(755,root,root) %{_sbindir}/gnt-cluster
+%attr(755,root,root) %{_sbindir}/gnt-config-backup
%attr(755,root,root) %{_sbindir}/gnt-debug
%attr(755,root,root) %{_sbindir}/gnt-group
%attr(755,root,root) %{_sbindir}/gnt-instance
%{py_sitescriptdir}/ganeti/rapi/*.py*
%dir %{py_sitescriptdir}/ganeti/server
%{py_sitescriptdir}/ganeti/server/*.py*
+%dir %{py_sitescriptdir}/ganeti/storage
+%{py_sitescriptdir}/ganeti/storage/*.py*
%dir %{py_sitescriptdir}/ganeti/tools
%{py_sitescriptdir}/ganeti/tools/*.py*
%dir %{py_sitescriptdir}/ganeti/utils
%{py_sitescriptdir}/ganeti/utils/*.py*
%dir %{py_sitescriptdir}/ganeti/watcher
%{py_sitescriptdir}/ganeti/watcher/*.py*
+%dir %attr(755,gnt-masterd,gnt-masterd) /var/lib/ganeti
+%dir %attr(770,gnt-masterd,gnt-daemons) /var/log/ganeti
+%dir %attr(775,gnt-masterd,gnt-daemons) /var/run/ganeti
%files htools
%defattr(644,root,root,755)