diff --git a/build-tests/x86/tumbleweed/test-image-disk-formats/appliance.kiwi b/build-tests/x86/tumbleweed/test-image-disk-formats/appliance.kiwi new file mode 100644 index 00000000000..beee7f906e7 --- /dev/null +++ b/build-tests/x86/tumbleweed/test-image-disk-formats/appliance.kiwi @@ -0,0 +1,83 @@ + + + + + + + Marcus Schäfer + marcus.schaefer@gmail.com + Build different disk formats + + + + + + 1.42.1 + zypper + en_US + us + Europe/Berlin + true + false + breeze + openSUSE + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build-tests/x86/tumbleweed/test-image-disk-formats/config.sh b/build-tests/x86/tumbleweed/test-image-disk-formats/config.sh new file mode 100644 index 00000000000..61803a44fa9 --- /dev/null +++ b/build-tests/x86/tumbleweed/test-image-disk-formats/config.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -ex + +#====================================== +# Activate services +#-------------------------------------- +systemctl enable sshd diff --git a/doc/source/image_description/elements.rst b/doc/source/image_description/elements.rst index 06315f19c63..e863400ba4f 100644 --- a/doc/source/image_description/elements.rst +++ b/doc/source/image_description/elements.rst @@ -931,10 +931,33 @@ flags="overlay|dmsquash": system based on the capabilities of the upstream dracut module. -format="gce|ova|qcow2|vagrant|vmdk|vdi|vhd|vhdx|vhd-fixed": - For disk image type oem, this specifies the format of - the virtual disk so that it can run on the desired target - virtualization platform. +format="format_name": + For disk image type `oem`, this specifies the format of the virtual disk + so that it can run on the desired target virtualization platform. The + supported formats_name's are: + + * `gce`: Google Compute Engine image format. + * `ova`: Open Virtualization Format Archive. + * `qcow2`: QEMU Copy-On-Write version 2. + * `vagrant`: Vagrant box format (tar.gz). + * `vmdk`: VMware Virtual Machine Disk. + * `vdi`: VirtualBox Disk Image. + * `vhd`: Microsoft Virtual Hard Disk. + * `vhdx`: Microsoft Virtual Hard Disk version 2. + * `vhd-fixed`: Microsoft Virtual Hard Disk with fixed size. + * `oci:image_format:container_transport`: OCI image archive. + + The `oci:...` format is a special case that allows you to create an + OCI-compliant container from a specified reference container. The + created container image has the actual disk image added as a new layer. + The specification of the `oci:image_format:container_transport` format + contains two parts separated by a colon. The first part specifies + one of the above disk formats or just `raw` if the disk should be + stored as raw disk inside of the container. The second part specifies + one of the supported `skopeo` container transport formats, for + details see the `skopeo` man page. This format is particularly useful + for building an image which bundles the actual disk image and its + runtime requirements into one artifact. formatoptions="string": Specifies additional format options passed on to `qemu-img`. diff --git a/kiwi/defaults.py b/kiwi/defaults.py index 821304b2c78..d7c0b429125 100644 --- a/kiwi/defaults.py +++ b/kiwi/defaults.py @@ -1528,8 +1528,19 @@ def get_disk_format_types(): :rtype: list """ return [ - 'gce', 'qcow2', 'vmdk', 'ova', 'meta', 'vmx', 'vhd', 'vhdx', - 'vhdfixed', 'vdi', 'vagrant.libvirt.box', 'vagrant.virtualbox.box' + 'gce', + 'qcow2', + 'vmdk', + 'ova', + 'meta', + 'vmx', + 'vhd', + 'vhdx', + 'vhdfixed', + 'vdi', + 'vagrant.libvirt.box', + 'vagrant.virtualbox.box', + 'oci' ] @staticmethod diff --git a/kiwi/schema/kiwi.rnc b/kiwi/schema/kiwi.rnc index 6119779e57e..c51096e4088 100644 --- a/kiwi/schema/kiwi.rnc +++ b/kiwi/schema/kiwi.rnc @@ -43,6 +43,7 @@ grub_console_input = xsd:token {pattern = "(none|console|serial|at_keyboard|usb_ fs_attributes = xsd:token {pattern = "(no-copy-on-write|synchronous-updates)(,(no-copy-on-write|synchronous-updates))*"} package-version-type = xsd:token {pattern = "(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){3}"} simple-uri-type = xsd:token {pattern = "(file:|https:|http:|ftp:).*"} +oci_format_type = xsd:token {pattern = "oci:(gce:|ova:|qcow2:|vmdk:|vdi:|vhd:|vhdx:|vhd-fixed:|raw:).*"} #========================================== # start with image description @@ -1986,7 +1987,7 @@ div { ## Specifies the format of the virtual disk. attribute format { "gce" | "ova" | "qcow2" | "vagrant" | "vmdk" | - "vdi" | "vhd" | "vhdx" | "vhd-fixed" + "vdi" | "vhd" | "vhdx" | "vhd-fixed" | oci_format_type } >> sch:pattern [ id = "format" is-a = "image_type" sch:param [ name = "attr" value = "format" ] @@ -3090,14 +3091,30 @@ div { ] ] ] + sch:pattern [ + abstract = "true" + id = "format_type" + sch:rule [ + context = "containerconfig[@$attr]" + sch:assert [ + test = "not(../@format) or starts-with(../@format, '$format')" + "containerconfig($attr) is only available for the following "~ + "image @format values: $format" + ] + ] + ] k.containerconfig.name.attribute = ## Specifies a name for the container. This is usually the ## the repository name of the container as read if the container ## image is imported via the docker load command attribute name { text } - >> sch:pattern [ id = "name" is-a = "container_type" + >> sch:pattern [ id = "image_name" is-a = "container_type" + sch:param [ name = "attr" value = "name" ] + sch:param [ name = "types" value = "oem docker oci appx" ] + ] + >> sch:pattern [ id = "format_name" is-a = "format_type" sch:param [ name = "attr" value = "name" ] - sch:param [ name = "types" value = "docker oci appx" ] + sch:param [ name = "format" value = "oci" ] ] k.containerconfig.tag.attribute = ## Specifies a tag for the container. This is usually the @@ -3106,7 +3123,7 @@ div { attribute tag { text } >> sch:pattern [ id = "tag" is-a = "container_type" sch:param [ name = "attr" value = "tag" ] - sch:param [ name = "types" value = "docker oci" ] + sch:param [ name = "types" value = "oem docker oci" ] ] k.containerconfig.additionalnames.attribute = ## Specifies additional names for the container using a comma @@ -3117,28 +3134,28 @@ div { attribute additionalnames { text } >> sch:pattern [ id = "additionalnames" is-a = "container_type" sch:param [ name = "attr" value = "additionalnames" ] - sch:param [ name = "types" value = "docker oci" ] + sch:param [ name = "types" value = "oem docker oci" ] ] k.containerconfig.maintainer.attribute = ## Specifies a maintainer for the container. attribute maintainer { text } >> sch:pattern [ id = "maintainer" is-a = "container_type" sch:param [ name = "attr" value = "maintainer" ] - sch:param [ name = "types" value = "docker oci" ] + sch:param [ name = "types" value = "oem docker oci" ] ] k.containerconfig.user.attribute = ## Specifies a user for the container. attribute user { text } >> sch:pattern [ id = "user" is-a = "container_type" sch:param [ name = "attr" value = "user" ] - sch:param [ name = "types" value = "docker oci" ] + sch:param [ name = "types" value = "oem docker oci" ] ] k.containerconfig.workingdir.attribute = ## Specifies the default working directory of the container attribute workingdir { text } >> sch:pattern [ id = "workingdir" is-a = "container_type" sch:param [ name = "attr" value = "workingdir" ] - sch:param [ name = "types" value = "docker oci" ] + sch:param [ name = "types" value = "oem docker oci" ] ] k.containerconfig.attlist = k.containerconfig.name.attribute & diff --git a/kiwi/schema/kiwi.rng b/kiwi/schema/kiwi.rng index ebbf86544e3..d53b37e9fd4 100644 --- a/kiwi/schema/kiwi.rng +++ b/kiwi/schema/kiwi.rng @@ -116,6 +116,11 @@ (file:|https:|http:|ftp:).* + + + oci:(gce:|ova:|qcow2:|vmdk:|vdi:|vhd:|vhdx:|vhd-fixed:|raw:).* + +