[PATCH] Add image probe function

From: Royce Lv <lvroyce@linux.vnet.ibm.com> Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it. Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass +class ImageFormatError(KimchiException): + pass class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os() + if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + + return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1]) -- 1.8.3.2

good. seems python-libguestfs is easy to use than shell. :-) See inline comments below. On 06/18/2014 05:35 PM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it.
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py
diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools
Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools
Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass
+class ImageFormatError(KimchiException): + pass
class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os()
Not sure inspect_os will raise some exception when they are mounted or the disk is encrypted. I have try opensuse. it failed to get the os info. Also try ubuntu 12.10 and rhel 6.4, F17. Not try windows. def inspect_os (self): """ ... This function uses other libguestfs features such as "g.mount_ro" and "g.umount_all" in order to mount and unmount filesystems and look at the contents. This should be called with no disks currently mounted. The function may also use Augeas, so any existing Augeas handle will be closed. This function cannot decrypt encrypted disks. The caller must do that first (supplying the necessary keys) if the disk is encrypted. ... """
+ if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + g.close()? seems it is not needed? but seems it will calls called implicitly the program ends.
def close (self): """Explicitly close the guestfs handle. The handle is closed implicitly when its reference count goes to zero (eg. when it goes out of scope or the program ends). This call is only needed if you want to force the handle to close now. After calling this, the program must not call any method on the handle (except the implicit call to __del__ which happens when the final reference is cleaned up). """ def shutdown (self): """This is the opposite of "g.launch". It performs an orderly shutdown of the backend process(es). If the autosync flag is set (which is the default) then the disk image is synchronized. If the subprocess exits with an error then this function will return an error, which should *not* be ignored (it may indicate that the disk image could not be written out properly). It is safe to call this multiple times. Extra calls are ignored. This call does *not* close or free up the handle. You still need to call "g.close" afterwards. "g.close" will call this if you don't do it explicitly, but note that any errors are ignored in that case. """
+ return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1])
-- Thanks and best regards! Sheldon Feng(???)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

On 2014?06?18? 22:56, Sheldon wrote:
good. seems python-libguestfs is easy to use than shell. :-)
See inline comments below.
On 06/18/2014 05:35 PM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv<lvroyce@linux.vnet.ibm.com>
Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it.
Signed-off-by: Royce Lv<lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py
diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools
Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools
Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass
+class ImageFormatError(KimchiException): + pass
class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os()
Not sure inspect_os will raise some exception when they are mounted or the disk is encrypted. If it is encrypted, there is no way that libguestfs can decrypted according to me. For mounted or encrypted disks, I will add exception handling for them. I have try opensuse. it failed to get the os info.
Also try ubuntu 12.10 and rhel 6.4, F17. Not try windows.
def inspect_os (self): """ ... This function uses other libguestfs features such as "g.mount_ro" and "g.umount_all" in order to mount and unmount filesystems and look at the contents. This should be called with no disks currently mounted. The function may also use Augeas, so any existing Augeas handle will be closed.
This function cannot decrypt encrypted disks. The caller must do that first (supplying the necessary keys) if the disk is encrypted. ... """
+ if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + g.close()? ACK. seems it is not needed? but seems it will calls called implicitly the program ends.
def close (self): """Explicitly close the guestfs handle.
The handle is closed implicitly when its reference count goes to zero (eg. when it goes out of scope or the program ends).
This call is only needed if you want to force the handle to close now. After calling this, the program must not call any method on the handle (except the implicit call to __del__ which happens when the final reference is cleaned up). """
def shutdown (self): """This is the opposite of "g.launch". It performs an orderly shutdown of the backend process(es). If the autosync flag is set (which is the default) then the disk image is synchronized.
If the subprocess exits with an error then this function will return an error, which should *not* be ignored (it may indicate that the disk image could not be written out properly).
It is safe to call this multiple times. Extra calls are ignored.
This call does *not* close or free up the handle. You still need to call "g.close" afterwards.
"g.close" will call this if you don't do it explicitly, but note that any errors are ignored in that case. """
+ return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1])
-- Thanks and best regards!
Sheldon Feng(???)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

On 06/18/2014 06:35 AM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it.
Do you mean to use libguestfs instead of our own code - isoinfo.py?
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py
diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools
Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools
Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass
+class ImageFormatError(KimchiException): + pass
class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os() + if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + + return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1])

On 06/27/2014 05:28 AM, Aline Manera wrote:
On 06/18/2014 06:35 AM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it.
Do you mean to use libguestfs instead of our own code - isoinfo.py? No. The isoinfo.py can be replaced by linux shell command, such as "file" or "iso" related command. But I think it is not necessary to replace it. Not sure the libguestfs can also support the same function of isoinfo.py. If it can we can replace the isoinfo.py
Here, I think */We should support create VM from an image. /* *Create a VM from image is faster than ISO. * So when we create a image from image, we had better to know the OS distro and version. There are several sources of an image. 1. local image 2. remote image. Same as Openstack glance. Now all OS distro support both remote ISO and image. 3. create one from a VM. User may take several snapshots for a VM. this way we had better to merge all snapshots to one. Maybe we should support a image-template pool. move the above type images to this pool.
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py
diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools
Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools
Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass
+class ImageFormatError(KimchiException): + pass
class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os() + if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + + return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1])
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
-- Thanks and best regards! Sheldon Feng(???)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

On 06/27/2014 09:00 AM, Sheldon wrote:
On 06/27/2014 05:28 AM, Aline Manera wrote:
On 06/18/2014 06:35 AM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Image file probe will be used in identify image file os info and generate reasonable configuration for it. This will be useful when import image and create a vm from it.
Do you mean to use libguestfs instead of our own code - isoinfo.py? No. The isoinfo.py can be replaced by linux shell command, such as "file" or "iso" related command. But I think it is not necessary to replace it. Not sure the libguestfs can also support the same function of isoinfo.py. If it can we can replace the isoinfo.py
Here, I think */We should support create VM from an image. /* *Create a VM from image is faster than ISO. * So when we create a image from image, we had better to know the OS distro and version.
There are several sources of an image. 1. local image
2. remote image. Same as Openstack glance. Now all OS distro support both remote ISO and image.
3. create one from a VM. User may take several snapshots for a VM. this way we had better to merge all snapshots to one.
Maybe we should support a image-template pool. move the above type images to this pool.
for remote image should we support steaming install?
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- docs/README.md | 9 ++++++--- src/kimchi/exception.py | 2 ++ src/kimchi/imageinfo.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/kimchi/imageinfo.py
diff --git a/docs/README.md b/docs/README.md index c658637..c341a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,8 @@ Install Dependencies PyPAM m2crypto python-jsonschema rpm-build \ qemu-kvm python-psutil python-ethtool sos \ python-ipaddr python-lxml nfs-utils \ - iscsi-initiator-utils libxslt pyparted nginx + iscsi-initiator-utils libxslt pyparted nginx \ + python-libguestfs libguestfs-tools # If using RHEL6, install the following additional packages: $ sudo yum install python-unittest2 python-ordereddict # Restart libvirt to allow configuration changes to take effect @@ -75,7 +76,8 @@ for more information on how to configure your system to access this repository. python-pam python-m2crypto python-jsonschema \ qemu-kvm libtool python-psutil python-ethtool \ sosreport python-ipaddr python-lxml nfs-common \ - open-iscsi lvm2 xsltproc python-parted nginx + open-iscsi lvm2 xsltproc python-parted nginx \ + python-guestfs libguestfs-tools
Packages version requirement: python-jsonschema >= 1.3.0 @@ -89,7 +91,8 @@ for more information on how to configure your system to access this repository. python-pam python-M2Crypto python-jsonschema \ rpm-build kvm python-psutil python-ethtool \ python-ipaddr python-lxml nfs-client open-iscsi \ - libxslt-tools python-xml python-parted + libxslt-tools python-xml python-parted \ + python-libguestfs guestfs-tools
Packages version requirement: python-psutil >= 0.6.0 diff --git a/src/kimchi/exception.py b/src/kimchi/exception.py index fcf60cc..a983d46 100644 --- a/src/kimchi/exception.py +++ b/src/kimchi/exception.py @@ -88,6 +88,8 @@ class InvalidOperation(KimchiException): class IsoFormatError(KimchiException): pass
+class ImageFormatError(KimchiException): + pass
class TimeoutExpired(KimchiException): pass diff --git a/src/kimchi/imageinfo.py b/src/kimchi/imageinfo.py new file mode 100644 index 0000000..d57ecac --- /dev/null +++ b/src/kimchi/imageinfo.py @@ -0,0 +1,42 @@ +# +# Kimchi +# +# Copyright IBM Corp, 2013 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import guestfs + + +def probe_image(image_path): + g = guestfs.GuestFS(python_return_dict=True) + g.add_drive_opts(image_path, readonly=1) + g.launch() + + roots = g.inspect_os() + if len(roots) == 0: + raise ImageFormatError("No os found in given image.") + + for root in roots: + version = "%d.%d" % (g.inspect_get_major_version(root), + g.inspect_get_minor_version(root)) + distro = "%s" % (g.inspect_get_distro(root)) + + return (distro, version) + + +if __name__ == '__main__': + print probe_image(sys.argv[1])
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
-- Thanks and best regards!
Sheldon Feng(???)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
-- Thanks and best regards! Sheldon Feng(???)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center
participants (4)
-
Aline Manera
-
lvroyce@linux.vnet.ibm.com
-
Royce Lv
-
Sheldon