[Libguestfs] [v2v PATCH 2/2] -o rhv-upload: check guest arch with cluster

Pino Toscano ptoscano at redhat.com
Tue Jan 28 13:46:28 UTC 2020


Get the CPU architecture of the specified cluster, and error out in case
the architecture of the guest is not the same as the cluster one.
---
 .../ovirtsdk4/types.py                         | 16 ++++++++++++++++
 v2v/output_rhv_upload.ml                       | 18 +++++++++++++++++-
 v2v/rhv-upload-precheck.py                     |  5 +++++
 3 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
index b8d4a728..732887aa 100644
--- a/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
+++ b/tests/test-v2v-o-rhv-upload-module/ovirtsdk4/types.py
@@ -22,9 +22,25 @@ from enum import Enum
 from ovirtsdk4 import imageio_port
 
 
+class Architecture(Enum):
+    UNDEFINED = "undefined"
+    X86_64 = "x86_64"
+
+    def __init__(self, arch):
+        self._arch = arch
+
+    def __str__(self):
+        return self._arch
+
+
+class Cpu(object):
+    architecture = Architecture.X86_64
+
+
 class Cluster(object):
     id = "2e97537b-a783-4706-af9e-75cb2e032dcd"
     name = "Default"
+    cpu = Cpu()
 
 
 class Configuration(object):
diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml
index 01b1ce4a..db14755c 100644
--- a/v2v/output_rhv_upload.ml
+++ b/v2v/output_rhv_upload.ml
@@ -248,6 +248,8 @@ object
   val mutable rhv_storagedomain_uuid = None
   (* The cluster UUID. *)
   val mutable rhv_cluster_uuid = None
+  (* The cluster CPU architecture *)
+  val mutable rhv_cluster_cpu_architecture = None
   (* List of disk UUIDs. *)
   val mutable disks_uuids = []
   (* If we didn't finish successfully, delete on exit. *)
@@ -272,6 +274,8 @@ object
        Some (JSON_parser.object_get_string "rhv_storagedomain_uuid" json);
     rhv_cluster_uuid <-
        Some (JSON_parser.object_get_string "rhv_cluster_uuid" json);
+    rhv_cluster_cpu_architecture <-
+       Some (JSON_parser.object_get_string "rhv_cluster_cpu_architecture" json);
     if have_selinux then
       error_unless_nbdkit_compiled_with_selinux ()
 
@@ -290,7 +294,19 @@ object
   (* rhev-apt.exe will be installed (if available). *)
   method install_rhev_apt = true
 
-  method prepare_targets source_name overlays _ =
+  method prepare_targets source_name overlays guestcaps =
+    let rhv_cluster_name =
+      match List.assoc "rhv_cluster" json_params with
+      | JSON.String s -> s
+      | _ -> assert false in
+    (match rhv_cluster_cpu_architecture with
+    | None -> assert false
+    | Some arch ->
+      if arch <> guestcaps.gcaps_arch then
+        error (f_"the cluster ‘%s’ does not support the architecture %s but %s")
+          rhv_cluster_name guestcaps.gcaps_arch arch
+    );
+
     let uuids =
       match rhv_options.rhv_disk_uuids with
       | None ->
diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py
index 5f33db98..ec3fcf4e 100644
--- a/v2v/rhv-upload-precheck.py
+++ b/v2v/rhv-upload-precheck.py
@@ -92,11 +92,16 @@ if len(clusters) == 0:
                        (params['rhv_cluster'], datacenter.name,
                         params['output_storage']))
 cluster = clusters[0]
+cpu = cluster.cpu
+if cpu.architecture == types.Architecture.UNDEFINED:
+    raise RuntimeError("The cluster ‘%s’ has an unknown architecture" %
+                       (params['rhv_cluster']))
 
 # Otherwise everything is OK, print a JSON with the results.
 results = {
     "rhv_storagedomain_uuid": storage_domain.id,
     "rhv_cluster_uuid": cluster.id,
+    "rhv_cluster_cpu_architecture": cpu.architecture.value,
 }
 
 json.dump(results, sys.stdout)
-- 
2.24.1




More information about the Libguestfs mailing list