diff options
| author | youngho choi <0505zxc@gmail.com> | 2020-09-07 06:35:04 +0900 |
|---|---|---|
| committer | Stephen Finucane <stephenfin@redhat.com> | 2021-01-04 17:25:34 +0000 |
| commit | 6f616a29b300238c004b676edd98a5337be38193 (patch) | |
| tree | d0b560c75f2da28827b0acd75a3da9c98065b411 /openstackclient/common | |
| parent | f083fc685bde09dfcb3d561cf87044ecda8bf3ad (diff) | |
| download | python-openstackclient-6f616a29b300238c004b676edd98a5337be38193.tar.gz | |
Add support '--progress' option for 'image create'
openstack-client doesn’t support the upload progress bar.
This patch shows progressbar when create image
if you added '--progress' option like a python-glanceclient.
like this.
[=============================>] 100%
+------------------+---------------------------+
| Field | Value |
+------------------+---------------------------+
| container_format | bare |
| created_at | 2020-09-06T20:44:40Z |
...
How to use
Add the'--progress' option on the 'openstack image create' command.
Code was written by referring to 'python-glanceclient' project
on stable/ussuri branch
Change-Id: Ic3035b49da10b6555066eee607a14a5b73797c00
task: 40003
story: 2007777
Diffstat (limited to 'openstackclient/common')
| -rw-r--r-- | openstackclient/common/progressbar.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/openstackclient/common/progressbar.py b/openstackclient/common/progressbar.py new file mode 100644 index 00000000..ef767a9c --- /dev/null +++ b/openstackclient/common/progressbar.py @@ -0,0 +1,67 @@ +# Copyright 2013 OpenStack Foundation +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import sys + + +class _ProgressBarBase(object): + """A progress bar provider for a wrapped obect. + + Base abstract class used by specific class wrapper to show + a progress bar when the wrapped object are consumed. + + :param wrapped: Object to wrap that hold data to be consumed. + :param totalsize: The total size of the data in the wrapped object. + + :note: The progress will be displayed only if sys.stdout is a tty. + """ + + def __init__(self, wrapped, totalsize): + self._wrapped = wrapped + self._totalsize = float(totalsize) + self._show_progress = sys.stdout.isatty() and self._totalsize != 0 + self._percent = 0 + + def _display_progress_bar(self, size_read): + if self._show_progress: + self._percent += size_read / self._totalsize + # Output something like this: [==========> ] 49% + sys.stdout.write('\r[{0:<30}] {1:.0%}'.format( + '=' * int(round(self._percent * 29)) + '>', self._percent + )) + sys.stdout.flush() + + def __getattr__(self, attr): + # Forward other attribute access to the wrapped object. + return getattr(self._wrapped, attr) + + +class VerboseFileWrapper(_ProgressBarBase): + """A file wrapper with a progress bar. + + The file wrapper shows and advances a progress bar whenever the + wrapped file's read method is called. + """ + + def read(self, *args, **kwargs): + data = self._wrapped.read(*args, **kwargs) + if data: + self._display_progress_bar(len(data)) + else: + if self._show_progress: + # Break to a new line from the progress bar for incoming + # output. + sys.stdout.write('\n') + return data |
