mcpu: Implement lock timeouts
[ganeti-local] / Makefile.am
index ca838e3..51270a0 100644 (file)
@@ -11,6 +11,9 @@ abs_top_srcdir = @abs_top_srcdir@
 
 ACLOCAL_AMFLAGS = -I autotools
 DOCBOOK_WRAPPER = $(top_srcdir)/autotools/docbook-wrapper
+BUILD_BASH_COMPLETION = $(top_srcdir)/autotools/build-bash-completion
+RUN_IN_TEMPDIR = $(top_srcdir)/autotools/run-in-tempdir
+CHECK_PYTHON_CODE = $(top_srcdir)/autotools/check-python-code
 REPLACE_VARS_SED = autotools/replace_vars.sed
 
 hypervisordir = $(pkgpythondir)/hypervisor
@@ -26,7 +29,9 @@ DIRS = \
        devel \
        doc \
        doc/examples \
+       doc/examples/hooks \
        lib \
+       lib/build \
        lib/http \
        lib/hypervisor \
        lib/rapi \
@@ -47,11 +52,14 @@ maintainer-clean-local:
 
 CLEANFILES = \
        autotools/replace_vars.sed \
+       daemons/ganeti-cleaner \
        devel/upload \
        doc/examples/bash_completion \
        doc/examples/ganeti.initd \
        doc/examples/ganeti.cron \
+       doc/examples/hooks/ipsec \
        lib/*.py[co] \
+       lib/build/*.py[co] \
        lib/http/*.py[co] \
        lib/hypervisor/*.py[co] \
        lib/rapi/*.py[co] \
@@ -62,9 +70,17 @@ CLEANFILES = \
        stamp-directories \
        $(nodist_pkgpython_PYTHON)
 
+BUILT_SOURCES = \
+       ganeti \
+       srclinks \
+       lib/_autoconf.py
+
 nodist_pkgpython_PYTHON = \
        lib/_autoconf.py
 
+noinst_PYTHON = \
+       lib/build/__init__.py
+
 pkgpython_PYTHON = \
        lib/__init__.py \
        lib/asyncnotifier.py \
@@ -114,6 +130,7 @@ http_PYTHON = \
 
 confd_PYTHON = \
        lib/confd/__init__.py \
+       lib/confd/client.py \
        lib/confd/server.py \
        lib/confd/querylib.py
 
@@ -121,11 +138,13 @@ docrst = \
        doc/admin.rst \
        doc/design-2.0.rst \
        doc/design-2.1.rst \
+       doc/devnotes.rst \
        doc/glossary.rst \
        doc/hooks.rst \
        doc/iallocator.rst \
        doc/index.rst \
        doc/install.rst \
+       doc/locking.rst \
        doc/rapi.rst \
        doc/security.rst
 
@@ -141,18 +160,15 @@ doc/html: $(docrst) $(docpng) doc/conf.py configure.ac
        touch "$@"
 
 docdot = \
-       doc/arch-2.0.dot
+       doc/arch-2.0.dot \
+       doc/design-2.1-lock-acquire.dot \
+       doc/design-2.1-lock-release.dot
 
 docpng = $(patsubst %.dot,%.png,$(docdot))
 
 noinst_DATA = $(manhtml) doc/html
 
-dist_sbin_SCRIPTS = \
-       daemons/ganeti-noded \
-       daemons/ganeti-watcher \
-       daemons/ganeti-masterd \
-       daemons/ganeti-confd \
-       daemons/ganeti-rapi \
+gnt_scripts = \
        scripts/gnt-backup \
        scripts/gnt-cluster \
        scripts/gnt-debug \
@@ -161,6 +177,17 @@ dist_sbin_SCRIPTS = \
        scripts/gnt-node \
        scripts/gnt-os
 
+dist_sbin_SCRIPTS = \
+       daemons/ganeti-noded \
+       daemons/ganeti-watcher \
+       daemons/ganeti-masterd \
+       daemons/ganeti-confd \
+       daemons/ganeti-rapi \
+       $(gnt_scripts)
+
+nodist_sbin_SCRIPTS = \
+       daemons/ganeti-cleaner
+
 dist_tools_SCRIPTS = \
        tools/burnin \
        tools/cfgshell \
@@ -170,19 +197,22 @@ dist_tools_SCRIPTS = \
 EXTRA_DIST = \
        $(MAINTAINERCLEANFILES) \
        NEWS \
-       DEVNOTES \
        pylintrc \
+       autotools/build-bash-completion \
+       autotools/check-python-code \
        autotools/docbook-wrapper \
+       autotools/run-in-tempdir \
+       daemons/ganeti-cleaner.in \
        devel/upload.in \
        $(docdot) \
        $(docrst) \
        doc/conf.py \
        doc/html \
-       doc/examples/bash_completion.in \
        doc/examples/ganeti.initd.in \
        doc/examples/ganeti.cron.in \
        doc/examples/dumb-allocator \
-       doc/locking.txt \
+       doc/examples/hooks/ethers \
+       doc/examples/hooks/ipsec.in \
        test/testutils.py \
        test/mocks.py \
        $(dist_TESTS) \
@@ -205,6 +235,7 @@ EXTRA_DIST = \
 
 man_MANS = \
        man/ganeti.7 \
+       man/ganeti-cleaner.8 \
        man/ganeti-masterd.8 \
        man/ganeti-noded.8 \
        man/ganeti-os-interface.7 \
@@ -228,61 +259,91 @@ TEST_FILES = \
        test/data/bdev-disk.txt \
        test/data/bdev-net.txt \
        test/data/proc_drbd8.txt \
+       test/data/proc_drbd80-emptyline.txt \
        test/data/proc_drbd83.txt
 
 dist_TESTS = \
        test/ganeti.bdev_unittest.py \
        test/ganeti.cli_unittest.py \
        test/ganeti.cmdlib_unittest.py \
+       test/ganeti.confd_client_unittest.py \
        test/ganeti.config_unittest.py \
        test/ganeti.constants_unittest.py \
        test/ganeti.hooks_unittest.py \
        test/ganeti.http_unittest.py \
        test/ganeti.locking_unittest.py \
+       test/ganeti.mcpu_unittest.py \
        test/ganeti.objects_unittest.py \
        test/ganeti.rapi.resources_unittest.py \
        test/ganeti.serializer_unittest.py \
        test/ganeti.ssh_unittest.py \
        test/ganeti.utils_unittest.py \
-       test/ganeti.workerpool_unittest.py
+       test/ganeti.workerpool_unittest.py \
+       test/docs_unittest.py
 
 nodist_TESTS =
 
 TESTS = $(dist_TESTS) $(nodist_TESTS)
 
-TESTS_ENVIRONMENT = PYTHONPATH=.:$(top_builddir) $(PYTHON)
+TESTS_ENVIRONMENT = \
+       PYTHONPATH=. TOP_SRCDIR=$(abs_top_srcdir) \
+       $(RUN_IN_TEMPDIR) $(PYTHON)
+
+all_python_code = \
+       $(dist_sbin_SCRIPTS) \
+       $(dist_tools_SCRIPTS) \
+       $(dist_TESTS) \
+       $(pkgpython_PYTHON) \
+       $(hypervisor_PYTHON) \
+       $(rapi_PYTHON) \
+       $(http_PYTHON) \
+       $(confd_PYTHON) \
+       $(noinst_PYTHON)
+
+srclink_files = \
+       man/footer.sgml \
+       $(all_python_code)
+
+check_python_code = \
+       $(all_python_code)
 
-all-local: stamp-directories lib/_autoconf.py devel/upload \
+all-local: stamp-directories devel/upload \
        doc/examples/bash_completion \
-       doc/examples/ganeti.initd doc/examples/ganeti.cron
+       doc/examples/ganeti.initd doc/examples/ganeti.cron \
+       doc/examples/hooks/ipsec
 
 devel/upload: devel/upload.in stamp-directories $(REPLACE_VARS_SED)
        sed -f $(REPLACE_VARS_SED) < $< > $@
        chmod u+x $@
 
+daemons/ganeti-cleaner: daemons/ganeti-cleaner.in stamp-directories \
+               $(REPLACE_VARS_SED)
+       sed -f $(REPLACE_VARS_SED) < $< > $@
+       chmod +x $@
+
 doc/examples/%: doc/examples/%.in stamp-directories \
                $(REPLACE_VARS_SED)
        sed -f $(REPLACE_VARS_SED) < $< > $@
 
+doc/examples/hooks/%: doc/examples/hooks/%.in stamp-directories \
+               $(REPLACE_VARS_SED)
+       sed -f $(REPLACE_VARS_SED) < $< > $@
+
+doc/examples/bash_completion: $(BUILD_BASH_COMPLETION) $(RUN_IN_TEMPDIR) \
+       lib/cli.py $(gnt_scripts) tools/burnin
+       PYTHONPATH=. $(RUN_IN_TEMPDIR) $(CURDIR)/$(BUILD_BASH_COMPLETION) > $@
+
 doc/%.png: doc/%.dot
        @test -n "$(DOT)" || { echo 'dot' not found during configure; exit 1; }
        $(DOT) -Tpng -o $@ $<
 
 man/%.7.in man/%.8.in: man/%.sgml man/footer.sgml $(DOCBOOK_WRAPPER)
-       @test -n "$(DOCBOOK2MAN)" || { echo 'docbook2html' not found during configure; exit 1; }
-       TMPDIR=`mktemp -d` && { \
-       $(DOCBOOK_WRAPPER) "$(DOCBOOK2MAN)" $< $$TMPDIR/$(patsubst man/%.in,%,$@) ; \
-       mv $$TMPDIR/$(patsubst man/%.in,%,$@) $@ ; \
-       rm -rf "$$TMPDIR" ; \
-       }
+       @test -n "$(DOCBOOK2MAN)" || { echo 'docbook2man' not found during configure; exit 1; }
+       $(DOCBOOK_WRAPPER) "$(DOCBOOK2MAN)" $< $(notdir $(@:.in=)) $@
 
 man/%.html.in: man/%.sgml man/footer.sgml $(DOCBOOK_WRAPPER)
        @test -n "$(DOCBOOK2HTML)" || { echo 'docbook2html' not found during configure; exit 1; }
-       TMPDIR=`mktemp -d` && { \
-       $(DOCBOOK_WRAPPER) "$(DOCBOOK2HTML) --nochunks" $< $$TMPDIR/$(patsubst man/%.in,%,$@) ; \
-       mv $$TMPDIR/$(patsubst man/%.in,%,$@) $@ ; \
-       rm -rf "$$TMPDIR" ; \
-       }
+       $(DOCBOOK_WRAPPER) "$(DOCBOOK2HTML) --nochunks" $< $(notdir $(@:.in=)) $@
 
 man/%.7: man/%.7.in stamp-directories $(REPLACE_VARS_SED)
        sed -f $(REPLACE_VARS_SED) < $< > $@
@@ -293,10 +354,6 @@ man/%.8: man/%.8.in stamp-directories $(REPLACE_VARS_SED)
 man/%.html: man/%.html.in stamp-directories $(REPLACE_VARS_SED)
        sed -f $(REPLACE_VARS_SED) < $< > $@
 
-man/footer.sgml $(TESTS): srclinks
-
-$(TESTS): ganeti lib/_autoconf.py
-
 lib/_autoconf.py: Makefile stamp-directories
        set -e; \
        { echo '# This file is automatically generated, do not edit!'; \
@@ -321,6 +378,7 @@ lib/_autoconf.py: Makefile stamp-directories
          echo "SSH_INITD_SCRIPT = '$(SSH_INITD_SCRIPT)'"; \
          echo "EXPORT_DIR = '$(EXPORT_DIR)'"; \
          echo "OS_SEARCH_PATH = [$(OS_SEARCH_PATH)]"; \
+         echo "XEN_BOOTLOADER = '$(XEN_BOOTLOADER)'"; \
          echo "XEN_KERNEL = '$(XEN_KERNEL)'"; \
          echo "XEN_INITRD = '$(XEN_INITRD)'"; \
          echo "FILE_STORAGE_DIR = '$(FILE_STORAGE_DIR)'"; \
@@ -328,7 +386,9 @@ lib/_autoconf.py: Makefile stamp-directories
          echo "KVM_PATH = '$(KVM_PATH)'"; \
          echo "KVM_MIGRATION_PORT = '$(KVM_MIGRATION_PORT)'"; \
          echo "SOCAT_PATH = '$(SOCAT_PATH)'"; \
-         echo "LVM_STRIPECOUNT = $(LVM_STRIPECOUNT)" ; \
+         echo "LVM_STRIPECOUNT = $(LVM_STRIPECOUNT)"; \
+         echo "TOOLSDIR = '$(toolsdir)'"; \
+         echo "GNT_SCRIPTS = [$(foreach i,$(notdir $(gnt_scripts)),'$(i)',)]"; \
        } > $@
 
 $(REPLACE_VARS_SED): Makefile stamp-directories
@@ -336,20 +396,21 @@ $(REPLACE_VARS_SED): Makefile stamp-directories
        { echo 's#@PREFIX@#$(prefix)#g'; \
          echo 's#@SYSCONFDIR@#$(sysconfdir)#g'; \
          echo 's#@LOCALSTATEDIR@#$(localstatedir)#g'; \
+         echo 's#@BINDIR@#$(bindir)#g'; \
          echo 's#@SBINDIR@#$(sbindir)#g'; \
          echo 's#@GANETI_VERSION@#$(PACKAGE_VERSION)#g'; \
+         echo 's#@CUSTOM_XEN_BOOTLOADER@#$(XEN_BOOTLOADER)#g'; \
          echo 's#@CUSTOM_XEN_KERNEL@#$(XEN_KERNEL)#g'; \
          echo 's#@CUSTOM_XEN_INITRD@#$(XEN_INITRD)#g'; \
          echo 's#@RPL_FILE_STORAGE_DIR@#$(FILE_STORAGE_DIR)#g'; \
+         echo 's#@PKGLIBDIR@#$(pkglibdir)#g'; \
        } > $@
 
 # We need to create symlinks because "make distcheck" will not install Python
 # files when building.
-#.PHONY: srclinks
 srclinks: stamp-directories
        set -e; \
-       for i in man/footer.sgml $(pkgpython_PYTHON) $(hypervisor_PYTHON) \
-                       $(rapi_PYTHON) $(http_PYTHON) $(confd_PYTHON); do \
+       for i in $(srclink_files); do \
                if test ! -f $$i -a -f $(abs_top_srcdir)/$$i; then \
                        $(LN_S) $(abs_top_srcdir)/$$i $$i; \
                fi; \
@@ -359,6 +420,9 @@ srclinks: stamp-directories
 ganeti:
        cd $(top_builddir) && test -h "$@" || { rm -f $@ && $(LN_S) lib $@; }
 
+check-local:
+       $(CHECK_PYTHON_CODE) $(check_python_code)
+
 # a dist hook rule for catching revision control directories
 distcheck-hook:
        if find $(top_distdir) | grep -F -e '.svn' -e '.git'; then \
@@ -376,18 +440,11 @@ stamp-directories: Makefile
        touch $@
 
 .PHONY: apidoc
-apidoc:
+apidoc: epydoc.conf $(RUN_IN_TEMPDIR)
        test -e doc/api || mkdir doc/api
-       TMPDIR=`mktemp -d ` && { \
-               cp -r scripts daemons lib $$TMPDIR && \
-               ( \
-                       CDIR=`pwd` && \
-                       cd $$TMPDIR && \
-                       mv lib ganeti && \
-                       epydoc -v --conf $$CDIR/epydoc.conf -o $$CDIR/doc/api \
-               ) ; \
-               rm -rf $$TMPDIR ; \
-       }
+       $(RUN_IN_TEMPDIR) epydoc -v \
+               --conf $(CURDIR)/epydoc.conf \
+               --output $(CURDIR)/doc/api
 
 .PHONY: TAGS
 TAGS: