[PATCH] Packaging: Discover and Build Plugins Automatically

From: Zhou Zheng Sheng <zhshzhou@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@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@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@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) -- 1.8.5.3

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 On 04/09/2014 06:43 AM, zhshzhou@linux.vnet.ibm.com wrote:
From: Zhou Zheng Sheng <zhshzhou@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@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@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@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)

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@linux.vnet.ibm.com wrote:
From: Zhou Zheng Sheng <zhshzhou@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@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@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@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@linux.vnet.ibm.com Telephone: 86-10-82454397
participants (3)
-
Aline Manera
-
Zhou Zheng Sheng
-
zhshzhou@linux.vnet.ibm.com