[libvirt] [PATCH RFC V2] guests: Add support for openSUSE

Fabiano Fidêncio fidencio at redhat.com
Mon Dec 2 15:41:45 UTC 2019


Jim,

Firstly, sorry it took so long for me to give it a try in your patch.

Now, comments inline ...

On Tue, Nov 26, 2019 at 1:52 AM Jim Fehlig <jfehlig at suse.com> wrote:
>
> This change adds support for the latest openSUSE Leap and
> openSUSE Tumbleweed guests.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>
> This version of the patch overcomes the 'lci build' issues noted in V1
> and works well for openSUSE Leap 15.1 and Tumbleweed. I'm still of the
> opinion of only supporting the latest Leap since there is only a six
> month support overlap between versions. Version x-1 is only supported
> six months after x is released.

I will leave this up to you and Andrea. I'd say, whatever floats your boat. :-)

>
> 'lci update ... libvirt' fails in task "Configure hostname":
>
> fatal: [libvirt-opensuse-tumbleweed]: FAILED! => {"changed": false, "msg": "hostname module cannot be used on platform Linux (Opensuse-tumbleweed)"}

It seems to be an Ansible bug: https://github.com/ansible/ansible/issues/42726

>
> Not sure why that is the case. But more importantly, even though it
> doesn't fail, the "Update installed packages" task doesn't install any
> of the packages required to build libvirt. I suppose that agrees with
> guests/REAMDME, but how then are the packages required to build $project
> installed? How/when is the list of packages required to build $project
> conveyed to $package_manager?
>
> 'lcitool build libvirt-opensuse-tumbleweed libvirt' fails in the
> "Gathering Facts" task:
>
> fatal: [libvirt-opensuse-tumbleweed]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: ", "unreachable": true}

I didn't get this far, I'd firstly try to get the first part fixed as
this whole thing is sequential ...

>
> Passing --debug to the command didn't help with determining what needed
> the password. ssh? I can't find where the "Gathering Facts" task is
> defined. The $root_password_file passed to /usr/bin/ansible-playbook
> contains the correct password for the root user. /me needs to figure
> out how to better debug this stuff :-).
>
>  guests/configs/autoinst.xml                   | 75 +++++++++++++++++++
>  .../host_vars/libvirt-opensuse-15/docker.yml  |  2 +
>  .../host_vars/libvirt-opensuse-15/install.yml |  2 +
>  guests/host_vars/libvirt-opensuse-15/main.yml | 22 ++++++
>  .../libvirt-opensuse-tumbleweed/docker.yml    |  2 +
>  .../libvirt-opensuse-tumbleweed/install.yml   |  2 +
>  .../libvirt-opensuse-tumbleweed/main.yml      | 22 ++++++
>  guests/inventory                              |  2 +
>  guests/lcitool                                |  2 +
>  guests/playbooks/update/tasks/base.yml        | 15 ++++
>  guests/vars/mappings.yml                      | 41 +++++++++-
>  11 files changed, 185 insertions(+), 2 deletions(-)
>
> diff --git a/guests/configs/autoinst.xml b/guests/configs/autoinst.xml
> new file mode 100644
> index 0000000..42c42f8
> --- /dev/null
> +++ b/guests/configs/autoinst.xml
> @@ -0,0 +1,75 @@
> +<?xml version="1.0"?>
> +<!DOCTYPE profile>
> +<profile
> +  xmlns="http://www.suse.com/1.0/yast2ns"
> +  xmlns:config="http://www.suse.com/1.0/configns">
> +  <general>
> +    <mode>
> +      <confirm config:type="boolean">false</confirm>

Here, please, also add:
<second_stage config:type="boolean">false</second_stage>

It'll avoid an unnecessary reboot in the VM.

> +    </mode>
> +  </general>
> +  <partitioning config:type="list">
> +    <drive>
> +      <device>/dev/vda</device>
> +      <use>all</use>
> +      <partitions config:type="list">
> +        <partition>
> +          <filesystem config:type="symbol">swap</filesystem>
> +          <size>256M</size>
> +          <mount>swap</mount>
> +        </partition>
> +        <partition>
> +          <filesystem config:type="symbol">ext4</filesystem>
> +          <mount>/</mount>
> +          <size>max</size>
> +        </partition>
> +      </partitions>
> +    </drive>
> +  </partitioning>
> +  <bootloader>
> +    <global>
> +      <terminal>console serial</terminal>
> +    </global>
> +  </bootloader>
> +  <timezone>
> +    <hwclock>UTC</hwclock>
> +    <timezone>UTC</timezone>
> +  </timezone>
> +  <software>
> +    <install_recommended config:type="boolean">false</install_recommended>
> +    <products config:type="list">
> +      <product>openSUSE</product>
> +    </products>
> +    <patterns config:type="list">
> +      <pattern>base</pattern>
> +      <pattern>minimal_base</pattern>
> +      <pattern>yast2_basis</pattern>
> +    </patterns>
> +    <packages config:type="list">

Here, please, also add:
<package>hostname</package>

Seems that lcitools rely on having hostname installed in the machine
and "hostname" is used before actually installing the packages. Or,
IOW, trying to install the package afterwards wouldn't work. (I gave
it a try).

> +      <package>openssh</package>
> +    </packages>
> +  </software>
> +  <networking>
> +    <keep_install_network config:type="boolean">true</keep_install_network>
> +  </networking>
> +  <users config:type="list">
> +    <user>
> +      <username>root</username>
> +      <user_password>root</user_password>
> +      <encrypted config:type="boolean">false</encrypted>
> +      <uid>0</uid>
> +      <gid>0</gid>
> +      <home>/root</home>
> +      <shell>/bin/bash</shell>
> +    </user>
> +  </users>
> +  <services-manager>
> +    <default_target>multi-user</default_target>
> +    <services config:type="list">
> +      <service>
> +        <service_name>sshd</service_name>
> +        <service_status>enable</service_status>
> +      </service>
> +    </services>
> +  </services-manager>
> +</profile>
> diff --git a/guests/host_vars/libvirt-opensuse-15/docker.yml b/guests/host_vars/libvirt-opensuse-15/docker.yml
> new file mode 100644
> index 0000000..8f32d06
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-15/docker.yml
> @@ -0,0 +1,2 @@
> +---
> +docker_base: opensuse/leap:15
> diff --git a/guests/host_vars/libvirt-opensuse-15/install.yml b/guests/host_vars/libvirt-opensuse-15/install.yml
> new file mode 100644
> index 0000000..d0fdbe5
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-15/install.yml
> @@ -0,0 +1,2 @@
> +---
> +install_url: http://download.opensuse.org/distribution/leap/15.1/repo/oss/
> diff --git a/guests/host_vars/libvirt-opensuse-15/main.yml b/guests/host_vars/libvirt-opensuse-15/main.yml
> new file mode 100644
> index 0000000..abd83c5
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-15/main.yml
> @@ -0,0 +1,22 @@
> +---
> +projects:
> +  - libosinfo
> +  - libvirt
> +  - libvirt-cim
> +  - libvirt-dbus
> +  - libvirt-glib
> +  - libvirt-perl
> +  - libvirt-python
> +  - libvirt-sandbox
> +  - libvirt-tck
> +  - osinfo-db
> +  - osinfo-db-tools
> +  - virt-manager
> +  - virt-viewer
> +
> +package_format: 'rpm'
> +package_manager: 'zypper'
> +os_name: 'OpenSUSE'
> +os_version: '15'
> +
> +ansible_python_interpreter: /usr/bin/python3
> diff --git a/guests/host_vars/libvirt-opensuse-tumbleweed/docker.yml b/guests/host_vars/libvirt-opensuse-tumbleweed/docker.yml
> new file mode 100644
> index 0000000..cc79a22
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-tumbleweed/docker.yml
> @@ -0,0 +1,2 @@
> +---
> +docker_base: opensuse/tumbleweed
> diff --git a/guests/host_vars/libvirt-opensuse-tumbleweed/install.yml b/guests/host_vars/libvirt-opensuse-tumbleweed/install.yml
> new file mode 100644
> index 0000000..36cea68
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-tumbleweed/install.yml
> @@ -0,0 +1,2 @@
> +---
> +install_url: http://download.opensuse.org/tumbleweed/repo/oss/
> diff --git a/guests/host_vars/libvirt-opensuse-tumbleweed/main.yml b/guests/host_vars/libvirt-opensuse-tumbleweed/main.yml
> new file mode 100644
> index 0000000..828df81
> --- /dev/null
> +++ b/guests/host_vars/libvirt-opensuse-tumbleweed/main.yml
> @@ -0,0 +1,22 @@
> +---
> +projects:
> +  - libosinfo
> +  - libvirt
> +  - libvirt-cim
> +  - libvirt-dbus
> +  - libvirt-glib
> +  - libvirt-perl
> +  - libvirt-python
> +  - libvirt-sandbox
> +  - libvirt-tck
> +  - osinfo-db
> +  - osinfo-db-tools
> +  - virt-manager
> +  - virt-viewer
> +
> +package_format: 'rpm'
> +package_manager: 'zypper'
> +os_name: 'OpenSUSE'
> +os_version: 'Tumbleweed'
> +
> +ansible_python_interpreter: /usr/bin/python3
> diff --git a/guests/inventory b/guests/inventory
> index 3b15513..71d3c91 100644
> --- a/guests/inventory
> +++ b/guests/inventory
> @@ -8,5 +8,7 @@ libvirt-fedora-rawhide
>  libvirt-freebsd-11
>  libvirt-freebsd-12
>  libvirt-freebsd-current
> +libvirt-opensuse-15
> +libvirt-opensuse-tumbleweed
>  libvirt-ubuntu-16
>  libvirt-ubuntu-18
> diff --git a/guests/lcitool b/guests/lcitool
> index a630971..7f26731 100755
> --- a/guests/lcitool
> +++ b/guests/lcitool
> @@ -531,6 +531,8 @@ class Application:
>                  install_config = "preseed.cfg"
>              elif facts["os_name"] in ["CentOS", "Fedora"]:
>                  install_config = "kickstart.cfg"
> +            elif facts["os_name"] == "OpenSUSE":
> +                install_config = "autoinst.xml"
>              else:
>                  raise Exception(
>                      "Host {} doesn't support installation".format(host)
> diff --git a/guests/playbooks/update/tasks/base.yml b/guests/playbooks/update/tasks/base.yml
> index 3d83e78..b6a2cd2 100644
> --- a/guests/playbooks/update/tasks/base.yml
> +++ b/guests/playbooks/update/tasks/base.yml
> @@ -65,12 +65,27 @@
>    when:
>      - package_format == 'pkg'
>
> +- name: Update installed packages
> +  command: '{{ package_manager }} update -y -l --force-resolution --no-recommends'
> +  args:
> +    warn: no
> +  when:
> +    - os_name == 'OpenSUSE'
> +
>  - name: Clean up packages after update
>    shell: '{{ package_manager }} clean packages -y && {{ package_manager }} autoremove -y'
>    args:
>      warn: no
>    when:
>      - package_format == 'rpm'
> +    - not os_name == "OpenSUSE"
> +
> +- name: Clean up packages after update
> +  shell: '{{ package_manager }} clean'
> +  args:
> +    warn: no
> +  when:
> +    - os_name == "OpenSUSE"
>
>  - name: Clean up packages after update
>    apt:
> diff --git a/guests/vars/mappings.yml b/guests/vars/mappings.yml
> index bd9b161..8359ce2 100644
> --- a/guests/vars/mappings.yml
> +++ b/guests/vars/mappings.yml
> @@ -19,10 +19,10 @@
>  #   - deb, pkg, rpm
>  #
>  # Valid OS names are:
> -#   - CentOS, Debian, Fedora, FreeBSD, Ubuntu
> +#   - CentOS, Debian, Fedora, FreeBSD, OpenSUSE, Ubuntu
>  #
>  # Valid OS versions are:
> -#   - CentOS7, Debian9, FedoraRawhide, Ubuntu18 and so on
> +#   - CentOS7, Debian9, FedoraRawhide, OpenSUSE15, Ubuntu18 and so on
>  #
>  # The arch specific rules use a prefix "$ARCH-" where  $ARCH
>  # is a libvirt arch name.
> @@ -70,6 +70,7 @@ mappings:
>
>    apparmor:
>      deb: libapparmor-dev
> +    OpenSUSE: libapparmor-devel
>      cross-policy-deb: foreign
>
>    augeas:
> @@ -117,6 +118,7 @@ mappings:
>    cppi:
>      Fedora: cppi
>      FreeBSD: cppi
> +    OpenSUSE: cppi
>
>    cyrus-sasl:
>      deb: libsasl2-dev
> @@ -127,6 +129,7 @@ mappings:
>    dbus-daemon:
>      default: dbus
>      Fedora: dbus-daemon
> +    OpenSUSE: dbus-1
>
>    device-mapper:
>      deb: libdevmapper-dev
> @@ -196,6 +199,7 @@ mappings:
>      deb: libglusterfs-dev
>      rpm: glusterfs-api-devel
>      Debian9: glusterfs-common
> +    OpenSUSE: glusterfs-devel
>      Ubuntu16: glusterfs-common
>      Ubuntu18: glusterfs-common
>      cross-policy-deb: foreign
> @@ -204,6 +208,7 @@ mappings:
>      deb: libgnutls28-dev
>      pkg: gnutls
>      rpm: gnutls-devel
> +    OpenSUSE: libgnutls-devel
>      cross-policy-deb: foreign
>
>    go:
> @@ -228,6 +233,7 @@ mappings:
>
>    gtk-update-icon-cache:
>      default: gtk-update-icon-cache
> +    OpenSUSE: gtk3-tools
>      Ubuntu16: libgtk2.0-bin
>
>    gtk-vnc2:
> @@ -248,14 +254,17 @@ mappings:
>    ip:
>      deb: iproute2
>      rpm: iproute
> +    OpenSUSE: iproute2
>
>    iscsiadm:
>      deb: open-iscsi
>      rpm: iscsi-initiator-utils
> +    OpenSUSE: open-iscsi
>
>    isoinfo:
>      default: genisoimage
>      FreeBSD: cdrkit
> +    OpenSUSE: mkisofs
>
>    java:
>      deb: openjdk-11-jre-headless
> @@ -289,6 +298,7 @@ mappings:
>    libaudit:
>      deb: libaudit-dev
>      rpm: audit-libs-devel
> +    OpenSUSE: audit-devel
>      cross-policy-deb: foreign
>
>    libblkid:
> @@ -320,6 +330,7 @@ mappings:
>      deb: libdbus-1-dev
>      pkg: dbus
>      rpm: dbus-devel
> +    OpenSUSE: dbus-1-devel
>      cross-policy-deb: foreign
>
>    libgovirt:
> @@ -347,6 +358,7 @@ mappings:
>      rpm: numactl-devel
>      armv6l-deb:
>      armv7l-deb:
> +    OpenSUSE: libnuma-devel
>      cross-policy-deb: foreign
>
>    libparted:
> @@ -370,6 +382,7 @@ mappings:
>      deb: librbd-dev
>      Fedora: librbd-devel
>      CentOS7: librbd1-devel
> +    OpenSUSE: librbd-devel
>      cross-policy-deb: foreign
>
>    libselinux:
> @@ -436,6 +449,7 @@ mappings:
>      deb: locales
>      Fedora: glibc-langpack-en
>      FreeBSD:
> +    OpenSUSE: glibc-locale
>
>    lsof:
>      default: lsof
> @@ -458,6 +472,7 @@ mappings:
>    ninja:
>     default: ninja-build
>     FreeBSD: ninja
> +   OpenSUSE: ninja
>
>    mingw32-curl:
>      Fedora: mingw32-curl
> @@ -639,6 +654,7 @@ mappings:
>    netcf:
>      deb: libnetcf-dev
>      rpm: netcf-devel
> +    OpenSUSE:
>      cross-policy-deb: skip
>
>    net-tools:
> @@ -678,6 +694,7 @@ mappings:
>      deb: perl
>      pkg: perl5
>      rpm: perl-Archive-Tar
> +    OpenSUSE: perl-Archive-Tar-Wrapper
>
>    perl-CPAN-Changes:
>      deb: libcpan-changes-perl
> @@ -709,6 +726,7 @@ mappings:
>      deb: libio-compress-perl
>      pkg: p5-IO-Compress
>      rpm: perl-IO-Compress-Bzip2
> +    OpenSUSE: perl-Compress-Bzip2
>
>    perl-IO-String:
>      deb: libio-string-perl
> @@ -747,6 +765,7 @@ mappings:
>      deb: libtest-lwp-useragent-perl
>      pkg: p5-Test-LWP-UserAgent
>      Fedora: perl-Test-LWP-UserAgent
> +    OpenSUSE: perl-Test-LWP-UserAgent
>
>    perl-Test-Pod:
>      deb: libtest-pod-perl
> @@ -809,20 +828,24 @@ mappings:
>      deb: python-dev
>      pkg: python2
>      rpm: python2-devel
> +    OpenSUSE: python-devel
>      cross-policy-deb: foreign
>
>    python2-lxml:
>      default: python-lxml
>      Fedora: python2-lxml
>      FreeBSD: py27-lxml
> +    OpenSUSE: python2-lxml
>
>    python2-nose:
>      default: python-nose
>      Fedora: python2-nose
>      FreeBSD: py27-nose
> +    OpenSUSE: python2-nose
>
>    python2-setuptools:
>      CentOS7: python2-setuptools
> +    OpenSUSE: python2-setuptools
>
>    python3:
>      default: python3
> @@ -831,6 +854,7 @@ mappings:
>      default: python3-dbus
>      FreeBSD: py36-dbus
>      CentOS7: python36-dbus
> +    OpenSUSE: python3-dbus-python
>
>    python3-devel:
>      deb: python3-dev
> @@ -838,17 +862,20 @@ mappings:
>      Fedora: python3-devel
>      CentOS7: python36-devel
>      cross-policy-deb: foreign
> +    OpenSUSE: python3-devel
>
>    python3-gi:
>      deb: python3-gi
>      pkg: py36-gobject3
>      rpm: python3-gobject
>      CentOS7: python36-gobject
> +    OpenSUSE: python3-gobject
>
>    python3-libxml2:
>      default: python3-libxml2
>      FreeBSD: py36-libxml2
>      CentOS7:
> +    OpenSUSE: python3-libxml2-python
>      Ubuntu16:
>
>    python3-lxml:
> @@ -864,6 +891,7 @@ mappings:
>    python3-pip:
>      CentOS7: python3-pip
>      Debian9: python3-pip
> +    OpenSUSE: python3-pip
>      Ubuntu16: python3-pip
>      Ubuntu18: python3-pip
>
> @@ -884,6 +912,7 @@ mappings:
>    qemu-img:
>      default: qemu-utils
>      rpm: qemu-img
> +    OpenSUSE: qemu-tools
>
>    radvd:
>      default: radvd
> @@ -929,6 +958,7 @@ mappings:
>      deb: libspice-client-gtk-3.0-dev
>      pkg: spice-gtk
>      rpm: spice-gtk3-devel
> +    OpenSUSE: spice-gtk-devel
>      cross-policy-deb: foreign
>
>    strace:
> @@ -942,6 +972,7 @@ mappings:
>      deb: iproute2
>      rpm: iproute-tc
>      CentOS7: iproute
> +    OpenSUSE: iproute2
>
>    unzip:
>      default: unzip
> @@ -964,10 +995,12 @@ mappings:
>    wireshark:
>      deb: wireshark-dev
>      Fedora: wireshark-devel
> +    OpenSUSE: wireshark-devel
>      cross-policy-deb: skip
>
>    xen:
>      Fedora: xen-devel
> +    OpenSUSE: xen-devel
>      x86_64-deb: libxen-dev
>      armv7l-deb: libxen-dev
>      aarch64-deb: libxen-dev
> @@ -994,18 +1027,21 @@ mappings:
>    xz-static:
>      deb: liblzma-dev
>      Fedora: xz-static
> +    OpenSUSE: xz-static-devel
>      cross-policy-deb: foreign
>
>    yajl:
>      deb: libyajl-dev
>      pkg: yajl
>      rpm: yajl-devel
> +    OpenSUSE: libyajl-devel
>      cross-policy-deb: foreign
>
>    zfs:
>      default: zfs-fuse
>      CentOS:
>      FreeBSD:
> +    OpenSUSE:
>
>    zlib:
>      deb: zlib1g-dev
> @@ -1015,6 +1051,7 @@ mappings:
>    zlib-static:
>      deb: zlib1g-dev
>      rpm: zlib-static
> +    OpenSUSE: zlib-devel-static
>      cross-policy-deb: foreign
>
>
> --
> 2.24.0
>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>

Apart from the comments inline, I had to add the following patch in
order to get Leap working:

```
diff --git a/guests/playbooks/build/jobs/defaults.yml
b/guests/playbooks/build/jobs/defaults.yml
index 48cf643..eb4dfd5 100644
--- a/guests/playbooks/build/jobs/defaults.yml
+++ b/guests/playbooks/build/jobs/defaults.yml
@@ -10,6 +10,7 @@ all_machines:
   - libvirt-freebsd-11
   - libvirt-freebsd-12
   - libvirt-freebsd-current
+  - libvirt-opensuse-15
   - libvirt-ubuntu-16
   - libvirt-ubuntu-18
 rpm_machines:
diff --git a/guests/playbooks/build/projects/libvirt.yml
b/guests/playbooks/build/projects/libvirt.yml
index 4b3dfdf..3e3dbba 100644
--- a/guests/playbooks/build/projects/libvirt.yml
+++ b/guests/playbooks/build/projects/libvirt.yml
@@ -19,6 +19,7 @@
       - libvirt-fedora-30
       - libvirt-fedora-31
       - libvirt-fedora-rawhide
+      - libvirt-opensuse-15
       - libvirt-ubuntu-16
       - libvirt-ubuntu-18
 - include: '{{ playbook_base }}/jobs/autotools-check-job.yml'
diff --git a/guests/playbooks/update/tasks/paths.yml
b/guests/playbooks/update/tasks/paths.yml
index 770680e..c258ad2 100644
--- a/guests/playbooks/update/tasks/paths.yml
+++ b/guests/playbooks/update/tasks/paths.yml
@@ -17,7 +17,7 @@
     - su

 - name: 'Look for files'
-  shell: 'find /etc /usr/local/etc -name {{ item }} 2>/dev/null'
+  shell: 'find /usr/local/etc -name {{ item }} 2>/dev/null || find
/etc -name {{ item }} 2>/dev/null'
   register: find
   with_items:
     - sudoers
diff --git a/guests/playbooks/update/tasks/users.yml
b/guests/playbooks/update/tasks/users.yml
index 0470686..bf149da 100644
--- a/guests/playbooks/update/tasks/users.yml
+++ b/guests/playbooks/update/tasks/users.yml
@@ -18,12 +18,18 @@
     line: 'PermitRootLogin without-password'
     state: present

+- name: '{{ flavor }}: Ensure group exists'
+  group:
+    name: '{{ flavor }}'
+    state: present
+
 - name: '{{ flavor }}: Create user account'
   user:
     name: '{{ flavor }}'
     comment: '{{ flavor }}'
     password: '*'
     shell: '{{ bash }}'
+    group: '{{ flavor }}'

 - name: '{{ flavor }}: Set password'
   user:
```

I know Andrea suggested to change the way we deal with finding sudoers
but, IMHO, it shouldn't be a blocker for your patches. However, I'm
*not* the maintainer of the project. :-)

So, with those changes, Leap works and we can build libvirt.

What I'd suggest:
- Submit a patch just adding Leap (and then you'll have to have an
agreement with Andrea about whether we'll support 15 or 15.x);
- After that, let's try to figure out the issue with Tumbleweed and,
only then, try to have it merged;

Does that make sense? Andrea, Jim, are we on the same page here?

Best Regards,
-- 
Fabiano Fidêncio





More information about the libvir-list mailing list