2022-07-06 16:29:41 +00:00
|
|
|
|
From a1f1129dc148639ed0b05b737157268d9b824a63 Mon Sep 17 00:00:00 2001
|
2022-04-12 11:17:50 +00:00
|
|
|
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
|
|
|
Date: Mon, 11 Apr 2022 11:01:46 +0100
|
|
|
|
|
Subject: [PATCH] output: Remove -o json mode
|
|
|
|
|
|
|
|
|
|
This removes the -o json mode completely.
|
|
|
|
|
|
|
|
|
|
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
|
|
(cherry picked from commit 4e6b389b4e27c8d13e57fcaf777d96ad7e08650b)
|
|
|
|
|
---
|
|
|
|
|
docs/virt-v2v.pod | 4 -
|
|
|
|
|
output/Makefile.am | 51 +-----
|
|
|
|
|
output/create_json.ml | 338 -----------------------------------
|
|
|
|
|
output/create_json.mli | 27 ---
|
|
|
|
|
output/output_json.ml | 153 ----------------
|
|
|
|
|
output/output_json.mli | 21 ---
|
|
|
|
|
output/var_expander.ml | 72 --------
|
|
|
|
|
output/var_expander.mli | 82 ---------
|
|
|
|
|
output/var_expander_tests.ml | 113 ------------
|
|
|
|
|
tests/Makefile.am | 2 -
|
|
|
|
|
tests/test-v2v-o-json.sh | 68 -------
|
|
|
|
|
v2v/v2v.ml | 7 +-
|
|
|
|
|
12 files changed, 5 insertions(+), 933 deletions(-)
|
|
|
|
|
delete mode 100644 output/create_json.ml
|
|
|
|
|
delete mode 100644 output/create_json.mli
|
|
|
|
|
delete mode 100644 output/output_json.ml
|
|
|
|
|
delete mode 100644 output/output_json.mli
|
|
|
|
|
delete mode 100644 output/var_expander.ml
|
|
|
|
|
delete mode 100644 output/var_expander.mli
|
|
|
|
|
delete mode 100644 output/var_expander_tests.ml
|
|
|
|
|
delete mode 100755 tests/test-v2v-o-json.sh
|
|
|
|
|
|
|
|
|
|
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
|
|
|
|
|
index 7ad22f00..912f1bc3 100644
|
|
|
|
|
--- a/docs/virt-v2v.pod
|
|
|
|
|
+++ b/docs/virt-v2v.pod
|
|
|
|
|
@@ -409,10 +409,6 @@ See L</Networks and bridges> below.
|
|
|
|
|
|
|
|
|
|
This is the same as I<-o local>.
|
|
|
|
|
|
|
|
|
|
-=item B<-o> B<json>
|
|
|
|
|
-
|
|
|
|
|
-This option is deprecated and will be removed in S<virt-v2v 2.2>.
|
|
|
|
|
-
|
|
|
|
|
=item B<-o> B<libvirt>
|
|
|
|
|
|
|
|
|
|
Set the output method to I<libvirt>. This is the default.
|
|
|
|
|
diff --git a/output/Makefile.am b/output/Makefile.am
|
|
|
|
|
index 61caf68b..dd488549 100644
|
|
|
|
|
--- a/output/Makefile.am
|
|
|
|
|
+++ b/output/Makefile.am
|
|
|
|
|
@@ -39,18 +39,15 @@ EXTRA_DIST = \
|
|
|
|
|
rhv-upload-precheck.py \
|
|
|
|
|
rhv-upload-transfer.py \
|
|
|
|
|
rhv-upload-vmcheck.py \
|
|
|
|
|
- test-v2v-python-syntax.sh \
|
|
|
|
|
- var_expander_tests.ml
|
|
|
|
|
+ test-v2v-python-syntax.sh
|
|
|
|
|
|
|
|
|
|
SOURCES_MLI = \
|
|
|
|
|
changeuid.mli \
|
|
|
|
|
- create_json.mli \
|
|
|
|
|
create_libvirt_xml.mli \
|
|
|
|
|
openstack_image_properties.mli \
|
|
|
|
|
output.mli \
|
|
|
|
|
output_disk.mli \
|
|
|
|
|
output_glance.mli \
|
|
|
|
|
- output_json.mli \
|
|
|
|
|
output_libvirt.mli \
|
|
|
|
|
output_null.mli \
|
|
|
|
|
output_openstack.mli \
|
|
|
|
|
@@ -66,14 +63,11 @@ SOURCES_MLI = \
|
|
|
|
|
output_rhv_upload_transfer_source.mli \
|
|
|
|
|
output_rhv_upload_vmcheck_source.mli \
|
|
|
|
|
python_script.mli \
|
|
|
|
|
- qemuopts.mli \
|
|
|
|
|
- var_expander.mli
|
|
|
|
|
+ qemuopts.mli
|
|
|
|
|
|
|
|
|
|
SOURCES_ML = \
|
|
|
|
|
changeuid.ml \
|
|
|
|
|
python_script.ml \
|
|
|
|
|
- var_expander.ml \
|
|
|
|
|
- create_json.ml \
|
|
|
|
|
create_libvirt_xml.ml \
|
|
|
|
|
qemuopts.ml \
|
|
|
|
|
openstack_image_properties.ml \
|
|
|
|
|
@@ -87,7 +81,6 @@ SOURCES_ML = \
|
|
|
|
|
output.ml \
|
|
|
|
|
output_disk.ml \
|
|
|
|
|
output_glance.ml \
|
|
|
|
|
- output_json.ml \
|
|
|
|
|
output_libvirt.ml \
|
|
|
|
|
output_null.ml \
|
|
|
|
|
output_openstack.ml \
|
|
|
|
|
@@ -203,47 +196,9 @@ $(MLOUTPUT_CMA): $(OBJECTS) libmloutput.a
|
|
|
|
|
$(OCAMLFIND) mklib $(OCAMLPACKAGES) \
|
|
|
|
|
$(OBJECTS) $(libmloutput_a_OBJECTS) -o mloutput
|
|
|
|
|
|
|
|
|
|
-# Unit tests.
|
|
|
|
|
-TESTS =
|
|
|
|
|
-if HAVE_OCAML_PKG_OUNIT
|
|
|
|
|
-TESTS += \
|
|
|
|
|
- var_expander_tests
|
|
|
|
|
-check_PROGRAMS = \
|
|
|
|
|
- var_expander_tests
|
|
|
|
|
-endif
|
|
|
|
|
-
|
|
|
|
|
-var_expander_tests_BOBJECTS = \
|
|
|
|
|
- var_expander.cmo \
|
|
|
|
|
- var_expander_tests.cmo
|
|
|
|
|
-var_expander_tests_XOBJECTS = $(var_expander_tests_BOBJECTS:.cmo=.cmx)
|
|
|
|
|
-
|
|
|
|
|
-var_expander_tests_SOURCES = dummy.c
|
|
|
|
|
-var_expander_tests_CPPFLAGS = $(virt_v2v_CPPFLAGS)
|
|
|
|
|
-var_expander_tests_CFLAGS = $(virt_v2v_CFLAGS)
|
|
|
|
|
-
|
|
|
|
|
-if !HAVE_OCAMLOPT
|
|
|
|
|
-# Can't call this var_expander_tests_OBJECTS because automake gets confused.
|
|
|
|
|
-var_expander_tests_THEOBJECTS = $(var_expander_tests_BOBJECTS)
|
|
|
|
|
-var_expander_tests.cmo: OCAMLPACKAGES += -package ounit2
|
|
|
|
|
-else
|
|
|
|
|
-var_expander_tests_THEOBJECTS = $(var_expander_tests_XOBJECTS)
|
|
|
|
|
-var_expander_tests.cmx: OCAMLPACKAGES += -package ounit2
|
|
|
|
|
-endif
|
|
|
|
|
-
|
|
|
|
|
-var_expander_tests_DEPENDENCIES = \
|
|
|
|
|
- $(var_expander_tests_THEOBJECTS) \
|
|
|
|
|
- $(top_builddir)/common/mlpcre/mlpcre.$(MLARCHIVE) \
|
|
|
|
|
- $(top_srcdir)/ocaml-link.sh
|
|
|
|
|
-var_expander_tests_LINK = \
|
|
|
|
|
- $(top_srcdir)/ocaml-link.sh -cclib '$(OCAMLCLIBS)' -- \
|
|
|
|
|
- $(OCAMLFIND) $(BEST) $(OCAMLFLAGS) \
|
|
|
|
|
- $(OCAMLPACKAGES) -package ounit2 \
|
|
|
|
|
- $(OCAMLLINKFLAGS) \
|
|
|
|
|
- $(var_expander_tests_THEOBJECTS) -o $@
|
|
|
|
|
-
|
|
|
|
|
# Unit tests.
|
|
|
|
|
TESTS_ENVIRONMENT = $(top_builddir)/run --test
|
|
|
|
|
-TESTS += test-v2v-python-syntax.sh
|
|
|
|
|
+TESTS = test-v2v-python-syntax.sh
|
|
|
|
|
|
|
|
|
|
# Dependencies.
|
|
|
|
|
.depend: \
|
|
|
|
|
diff --git a/output/create_json.ml b/output/create_json.ml
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index cbc27fdc..00000000
|
|
|
|
|
--- a/output/create_json.ml
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,338 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-open Std_utils
|
|
|
|
|
-open C_utils
|
|
|
|
|
-open Tools_utils
|
|
|
|
|
-
|
|
|
|
|
-open Types
|
|
|
|
|
-open Utils
|
|
|
|
|
-
|
|
|
|
|
-module G = Guestfs
|
|
|
|
|
-
|
|
|
|
|
-let json_list_of_string_list =
|
|
|
|
|
- List.map (fun x -> JSON.String x)
|
|
|
|
|
-
|
|
|
|
|
-let json_list_of_string_string_list =
|
|
|
|
|
- List.map (fun (x, y) -> x, JSON.String y)
|
|
|
|
|
-
|
|
|
|
|
-let push_optional_string lst name = function
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some v -> List.push_back lst (name, JSON.String v)
|
|
|
|
|
-
|
|
|
|
|
-let push_optional_int lst name = function
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some v -> List.push_back lst (name, JSON.Int (Int64.of_int v))
|
|
|
|
|
-
|
|
|
|
|
-let json_unknown_string = function
|
|
|
|
|
- | "unknown" -> JSON.Null
|
|
|
|
|
- | v -> JSON.String v
|
|
|
|
|
-
|
|
|
|
|
-let create_json_metadata source inspect
|
|
|
|
|
- { guestcaps; target_buses; target_firmware; target_nics }
|
|
|
|
|
- outdisk_name output_format output_name =
|
|
|
|
|
- let doc = ref [
|
|
|
|
|
- "version", JSON.Int 1L;
|
|
|
|
|
- "name", JSON.String output_name;
|
|
|
|
|
- "memory", JSON.Int source.s_memory;
|
|
|
|
|
- "vcpu", JSON.Int (Int64.of_int source.s_vcpu);
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- (match source.s_genid with
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some genid -> List.push_back doc ("genid", JSON.String genid)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- if source.s_cpu_vendor <> None || source.s_cpu_model <> None ||
|
|
|
|
|
- source.s_cpu_topology <> None then (
|
|
|
|
|
- let cpu = ref [] in
|
|
|
|
|
-
|
|
|
|
|
- push_optional_string cpu "vendor" source.s_cpu_vendor;
|
|
|
|
|
- push_optional_string cpu "model" source.s_cpu_model;
|
|
|
|
|
- (match source.s_cpu_topology with
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } ->
|
|
|
|
|
- let attrs = [
|
|
|
|
|
- "sockets", JSON.Int (Int64.of_int s_cpu_sockets);
|
|
|
|
|
- "cores", JSON.Int (Int64.of_int s_cpu_cores);
|
|
|
|
|
- "threads", JSON.Int (Int64.of_int s_cpu_threads);
|
|
|
|
|
- ] in
|
|
|
|
|
- List.push_back cpu ("topology", JSON.Dict attrs)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- List.push_back doc ("cpu", JSON.Dict !cpu);
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- let firmware =
|
|
|
|
|
- let firmware_type =
|
|
|
|
|
- match target_firmware with
|
|
|
|
|
- | TargetBIOS -> "bios"
|
|
|
|
|
- | TargetUEFI -> "uefi" in
|
|
|
|
|
-
|
|
|
|
|
- let fw = ref [
|
|
|
|
|
- "type", JSON.String firmware_type;
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- (match target_firmware with
|
|
|
|
|
- | TargetBIOS -> ()
|
|
|
|
|
- | TargetUEFI ->
|
|
|
|
|
- let uefi_firmware = find_uefi_firmware guestcaps.gcaps_arch in
|
|
|
|
|
- let flags =
|
|
|
|
|
- List.map (
|
|
|
|
|
- function
|
|
|
|
|
- | Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED -> "secure_boot_required"
|
|
|
|
|
- ) uefi_firmware.Uefi.flags in
|
|
|
|
|
-
|
|
|
|
|
- let uefi = ref [
|
|
|
|
|
- "code", JSON.String uefi_firmware.Uefi.code;
|
|
|
|
|
- "vars", JSON.String uefi_firmware.Uefi.vars;
|
|
|
|
|
- "flags", JSON.List (json_list_of_string_list flags);
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- push_optional_string uefi "code-debug" uefi_firmware.Uefi.code_debug;
|
|
|
|
|
-
|
|
|
|
|
- List.push_back fw ("uefi", JSON.Dict !uefi)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- !fw in
|
|
|
|
|
- List.push_back doc ("firmware", JSON.Dict firmware);
|
|
|
|
|
-
|
|
|
|
|
- List.push_back doc ("features",
|
|
|
|
|
- JSON.List (json_list_of_string_list source.s_features));
|
|
|
|
|
-
|
|
|
|
|
- let machine =
|
|
|
|
|
- match guestcaps.gcaps_machine with
|
|
|
|
|
- | I440FX -> "pc"
|
|
|
|
|
- | Q35 -> "q35"
|
|
|
|
|
- | Virt -> "virt" in
|
|
|
|
|
- List.push_back doc ("machine", JSON.String machine);
|
|
|
|
|
-
|
|
|
|
|
- let disks, removables =
|
|
|
|
|
- let disks = ref []
|
|
|
|
|
- and removables = ref [] in
|
|
|
|
|
-
|
|
|
|
|
- let iter_bus bus_name drive_prefix i = function
|
|
|
|
|
- | BusSlotEmpty -> ()
|
|
|
|
|
- | BusSlotDisk d ->
|
|
|
|
|
- (* Find the corresponding target disk. *)
|
|
|
|
|
- let outdisk = outdisk_name d.s_disk_id in
|
|
|
|
|
-
|
|
|
|
|
- let disk = [
|
|
|
|
|
- "dev", JSON.String (drive_prefix ^ drive_name i);
|
|
|
|
|
- "bus", JSON.String bus_name;
|
|
|
|
|
- "format", JSON.String output_format;
|
|
|
|
|
- "file", JSON.String outdisk;
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- List.push_back disks (JSON.Dict disk)
|
|
|
|
|
-
|
|
|
|
|
- | BusSlotRemovable { s_removable_type = CDROM } ->
|
|
|
|
|
- let cdrom = [
|
|
|
|
|
- "type", JSON.String "cdrom";
|
|
|
|
|
- "dev", JSON.String (drive_prefix ^ drive_name i);
|
|
|
|
|
- "bus", JSON.String bus_name;
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- List.push_back removables (JSON.Dict cdrom)
|
|
|
|
|
-
|
|
|
|
|
- | BusSlotRemovable { s_removable_type = Floppy } ->
|
|
|
|
|
- let floppy = [
|
|
|
|
|
- "type", JSON.String "floppy";
|
|
|
|
|
- "dev", JSON.String (drive_prefix ^ drive_name i);
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- List.push_back removables (JSON.Dict floppy)
|
|
|
|
|
- in
|
|
|
|
|
-
|
|
|
|
|
- Array.iteri (iter_bus "virtio" "vd") target_buses.target_virtio_blk_bus;
|
|
|
|
|
- Array.iteri (iter_bus "ide" "hd") target_buses.target_ide_bus;
|
|
|
|
|
- Array.iteri (iter_bus "scsi" "sd") target_buses.target_scsi_bus;
|
|
|
|
|
- Array.iteri (iter_bus "floppy" "fd") target_buses.target_floppy_bus;
|
|
|
|
|
-
|
|
|
|
|
- !disks, !removables in
|
|
|
|
|
- List.push_back doc ("disks", JSON.List disks);
|
|
|
|
|
- List.push_back doc ("removables", JSON.List removables);
|
|
|
|
|
-
|
|
|
|
|
- let nics =
|
|
|
|
|
- List.map (
|
|
|
|
|
- fun { s_mac = mac; s_vnet_type = vnet_type; s_nic_model = nic_model;
|
|
|
|
|
- s_vnet = vnet; } ->
|
|
|
|
|
- let vnet_type_str =
|
|
|
|
|
- match vnet_type with
|
|
|
|
|
- | Bridge -> "bridge"
|
|
|
|
|
- | Network -> "network" in
|
|
|
|
|
-
|
|
|
|
|
- let nic = ref [
|
|
|
|
|
- "vnet", JSON.String vnet;
|
|
|
|
|
- "vnet-type", JSON.String vnet_type_str;
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- let nic_model_str = Option.map string_of_nic_model nic_model in
|
|
|
|
|
- push_optional_string nic "model" nic_model_str;
|
|
|
|
|
-
|
|
|
|
|
- push_optional_string nic "mac" mac;
|
|
|
|
|
-
|
|
|
|
|
- JSON.Dict !nic
|
|
|
|
|
- ) target_nics in
|
|
|
|
|
- List.push_back doc ("nics", JSON.List nics);
|
|
|
|
|
-
|
|
|
|
|
- let guestcaps_dict =
|
|
|
|
|
- let block_bus =
|
|
|
|
|
- match guestcaps.gcaps_block_bus with
|
|
|
|
|
- | Virtio_blk -> "virtio-blk"
|
|
|
|
|
- | IDE -> "ide" in
|
|
|
|
|
- let net_bus =
|
|
|
|
|
- match guestcaps.gcaps_net_bus with
|
|
|
|
|
- | Virtio_net -> "virtio-net"
|
|
|
|
|
- | E1000 -> "e1000"
|
|
|
|
|
- | RTL8139 -> "rtl8139" in
|
|
|
|
|
- let video = "vga" in
|
|
|
|
|
- let machine =
|
|
|
|
|
- match guestcaps.gcaps_machine with
|
|
|
|
|
- | I440FX -> "i440fx"
|
|
|
|
|
- | Q35 -> "q35"
|
|
|
|
|
- | Virt -> "virt" in
|
|
|
|
|
-
|
|
|
|
|
- [
|
|
|
|
|
- "block-bus", JSON.String block_bus;
|
|
|
|
|
- "net-bus", JSON.String net_bus;
|
|
|
|
|
- "video", JSON.String video;
|
|
|
|
|
- "machine", JSON.String machine;
|
|
|
|
|
- "arch", JSON.String guestcaps.gcaps_arch;
|
|
|
|
|
- "virtio-rng", JSON.Bool guestcaps.gcaps_virtio_rng;
|
|
|
|
|
- "virtio-balloon", JSON.Bool guestcaps.gcaps_virtio_balloon;
|
|
|
|
|
- "isa-pvpanic", JSON.Bool guestcaps.gcaps_isa_pvpanic;
|
|
|
|
|
- "virtio-socket", JSON.Bool guestcaps.gcaps_virtio_socket;
|
|
|
|
|
- "acpi", JSON.Bool guestcaps.gcaps_acpi;
|
|
|
|
|
- "virtio-1-0", JSON.Bool guestcaps.gcaps_virtio_1_0;
|
|
|
|
|
- ] in
|
|
|
|
|
- List.push_back doc ("guestcaps", JSON.Dict guestcaps_dict);
|
|
|
|
|
-
|
|
|
|
|
- (match source.s_sound with
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some { s_sound_model = model } ->
|
|
|
|
|
- let sound = [
|
|
|
|
|
- "model", JSON.String (string_of_source_sound_model model);
|
|
|
|
|
- ] in
|
|
|
|
|
- List.push_back doc ("sound", JSON.Dict sound)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- (match source.s_display with
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some d ->
|
|
|
|
|
- let display_type =
|
|
|
|
|
- match d.s_display_type with
|
|
|
|
|
- | Window -> "window"
|
|
|
|
|
- | VNC -> "vnc"
|
|
|
|
|
- | Spice -> "spice" in
|
|
|
|
|
-
|
|
|
|
|
- let display = ref [
|
|
|
|
|
- "type", JSON.String display_type;
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- push_optional_string display "keymap" d.s_keymap;
|
|
|
|
|
- push_optional_string display "password" d.s_password;
|
|
|
|
|
-
|
|
|
|
|
- let listen =
|
|
|
|
|
- match d.s_listen with
|
|
|
|
|
- | LNoListen -> None
|
|
|
|
|
- | LAddress address ->
|
|
|
|
|
- Some [
|
|
|
|
|
- "type", JSON.String "address";
|
|
|
|
|
- "address", JSON.String address;
|
|
|
|
|
- ]
|
|
|
|
|
- | LNetwork network ->
|
|
|
|
|
- Some [
|
|
|
|
|
- "type", JSON.String "network";
|
|
|
|
|
- "network", JSON.String network;
|
|
|
|
|
- ]
|
|
|
|
|
- | LSocket None ->
|
|
|
|
|
- Some [
|
|
|
|
|
- "type", JSON.String "socket";
|
|
|
|
|
- "socket", JSON.Null;
|
|
|
|
|
- ]
|
|
|
|
|
- | LSocket (Some socket) ->
|
|
|
|
|
- Some [
|
|
|
|
|
- "type", JSON.String "socket";
|
|
|
|
|
- "socket", JSON.String socket;
|
|
|
|
|
- ]
|
|
|
|
|
- | LNone ->
|
|
|
|
|
- Some [
|
|
|
|
|
- "type", JSON.String "none";
|
|
|
|
|
- ] in
|
|
|
|
|
- (match listen with
|
|
|
|
|
- | None -> ()
|
|
|
|
|
- | Some l -> List.push_back display ("listen", JSON.Dict l)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- push_optional_int display "port" d.s_port;
|
|
|
|
|
-
|
|
|
|
|
- List.push_back doc ("display", JSON.Dict !display)
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- let inspect_dict =
|
|
|
|
|
- let apps =
|
|
|
|
|
- List.map (
|
|
|
|
|
- fun { G.app2_name = name; app2_display_name = display_name;
|
|
|
|
|
- app2_epoch = epoch; app2_version = version;
|
|
|
|
|
- app2_release = release; app2_arch = arch; } ->
|
|
|
|
|
- JSON.Dict [
|
|
|
|
|
- "name", JSON.String name;
|
|
|
|
|
- "display-name", JSON.String display_name;
|
|
|
|
|
- "epoch", JSON.Int (Int64.of_int32 epoch);
|
|
|
|
|
- "version", JSON.String version;
|
|
|
|
|
- "release", JSON.String release;
|
|
|
|
|
- "arch", JSON.String arch;
|
|
|
|
|
- ]
|
|
|
|
|
- ) inspect.i_apps in
|
|
|
|
|
-
|
|
|
|
|
- let firmware_dict =
|
|
|
|
|
- match inspect.i_firmware with
|
|
|
|
|
- | I_BIOS ->
|
|
|
|
|
- [
|
|
|
|
|
- "type", JSON.String "bios";
|
|
|
|
|
- ]
|
|
|
|
|
- | I_UEFI devices ->
|
|
|
|
|
- [
|
|
|
|
|
- "type", JSON.String "uefi";
|
|
|
|
|
- "devices", JSON.List (json_list_of_string_list devices);
|
|
|
|
|
- ] in
|
|
|
|
|
-
|
|
|
|
|
- [
|
|
|
|
|
- "root", JSON.String inspect.i_root;
|
|
|
|
|
- "type", JSON.String inspect.i_type;
|
|
|
|
|
- "distro", json_unknown_string inspect.i_distro;
|
|
|
|
|
- "osinfo", json_unknown_string inspect.i_osinfo;
|
|
|
|
|
- "arch", JSON.String inspect.i_arch;
|
|
|
|
|
- "major-version", JSON.Int (Int64.of_int inspect.i_major_version);
|
|
|
|
|
- "minor-version", JSON.Int (Int64.of_int inspect.i_minor_version);
|
|
|
|
|
- "package-format", json_unknown_string inspect.i_package_format;
|
|
|
|
|
- "package-management", json_unknown_string inspect.i_package_management;
|
|
|
|
|
- "product-name", json_unknown_string inspect.i_product_name;
|
|
|
|
|
- "product-variant", json_unknown_string inspect.i_product_variant;
|
|
|
|
|
- "mountpoints", JSON.Dict (json_list_of_string_string_list inspect.i_mountpoints);
|
|
|
|
|
- "applications", JSON.List apps;
|
|
|
|
|
- "windows-systemroot", JSON.String inspect.i_windows_systemroot;
|
|
|
|
|
- "windows-software-hive", JSON.String inspect.i_windows_software_hive;
|
|
|
|
|
- "windows-system-hive", JSON.String inspect.i_windows_system_hive;
|
|
|
|
|
- "windows-current-control-set", JSON.String inspect.i_windows_current_control_set;
|
|
|
|
|
- "firmware", JSON.Dict firmware_dict;
|
|
|
|
|
- ] in
|
|
|
|
|
- List.push_back doc ("inspect", JSON.Dict inspect_dict);
|
|
|
|
|
-
|
|
|
|
|
- !doc
|
|
|
|
|
diff --git a/output/create_json.mli b/output/create_json.mli
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 97086ff5..00000000
|
|
|
|
|
--- a/output/create_json.mli
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,27 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-(** Create JSON metadata for [-o json]. *)
|
|
|
|
|
-
|
|
|
|
|
-val create_json_metadata : Types.source -> Types.inspect ->
|
|
|
|
|
- Types.target_meta ->
|
|
|
|
|
- (int -> string) -> string -> string ->
|
|
|
|
|
- JSON.doc
|
|
|
|
|
-(** [create_json_metadata source targets outdisk_map output_format output_name]
|
|
|
|
|
- creates the JSON with the majority of the data that virt-v2v used for the
|
|
|
|
|
- conversion. *)
|
|
|
|
|
diff --git a/output/output_json.ml b/output/output_json.ml
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 6e81b639..00000000
|
|
|
|
|
--- a/output/output_json.ml
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,153 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2009-2021 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-open Printf
|
|
|
|
|
-open Unix
|
|
|
|
|
-
|
|
|
|
|
-open C_utils
|
|
|
|
|
-open Std_utils
|
|
|
|
|
-open Tools_utils
|
|
|
|
|
-open Common_gettext.Gettext
|
|
|
|
|
-
|
|
|
|
|
-open Types
|
|
|
|
|
-open Utils
|
|
|
|
|
-
|
|
|
|
|
-open Output
|
|
|
|
|
-
|
|
|
|
|
-module Json = struct
|
|
|
|
|
- type poptions = string * Types.output_allocation * string * string * string
|
|
|
|
|
-
|
|
|
|
|
- type t = unit
|
|
|
|
|
-
|
|
|
|
|
- let to_string options =
|
|
|
|
|
- "-o json" ^
|
|
|
|
|
- match options.output_storage with
|
|
|
|
|
- | Some os -> " -os " ^ os
|
|
|
|
|
- | None -> ""
|
|
|
|
|
-
|
|
|
|
|
- let query_output_options () =
|
|
|
|
|
- printf (f_"Output options (-oo) which can be used with -o json:
|
|
|
|
|
-
|
|
|
|
|
- -oo json-disks-pattern=PATTERN Pattern for the disks.
|
|
|
|
|
-")
|
|
|
|
|
-
|
|
|
|
|
- let parse_options options source =
|
|
|
|
|
- if options.output_conn <> None then
|
|
|
|
|
- error_option_cannot_be_used_in_output_mode "json" "-oc";
|
|
|
|
|
- if options.output_password <> None then
|
|
|
|
|
- error_option_cannot_be_used_in_output_mode "json" "-op";
|
|
|
|
|
-
|
|
|
|
|
- let known_pattern_variables = ["DiskNo"; "DiskDeviceName"; "GuestName"] in
|
|
|
|
|
- let json_disks_pattern = ref None in
|
|
|
|
|
- List.iter (
|
|
|
|
|
- fun (k, v) ->
|
|
|
|
|
- match k with
|
|
|
|
|
- | "json-disks-pattern" ->
|
|
|
|
|
- if !json_disks_pattern <> None then
|
|
|
|
|
- error (f_"-o json: -oo json-disks-pattern set more than once");
|
|
|
|
|
- let vars =
|
|
|
|
|
- try Var_expander.scan_variables v
|
|
|
|
|
- with Var_expander.Invalid_variable var ->
|
|
|
|
|
- error (f_"-o json: -oo json-disks-pattern: invalid variable %%{%s}")
|
|
|
|
|
- var in
|
|
|
|
|
- List.iter (
|
|
|
|
|
- fun var ->
|
|
|
|
|
- if not (List.mem var known_pattern_variables) then
|
|
|
|
|
- error (f_"-o json: -oo json-disks-pattern: unhandled variable %%{%s}")
|
|
|
|
|
- var
|
|
|
|
|
- ) vars;
|
|
|
|
|
- json_disks_pattern := Some v
|
|
|
|
|
- | k ->
|
|
|
|
|
- error (f_"-o json: unknown output option ‘-oo %s’") k
|
|
|
|
|
- ) options.output_options;
|
|
|
|
|
-
|
|
|
|
|
- let json_disks_pattern =
|
|
|
|
|
- Option.default "%{GuestName}-%{DiskDeviceName}" !json_disks_pattern in
|
|
|
|
|
-
|
|
|
|
|
- (* -os must be set to a directory. *)
|
|
|
|
|
- let output_storage =
|
|
|
|
|
- match options.output_storage with
|
|
|
|
|
- | None ->
|
|
|
|
|
- error (f_"-o json: output directory was not specified, use '-os /dir'")
|
|
|
|
|
- | Some d when not (is_directory d) ->
|
|
|
|
|
- error (f_"-os %s: output directory does not exist or is not a directory") d
|
|
|
|
|
- | Some d -> d in
|
|
|
|
|
-
|
|
|
|
|
- let output_name = Option.default source.s_name options.output_name in
|
|
|
|
|
-
|
|
|
|
|
- (json_disks_pattern,
|
|
|
|
|
- options.output_alloc, options.output_format, output_name, output_storage)
|
|
|
|
|
-
|
|
|
|
|
- let rec setup dir options source =
|
|
|
|
|
- let disks = get_disks dir in
|
|
|
|
|
- let json_disks_pattern,
|
|
|
|
|
- output_alloc, output_format, output_name,
|
|
|
|
|
- output_storage = options in
|
|
|
|
|
-
|
|
|
|
|
- List.iter (
|
|
|
|
|
- fun (i, size) ->
|
|
|
|
|
- let socket = sprintf "%s/out%d" dir i in
|
|
|
|
|
- On_exit.unlink socket;
|
|
|
|
|
-
|
|
|
|
|
- (* Create the actual output disk. *)
|
|
|
|
|
- let outdisk = json_path output_storage output_name
|
|
|
|
|
- json_disks_pattern i in
|
|
|
|
|
- mkdir_p (Filename.dirname outdisk) 0o755;
|
|
|
|
|
-
|
|
|
|
|
- output_to_local_file output_alloc output_format outdisk size socket
|
|
|
|
|
- ) disks
|
|
|
|
|
-
|
|
|
|
|
- (* For -o json, return the output disk name of the i'th disk. *)
|
|
|
|
|
- and json_path os output_name json_disks_pattern i =
|
|
|
|
|
- let outname =
|
|
|
|
|
- let vars_fn = function
|
|
|
|
|
- | "DiskNo" -> Some (string_of_int (i+1))
|
|
|
|
|
- | "DiskDeviceName" -> Some (sprintf "sd%s" (drive_name i))
|
|
|
|
|
- | "GuestName" -> Some output_name
|
|
|
|
|
- | _ -> assert false
|
|
|
|
|
- in
|
|
|
|
|
- Var_expander.replace_fn json_disks_pattern vars_fn in
|
|
|
|
|
- let outdisk = os // outname in
|
|
|
|
|
- let outdisk = absolute_path outdisk in
|
|
|
|
|
- outdisk
|
|
|
|
|
-
|
|
|
|
|
- let finalize dir options () source inspect target_meta =
|
|
|
|
|
- let json_disks_pattern,
|
|
|
|
|
- output_alloc, output_format, output_name, output_storage = options in
|
|
|
|
|
-
|
|
|
|
|
- let doc =
|
|
|
|
|
- Create_json.create_json_metadata source inspect target_meta
|
|
|
|
|
- (json_path output_storage output_name json_disks_pattern)
|
|
|
|
|
- output_format output_name in
|
|
|
|
|
- let doc_string = JSON.string_of_doc ~fmt:JSON.Indented doc in
|
|
|
|
|
-
|
|
|
|
|
- if verbose () then (
|
|
|
|
|
- eprintf "resulting JSON:\n";
|
|
|
|
|
- output_string Stdlib.stderr doc_string;
|
|
|
|
|
- eprintf "\n\n%!";
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- let file = output_storage // output_name ^ ".json" in
|
|
|
|
|
- with_open_out file (
|
|
|
|
|
- fun chan ->
|
|
|
|
|
- output_string chan doc_string;
|
|
|
|
|
- output_char chan '\n'
|
|
|
|
|
- )
|
|
|
|
|
-
|
|
|
|
|
- let request_size = None
|
|
|
|
|
-end
|
|
|
|
|
diff --git a/output/output_json.mli b/output/output_json.mli
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 00786ef7..00000000
|
|
|
|
|
--- a/output/output_json.mli
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,21 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2009-2021 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-(** [-o json] output mode. *)
|
|
|
|
|
-
|
|
|
|
|
-module Json : Output.OUTPUT
|
|
|
|
|
diff --git a/output/var_expander.ml b/output/var_expander.ml
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 24b9bafe..00000000
|
|
|
|
|
--- a/output/var_expander.ml
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,72 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-open Std_utils
|
|
|
|
|
-
|
|
|
|
|
-exception Invalid_variable of string
|
|
|
|
|
-
|
|
|
|
|
-let var_re = PCRE.compile "(^|[^%])%{([^}]+)}"
|
|
|
|
|
-
|
|
|
|
|
-let check_variable var =
|
|
|
|
|
- String.iter (
|
|
|
|
|
- function
|
|
|
|
|
- | '0'..'9'
|
|
|
|
|
- | 'a'..'z'
|
|
|
|
|
- | 'A'..'Z'
|
|
|
|
|
- | '_'
|
|
|
|
|
- | '-' -> ()
|
|
|
|
|
- | _ -> raise (Invalid_variable var)
|
|
|
|
|
- ) var
|
|
|
|
|
-
|
|
|
|
|
-let scan_variables str =
|
|
|
|
|
- let res = ref [] in
|
|
|
|
|
- let offset = ref 0 in
|
|
|
|
|
- while PCRE.matches ~offset:!offset var_re str; do
|
|
|
|
|
- let var = PCRE.sub 2 in
|
|
|
|
|
- check_variable var;
|
|
|
|
|
- let _, end_ = PCRE.subi 0 in
|
|
|
|
|
- List.push_back res var;
|
|
|
|
|
- offset := end_
|
|
|
|
|
- done;
|
|
|
|
|
- List.remove_duplicates !res
|
|
|
|
|
-
|
|
|
|
|
-let replace_fn str fn =
|
|
|
|
|
- let res = ref str in
|
|
|
|
|
- let offset = ref 0 in
|
|
|
|
|
- while PCRE.matches ~offset:!offset var_re !res; do
|
|
|
|
|
- let var = PCRE.sub 2 in
|
|
|
|
|
- check_variable var;
|
|
|
|
|
- let start_, end_ = PCRE.subi 0 in
|
|
|
|
|
- match fn var with
|
|
|
|
|
- | None ->
|
|
|
|
|
- offset := end_
|
|
|
|
|
- | Some text ->
|
|
|
|
|
- let prefix_len =
|
|
|
|
|
- let prefix_start, prefix_end = PCRE.subi 1 in
|
|
|
|
|
- prefix_end - prefix_start in
|
|
|
|
|
- res := (String.sub !res 0 (start_ + prefix_len)) ^ text ^ (String.sub !res end_ (String.length !res - end_));
|
|
|
|
|
- offset := start_ + prefix_len + String.length text
|
|
|
|
|
- done;
|
|
|
|
|
- !res
|
|
|
|
|
-
|
|
|
|
|
-let replace_list str lst =
|
|
|
|
|
- let fn var =
|
|
|
|
|
- try Some (List.assoc var lst)
|
|
|
|
|
- with Not_found -> None
|
|
|
|
|
- in
|
|
|
|
|
- replace_fn str fn
|
|
|
|
|
diff --git a/output/var_expander.mli b/output/var_expander.mli
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 80aa33c2..00000000
|
|
|
|
|
--- a/output/var_expander.mli
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,82 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-(** Simple variable expander.
|
|
|
|
|
-
|
|
|
|
|
- This module provides the support to expand variables in strings,
|
|
|
|
|
- specified in the form of [%{name}].
|
|
|
|
|
-
|
|
|
|
|
- For example:
|
|
|
|
|
-
|
|
|
|
|
-{v
|
|
|
|
|
-let str = "variable-%{INDEX} in %{INDEX} replaced %{INDEX} times"
|
|
|
|
|
-let index = ref 0
|
|
|
|
|
-let fn = function
|
|
|
|
|
- | "INDEX" ->
|
|
|
|
|
- incr index;
|
|
|
|
|
- Some (string_of_int !index)
|
|
|
|
|
- | _ -> None
|
|
|
|
|
-in
|
|
|
|
|
-let str = Var_expander.replace_fn str fn
|
|
|
|
|
-(* now str is "variable-1 in 2 replaced 3 times" *)
|
|
|
|
|
-v}
|
|
|
|
|
-
|
|
|
|
|
- The names of variables can contain only ASCII letters (uppercase,
|
|
|
|
|
- and lowercase), digits, underscores, and dashes.
|
|
|
|
|
-
|
|
|
|
|
- The replacement is done in a single pass: this means that if a
|
|
|
|
|
- variable is replaced with the text of a variable, that new text
|
|
|
|
|
- is kept as is in the final output. In practice:
|
|
|
|
|
-
|
|
|
|
|
-{v
|
|
|
|
|
-let str = "%{VAR}"
|
|
|
|
|
-let str = Var_expander.replace_list str [("VAR", "%{VAR}")]
|
|
|
|
|
-(* now str is "%{VAR}" *)
|
|
|
|
|
-v}
|
|
|
|
|
-*)
|
|
|
|
|
-
|
|
|
|
|
-exception Invalid_variable of string
|
|
|
|
|
-(** Invalid variable name error.
|
|
|
|
|
-
|
|
|
|
|
- In case a variable contains characters not allowed, then this
|
|
|
|
|
- exception with the actual unacceptable variable. *)
|
|
|
|
|
-
|
|
|
|
|
-val scan_variables : string -> string list
|
|
|
|
|
-(** Scan the pattern string for all the variables available.
|
|
|
|
|
-
|
|
|
|
|
- This can raise {!Invalid_variable} in case there are invalid
|
|
|
|
|
- variable names. *)
|
|
|
|
|
-
|
|
|
|
|
-val replace_fn : string -> (string -> string option) -> string
|
|
|
|
|
-(** Replaces a string expanding all the variables.
|
|
|
|
|
-
|
|
|
|
|
- The replacement function specify how a variable is replaced;
|
|
|
|
|
- if [None] is returned, then that variable is not replaced.
|
|
|
|
|
-
|
|
|
|
|
- This can raise {!Invalid_variable} in case there are invalid
|
|
|
|
|
- variable names. *)
|
|
|
|
|
-
|
|
|
|
|
-val replace_list : string -> (string * string) list -> string
|
|
|
|
|
-(** Replaces a string expanding all the variables.
|
|
|
|
|
-
|
|
|
|
|
- The replacement list specify how a variable is replaced;
|
|
|
|
|
- if it is not specified in the list, then that variable is not
|
|
|
|
|
- replaced.
|
|
|
|
|
-
|
|
|
|
|
- This can raise {!Invalid_variable} in case there are invalid
|
|
|
|
|
- variable names. *)
|
|
|
|
|
diff --git a/output/var_expander_tests.ml b/output/var_expander_tests.ml
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index 35b62836..00000000
|
|
|
|
|
--- a/output/var_expander_tests.ml
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,113 +0,0 @@
|
|
|
|
|
-(* virt-v2v
|
|
|
|
|
- * Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
- * (at your option) any later version.
|
|
|
|
|
- *
|
|
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
- * GNU General Public License for more details.
|
|
|
|
|
- *
|
|
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
- *)
|
|
|
|
|
-
|
|
|
|
|
-open Printf
|
|
|
|
|
-open OUnit
|
|
|
|
|
-
|
|
|
|
|
-open Std_utils
|
|
|
|
|
-
|
|
|
|
|
-let assert_equal_string = assert_equal ~printer:identity
|
|
|
|
|
-let assert_equal_stringlist = assert_equal ~printer:(fun x -> "(" ^ (String.escaped (String.concat "," x)) ^ ")")
|
|
|
|
|
-
|
|
|
|
|
-let replace_none_fn _ = None
|
|
|
|
|
-let replace_empty_fn _ = Some ""
|
|
|
|
|
-
|
|
|
|
|
-let test_no_replacement () =
|
|
|
|
|
- assert_equal_string "" (Var_expander.replace_fn "" replace_none_fn);
|
|
|
|
|
- assert_equal_string "x" (Var_expander.replace_fn "x" replace_none_fn);
|
|
|
|
|
- assert_equal_string "%{}" (Var_expander.replace_fn "%{}" replace_none_fn);
|
|
|
|
|
- assert_equal_string "%{EMPTY}" (Var_expander.replace_fn "%{EMPTY}" replace_none_fn);
|
|
|
|
|
- assert_equal_string "%{EMPTY} %{no}" (Var_expander.replace_fn "%{EMPTY} %{no}" replace_none_fn);
|
|
|
|
|
- assert_equal_string "a %{EMPTY} b" (Var_expander.replace_fn "a %{EMPTY} b" replace_none_fn);
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-let test_replacements () =
|
|
|
|
|
- assert_equal_string "" (Var_expander.replace_fn "%{EMPTY}" replace_empty_fn);
|
|
|
|
|
- assert_equal_string "x " (Var_expander.replace_fn "x %{EMPTY}" replace_empty_fn);
|
|
|
|
|
- assert_equal_string "xy" (Var_expander.replace_fn "x%{EMPTY}y" replace_empty_fn);
|
|
|
|
|
- assert_equal_string "x<->y" (Var_expander.replace_fn "x%{FOO}y" (function | "FOO" -> Some "<->" | _ -> None));
|
|
|
|
|
- assert_equal_string "a x b" (Var_expander.replace_fn "a %{FOO} b" (function | "FOO" -> Some "x" | _ -> None));
|
|
|
|
|
- assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{FOO} %{BAR}" (function | "BAR" -> Some "x" | _ -> None));
|
|
|
|
|
- assert_equal_string "%{FOO}" (Var_expander.replace_fn "%{BAR}" (function | "BAR" -> Some "%{FOO}" | _ -> None));
|
|
|
|
|
- assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{BAR} %{FOO}" (function | "BAR" -> Some "%{FOO}" | "FOO" -> Some "x" | _ -> None));
|
|
|
|
|
- begin
|
|
|
|
|
- let str = "%{INDEX}, %{INDEX}, %{INDEX}" in
|
|
|
|
|
- let index = ref 0 in
|
|
|
|
|
- let fn = function
|
|
|
|
|
- | "INDEX" ->
|
|
|
|
|
- incr index;
|
|
|
|
|
- Some (string_of_int !index)
|
|
|
|
|
- | _ -> None
|
|
|
|
|
- in
|
|
|
|
|
- assert_equal_string "1, 2, 3" (Var_expander.replace_fn str fn)
|
|
|
|
|
- end;
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-let test_escape () =
|
|
|
|
|
- assert_equal_string "%%{FOO}" (Var_expander.replace_fn "%%{FOO}" replace_empty_fn);
|
|
|
|
|
- assert_equal_string "x %%{FOO} x" (Var_expander.replace_fn "%{FOO} %%{FOO} %{FOO}" (function | "FOO" -> Some "x" | _ -> None));
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-let test_list () =
|
|
|
|
|
- assert_equal_string "x %{NONE}" (Var_expander.replace_list "%{FOO} %{NONE}" [("FOO", "x")]);
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-let test_scan_variables () =
|
|
|
|
|
- let assert_invalid_variable var =
|
|
|
|
|
- let str = "%{" ^ var ^ "}" in
|
|
|
|
|
- assert_raises (Var_expander.Invalid_variable var)
|
|
|
|
|
- (fun () -> Var_expander.scan_variables str)
|
|
|
|
|
- in
|
|
|
|
|
- assert_equal_stringlist [] (Var_expander.scan_variables "");
|
|
|
|
|
- assert_equal_stringlist [] (Var_expander.scan_variables "foo");
|
|
|
|
|
- assert_equal_stringlist ["FOO"] (Var_expander.scan_variables "%{FOO}");
|
|
|
|
|
- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR}");
|
|
|
|
|
- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR} %{FOO}");
|
|
|
|
|
- assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %%{ESCAPED} %{BAR}");
|
|
|
|
|
- assert_invalid_variable "FOO/BAR";
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-let test_errors () =
|
|
|
|
|
- let assert_invalid_variable var =
|
|
|
|
|
- let str = "%{" ^ var ^ "}" in
|
|
|
|
|
- assert_raises (Var_expander.Invalid_variable var)
|
|
|
|
|
- (fun () -> Var_expander.replace_fn str replace_none_fn)
|
|
|
|
|
- in
|
|
|
|
|
- assert_invalid_variable "FOO/BAR";
|
|
|
|
|
- assert_invalid_variable "FOO:BAR";
|
|
|
|
|
- assert_invalid_variable "FOO(BAR";
|
|
|
|
|
- assert_invalid_variable "FOO)BAR";
|
|
|
|
|
- assert_invalid_variable "FOO@BAR";
|
|
|
|
|
- ()
|
|
|
|
|
-
|
|
|
|
|
-(* Suites declaration. *)
|
|
|
|
|
-let suite =
|
|
|
|
|
- TestList ([
|
|
|
|
|
- "basic" >::: [
|
|
|
|
|
- "no_replacement" >:: test_no_replacement;
|
|
|
|
|
- "replacements" >:: test_replacements;
|
|
|
|
|
- "escape" >:: test_escape;
|
|
|
|
|
- "list" >:: test_list;
|
|
|
|
|
- "scan_variables" >:: test_scan_variables;
|
|
|
|
|
- "errors" >:: test_errors;
|
|
|
|
|
- ];
|
|
|
|
|
- ])
|
|
|
|
|
-
|
|
|
|
|
-let () =
|
|
|
|
|
- ignore (run_test_tt_main suite);
|
|
|
|
|
- Printf.fprintf stderr "\n"
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
2022-07-06 16:29:41 +00:00
|
|
|
|
index db32e42b..e787a86c 100644
|
2022-04-12 11:17:50 +00:00
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
2022-04-26 10:04:45 +00:00
|
|
|
|
@@ -81,7 +81,6 @@ TESTS = \
|
2022-04-12 11:17:50 +00:00
|
|
|
|
test-v2v-machine-readable.sh \
|
|
|
|
|
test-v2v-networks-and-bridges.sh \
|
|
|
|
|
test-v2v-o-glance.sh \
|
|
|
|
|
- test-v2v-o-json.sh \
|
|
|
|
|
test-v2v-o-libvirt.sh \
|
|
|
|
|
test-v2v-o-null.sh \
|
|
|
|
|
test-v2v-o-openstack.sh \
|
2022-07-06 16:29:41 +00:00
|
|
|
|
@@ -241,7 +240,6 @@ EXTRA_DIST += \
|
2022-04-12 11:17:50 +00:00
|
|
|
|
test-v2v-networks-and-bridges.sh \
|
|
|
|
|
test-v2v-networks-and-bridges-expected.xml \
|
|
|
|
|
test-v2v-o-glance.sh \
|
|
|
|
|
- test-v2v-o-json.sh \
|
|
|
|
|
test-v2v-o-libvirt.sh \
|
|
|
|
|
test-v2v-o-null.sh \
|
|
|
|
|
test-v2v-o-openstack.sh \
|
|
|
|
|
diff --git a/tests/test-v2v-o-json.sh b/tests/test-v2v-o-json.sh
|
|
|
|
|
deleted file mode 100755
|
|
|
|
|
index 15e7ad5a..00000000
|
|
|
|
|
--- a/tests/test-v2v-o-json.sh
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,68 +0,0 @@
|
|
|
|
|
-#!/bin/bash -
|
|
|
|
|
-# libguestfs virt-v2v test script
|
|
|
|
|
-# Copyright (C) 2019 Red Hat Inc.
|
|
|
|
|
-#
|
|
|
|
|
-# This program is free software; you can redistribute it and/or modify
|
|
|
|
|
-# it under the terms of the GNU General Public License as published by
|
|
|
|
|
-# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
-# (at your option) any later version.
|
|
|
|
|
-#
|
|
|
|
|
-# This program is distributed in the hope that it will be useful,
|
|
|
|
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
-# GNU General Public License for more details.
|
|
|
|
|
-#
|
|
|
|
|
-# You should have received a copy of the GNU General Public License
|
|
|
|
|
-# along with this program; if not, write to the Free Software
|
|
|
|
|
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
-
|
|
|
|
|
-# Test -o json.
|
|
|
|
|
-
|
|
|
|
|
-set -e
|
|
|
|
|
-set -x
|
|
|
|
|
-
|
|
|
|
|
-source ./functions.sh
|
|
|
|
|
-set -e
|
|
|
|
|
-set -x
|
|
|
|
|
-
|
|
|
|
|
-skip_if_skipped
|
|
|
|
|
-requires test -f ../test-data/phony-guests/windows.img
|
|
|
|
|
-requires jq --version
|
|
|
|
|
-
|
|
|
|
|
-libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml"
|
|
|
|
|
-
|
|
|
|
|
-export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools"
|
|
|
|
|
-
|
|
|
|
|
-guestname=windows
|
|
|
|
|
-
|
|
|
|
|
-d=test-v2v-o-json.d
|
|
|
|
|
-rm -rf $d
|
|
|
|
|
-cleanup_fn rm -r $d
|
|
|
|
|
-mkdir $d
|
|
|
|
|
-
|
|
|
|
|
-json=$d/$guestname.json
|
|
|
|
|
-disk=$d/$guestname-sda
|
|
|
|
|
-
|
|
|
|
|
-$VG virt-v2v --debug-gc \
|
|
|
|
|
- -i libvirt -ic "$libvirt_uri" windows \
|
|
|
|
|
- -o json -os $d -on $guestname
|
|
|
|
|
-
|
|
|
|
|
-# Test the disk was created.
|
|
|
|
|
-test -f $disk
|
|
|
|
|
-
|
|
|
|
|
-# Test the JSON.
|
|
|
|
|
-test x$(jq -r '.name' $json) = xwindows
|
|
|
|
|
-test x$(jq -r '.inspect.type' $json) = xwindows
|
|
|
|
|
-test x$(jq -r '.inspect.distro' $json) = xwindows
|
|
|
|
|
-test $(jq -r '.disks | length' $json) -eq 1
|
|
|
|
|
-test $(jq -r '.disks[0].file' $json) = $(realpath $disk)
|
|
|
|
|
-test $(jq -r '.nics | length' $json) -eq 1
|
|
|
|
|
-test $(jq -r '.removables | length' $json) -eq 0
|
|
|
|
|
-
|
|
|
|
|
-# libguestfs 1.40 didn't have osinfo inspection data, but we want this
|
|
|
|
|
-# test to work with 1.40, so ignore if jq returns this field as
|
|
|
|
|
-# "null".
|
|
|
|
|
-osinfo=$(jq -r '.inspect.osinfo' $json)
|
|
|
|
|
-if [ "x$osinfo" != "xnull" ]; then
|
|
|
|
|
- test x$osinfo = xwin7
|
|
|
|
|
-fi
|
|
|
|
|
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
|
|
|
|
|
index e00f9814..994982ac 100644
|
|
|
|
|
--- a/v2v/v2v.ml
|
|
|
|
|
+++ b/v2v/v2v.ml
|
|
|
|
|
@@ -194,7 +194,6 @@ let rec main () =
|
|
|
|
|
match mode with
|
|
|
|
|
| "libvirt" -> output_mode := `Libvirt
|
|
|
|
|
| "disk" | "local" -> output_mode := `Disk
|
|
|
|
|
- | "json" -> output_mode := `JSON
|
|
|
|
|
| "null" -> output_mode := `Null
|
|
|
|
|
| "openstack" | "osp" | "rhosp" -> output_mode := `Openstack
|
|
|
|
|
| "ovirt" | "rhv" | "rhev" -> output_mode := `RHV
|
|
|
|
|
@@ -241,7 +240,7 @@ let rec main () =
|
|
|
|
|
s_"Map network ‘in’ to ‘out’";
|
|
|
|
|
[ L"no-trim" ], Getopt.String ("-", no_trim_warning),
|
|
|
|
|
s_"Ignored for backwards compatibility";
|
|
|
|
|
- [ S 'o' ], Getopt.String ("json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode),
|
|
|
|
|
+ [ S 'o' ], Getopt.String ("libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode),
|
|
|
|
|
s_"Set output mode (default: libvirt)";
|
|
|
|
|
[ M"oa" ], Getopt.String ("sparse|preallocated", set_output_alloc),
|
|
|
|
|
s_"Set output allocation mode";
|
|
|
|
|
@@ -376,7 +375,6 @@ read the man page virt-v2v(1).
|
|
|
|
|
pr "input:libvirtxml\n";
|
|
|
|
|
pr "input:ova\n";
|
|
|
|
|
pr "input:vmx\n";
|
|
|
|
|
- pr "output:json\n";
|
|
|
|
|
pr "output:libvirt\n";
|
|
|
|
|
pr "output:local\n";
|
|
|
|
|
pr "output:null\n";
|
|
|
|
|
@@ -472,8 +470,7 @@ read the man page virt-v2v(1).
|
|
|
|
|
| `Openstack -> (module Output_openstack.Openstack)
|
|
|
|
|
| `RHV_Upload -> (module Output_rhv_upload.RHVUpload)
|
|
|
|
|
| `RHV -> (module Output_rhv.RHV)
|
|
|
|
|
- | `VDSM -> (module Output_vdsm.VDSM)
|
|
|
|
|
- | `JSON -> (module Output_json.Json) in
|
|
|
|
|
+ | `VDSM -> (module Output_vdsm.VDSM) in
|
|
|
|
|
|
|
|
|
|
let output_options = {
|
|
|
|
|
Output.output_alloc = output_alloc;
|