summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* pylint: Resolve test for membershipRadostin Stoyanov2018-03-011-1/+1
| | | | | | E713 test for membership should be 'not in' Signed-off-by: Radostin Stoyanov <rstoyanov1@gmail.com>
* tests: Add empty line at the end of fileRadostin Stoyanov2018-03-011-1/+1
| | | | Resolves pylint: "W292 no newline at end of file"
* pylint: Provide modules instead of filesRadostin Stoyanov2018-03-011-1/+1
| | | | | | | | | | | | We should give Pylint the name of a python package or module. [1] A python module is a file containing Python definitions and statements or directory containing the input script (__init__.py) [2] 1: https://pylint.readthedocs.io/en/latest/user_guide/run.html#invoking-pylint 2: https://docs.python.org/2/tutorial/modules.html Signed-off-by: Radostin Stoyanov <rstoyanov1@gmail.com>
* docker-source: Get list of layers without `--raw`Radostin Stoyanov2017-12-182-73/+22
| | | | | | | | | | | | When `skopeo inspect --raw docker://feodra` is used the returned manifest content contains a list with manifests for specific platforms [1] rather than a list with layers. By using `skopeo inpect docker://fedora` the correct manifest content is retrieved and a list with layers is provided. In addition, skopeo handles the difference between schemaVersion 1 and 2. [1] https://docs.docker.com/registry/spec/manifest-v2-2/#manifest-list-field-descriptions
* docker-source: Avoid skopeo copy in cacheRadostin Stoyanov2017-12-122-3/+27
| | | | | | | The `skopeo copy` command has changed it's behaviour to keep only a files for single container image per directory. To get around this and keep cache of downloaded images is used temporary destination directory for 'skopeo copy' and image files are then moved in the cache folder.
* source-docker: Show error if skopeo not installedRadostin Stoyanov2017-11-211-0/+4
| | | | Show appropriate error message when skopeo is not installed.
* Show error when guestfs-python is not installedRadostin Stoyanov2017-11-211-1/+6
| | | | | Show appropriate error message when the python bindings for libguestfs are not installed.
* utils: Add is_installed functionRadostin Stoyanov2017-11-211-0/+13
| | | | | Add utility function to check whether an executable is available in the PATH env variable.
* NEWS: fix formattingCédric Bosdonnat2017-09-071-3/+2
|
* Add NEWS filesCédric Bosdonnat2017-09-072-1/+7
|
* Bump version to 1.0.0v1.0.0Cédric Bosdonnat2017-09-071-1/+1
|
* Prepare setup.py for releaseCédric Bosdonnat2017-09-073-21/+113
| | | | | | Clean up the file, tell the world we are now stable enough, generate ChangeLog and AUTHORS files and add license header. Add the test files to the distribution.
* README: complete dependencies listCédric Bosdonnat2017-09-071-0/+2
|
* tox setup: pass HOME environment variableCédric Bosdonnat2017-09-071-24/+25
| | | | | | | Tests need the HOME environment variable, tell tox to pass it to the virtual environment. Also fix line endings of tox.ini to unix ones.
* python3 compat: python3 strings have no decode()Cédric Bosdonnat2017-09-061-1/+3
| | | | | | Since python3 strings are already Unicode-capable, there have no decode() function. Libguestfs content strings can be either python 2 or 3 strings, only decode them to utf-8 for python2.
* docker: only one layer drive per guestfs applianceCédric Bosdonnat2017-09-061-6/+5
| | | | | | | | | The current code was trying to save time by adding all drives to the guestfs handle and launch the instance from it. However, this doesn't fly since backing chain images would be used more than once. To bad for performance, but sticking to one layer per guestfs launch is safer and gets the tests to the pass.
* Add man page for virt-bootstrapRadostin Stoyanov2017-08-284-0/+246
|
* Use cache directory to store downloaded tar filesRadostin Stoyanov2017-08-281-3/+6
|
* Update doc stringsRadostin Stoyanov2017-08-283-42/+208
| | | | | | These documentation can be seen using: $ pydoc virtBootstrap
* Show warning for unprivileged usersRadostin Stoyanov2017-08-281-0/+7
| | | | | Show warning message and don't allow ownership mapping for non-root user when the output format is 'dir'.
* Define source code encodingRadostin Stoyanov2017-08-287-0/+7
| | | | | | | | | The default source code encoding in Python2.* is ASCII (PEP 263 [1]) and in Python3.* is UTF-8 (PEP 3120 [2]). Define the encoding on top of each file for consistency. [1] https://www.python.org/dev/peps/pep-0263/ [2] https://www.python.org/dev/peps/pep-3120/
* Use environment variable for temporary directoryRadostin Stoyanov2017-08-281-0/+6
| | | | | Allow the user to specify path for temporary directory used by virt-bootstrap using the `VIRTBOOTSTRAP_TMPDIR` environment variable.
* Update helper message for source uriRadostin Stoyanov2017-08-281-1/+1
| | | | Use more general description for source URI.
* Improve readability of parser argumentsRadostin Stoyanov2017-08-281-39/+115
|
* Add --version flagRadostin Stoyanov2017-08-283-3/+12
|
* Add virt-builder sourceRadostin Stoyanov2017-08-284-1/+399
| | | | | | | | | | | | | | | | | | | | Add implementation for virt-builder source which aims to create container root file system from VM image build with virt-builder. Usage examples: $ virt-bootstrap virt-builder://fedora-25 /tmp/foo $ virt-bootstrap virt-builder://ubuntu-16.04 /tmp/bar --root-password secret $ virt-bootstrap virt-builder://fedora-25 /tmp/foo -f qcow2 --idmap 0:1000:10 $ sudo virt-bootstrap virt-builder://fedora-25 /tmp/foo --idmap 0:1000:10 Tests are also introduced along with the implementation. They cover creation of root file system and UID/GID mapping for 'dir' and 'qcow2' output format by mocking the build_image() method to avoid the time consuming call to virt-builder which might also require network connection with function which creates dummy disk image. Setting root password is handled by virt-builder and hence the introduced test only ensures that the password string is passed correctly.
* Set root password with guestfs-pythonRadostin Stoyanov2017-08-286-41/+103
| | | | | | | | Use the python bindings of libguestfs to create additional qcow2 image which has as backing file the last layer (layer-0.qcow2 for FileSource) and insert hashed value of given root password in the /etc/shadow file. Note: This additional qcow2 image is also used to apply UID/GID map.
* Enable UID/GID mapping for qcow2Radostin Stoyanov2017-08-286-1/+129
| | | | | | | | | | | Apply ownership mapping in qcow2 images using libguestfs python bindings. To make this solution more general we introduce function guestfs_walk() which will return the root file system tree of disk image along with UID/GID values. These changes are applied in additional qcow2 disk image using the last layer as backing file. For FileSource this is layer-1.qcow2 with backing file layer-0.qcow2.
* Create qcow2 images with guestfs-pythonRadostin Stoyanov2017-08-284-68/+131
| | | | | | | | | | | | Use the python bindings of libguestfs to create qcow2 image with backing chains to mimic the layers of container image. This commit also changes the behavior of FileSource when 'qcow2' output format is used. Now the string layer-0.qcow2 will be used as name of the output file. This change is applied in the test suite as an update to the function get_image_path().
* Simplify setting permissions of shadow fileRadostin Stoyanov2017-08-281-2/+1
|
* Make set_root_password_in_rootfs reusableRadostin Stoyanov2017-08-281-7/+15
| | | | | Make the code for setting password hash in the content of shadow file reusable and hence can be used with qcow2 output format.
* UID/GID mapping: Use empty list instead of NoneRadostin Stoyanov2017-08-281-0/+6
| | | | | | | | Resolve an issue when only uid_map or only gid_map is specified. We set the default values to None. However, `len(None)` will raise an exception. To avoid this we need to set the default values to [] (empty list).
* Split the function mapping_uid_gidRadostin Stoyanov2017-08-281-2/+8
| | | | | | Split the function mapping_uid_gid in two parts so that the code which makes both lists map_uid and map_gid with equal length can be reused.
* Make UID/GID mapping reusableRadostin Stoyanov2017-08-282-73/+73
| | | | | Move the functions implementing UID/GID mapping in the utils module and hence they can be reused with qcow2 output format.
* Make get_compression_type() reusableRadostin Stoyanov2017-08-281-14/+27
| | | | | Take out the code for getting compression type of tarball in separate function.
* Get layer size if not providedRadostin Stoyanov2017-08-282-7/+7
| | | | | | | Docker registry with Manifest v1 does not require the size of layers to be included. However, when this information is not provided we can use os.path.getsize() to get and show the size of tarball. We can also use this function for FileSource to provide consistent output messages.
* DockerSource: Split checksum and layersRadostin Stoyanov2017-08-284-19/+27
| | | | | | | | | | | | The current implementation store in one list: - checksum - checksum type - file path - file size However, the information about checksum and checksum type is only used to verify the content of tarball before it is being extracted. Splitting these into separate lists would allow us to reuse the function untar_layers() with FileSource.
* get_mime_type: Properly close stdout handleRadostin Stoyanov2017-08-281-5/+6
| | | | | This aims to fix the warning of Python3: ResourceWarning: unclosed file <_io.BufferedReader name=3>
* untar: Use unique name with virt-sandboxRadostin Stoyanov2017-08-281-0/+1
| | | | | | Specify unique name when creating Libvirt domain with virt-sandbox. Otherwise the default name "sandbox" will be used and this might result in collision with another instance of virt-bootstrap.
* Add regression testsRadostin Stoyanov2017-08-283-3/+757
| | | | | | These tests aim to verify the output of virt-bootstrap by creating tar archives which contain dummy root file system and call the function bootstrap(). The check the extracted root file system.
* Improve untar commandRadostin Stoyanov2017-08-281-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Add "--overwrite" to enforce the overwrite of existing files. Add the flag "--absolute-names" to disable the strip of leading '/'s This is used to get around the error "Cannot open:Permission denied" which occurs when the qemu driver is used by virt-sandbox. It is used for unprivileged users to create isolated environment in which tar is executed to extract the content from container image layers. In particular this error occurs when the tar archive contains symbolic link which has target path starting with '/'. Steps to reproduce: $ mkdir /tmp/foo $ cd /tmp/foo $ touch file $ ln -s /tmp/foo/file link $ tar -cf archive.tar link $ mkdir /tmp/foo/dest $ virt-sandbox -c qemu:///session \ -m host-bind:/mnt=/tmp/foo/dest \ -- /bin/tar xf /tmp/foo/archive.tar -C /mnt Error message: tar: link: Cannot open: Permission denied tar: Exiting with failure status due to previous errors
* Drop unit testsRadostin Stoyanov2017-08-287-1948/+180
| | | | | | | | | Unit tests were used to ensure that functions and methods work as expected. However, these tests are closely related to the implementation and will result in major changes after some refactoring. To reduce the amount of work needed to add new features or changes to the code most of these tests will be replaced with more abstract form of testing introduced in the following commits.
* Add a more to gitignoreCédric Bosdonnat2017-08-031-0/+4
|
* Add guestfs python binding dependencyCédric Bosdonnat2017-08-032-1/+5
| | | | | | Adding the python binding of libguestfs as dependency will allow switching from calls to the virt-* tools and potentially optimize processing time.
* Use requirements.txt for dependenciesCédric Bosdonnat2017-08-033-4/+5
| | | | | | | | | | | | | | | | | | | | Later on when we will introduce libguestfs dependency, we would need to add a dependency_links to setup.py. This is rather hacky and https://caremad.io/posts/2013/07/setup-vs-requirement/ recommends using requirements.txt. Thus, to install the package when all dependencies are already installed, the following command can be used: python setup.py install Otherwise, the recommended way is to use pip as follows: pip install -r recommends.txt -e . This will also download the guestfs python binding, build and install it. However this would be skipped if installed from a linux distro package if this one provides the egg-info.
* Split 'sources' module into filesRadostin Stoyanov2017-08-035-57/+118
| | | | | | | | | | | | | Improve readability by spliting the 'sources' module into separate files. Each file contains only one class. In addition update the mock statements in the unit tests to match these changes. Add recursive-include in MANIFEST.in to include virtBootstrap.sources module. Update the unit tests to match these changes.
* setup: Use find_packages()Radostin Stoyanov2017-08-031-1/+1
| | | | | | | The find_packages() [1] function returns a list of package names suitable for use as the packages argument to setup(). [1] http://setuptools.readthedocs.io/en/latest/setuptools.html#using-find-packages
* Use explicit importRadostin Stoyanov2017-08-035-39/+67
| | | | | Reduce the number of import statements and improve readability. Update the unit tests to match these changes.
* tests: Remove redundant argumentsRadostin Stoyanov2017-08-031-19/+22
|
* sources: Use default values of argumentsRadostin Stoyanov2017-08-031-6/+6
|