[Libguestfs] [PATCH v2 1/2] v2v: OVF: write ovirt:id attribute for the OS in OVirt flavour
Michal Skrivanek
mskrivan at redhat.com
Thu Apr 5 12:53:37 UTC 2018
> On 5 Apr 2018, at 14:16, Tomáš Golembiovský <tgolembi at redhat.com> wrote:
>
> On Thu, 05 Apr 2018 13:56:11 +0200
> Pino Toscano <ptoscano at redhat.com> wrote:
>
>> On Thursday, 5 April 2018 13:45:53 CEST Tomáš Golembiovský wrote:
>>> On Thu, 5 Apr 2018 10:34:33 +0200
>>> Pino Toscano <ptoscano at redhat.com> wrote:
>>>
>>>> When writing the OVF in OVirt flavour, add a ovirt:id attribute to the
>>>> OperatingSystemSection tag: this attribute represents the numeric value
>>>> of the ostype ID, which is ignored by oVirt when parsing OVFs in API
>>>> mode.
>>>> ---
>>>> v2v/create_ovf.ml | 202 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>>> 1 file changed, 201 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml
>>>> index 64edd2b86..f56c4cb64 100644
>>>> --- a/v2v/create_ovf.ml
>>>> +++ b/v2v/create_ovf.ml
>>>> @@ -216,6 +216,203 @@ and get_ostype = function
>>>> typ distro major minor arch product;
>>>> "Unassigned"
>>>>
>>>> +(* Determine the ovirt:id attribute from libguestfs inspection.
>>>> + * See ovirt-engine sources, file:
>>>> + * packaging/conf/osinfo-defaults.properties
>>>> + * and also:
>>>> + * https://bugzilla.redhat.com/show_bug.cgi?id=1219857#c9
>>>> + *)
>>>> +and get_ovirt_osid = function
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 3;
>>>> + i_arch = "i386" } ->
>>>> + 9
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 3;
>>>> + i_arch = "x86_64" } ->
>>>> + 15
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 4;
>>>> + i_arch = "i386" } ->
>>>> + 8
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 4;
>>>> + i_arch = "x86_64" } ->
>>>> + 14
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 5;
>>>> + i_arch = "i386" } ->
>>>> + 7
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 5;
>>>> + i_arch = "x86_64" } ->
>>>> + 13
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6;
>>>> + i_arch = "i386" } ->
>>>> + 18
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6;
>>>> + i_arch = "x86_64" } ->
>>>> + 19
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6;
>>>> + i_minor_version = min; i_arch = ("ppc64"|"ppc64le") } when min >= 9 ->
>>>> + 1007
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 6;
>>>> + i_arch = ("ppc64"|"ppc64le") } ->
>>>> + 1003
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7;
>>>> + i_arch = "x86_64" } ->
>>>> + 24
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7;
>>>> + i_arch = ("ppc64"|"ppc64le") } ->
>>>> + 1006
>>>> +
>>>> + | { i_type = "linux"; i_distro = ("rhel"|"centos"); i_major_version = 7;
>>>> + i_arch = "s390x" } ->
>>>> + 2003
>>>> +
>>>> + | { i_type = "linux"; i_distro = "sles"; i_major_version = 11;
>>>> + i_arch = "x86_64" } ->
>>>> + 1193
>>>
>>> Shouldn't we here and for the one below use: i_major_version >= 11?
>>> There's also SLES 12.
>>
>> Please note that this function is modelled after the get_ostype function
>> in the same file, so it inherits basically all its results (at most
>> adding a couple more).
>>
>> In this case, get_ostype returns sles_11/sles_11_ppc64 only for that
>> version, so in case I need to adapt get_ostype first.
>>
>
> Ok, we can treat SLES12 as generic Linux for now if that's easier.
>
>>>> +
>>>> + | { i_type = "linux"; i_distro = "sles"; i_major_version = 11;
>>>> + i_arch = "ppc64" | "ppc64le" } ->
>>>> + 1004
>>>> +
>>>> + | { i_type = "linux"; i_distro = "sles"; i_major_version = 12;
>>>> + i_arch = "s390x" } ->
>>>> + 2004
>>>> +
>>>> + (* Only Debian 7 is available, so use it for any 7+ version. *)
>>>> + | { i_type = "linux"; i_distro = "debian"; i_major_version = v }
>>>> + when v >= 7 ->
>>>> + 1300
>>>> +
>>>> + (* Only Ubuntu 12.04 to 14.04 are available, so use them starting
>>>> + * from 12.04, and 14.04 for anything after it.
>>>> + *)
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v;
>>>> + i_arch = ("ppc64"|"ppc64le") } when v >= 14 ->
>>>> + 1005
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v;
>>>> + i_arch = "s390x" } when v >= 16 ->
>>>> + 2005
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = v }
>>>> + when v >= 14 ->
>>>> + 1256
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 12;
>>>> + i_minor_version = 4 } ->
>>>> + 1252
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 12;
>>>> + i_minor_version = 10 } ->
>>>> + 1253
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 13;
>>>> + i_minor_version = 4 } ->
>>>> + 1254
>>>> +
>>>> + | { i_type = "linux"; i_distro = "ubuntu"; i_major_version = 13;
>>>> + i_minor_version = 10 } ->
>>>> + 1255
>>>> +
>>>> + | { i_type = "linux"; i_arch = ("ppc64"|"ppc64le") } ->
>>>> + 1002
>>>> +
>>>> + | { i_type = "linux"; i_arch = "s390x" } ->
>>>> + 2002
>>>> +
>>>> + | { i_type = "linux" } ->
>>>> + 5
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 5; i_minor_version = 1 } ->
>>>> + 1 (* no architecture differentiation of XP on RHV *)
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 5; i_minor_version = 2;
>>>> + i_product_name = product } when String.find product "XP" >= 0 ->
>>>> + 1 (* no architecture differentiation of XP on RHV *)
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 5; i_minor_version = 2;
>>>> + i_arch = "i386" } ->
>>>> + 3
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 5; i_minor_version = 2;
>>>> + i_arch = "x86_64" } ->
>>>> + 10
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 0;
>>>> + i_arch = "i386" } ->
>>>> + 4
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 0;
>>>> + i_arch = "x86_64" } ->
>>>> + 16
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 1;
>>>> + i_arch = "i386" } ->
>>>> + 11
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 1;
>>>> + i_arch = "x86_64"; i_product_variant = "Client" } ->
>>>> + 12
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 1;
>>>> + i_arch = "x86_64" } ->
>>>> + 17
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 2;
>>>> + i_arch = "i386" } ->
>>>> + 20
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 2;
>>>> + i_arch = "x86_64"; i_product_variant = "Client" } ->
>>>> + 21
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 2;
>>>> + i_arch = "x86_64" } ->
>>>> + 23
>>>> +
>>>> + (* Treat Windows 8.1 client like Windows 8. See:
>>>> + * https://bugzilla.redhat.com/show_bug.cgi?id=1309580#c4
>>>> + *)
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 3;
>>>> + i_arch = "i386"; i_product_variant = "Client" } ->
>>>> + 20
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 3;
>>>> + i_arch = "x86_64"; i_product_variant = "Client" } ->
>>>> + 21
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 6; i_minor_version = 3;
>>>> + i_arch = "x86_64" } ->
>>>> + 23
>>>
>>> This one is Windows Server 2012R2 and should map to 25.
>>
>> There's a comment few lines above about treating win 8.1 as win 8.
>>
>
> Yes, but I believe it talks only about the desktop version.
>
>
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 10; i_minor_version = 0;
>>>> + i_arch = "i386" } ->
>>>> + 26
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 10; i_minor_version = 0;
>>>> + i_arch = "x86_64"; i_product_variant = "Client" } ->
>>>> + 27
>>>> +
>>>> + | { i_type = "windows"; i_major_version = 10; i_minor_version = 0;
>>>> + i_arch = "x86_64" } ->
>>>> + 29
>>>> +
>>>> + | { i_type = typ; i_distro = distro;
>>>> + i_major_version = major; i_minor_version = minor; i_arch = arch;
>>>> + i_product_name = product } ->
>>>> + warning (f_"unknown guest operating system: %s %s %d.%d %s (%s)")
>>>> + typ distro major minor arch product;
>>>> + 0
>>>> +
>>>
>>> There are also 1001 which is unspecified PPC and 2001 which is unspecified
>>> s390x. Maybe we want to use those too?
>>
>> They need to be added to get_ostype too, then; OTOH, they are for OSes
>> different than Linux, Windows, and FreeBSD, which are not supported by
>> v2v (only Linux, and Windows are). Hence, adding them is a bit
>> pointless at the moment.
>
> Ok, let's leave that as is, if that's easier.
>
>>>> (* Set the <Origin/> element based on the source hypervisor.
>>>> * https://bugzilla.redhat.com/show_bug.cgi?id=1342398#c6
>>>> * https://gerrit.ovirt.org/#/c/59147/
>>>> @@ -295,6 +492,7 @@ let rec create_ovf source targets guestcaps inspect
>>>> "xmlns:vssd", "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData";
>>>> "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance";
>>>> "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1/";
>>>> + "xmlns:ovirt", "http://www.ovirt.org/ovf";
>>>> "ovf:version", "0.9"
>>>> ] [
>>>> Comment generated_by;
>>>> @@ -357,8 +555,10 @@ let rec create_ovf source targets guestcaps inspect
>>>> ] in
>>>> (match ovf_flavour with
>>>> | OVirt ->
>>>> + let ovirt_osid = get_ovirt_osid inspect in
>>>> e "OperatingSystemSection" ["ovf:id", vm_uuid;
>>>
>>> Having UUID here does not make sense. We can use 0 which is "Unknown" or
>>> 1 wich is "Other".
>>
>> Note I did not add this ovf:id here :) ovirt-engine will ignore it
right, but it is more aligned with the actual standard. If we do not want to implement those DMTF ids (which is a lot of useless copy&paste) then let’s just put one generic number here at least (0 or 1), instead of something completely wrong
>> anyway, at least according to my reading of its OVF parser, as long
>> as ovirt:id is there.
>
> I know you didn't. I did. :)
>
> Tomas
>
> --
> Tomáš Golembiovský <tgolembi at redhat.com>
More information about the Libguestfs
mailing list