[Kimchi-devel] [PATCH] Packaging: Discover and Build Plugins Automatically

Zhou Zheng Sheng zhshzhou at linux.vnet.ibm.com
Thu Apr 10 02:12:43 UTC 2014


on 2014/04/09 20:36, Aline Manera wrote:
> 
> The plugins should be packaged in a separated package and not with
> kimchi code.
> 
> We should have: kimchi.rpm and pluginA.rpm, pluginB.rpm and so (same for
> deb packages)
> And plugins packages depend on kimchi

Thanks Aline. The resulted packages are separated and depend on the
kimchi RPM. When we package Kimchi itself, it ignores the plugins and
build as usual.

When the downstream developer packages the plugins, it produces
kimchi-xxx.rpm and kimchi-pluginA-xxx.rpm. Then downstream developer
just discard kimchi-xxx.rpm and use kimchi-pluginA-xxx.rpm. This is
useful because generally we allow kimchid to start from the source
workspace. If kimchi does not discover and build plugins automatically,
the developer has to cd into each plugin sub-directory and build them
manually.

> 
> On 04/09/2014 06:43 AM, zhshzhou at linux.vnet.ibm.com wrote:
>> From: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>>
>> Though Kimchi can automatically discover and load plugin Python modules
>> when kimchid starts, the packaging subsystem is not as smart. Downstream
>> plugin developers have to insert entries in Kimchi configure.ac and
>> contrib/kimchi.spec.*.in to compile and package plugin files. This is
>> not scalable.
>>
>> This patch proposes a mechanism to make packaging scripts smarter to
>> discover and build plugins dynamically, so that the plugin code is
>> actually "plugable" to the packaging subsystem. The plugin developer
>> just places the pluginX code to plugins/pluginX, then uses
>> "./autogen.sh --with-plugins=pluginX" to generate the packaging scripts
>> for pluginX. We no longer have to change upstream Kimchi configure.ac,
>> Makefile.am and kimchi.spec.*.in.
>>
>> To compile with plugins, use the following command.
>>    ./autogen.sh --with-plugins=plugin1,plugin2,... && make
>>
>> To build kimchi-plugin1.rpm, kimchi-plugin2.rpm and kimchi.rpm, use the
>> following command.
>>    ./autogen.sh --system --with-plugins=plugin1,plugin2 && make &&
>> make rpm
>>
>> To build only kimchi.rpm, use the following command
>>    ./autogen.sh --system && make && make rpm
>>
>> This patch makes use of the "include" functions in autoconf and RPM
>> spec. The basic idea is that each plugin provides two files as follow.
>>    plugins/PLUGIN_NAME/configure.m4
>>    plugins/PLUGIN_NAME/plugin.spec
>> Then autogen.sh catenates all plugins/{enabled_plugins}/configure.m4
>> into one big plugins/plugins.m4. In configure.ac, it includes
>> plugins/plugins.m4. When we invoke "make rpm", the Makefil scripts does
>> the similar catenation of plugins/{enabled_plugins}/plugin.spec into
>> plugins/plugins.spec, and have kimchi.spec include this file.
>>
>> Since the Debian packaging system is a different story, future patches
>> shall be submitted to make Kimchi deb packaging code plugable.
>>
>> Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>> ---
>>   .gitignore                           |  2 ++
>>   Makefile.am                          | 14 ++++++++------
>>   autogen.sh                           | 13 +++++++++++++
>>   configure.ac                         |  7 ++++---
>>   contrib/kimchi.spec.fedora.in        |  4 ++++
>>   contrib/kimchi.spec.suse.in          |  4 ++++
>>   plugins/Makefile.am                  | 17 +++++++++++++++--
>>   plugins/sample/Makefile.am           | 14 +++++++++++++-
>>   plugins/sample/configure.m4          | 26 ++++++++++++++++++++++++++
>>   plugins/sample/plugin.spec           | 17 +++++++++++++++++
>>   plugins/sample/ui/config/Makefile.am |  6 +++++-
>>   11 files changed, 111 insertions(+), 13 deletions(-)
>>   create mode 100644 plugins/sample/configure.m4
>>   create mode 100644 plugins/sample/plugin.spec
>>
>> diff --git a/.gitignore b/.gitignore
>> index 67878e2..324325b 100644
>> --- a/.gitignore
>> +++ b/.gitignore
>> @@ -20,6 +20,8 @@ contrib/DEBIAN/control
>>   contrib/kimchi.spec.fedora
>>   contrib/kimchi.spec.suse
>>   contrib/make-deb.sh
>> +plugins/plugins.m4
>> +plugins/plugins.spec
>>   *.min.css
>>   *.min.js
>>   *.gmo
>> diff --git a/Makefile.am b/Makefile.am
>> index 6831b5d..b6a864c 100644
>> --- a/Makefile.am
>> +++ b/Makefile.am
>> @@ -35,9 +35,7 @@ EXTRA_DIST = \
>>   # When fixing a file to conform with pep8, add it to the WL here.
>>   # So it will be checked from now on.
>>   PEP8_WHITELIST = \
>> -    plugins/__init__.py \
>> -    plugins/sample/__init__.py \
>> -    plugins/sample/model.py \
>> +    plugins \
>>       src/kimchi/asynctask.py \
>>       src/kimchi/auth.py \
>>       src/kimchi/cachebust.py \
>> @@ -122,10 +120,14 @@ kimchi.spec: contrib/kimchi.spec.fedora
>> contrib/kimchi.spec.suse
>>           /bin/false ;                                        \
>>       fi
>>   -rpm: dist kimchi.spec
>> +plugins/plugins.spec:
>> +    cd plugins; \
>> +    make plugins.spec
>> +
>> +rpm: dist kimchi.spec plugins/plugins.spec
>>       $(MKDIR_P) rpm/BUILD rpm/RPMS rpm/SOURCES rpm/SPECS rpm/SRPMS
>>       cp $(top_srcdir)/kimchi.spec rpm/SPECS/kimchi.spec
>> -    cp $(DIST_ARCHIVES) rpm/SOURCES
>> +    cp $(DIST_ARCHIVES) plugins/plugins.spec rpm/SOURCES
>>       rpmbuild -ba --define "_topdir `pwd`/rpm" rpm/SPECS/kimchi.spec
>>     fedora-rpm: contrib/kimchi.spec.fedora
>> @@ -146,7 +148,7 @@ VERSION:
>>           git describe --abbrev=0 > $@;                     \
>>       fi
>>   -.PHONY: deb install-deb rpm fedora-rpm suse-rpm ChangeLog VERSION
>> +.PHONY: deb install-deb rpm fedora-rpm suse-rpm ChangeLog VERSION
>> plugins/plugins.spec
>>     clean-local:
>>       rm -rf mo rpm
>> diff --git a/autogen.sh b/autogen.sh
>> index 0f22dba..75d85aa 100755
>> --- a/autogen.sh
>> +++ b/autogen.sh
>> @@ -1,5 +1,18 @@
>>   #!/bin/bash
>>   +plugins_list=""
>> +for opts in "$@" ; do
>> +    if [[ "$opts" == "--with-plugins="* ]] ; then
>> +        plugins_list=${opts#--with-plugins=}
>> +        plugins_list=$(sed -e "s/,/ /g" <<< ${plugins_list})
>> +    fi
>> +done
>> +
>> +echo "" > plugins/plugins.m4
>> +for plugin in ${plugins_list}; do
>> +    cat plugins/${plugin}/configure.m4 >> plugins/plugins.m4
>> +done
>> +
>>   aclocal
>>   automake --add-missing
>>   autoreconf
>> diff --git a/configure.ac b/configure.ac
>> index a625f35..75be00d 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -48,6 +48,10 @@ if test "x$PYFLAKES" = "x"; then
>>     AC_MSG_WARN([pyflakes not found])
>>   fi
>>   +m4_include([plugins/plugins.m4])
>> +
>> +AC_SUBST([enabled_plugins], ["${enabled_plugins}"])
>> +
>>     AC_CONFIG_FILES([
>>       po/Makefile.in
>> @@ -61,9 +65,6 @@ AC_CONFIG_FILES([
>>       src/kimchi/control/vm/Makefile
>>       src/kimchi/model/Makefile
>>       plugins/Makefile
>> -    plugins/sample/Makefile
>> -    plugins/sample/ui/Makefile
>> -    plugins/sample/ui/config/Makefile
>>       ui/Makefile
>>       ui/css/Makefile
>>       ui/css/novnc/Makefile
>> diff --git a/contrib/kimchi.spec.fedora.in
>> b/contrib/kimchi.spec.fedora.in
>> index bf80104..12b5f42 100644
>> --- a/contrib/kimchi.spec.fedora.in
>> +++ b/contrib/kimchi.spec.fedora.in
>> @@ -10,6 +10,7 @@ BuildRoot:   
>> %{_topdir}/BUILD/%{name}-%{version}-%{release}
>>   Group:        System Environment/Base
>>   License:    LGPL/ASL2
>>   Source0:    %{name}-%{version}.tar.gz
>> +Source1:    plugins.spec
>>   Requires:    qemu-kvm
>>   Requires:    gettext-devel
>>   Requires:    libvirt
>> @@ -140,6 +141,7 @@ rm -rf $RPM_BUILD_ROOT
>>   %{python_sitelib}/kimchi/control/*.py*
>>   %{python_sitelib}/kimchi/control/vm/*.py*
>>   %{python_sitelib}/kimchi/model/*.py*
>> +%{python_sitelib}/kimchi/plugins/*.py*
>>   %{python_sitelib}/kimchi/API.json
>>   %{_datadir}/kimchi/doc/API.md
>>   %{_datadir}/kimchi/doc/README.md
>> @@ -192,6 +194,8 @@ rm -rf $RPM_BUILD_ROOT
>>   %{_initrddir}/kimchid
>>   %endif
>>   +%include %{SOURCE1}
>> +
>>   %changelog
>>   * Tue Feb 11 2014 Crístian Viana <vianac at linux.vnet.ibm.com> 1.1.0
>>   - Add help pages and XSLT dependency
>> diff --git a/contrib/kimchi.spec.suse.in b/contrib/kimchi.spec.suse.in
>> index cba0899..8432dab 100644
>> --- a/contrib/kimchi.spec.suse.in
>> +++ b/contrib/kimchi.spec.suse.in
>> @@ -6,6 +6,7 @@ BuildRoot:   
>> %{_topdir}/BUILD/%{name}-%{version}-%{release}
>>   Group:        System Environment/Base
>>   License:    LGPL/ASL2
>>   Source0:    %{name}-%{version}.tar.gz
>> +Source1:    plugins.spec
>>   Requires:    kvm
>>   Requires:    gettext-tools
>>   Requires:    libvirt
>> @@ -66,6 +67,7 @@ rm -rf $RPM_BUILD_ROOT
>>   %{python_sitelib}/kimchi/control/*.py*
>>   %{python_sitelib}/kimchi/control/vm/*.py*
>>   %{python_sitelib}/kimchi/model/*.py*
>> +%{python_sitelib}/kimchi/plugins/*.py*
>>   %{python_sitelib}/kimchi/API.json
>>   %{_datadir}/kimchi/doc/API.md
>>   %{_datadir}/kimchi/doc/README.md
>> @@ -108,6 +110,8 @@ rm -rf $RPM_BUILD_ROOT
>>   %{_sysconfdir}/kimchi/distros.d/gentoo.json
>>   %{_initrddir}/kimchid
>>   +%include %{SOURCE1}
>> +
>>   %changelog
>>   * Tue Feb 11 2014 Crístian Viana <vianac at linux.vnet.ibm.com> 1.1.0
>>   - Add help pages and XSLT dependency
>> diff --git a/plugins/Makefile.am b/plugins/Makefile.am
>> index 2ceedae..2ec958f 100644
>> --- a/plugins/Makefile.am
>> +++ b/plugins/Makefile.am
>> @@ -17,6 +17,19 @@
>>   # License along with this library; if not, write to the Free Software
>>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
>> 02110-1301  USA
>>   -SUBDIRS = sample
>> +SUBDIRS = $(enabled_plugins)
>>   -EXTRA_DIST = __init__.py
>> +plugins_PYTHON = \
>> +    __init__.py
>> +
>> +pluginsdir = $(pythondir)/kimchi/plugins
>> +
>> +plugins.spec: $(SUBDIRS:%=%/plugin.spec) Makefile
>> +    echo "" > plugins.spec
>> +    for plugin in $(SUBDIRS); do \
>> +        cat $$plugin/plugin.spec >> plugins.spec; \
>> +    done
>> +
>> +CLEANFILES = \
>> +    plugins.spec \
>> +    $(NULL)
>> diff --git a/plugins/sample/Makefile.am b/plugins/sample/Makefile.am
>> index e03a4c0..1d595c2 100644
>> --- a/plugins/sample/Makefile.am
>> +++ b/plugins/sample/Makefile.am
>> @@ -19,4 +19,16 @@
>>     SUBDIRS = ui
>>   -EXTRA_DIST = API.json sample.conf $(wildcard *.py)
>> +sampledir = $(pythondir)/kimchi/plugins/sample
>> +
>> +confdir = $(sysconfdir)/kimchi/plugins.d
>> +
>> +sample_PYTHON = $(wildcard *.py)
>> +
>> +dist_conf_DATA = sample.conf
>> +
>> +EXTRA_DIST = API.json
>> +
>> +install-data-local:
>> +    $(MKDIR_P) $(DESTDIR)$(sampledir)
>> +    $(INSTALL_DATA) API.json $(DESTDIR)$(sampledir)/API.json
>> diff --git a/plugins/sample/configure.m4 b/plugins/sample/configure.m4
>> new file mode 100644
>> index 0000000..b5d65f9
>> --- /dev/null
>> +++ b/plugins/sample/configure.m4
>> @@ -0,0 +1,26 @@
>> +#
>> +# Kimchi
>> +#
>> +# Copyright IBM Corp, 2014
>> +#
>> +# This library is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU Lesser General Public
>> +# License as published by the Free Software Foundation; either
>> +# version 2.1 of the License, or (at your option) any later version.
>> +#
>> +# This library is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +# Lesser General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU Lesser General Public
>> +# License along with this library; if not, write to the Free Software
>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
>> 02110-1301 USA
>> +
>> +enabled_plugins="${enabled_plugins} sample"
>> +
>> +AC_CONFIG_FILES([
>> +    plugins/sample/Makefile
>> +    plugins/sample/ui/Makefile
>> +    plugins/sample/ui/config/Makefile
>> +])
>> diff --git a/plugins/sample/plugin.spec b/plugins/sample/plugin.spec
>> new file mode 100644
>> index 0000000..9b6b03f
>> --- /dev/null
>> +++ b/plugins/sample/plugin.spec
>> @@ -0,0 +1,17 @@
>> +%package sample
>> +Summary:    Sample plugin for Kimchi.
>> +Requires:    %{name} = %{version}-%{release}
>> +
>> +%description sample
>> +Kimchi is a web server application application to manage KVM/Qemu
>> +virtual machines. Kimchi-sample is a sample plugin to demo how to write
>> +plugin for Kimchi.
>> +
>> +
>> +%files sample
>> +%attr(-,root,root)
>> +%{python_sitelib}/kimchi/plugins/sample/*.py*
>> +%{python_sitelib}/kimchi/plugins/sample/API.json
>> +%{_datadir}/kimchi/plugins/sample/ui/config/tab-ext.xml
>> +%{_sysconfdir}/kimchi/plugins.d/sample.conf
>> +
>> diff --git a/plugins/sample/ui/config/Makefile.am
>> b/plugins/sample/ui/config/Makefile.am
>> index cf9e09e..eb05920 100644
>> --- a/plugins/sample/ui/config/Makefile.am
>> +++ b/plugins/sample/ui/config/Makefile.am
>> @@ -17,5 +17,9 @@
>>   # License along with this library; if not, write to the Free Software
>>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
>> 02110-1301  USA
>>   -EXTRA_DIST = tab-ext.xml
>> +xmldir = $(datadir)/kimchi/plugins/sample/ui/config
>> +
>> +dist_xml_DATA = \
>> +    tab-ext.xml \
>> +    $(NULL)
>>   
> 


-- 
Thanks and best regards!

Zhou Zheng Sheng / 周征晟
E-mail: zhshzhou at linux.vnet.ibm.com
Telephone: 86-10-82454397




More information about the Kimchi-devel mailing list