[Kimchi-devel] [PATCH] Add image probe function
Royce Lv
lvroyce at linux.vnet.ibm.com
Wed Jul 2 03:16:01 UTC 2014
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 at linux.vnet.ibm.com wrote:
>> From: Royce Lv<lvroyce at 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 at 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 at linux.vnet.ibm.com>
> IBM Linux Technology Center
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20140702/55d5f1ec/attachment.html>
More information about the Kimchi-devel
mailing list