diff --git a/.gitignore b/.gitignore index 38e6cbdba7..ab18382565 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ maipo/ *.shellchecked .coverage tools/bin +.idea diff --git a/schema/cosa/cosa_v1.go b/schema/cosa/cosa_v1.go index 1b9875a847..fc95145422 100644 --- a/schema/cosa/cosa_v1.go +++ b/schema/cosa/cosa_v1.go @@ -88,6 +88,7 @@ type BuildArtifacts struct { Initramfs *Artifact `json:"initramfs,omitempty"` Iso *Artifact `json:"iso,omitempty"` Kernel *Artifact `json:"kernel,omitempty"` + KubeVirt *Artifact `json:"kubevirt,omitempty"` LiveInitramfs *Artifact `json:"live-initramfs,omitempty"` LiveIso *Artifact `json:"live-iso,omitempty"` LiveKernel *Artifact `json:"live-kernel,omitempty"` diff --git a/schema/cosa/schema_doc.go b/schema/cosa/schema_doc.go index e1ddd61c12..ffe323f735 100644 --- a/schema/cosa/schema_doc.go +++ b/schema/cosa/schema_doc.go @@ -1,4 +1,4 @@ -// Generated by ./generate-schema.sh +// Generated by /home/rmohr/coreos-assembler/schema/generate-schema.sh // DO NOT EDIT package cosa @@ -421,6 +421,7 @@ var generatedSchemaJSON = `{ "metal4k", "nutanix", "openstack", + "kubevirt", "qemu", "vmware", "vultr" @@ -516,6 +517,12 @@ var generatedSchemaJSON = `{ "title":"OpenStack", "$ref": "#/definitions/artifact" }, + "kubevirt": { + "$id":"#/properties/images/properties/kubevirt", + "type":"object", + "title":"KubeVirt", + "$ref": "#/definitions/artifact" + }, "vmware": { "$id":"#/properties/images/properties/vmware", "type":"object", diff --git a/schema/v1.json b/schema/v1.json index 385eb73b44..22f963cc99 100644 --- a/schema/v1.json +++ b/schema/v1.json @@ -416,6 +416,7 @@ "metal4k", "nutanix", "openstack", + "kubevirt", "qemu", "vmware", "vultr" @@ -511,6 +512,12 @@ "title":"OpenStack", "$ref": "#/definitions/artifact" }, + "kubevirt": { + "$id":"#/properties/images/properties/kubevirt", + "type":"object", + "title":"KubeVirt", + "$ref": "#/definitions/artifact" + }, "vmware": { "$id":"#/properties/images/properties/vmware", "type":"object", diff --git a/src/cmd-buildextend-kubevirt b/src/cmd-buildextend-kubevirt new file mode 100755 index 0000000000..7dcc70c4d4 --- /dev/null +++ b/src/cmd-buildextend-kubevirt @@ -0,0 +1,122 @@ +#!/usr/bin/python3 -u +import logging as log +import os.path +import sys + +cosa_dir = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, f"{cosa_dir}/cosalib") +sys.path.insert(0, cosa_dir) + +from cosalib.build import BuildExistsError +from cosalib.cli import BuildCli +import cosalib.qemuvariants as QVariants +import cosalib.ova as OVA + + +def get_builder(imgtype, build_root, build="latest", force=False, compress=False, schema=None): + kargs = { + "build": build, + "buildroot": build_root, + "force": force, + "compress": compress, + "schema": schema, + "variant": imgtype + } + + if imgtype in QVariants.VARIANTS: + log.info(f"Target '{imgtype.upper()}' is a Qemu Variant image") + return QVariants.QemuVariantImage(**kargs) + + if imgtype in OVA.VARIANTS: + return OVA.OVA(**kargs) + + raise Exception(f"{imgtype} is not supported by this command") + + +def artifact_cli(): + """ cli implements command-line innovation """ + log.basicConfig( + format='[%(levelname)s]: %(message)s', + level=log.INFO) + + targets = list(QVariants.VARIANTS.keys()) + targets.extend(OVA.VARIANTS.keys()) + targets.append("manual") + + parser = BuildCli() + subparsers = parser.add_subparsers(dest="command") + + # Options for finding the build. + parser.add_argument("--force", action='store_true', + help="Force rebuild of existing disk") + parser.add_argument("--compress", action='store_true', + help="Compress generated image") + + # Support for legacy cmd-buildextend-* targets + symlink = None + for k in targets: + if sys.argv[0].endswith(f"cmd-buildextend-{k}"): + symlink = k + log.info(f"CLI is a symlink for cmd-buildextend-{k}") + break + + # Predefined mode + target = subparsers.add_parser(name="target", + description="manually define build") + target.add_argument("target", default=None, + help="name of predefined target", + choices=targets) + + # Manual mode for developers + manual = subparsers.add_parser(name="manual", + description="build new disk from cli args") + manual.add_argument("--image_format", required=True, + help="qemu-img supported image format, i.e vpc") + manual.add_argument("--image_suffix", required=True, + help="file name suffix") + manual.add_argument("--platform", required=True, + help="Ignition platform to set image to") + manual.add_argument("--convert_options", + help="qemu-img options") + manual.add_argument("--virtual-size", help="Virtual Size to use") + + args = parser.parse_args() + + builder = None + + # Figure out if the build target has been set + build_target = None + if "target" in args: + build_target = args.target + elif symlink: + build_target = symlink + + if build_target: + builder = get_builder(build_target, args.buildroot, args.build, + force=args.force, compress=args.compress, schema=args.schema) + elif args.command == "manual": + kwargs = { + 'force': args.force, + 'image_format': args.image_format, + 'image_suffix': args.image_suffix, + 'platform': args.platform, + 'schema': args.schema, + 'virtual_size': args.virtual_size, + } + if args.convert_options: + kwargs["convert_options"] = {'-o': f'{args.convert_options}'} + + builder = QVariants.QemuVariantImage(buildroot=args.buildroot, + build=args.build, + **kwargs) + else: + raise Exception("please see --help for correct invocation") + + return builder + + +if __name__ == '__main__': + try: + artifact_cli().build_artifacts() + except BuildExistsError as e: + log.warning(e) diff --git a/src/coreos-assembler b/src/coreos-assembler index 2944824968..7568639779 100755 --- a/src/coreos-assembler +++ b/src/coreos-assembler @@ -44,7 +44,7 @@ cmd=${1:-} build_commands="init fetch build run prune clean list" # commands more likely to be used in a prod pipeline only advanced_build_commands="buildfetch buildupload oc-adm-release push-container upload-oscontainer" -buildextend_commands="aliyun aws azure digitalocean exoscale gcp ibmcloud live metal metal4k nutanix openstack qemu vmware vultr" +buildextend_commands="aliyun aws azure digitalocean exoscale gcp ibmcloud kubevirt live metal metal4k nutanix openstack qemu vmware vultr" utility_commands="aws-replicate compress generate-hashlist koji-upload kola remote-prune sign tag" other_commands="shell meta" if [ -z "${cmd}" ]; then diff --git a/src/cosalib/cli.py b/src/cosalib/cli.py index 68ec5cb7dc..14f29c6cb5 100644 --- a/src/cosalib/cli.py +++ b/src/cosalib/cli.py @@ -13,7 +13,8 @@ gcp, vultr, exoscale, - ibmcloud + ibmcloud, + kubevirt ) CLOUD_CLI_TARGET = { @@ -44,6 +45,9 @@ "powervs": (ibmcloud.ibmcloud_cli, ibmcloud.ibmcloud_run_ore, ibmcloud.ibmcloud_run_ore_replicate), + "kubevirt": (kubevirt.kubevirt_cli, + kubevirt.kubevirt_run_ore, + kubevirt.kubevirt_run_ore_replicate), } diff --git a/src/cosalib/kubevirt.py b/src/cosalib/kubevirt.py new file mode 100644 index 0000000000..c1f5fca6ad --- /dev/null +++ b/src/cosalib/kubevirt.py @@ -0,0 +1,18 @@ +def kubevirt_run_ore(build, args): + print(""" +Images are not published to KubeVirt. This command is a placeholder. +""") + + +def kubevirt_run_ore_replicate(*args, **kwargs): + print(""" +KubeVirt does not require regional replication. This command is a +placeholder. +""") + + +def kubevirt_cli(parser): + """ + Extend a parser with the KubeVirt options + """ + return parser diff --git a/src/cosalib/qemuvariants.py b/src/cosalib/qemuvariants.py index 458ff68a0e..a405d890b1 100644 --- a/src/cosalib/qemuvariants.py +++ b/src/cosalib/qemuvariants.py @@ -91,6 +91,10 @@ "--format=oldgnu" ] }, + "kubevirt": { + "image_format": "qcow2", + "platform": "kubevirt", + }, "openstack": { "image_format": "qcow2", "platform": "openstack", diff --git a/src/v1.json b/src/v1.json index 385eb73b44..ea094a7872 100644 --- a/src/v1.json +++ b/src/v1.json @@ -418,7 +418,8 @@ "openstack", "qemu", "vmware", - "vultr" + "vultr", + "kubevirt" ], "properties": { "ostree": { @@ -511,6 +512,12 @@ "title":"OpenStack", "$ref": "#/definitions/artifact" }, + "kubevirt": { + "$id":"#/properties/images/properties/kubevirt", + "type":"object", + "title":"KubeVirt", + "$ref": "#/definitions/artifact" + }, "vmware": { "$id":"#/properties/images/properties/vmware", "type":"object",