[libvirt] [jenkins-ci POC 2/2] guests: Add Dockerfile generator

Andrea Bolognani posted 2 patches 7 years ago
[libvirt] [jenkins-ci POC 2/2] guests: Add Dockerfile generator
Posted by Andrea Bolognani 7 years ago
This is basically the exact same algorithm used by the
Ansible playbooks to process package mappings, implemented
as a standalone script.

There's little to none error handling, and some information
is hardcoded instead of being configurable at runtime; more
importantly, before it can be considered for merging it
needs to be integrated into lcitool, which in turn requires
lcitool to be significantly reworked.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
 guests/dockerfile-generator                   | 72 +++++++++++++++++++
 guests/host_vars/libvirt-centos-7/docker.yml  |  2 +
 guests/host_vars/libvirt-debian-8/docker.yml  |  2 +
 guests/host_vars/libvirt-debian-9/docker.yml  |  2 +
 .../host_vars/libvirt-debian-sid/docker.yml   |  2 +
 guests/host_vars/libvirt-fedora-27/docker.yml |  2 +
 guests/host_vars/libvirt-fedora-28/docker.yml |  2 +
 .../libvirt-fedora-rawhide/docker.yml         |  2 +
 guests/host_vars/libvirt-ubuntu-16/docker.yml |  2 +
 guests/host_vars/libvirt-ubuntu-18/docker.yml |  2 +
 10 files changed, 90 insertions(+)
 create mode 100755 guests/dockerfile-generator
 create mode 100644 guests/host_vars/libvirt-centos-7/docker.yml
 create mode 100644 guests/host_vars/libvirt-debian-8/docker.yml
 create mode 100644 guests/host_vars/libvirt-debian-9/docker.yml
 create mode 100644 guests/host_vars/libvirt-debian-sid/docker.yml
 create mode 100644 guests/host_vars/libvirt-fedora-27/docker.yml
 create mode 100644 guests/host_vars/libvirt-fedora-28/docker.yml
 create mode 100644 guests/host_vars/libvirt-fedora-rawhide/docker.yml
 create mode 100644 guests/host_vars/libvirt-ubuntu-16/docker.yml
 create mode 100644 guests/host_vars/libvirt-ubuntu-18/docker.yml

diff --git a/guests/dockerfile-generator b/guests/dockerfile-generator
new file mode 100755
index 0000000..e1212da
--- /dev/null
+++ b/guests/dockerfile-generator
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+
+import sys
+import yaml
+
+if len(sys.argv) < 2:
+    print("Usage: {} GUEST".format(sys.argv[0]))
+    sys.exit(1)
+
+guest = sys.argv[1]
+
+# Load data
+
+with open("vars/mappings.yml", "r") as f:
+    mappings = yaml.load(f)
+    mappings = mappings["mappings"]
+
+with open("host_vars/{}/main.yml".format(guest), "r") as f:
+    main = yaml.load(f)
+    package_format = main["package_format"]
+    os_name = main["os_name"]
+    os_version = main["os_version"]
+    os_full = "{}{}".format(os_name, os_version)
+
+with open("host_vars/{}/docker.yml".format(guest), "r") as f:
+    docker = yaml.load(f)
+    docker_base = docker["docker_base"]
+
+projects = ["base", "libvirt"]
+if os_name == "Fedora" and os_version == "Rawhide":
+    projects += ["libvirt+mingw"]
+
+# Process mappings
+
+temp = {}
+
+for project in projects:
+    with open("vars/projects/{}.yml".format(project), "r") as f:
+        packages = yaml.load(f)
+        packages = packages["packages"]
+    for package in packages:
+        if "default" in mappings[package]:
+            temp[package] = mappings[package]["default"]
+        if package_format in mappings[package]:
+            temp[package] = mappings[package][package_format]
+        if os_name in mappings[package]:
+            temp[package] = mappings[package][os_name]
+        if os_full in mappings[package]:
+            temp[package] = mappings[package][os_full]
+
+flattened = []
+
+for item in temp:
+    if temp[item] != None and temp[item] not in flattened:
+        flattened += [ temp[item] ]
+
+# Output Dockerfile
+
+print("FROM {}".format(docker_base))
+
+sys.stdout.write("ENV PACKAGES ")
+print(" \\\n             ".join(sorted(flattened)))
+
+if package_format == "deb":
+    print("RUN apt-get update && \\")
+    print("    apt-get install -y ${PACKAGES} && \\")
+    print("    apt-get autoremove -y && \\")
+    print("    apt-get autoclean -y")
+elif package_format == "rpm":
+    print("RUN yum install -y ${PACKAGES} && \\")
+    print("    yum autoremove -y && \\")
+    print("    yum clean all -y")
diff --git a/guests/host_vars/libvirt-centos-7/docker.yml b/guests/host_vars/libvirt-centos-7/docker.yml
new file mode 100644
index 0000000..59f7f12
--- /dev/null
+++ b/guests/host_vars/libvirt-centos-7/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: centos:centos7
diff --git a/guests/host_vars/libvirt-debian-8/docker.yml b/guests/host_vars/libvirt-debian-8/docker.yml
new file mode 100644
index 0000000..235f0fd
--- /dev/null
+++ b/guests/host_vars/libvirt-debian-8/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: debian:8
diff --git a/guests/host_vars/libvirt-debian-9/docker.yml b/guests/host_vars/libvirt-debian-9/docker.yml
new file mode 100644
index 0000000..0b4ccee
--- /dev/null
+++ b/guests/host_vars/libvirt-debian-9/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: debian:9
diff --git a/guests/host_vars/libvirt-debian-sid/docker.yml b/guests/host_vars/libvirt-debian-sid/docker.yml
new file mode 100644
index 0000000..e20a37e
--- /dev/null
+++ b/guests/host_vars/libvirt-debian-sid/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: debian:sid
diff --git a/guests/host_vars/libvirt-fedora-27/docker.yml b/guests/host_vars/libvirt-fedora-27/docker.yml
new file mode 100644
index 0000000..dcada18
--- /dev/null
+++ b/guests/host_vars/libvirt-fedora-27/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: fedora:27
diff --git a/guests/host_vars/libvirt-fedora-28/docker.yml b/guests/host_vars/libvirt-fedora-28/docker.yml
new file mode 100644
index 0000000..a874018
--- /dev/null
+++ b/guests/host_vars/libvirt-fedora-28/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: fedora:28
diff --git a/guests/host_vars/libvirt-fedora-rawhide/docker.yml b/guests/host_vars/libvirt-fedora-rawhide/docker.yml
new file mode 100644
index 0000000..39dda1c
--- /dev/null
+++ b/guests/host_vars/libvirt-fedora-rawhide/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: fedora:rawhide
diff --git a/guests/host_vars/libvirt-ubuntu-16/docker.yml b/guests/host_vars/libvirt-ubuntu-16/docker.yml
new file mode 100644
index 0000000..2d4eb25
--- /dev/null
+++ b/guests/host_vars/libvirt-ubuntu-16/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: ubuntu:16.04
diff --git a/guests/host_vars/libvirt-ubuntu-18/docker.yml b/guests/host_vars/libvirt-ubuntu-18/docker.yml
new file mode 100644
index 0000000..13d6cc1
--- /dev/null
+++ b/guests/host_vars/libvirt-ubuntu-18/docker.yml
@@ -0,0 +1,2 @@
+---
+docker_base: ubuntu:18.04
-- 
2.17.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [jenkins-ci POC 2/2] guests: Add Dockerfile generator
Posted by Daniel P. Berrangé 7 years ago
On Fri, Jun 15, 2018 at 08:53:44AM +0200, Andrea Bolognani wrote:
> This is basically the exact same algorithm used by the
> Ansible playbooks to process package mappings, implemented
> as a standalone script.
> 
> There's little to none error handling, and some information
> is hardcoded instead of being configurable at runtime; more
> importantly, before it can be considered for merging it
> needs to be integrated into lcitool, which in turn requires
> lcitool to be significantly reworked.

I'm not understanding why it needs to be integrated into
lcitool ?  Generating dockerfiles has no dependancy /
interaction with ansible updating the jenkins slaves.

Why won't we just run this script separately when needed,
ideally as non-root ?  Looks good enough to commit now
IMHO


Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [jenkins-ci POC 2/2] guests: Add Dockerfile generator
Posted by Andrea Bolognani 7 years ago
On Fri, 2018-06-15 at 10:12 +0100, Daniel P. Berrangé wrote:
> On Fri, Jun 15, 2018 at 08:53:44AM +0200, Andrea Bolognani wrote:
> > This is basically the exact same algorithm used by the
> > Ansible playbooks to process package mappings, implemented
> > as a standalone script.
> > 
> > There's little to none error handling, and some information
> > is hardcoded instead of being configurable at runtime; more
> > importantly, before it can be considered for merging it
> > needs to be integrated into lcitool, which in turn requires
> > lcitool to be significantly reworked.
> 
> I'm not understanding why it needs to be integrated into
> lcitool ?  Generating dockerfiles has no dependancy /
> interaction with ansible updating the jenkins slaves.

Strictly speaking there is no interaction; however, in order to
generate Dockerfiles you need to poke into the Ansible inventory,
so the two are not completely independent either.

To a degree it's similar to how installation and setup of guests,
while performed in isolation from each other and using completely
different tools, both require information stored in the Ansible
inventory and are exposed by lcitool as top-level actions with a
consistent interface.

Plus it's a good excuse to go back and make lcitool somewhat less
of a horrible hack ;)

> Why won't we just run this script separately when needed,
> ideally as non-root ?  Looks good enough to commit now
> IMHO

lcitool is already designed to run as non-root, so no need to
change anything there.

-- 
Andrea Bolognani / Red Hat / Virtualization

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list