Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 00/11] Expose virt-v2v's "-oo"; re-enable openstack
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141 Let the user pass "-oo" options from the kernel cmdline and from the GUI to virt-v2v. This is primarily useful with the OpenStack output mode, so reenable that mode. Cc: Alban Lecorps <alban.lecorps at ubisoft.com> Laszlo Alban Lecorps (1): Introduce "p2v.output.misc" for passing "-oo" options to virt-v2v Laszlo Ersek (10): test-virt-p2v-cmdline: turn option list into a shell array guestfs-utils: import guestfs_int_join_strings() gui: factor out entry_text_dup() gui: factor out tgl_btn_is_act() gui: flatten get_phys_topo_from_conv_dlg() gui: wrap overlong function declaration lines gui: wrap string literals gui: expose "p2v.output.misc" (-oo) Reenable the OpenStack output mode make-kickstart: add URLs for RHEL-9 conversion.c | 9 ++ generate-p2v-config.pl | 10 ++ gui.c | 168 ++++++++++++++++---- libguestfs/guestfs-utils.c | 35 ++++ libguestfs/guestfs-utils.h | 1 + ssh.c | 5 +- test-virt-p2v-cmdline.sh | 24 ++- virt-p2v-make-kickstart.in | 13 ++ virt-p2v.pod | 2 + 9 files changed, 230 insertions(+), 37 deletions(-)
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 01/11] test-virt-p2v-cmdline: turn option list into a shell array
The argument for virt-p2v's "--cmdline" option has grown huge.
Break it to
multiple lines. That's easiest to do with a shell array.
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
test-virt-p2v-cmdline.sh | 22 +++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/test-virt-p2v-cmdline.sh b/test-virt-p2v-cmdline.sh
index 79c3061b1e7c..7d5434cf8428 100755
--- a/test-virt-p2v-cmdline.sh
+++ b/test-virt-p2v-cmdline.sh
@@ -26,7 +26,27 @@ out=test-virt-p2v-cmdline.out
rm -f $out
# The Linux kernel command line.
-$VG virt-p2v --cmdline='p2v.server=localhost p2v.port=123 p2v.username=user
p2v.password=secret p2v.skip_test_connection p2v.name=test p2v.vcpu.cores=4
p2v.memory=1G p2v.disks=sda,sdb,sdc p2v.removable=sdd p2v.interfaces=eth0,eth1
p2v.o=local p2v.oa=sparse p2v.oc=qemu:///session p2v.of=raw p2v.os=/var/tmp
p2v.network=em1:wired,other p2v.dump_config_and_exit' > $out
+P2V_OPTS=(
+ p2v.server=localhost
+ p2v.port=123
+ p2v.username=user
+ p2v.password=secret
+ p2v.skip_test_connection
+ p2v.name=test
+ p2v.vcpu.cores=4
+ p2v.memory=1G
+ p2v.disks=sda,sdb,sdc
+ p2v.removable=sdd
+ p2v.interfaces=eth0,eth1
+ p2v.o=local
+ p2v.oa=sparse
+ p2v.oc=qemu:///session
+ p2v.of=raw
+ p2v.os=/var/tmp
+ p2v.network=em1:wired,other
+ p2v.dump_config_and_exit
+)
+$VG virt-p2v --cmdline="${P2V_OPTS[*]}" > $out
# For debugging purposes.
cat $out
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 02/11] Introduce "p2v.output.misc" for passing "-oo" options to virt-v2v
From: Alban Lecorps <alban.lecorps at ubisoft.com>
The "-oo" option will be useful primarily for the openstack output
mode
(currently disabled, from commit b74c126629e3, "Ignore 'openstack'
driver", 2020-03-16).
Use a ConfigStringList knob for "-oo", and for each OPTION=VALUE
element
in that list, create a separate "-oo OPTION=VALUE" option. Do this
because
there are too many "-oo" options, and because they are
output-dependent,
and because even virt-v2v "blindly" forwards some of those (such as
"-oo
os-*=*" for openstack).
The "p2v.oo" shorthand is not needed for compatibility, but it's
still a
good idea for user convenience.
(Various tweaks, documentation, and test case update, by Laszlo.)
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
generate-p2v-config.pl | 10 ++++++++++
conversion.c | 9 +++++++++
test-virt-p2v-cmdline.sh | 2 ++
3 files changed, 21 insertions(+)
diff --git a/generate-p2v-config.pl b/generate-p2v-config.pl
index 47487f7b0f35..5e1d8519bd91 100755
--- a/generate-p2v-config.pl
+++ b/generate-p2v-config.pl
@@ -147,6 +147,7 @@ my @fields = [
ConfigString->new(name => 'connection'),
ConfigString->new(name => 'format'),
ConfigString->new(name => 'storage'),
+ ConfigStringList->new(name => 'misc'),
],
),
];
@@ -168,6 +169,7 @@ my @cmdline_aliases = (
["p2v.output.connection", "p2v.oc"],
["p2v.output.format", "p2v.of"],
["p2v.output.storage", "p2v.os"],
+ ["p2v.output.misc", "p2v.oo"],
);
# Some config entries are not exposed on the kernel command line.
@@ -379,6 +381,14 @@ option. See L<virt-v2v(1)/OPTIONS>.
If not specified, the default is F</var/tmp> (on the conversion
server).",
),
+ "p2v.output.misc" => manual_entry->new(
+ shortopt => "OPTION=VALUE,...",
+ description => "
+Set miscellaneous output option(s) related to the selected output mode.
+This is the same as the virt-v2v I<-oo> option; each
C<OPTION=VALUE>
+element in the list will be turned into a separate I<-oo OPTION=VALUE>
+option on the virt-v2v command line. See L<virt-v2v(1)/OPTIONS>.",
+ ),
);
# Clean up the program name.
diff --git a/conversion.c b/conversion.c
index b9af47deda74..cc6387c88af8 100644
--- a/conversion.c
+++ b/conversion.c
@@ -526,6 +526,15 @@ generate_wrapper_script (struct config *config, const char
*remote_dir,
print_quoted (fp, config->output.storage);
}
+ if (config->output.misc) { /* -oo */
+ size_t i;
+
+ for (i = 0; config->output.misc[i]; ++i) {
+ fprintf (fp, " -oo ");
+ print_quoted (fp, config->output.misc[i]);
+ }
+ }
+
fprintf (fp, " --root first");
fprintf (fp, " physical.xml");
fprintf (fp, " </dev/null"); /* no stdin */
diff --git a/test-virt-p2v-cmdline.sh b/test-virt-p2v-cmdline.sh
index 7d5434cf8428..bcec86089b00 100755
--- a/test-virt-p2v-cmdline.sh
+++ b/test-virt-p2v-cmdline.sh
@@ -43,6 +43,7 @@ P2V_OPTS=(
p2v.oc=qemu:///session
p2v.of=raw
p2v.os=/var/tmp
+ p2v.oo=opt1=val1,opt2=val2
p2v.network=em1:wired,other
p2v.dump_config_and_exit
)
@@ -69,5 +70,6 @@ grep "^output\.allocation.*sparse" $out
grep "^output\.connection.*qemu:///session" $out
grep "^output\.format.*raw" $out
grep "^output\.storage.*/var/tmp" $out
+grep "^output\.misc.*opt1=val1 opt2=val2" $out
rm $out
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 03/11] guestfs-utils: import guestfs_int_join_strings()
Copy the guestfs_int_join_strings() function from libguestfs-common @
3253cd99d135 ("mldrivers: Add support for reading Windows drivers from
DriverDatabase", 2023-01-26).
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
libguestfs/guestfs-utils.h | 1 +
libguestfs/guestfs-utils.c | 35 ++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/libguestfs/guestfs-utils.h b/libguestfs/guestfs-utils.h
index d5557a49680c..62402ccdd202 100644
--- a/libguestfs/guestfs-utils.h
+++ b/libguestfs/guestfs-utils.h
@@ -48,6 +48,7 @@
extern void guestfs_int_free_string_list (char **);
extern size_t guestfs_int_count_strings (char *const *);
extern char **guestfs_int_copy_string_list (char *const *);
+extern char *guestfs_int_join_strings (const char *sep, char *const *);
extern char **guestfs_int_split_string (char sep, const char *);
extern int guestfs_int_random_string (char *ret, size_t len);
extern char *guestfs_int_drive_name (size_t index, char *ret);
diff --git a/libguestfs/guestfs-utils.c b/libguestfs/guestfs-utils.c
index 505c9f6c0a32..9f0b012d2968 100644
--- a/libguestfs/guestfs-utils.c
+++ b/libguestfs/guestfs-utils.c
@@ -77,6 +77,41 @@ guestfs_int_copy_string_list (char *const *argv)
return ret;
}
+char *
+guestfs_int_join_strings (const char *sep, char *const *argv)
+{
+ size_t i, len, seplen, rlen;
+ char *r;
+
+ seplen = strlen (sep);
+
+ len = 0;
+ for (i = 0; argv[i] != NULL; ++i) {
+ if (i > 0)
+ len += seplen;
+ len += strlen (argv[i]);
+ }
+ len++; /* for final \0 */
+
+ r = malloc (len);
+ if (r == NULL)
+ return NULL;
+
+ rlen = 0;
+ for (i = 0; argv[i] != NULL; ++i) {
+ if (i > 0) {
+ memcpy (&r[rlen], sep, seplen);
+ rlen += seplen;
+ }
+ len = strlen (argv[i]);
+ memcpy (&r[rlen], argv[i], len);
+ rlen += len;
+ }
+ r[rlen] = '\0';
+
+ return r;
+}
+
/**
* Split string at separator character C<sep>, returning the list of
* strings. Returns C<NULL> on memory allocation failure.
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 04/11] gui: factor out entry_text_dup()
Some of the overlong lines in "gui.c" originate from function calls
like
config->whatever = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
These are hard to wrap -- we generally break the second and further
arguments in a function call to new lines, and start those new lines
aligned with the opening parenthesis of the function call. However, in the
above expression, each function only takes one parameter -- the problem is
the deep nesting, and our wrapping style generally strives to reflect
nesting.
Extract the expression to a small (somewhat accidental) helper function.
This function is then used from multiple dialogs (the connection dialog
and the conversion dialog).
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/gui.c b/gui.c
index 3068c97c3ba3..5c53883ff2ae 100644
--- a/gui.c
+++ b/gui.c
@@ -150,6 +150,16 @@ gui_conversion (struct config *config,
gtk_main ();
}
+/**
+ * Trivial helper (shorthand) function for duplicating the contents of a
+ * GTK_ENTRY.
+ */
+static char *
+entry_text_dup (GtkWidget *entry)
+{
+ return strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+}
+
/*----------------------------------------------------------------------*/
/* Connection dialog. */
@@ -426,7 +436,7 @@ test_connection_clicked (GtkWidget *w, gpointer data)
/* Get the fields from the various widgets. */
free (config->remote.server);
- config->remote.server = strdup (gtk_entry_get_text (GTK_ENTRY
(server_entry)));
+ config->remote.server = entry_text_dup (server_entry);
if (STREQ (config->remote.server, "")) {
gtk_label_set_text (GTK_LABEL (spinner_message),
_("error: No conversion server given."));
@@ -442,7 +452,7 @@ test_connection_clicked (GtkWidget *w, gpointer data)
errors++;
}
free (config->auth.username);
- config->auth.username = strdup (gtk_entry_get_text (GTK_ENTRY
(username_entry)));
+ config->auth.username = entry_text_dup (username_entry);
if (STREQ (config->auth.username, "")) {
gtk_label_set_text (GTK_LABEL (spinner_message),
_("error: No user name. If in doubt, use
\"root\"."));
@@ -450,7 +460,7 @@ test_connection_clicked (GtkWidget *w, gpointer data)
errors++;
}
free (config->auth.password);
- config->auth.password = strdup (gtk_entry_get_text (GTK_ENTRY
(password_entry)));
+ config->auth.password = entry_text_dup (password_entry);
free (config->auth.identity.url);
identity_str = gtk_entry_get_text (GTK_ENTRY (identity_entry));
@@ -2064,7 +2074,7 @@ start_conversion_clicked (GtkWidget *w, gpointer data)
/* Unpack dialog fields and check them. */
free (config->guestname);
- config->guestname = strdup (gtk_entry_get_text (GTK_ENTRY
(guestname_entry)));
+ config->guestname = entry_text_dup (guestname_entry);
if (STREQ (config->guestname, "")) {
dlg = gtk_message_dialog_new (GTK_WINDOW (conv_dlg),
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 05/11] gui: factor out tgl_btn_is_act()
Repeat the previous refactoring for
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button))
which is another source of overlong lines in "gui.c". The new function
is
again used in both the connection dialog and the conversion dialog.
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/gui.c b/gui.c
index 5c53883ff2ae..3c0f21ca87d0 100644
--- a/gui.c
+++ b/gui.c
@@ -160,6 +160,16 @@ entry_text_dup (GtkWidget *entry)
return strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
}
+/**
+ * Trivial helper (shorthand) function for getting the active/inactive state
+ * of a GTK_TOGGLE_BUTTON.
+ */
+static bool
+tgl_btn_is_act (GtkWidget *toggle_button)
+{
+ return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
+}
+
/*----------------------------------------------------------------------*/
/* Connection dialog. */
@@ -360,7 +370,7 @@ username_changed_callback (GtkWidget *w, gpointer data)
str = gtk_entry_get_text (GTK_ENTRY (username_entry));
username_is_root = str != NULL && STREQ (str, "root");
- sudo_is_set = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sudo_button));
+ sudo_is_set = tgl_btn_is_act (sudo_button);
/* The sudo button is sensitive if:
* - The username is not "root", or
@@ -470,7 +480,7 @@ test_connection_clicked (GtkWidget *w, gpointer data)
config->auth.identity.url = NULL;
config->auth.identity.file_needs_update = 1;
- config->auth.sudo = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
(sudo_button));
+ config->auth.sudo = tgl_btn_is_act (sudo_button);
if (errors)
return;
@@ -1713,7 +1723,7 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer
data)
static bool
get_phys_topo_from_conv_dlg (void)
{
- return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vcpu_topo));
+ return tgl_btn_is_act (vcpu_topo);
}
static int
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 06/11] gui: flatten get_phys_topo_from_conv_dlg()
At this point, the get_phys_topo_from_conv_dlg() function has become
useless -- it doesn't save any work, so flatten (inline) its definition at
all call sites, and remove the declaration and the definition.
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/gui.c b/gui.c
index 3c0f21ca87d0..e29a9534a195 100644
--- a/gui.c
+++ b/gui.c
@@ -686,7 +686,6 @@ static void start_conversion_clicked (GtkWidget *w, gpointer
data);
static void vcpu_topo_toggled (GtkWidget *w, gpointer data);
static void vcpus_or_memory_check_callback (GtkWidget *w, gpointer data);
static void notify_ui_callback (int type, const char *data);
-static bool get_phys_topo_from_conv_dlg (void);
static int get_vcpus_from_conv_dlg (void);
static uint64_t get_memory_from_conv_dlg (void);
@@ -1662,7 +1661,7 @@ vcpu_topo_toggled (GtkWidget *w, gpointer data)
unsigned vcpus;
char vcpus_str[64];
- phys_topo = get_phys_topo_from_conv_dlg ();
+ phys_topo = tgl_btn_is_act (vcpu_topo);
if (phys_topo) {
struct cpu_topo topo;
@@ -1720,12 +1719,6 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer
data)
gtk_label_set_text (GTK_LABEL (target_warning_label), "");
}
-static bool
-get_phys_topo_from_conv_dlg (void)
-{
- return tgl_btn_is_act (vcpu_topo);
-}
-
static int
get_vcpus_from_conv_dlg (void)
{
@@ -2099,7 +2092,7 @@ start_conversion_clicked (GtkWidget *w, gpointer data)
return;
}
- config->vcpu.phys_topo = get_phys_topo_from_conv_dlg ();
+ config->vcpu.phys_topo = tgl_btn_is_act (vcpu_topo);
config->vcpu.cores = get_vcpus_from_conv_dlg ();
config->memory = get_memory_from_conv_dlg ();
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 07/11] gui: wrap overlong function declaration lines
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/gui.c b/gui.c
index e29a9534a195..f3dbea7d725a 100644
--- a/gui.c
+++ b/gui.c
@@ -672,8 +672,13 @@ static void populate_removable_store (GtkListStore
*removable_store,
static void populate_removable (GtkTreeView *removable_list_p,
const char * const *removable);
static void populate_interfaces (GtkTreeView *interfaces_list_p);
-static void toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer
data);
-static void network_edited_callback (GtkCellRendererToggle *cell, gchar
*path_str, gchar *new_text, gpointer data);
+static void toggled (GtkCellRendererToggle *cell,
+ gchar *path_str,
+ gpointer data);
+static void network_edited_callback (GtkCellRendererToggle *cell,
+ gchar *path_str,
+ gchar *new_text,
+ gpointer data);
static gboolean maybe_identify_click (GtkWidget *interfaces_list_p,
GdkEventButton *event,
gpointer data);
@@ -1755,10 +1760,14 @@ static void *start_conversion_thread (void *data);
static gboolean conversion_error (gpointer user_data);
static gboolean conversion_finished (gpointer user_data);
static void cancel_conversion_dialog (GtkWidget *w, gpointer data);
-static void activate_action (GSimpleAction *action, GVariant *parameter,
gpointer user_data);
+static void activate_action (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data);
static void shutdown_clicked (GtkWidget *w, gpointer data);
static void reboot_clicked (GtkWidget *w, gpointer data);
-static gboolean close_running_dialog (GtkWidget *w, GdkEvent *event, gpointer
data);
+static gboolean close_running_dialog (GtkWidget *w,
+ GdkEvent *event,
+ gpointer data);
static const GActionEntry shutdown_actions[] = {
{ .name = "shutdown", .activate = activate_action },
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 08/11] gui: wrap string literals
In "gui.c", we use many long string literals, for labels, warnings,
tooltips etc. Wrap them so the source code never exceeds 80 characters in
width.
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 58 ++++++++++++++++----
1 file changed, 46 insertions(+), 12 deletions(-)
diff --git a/gui.c b/gui.c
index f3dbea7d725a..f86cab649785 100644
--- a/gui.c
+++ b/gui.c
@@ -215,7 +215,8 @@ create_connection_dialog (struct config *config)
gtk_window_set_resizable (GTK_WINDOW (conn_dlg), FALSE);
/* The main dialog area. */
- intro = gtk_label_new (_("Connect to a virt-v2v conversion server over
SSH:"));
+ intro = gtk_label_new (_("Connect to a virt-v2v conversion server over
"
+ "SSH:"));
gtk_label_set_line_wrap (GTK_LABEL (intro), TRUE);
set_padding (intro, 10, 10);
@@ -457,7 +458,8 @@ test_connection_clicked (GtkWidget *w, gpointer data)
if (sscanf (port_str, "%d", &config->remote.port) != 1 ||
config->remote.port <= 0 || config->remote.port >= 65536) {
gtk_label_set_text (GTK_LABEL (spinner_message),
- _("error: Invalid port number. If in doubt, use
\"22\"."));
+ _("error: Invalid port number. If in doubt, use
"
+ "\"22\"."));
gtk_widget_grab_focus (port_entry);
errors++;
}
@@ -838,7 +840,17 @@ create_conversion_dialog (struct config *config,
set_alignment (o_label, 1., 0.5);
o_combo = gtk_combo_box_text_new ();
gtk_label_set_mnemonic_widget (GTK_LABEL (o_label), o_combo);
- gtk_widget_set_tooltip_markup (o_combo, _("<b>libvirt</b>
means send the converted guest to libvirt-managed KVM on the conversion server.
<b>local</b> means put it in a directory on the conversion server.
<b>rhv</b> means write it to RHV-M/oVirt. <b>glance</b>
means write it to OpenStack Glance. See the virt-v2v(1) manual page for more
information about output options."));
+ gtk_widget_set_tooltip_markup (o_combo,
+ _("<b>libvirt</b> means send
the converted "
+ "guest to libvirt-managed KVM on the
"
+ "conversion server. "
+ "<b>local</b> means put it
in a directory "
+ "on the conversion server. "
+ "<b>rhv</b> means write it
to RHV-M/oVirt. "
+ "<b>glance</b> means write
it to OpenStack "
+ "Glance. "
+ "See the virt-v2v(1) manual page for
more "
+ "information about output
options."));
repopulate_output_combo (config);
table_attach (output_tbl, o_combo,
1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
@@ -850,7 +862,12 @@ create_conversion_dialog (struct config *config,
set_alignment (oc_label, 1., 0.5);
oc_entry = gtk_entry_new ();
gtk_label_set_mnemonic_widget (GTK_LABEL (oc_label), oc_entry);
- gtk_widget_set_tooltip_markup (oc_entry, _("For
<b>libvirt</b> only, the libvirt connection URI, or leave blank to
add the guest to the default libvirt instance on the conversion server. For
others, leave this field blank."));
+ gtk_widget_set_tooltip_markup (oc_entry,
+ _("For <b>libvirt</b> only,
the libvirt "
+ "connection URI, or leave blank to add
the "
+ "guest to the default libvirt instance
on "
+ "the conversion server. "
+ "For others, leave this field
blank."));
if (config->output.connection != NULL)
gtk_entry_set_text (GTK_ENTRY (oc_entry), config->output.connection);
table_attach (output_tbl, oc_entry,
@@ -863,7 +880,12 @@ create_conversion_dialog (struct config *config,
set_alignment (os_label, 1., 0.5);
os_entry = gtk_entry_new ();
gtk_label_set_mnemonic_widget (GTK_LABEL (os_label), os_entry);
- gtk_widget_set_tooltip_markup (os_entry, _("For
<b>local</b>, put the directory name on the conversion server. For
<b>rhv</b>, put the Export Storage Domain (server:/mountpoint). For
others, leave this field blank."));
+ gtk_widget_set_tooltip_markup (os_entry,
+ _("For <b>local</b>, put the
directory name "
+ "on the conversion server. "
+ "For <b>rhv</b>, put the
Export Storage "
+ "Domain (server:/mountpoint). "
+ "For others, leave this field
blank."));
if (config->output.storage != NULL)
gtk_entry_set_text (GTK_ENTRY (os_entry), config->output.storage);
table_attach (output_tbl, os_entry,
@@ -876,7 +898,10 @@ create_conversion_dialog (struct config *config,
set_alignment (of_label, 1., 0.5);
of_entry = gtk_entry_new ();
gtk_label_set_mnemonic_widget (GTK_LABEL (of_label), of_entry);
- gtk_widget_set_tooltip_markup (of_entry, _("The output disk format,
typically <b>raw</b> or <b>qcow2</b>. If blank,
defaults to <b>raw</b>."));
+ gtk_widget_set_tooltip_markup (of_entry,
+ _("The output disk format, typically
"
+ "<b>raw</b> or
<b>qcow2</b>. "
+ "If blank, defaults to
<b>raw</b>."));
if (config->output.format != NULL)
gtk_entry_set_text (GTK_ENTRY (of_entry), config->output.format);
table_attach (output_tbl, of_entry,
@@ -947,7 +972,9 @@ create_conversion_dialog (struct config *config,
/* See maybe_identify_click below for what we're doing. */
g_signal_connect (interfaces_list, "button-press-event",
G_CALLBACK (maybe_identify_click), NULL);
- gtk_widget_set_tooltip_markup (interfaces_list, _("Left click on an
interface name to flash the light on the physical interface."));
+ gtk_widget_set_tooltip_markup (interfaces_list,
+ _("Left click on an interface name to
flash "
+ "the light on the physical
interface."));
populate_interfaces (GTK_TREE_VIEW (interfaces_list));
scrolled_window_add_with_viewport (interfaces_sw, interfaces_list);
gtk_container_add (GTK_CONTAINER (interfaces_frame), interfaces_sw);
@@ -1273,7 +1300,9 @@ populate_interfaces (GtkTreeView *interfaces_list_p)
"%s\n"
"%s"
"</small>\n"
- "<small><u><span
foreground=\"blue\">Identify
interface</span></u></small>",
+ "<small><u><span
foreground=\"blue\">"
+ "Identify interface"
+ "</span></u></small>",
if_name,
if_addr ? : _("Unknown"),
if_vendor ? : _("Unknown")) == -1)
@@ -1699,7 +1728,8 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer
data)
gtk_widget_show (vcpus_warning);
warning = concat_warning (warning,
- _("Number of virtual CPUs is larger than
what is supported for KVM (max: %d)."),
+ _("Number of virtual CPUs is larger than
what is "
+ "supported for KVM (max: %d)."),
MAX_SUPPORTED_VCPUS);
}
else
@@ -1709,7 +1739,8 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer
data)
gtk_widget_show (memory_warning);
warning = concat_warning (warning,
- _("Memory size is larger than what is
supported for KVM (max: %" PRIu64 ")."),
+ _("Memory size is larger than what is
supported "
+ "for KVM (max: %" PRIu64
")."),
MAX_SUPPORTED_MEMORY_MB);
}
else
@@ -1717,7 +1748,9 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer
data)
if (warning != NULL) {
warning = concat_warning (warning,
- _("If you ignore this warning, conversion
can still succeed, but the guest may not work or may not be supported on the
target."));
+ _("If you ignore this warning, conversion
can "
+ "still succeed, but the guest may not work
or "
+ "may not be supported on the
target."));
gtk_label_set_text (GTK_LABEL (target_warning_label), warning);
}
else
@@ -2115,7 +2148,8 @@ start_conversion_clicked (GtkWidget *w, gpointer data)
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("No disks were selected for
conversion.\n"
- "At least one fixed hard disk must be
selected.\n"));
+ "At least one fixed hard disk must be
"
+ "selected.\n"));
gtk_window_set_title (GTK_WINDOW (dlg), _("Error"));
gtk_dialog_run (GTK_DIALOG (dlg));
gtk_widget_destroy (dlg);
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 09/11] gui: expose "p2v.output.misc" (-oo)
Introduce a new GTK_ENTRY field in the Output options box. Similarly to
"p2v.output.misc" on the kernel cmdline, the contents of this
GTK_ENTRY
are a comma-separated list of OPTION=VALUE options, where each option is
passed to virt-v2v as the argument of a separate "-oo" option.
Refresh the manual accordingly.
For initially populating the text entry (in case the kernel command line
specified "p2v.output.misc"), call the guestfs_int_join_strings()
function
that we imported previously in this series.
For unpacking the contents in start_conversion_clicked(), call
guestfs_int_split_string(), just like the generated kernel cmdline parser
does, in update_config_from_kernel_cmdline() [kernel-config.c].
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 47 +++++++++++++++++++-
virt-p2v.pod | 2 +
2 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/gui.c b/gui.c
index f86cab649785..040b43dd235d 100644
--- a/gui.c
+++ b/gui.c
@@ -116,7 +116,7 @@ static GtkWidget *conn_dlg,
static GtkWidget *conv_dlg,
*guestname_entry, *vcpu_topo, *vcpus_entry, *memory_entry,
*vcpus_warning, *memory_warning, *target_warning_label,
- *o_combo, *oc_entry, *os_entry, *of_entry, *oa_combo,
+ *o_combo, *oc_entry, *os_entry, *of_entry, *oa_combo, *oo_entry,
*info_label,
*disks_list, *removable_list, *interfaces_list;
static int vcpus_entry_when_last_sensitive;
@@ -674,6 +674,7 @@ static void populate_removable_store (GtkListStore
*removable_store,
static void populate_removable (GtkTreeView *removable_list_p,
const char * const *removable);
static void populate_interfaces (GtkTreeView *interfaces_list_p);
+static void populate_misc_opts (GtkEntry *entry, char * const *misc);
static void toggled (GtkCellRendererToggle *cell,
gchar *path_str,
gpointer data);
@@ -733,7 +734,7 @@ create_conversion_dialog (struct config *config,
GtkWidget *target_frame, *target_vbox, *target_tbl;
GtkWidget *guestname_label, *vcpus_label, *memory_label;
GtkWidget *output_frame, *output_vbox, *output_tbl;
- GtkWidget *o_label, *oa_label, *oc_label, *of_label, *os_label;
+ GtkWidget *o_label, *oa_label, *oc_label, *of_label, *os_label, *oo_label;
GtkWidget *info_frame;
GtkWidget *disks_frame, *disks_sw;
GtkWidget *removable_frame, *removable_sw;
@@ -929,6 +930,23 @@ create_conversion_dialog (struct config *config,
table_attach (output_tbl, oa_combo,
1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
+ row++;
+ oo_label = gtk_label_new_with_mnemonic (_("M_isc. options
(-oo):"));
+ table_attach (output_tbl, oo_label,
+ 0, 1, row, GTK_FILL, GTK_FILL, 1, 1);
+ set_alignment (oo_label, 1., 0.5);
+ oo_entry = gtk_entry_new ();
+ gtk_label_set_mnemonic_widget (GTK_LABEL (oo_label), oo_entry);
+ gtk_widget_set_tooltip_markup (oo_entry,
+ _("A comma-separated list of "
+ "<b>OPTION=VALUE</b>
output-specific "
+ "options. Each option is passed to
"
+ "virt-v2v as the argument of a separate
"
+ "<b>-oo</b>
option."));
+ populate_misc_opts (GTK_ENTRY (oo_entry), config->output.misc);
+ table_attach (output_tbl, oo_entry,
+ 1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
+
gtk_box_pack_start (GTK_BOX (output_vbox), output_tbl, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (output_frame), output_vbox);
@@ -1356,6 +1374,25 @@ populate_interfaces (GtkTreeView *interfaces_list_p)
G_CALLBACK (network_edited_callback), interfaces_store);
}
+/**
+ * Populate the C<Misc. options> text entry.
+ */
+static void
+populate_misc_opts (GtkEntry *entry, char * const *misc)
+{
+ char *joined;
+
+ if (misc == NULL)
+ return;
+
+ joined = guestfs_int_join_strings (",", misc);
+ if (joined == NULL)
+ error (EXIT_FAILURE, errno, "malloc");
+
+ gtk_entry_set_text (entry, joined);
+ free(joined);
+}
+
static void
toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
{
@@ -2197,6 +2234,12 @@ start_conversion_clicked (GtkWidget *w, gpointer data)
else
config->output.storage = NULL;
+ str = gtk_entry_get_text (GTK_ENTRY (oo_entry));
+ guestfs_int_free_string_list (config->output.misc);
+ config->output.misc = guestfs_int_split_string (',', str);
+ if (config->output.misc == NULL)
+ error (EXIT_FAILURE, errno, "strdup");
+
/* Display the UI for conversion. */
show_running_dialog ();
diff --git a/virt-p2v.pod b/virt-p2v.pod
index ecdae46eaaf6..a7e8edcbf9f0 100644
--- a/virt-p2v.pod
+++ b/virt-p2v.pod
@@ -175,6 +175,8 @@ first-time virt-p2v user.
?
? Output allocation (-oa): [sparse ?]
?
+ ? Misc. options (-oo): [___________________]
+ ?
All output options and paths are relative to the conversion server
(I<not> to the physical server).
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 10/11] Reenable the OpenStack output mode
With "-oo" exposed on the GUI, the reason for disabling the openstack
driver (from commit b74c126629e3, "Ignore 'openstack' driver",
2020-03-16)
is gone. Reenable the driver.
At the same time, add two small openstack-related hints to the GUI.
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
gui.c | 5 ++++-
ssh.c | 5 ++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/gui.c b/gui.c
index 040b43dd235d..d61069dc0404 100644
--- a/gui.c
+++ b/gui.c
@@ -848,6 +848,8 @@ create_conversion_dialog (struct config *config,
"<b>local</b> means put it
in a directory "
"on the conversion server. "
"<b>rhv</b> means write it
to RHV-M/oVirt. "
+ "<b>openstack</b> means
write it to "
+ "OpenStack. "
"<b>glance</b> means write
it to OpenStack "
"Glance. "
"See the virt-v2v(1) manual page for
more "
@@ -942,7 +944,8 @@ create_conversion_dialog (struct config *config,
"<b>OPTION=VALUE</b>
output-specific "
"options. Each option is passed to
"
"virt-v2v as the argument of a separate
"
- "<b>-oo</b>
option."));
+ "<b>-oo</b> option. Mainly
useful for "
+ "<b>openstack</b>."));
populate_misc_opts (GTK_ENTRY (oo_entry), config->output.misc);
table_attach (output_tbl, oo_entry,
1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
diff --git a/ssh.c b/ssh.c
index 513a20318359..ec44e77895a5 100644
--- a/ssh.c
+++ b/ssh.c
@@ -1015,11 +1015,10 @@ static void
add_output_driver (const char *name)
{
/* Ignore the 'vdsm' driver, since that should only be used by VDSM.
- * Ignore the 'openstack' and 'rhv-upload' drivers, since we
do not
- * support passing all the options for them.
+ * Ignore the 'rhv-upload' driver, since we do not support passing
all the
+ * options for it.
*/
if (STRNEQ (name, "vdsm") &&
- STRNEQ (name, "openstack") &&
STRNEQ (name, "rhv-upload"))
add_option ("output", &output_drivers, name);
}
Laszlo Ersek
2023-Jan-30 14:22 UTC
[Libguestfs] [p2v PATCH 11/11] make-kickstart: add URLs for RHEL-9
This is similar to commit 2d608e252bbe ("Add kickstart URLs for RHEL
8",
2020-02-18), but we also need to add EPEL-9 (cf. commit f4c7ae6ba98f,
"make-disk: inject EPEL9 repo in RHEL9 disk image", 2023-01-20).
Cc: Alban Lecorps <alban.lecorps at ubisoft.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1792141
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
virt-p2v-make-kickstart.in | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/virt-p2v-make-kickstart.in b/virt-p2v-make-kickstart.in
index 7f215fc4ebb4..d16161f97398 100644
--- a/virt-p2v-make-kickstart.in
+++ b/virt-p2v-make-kickstart.in
@@ -190,6 +190,19 @@ repo --name=rhel7_${minor}_server_optional
--baseurl=$baseurl/Server-optional/$a
repos="$repos
repo --name=rhel8_${minor}_0_baseos --baseurl=$baseurl/BaseOS/$arch/os $proxy
repo --name=rhel8_${minor}_0_appstream --baseurl=$baseurl/AppStream/$arch/os
$proxy
+"
+ # Avoid recommends by default.
+ packages_options="--excludeWeakdeps"
+ ;;
+ rhel-9.*)
+ minor=$( echo "$repo" | sed
's/rhel-[0-9]*\.\([0-9]*\)/\1/' )
+ baseurl=http://download.devel.redhat.com/released/RHEL-9/9.$minor.0
+ # '$basearch' cannot be used in kickstart, so:
+ arch=`uname -m`
+ repos="$repos
+repo --name=rhel9_${minor}_0_baseos --baseurl=$baseurl/BaseOS/$arch/os $proxy
+repo --name=rhel9_${minor}_0_appstream --baseurl=$baseurl/AppStream/$arch/os
$proxy
+repo --name=epel9
--mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-9\\\\&arch=$arch
"
# Avoid recommends by default.
packages_options="--excludeWeakdeps"
Seemingly Similar Threads
- [PATCH 0/2] p2v: Allow virt-p2v to be built with Gtk 2 or 3.
- [PATCH v2 0/3] p2v: Allow virt-p2v to be built with Gtk 2 or 3.
- [PATCH 0/2] p2v: Warn if vcpus or memory would be larger than supported by RHEL (RHBZ#823758).
- Re: [PATCH 1/2] p2v: Factor out code for parsing vcpus & memory from conversion dialog.
- viewer updates for fedora submission