summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Merrick <simonmerrick@catalyst.net.nz>2020-11-19 20:05:54 +1300
committerAlan Pevec <alan.pevec@redhat.com>2021-05-28 22:36:43 +0000
commit8dbf141d52c84d0a7311e62d39d229fdc80876fd (patch)
tree8189d239457d486adf3ae7587e1ef47742b0575f
parent94ae417b5121187dec5334f51ce79c6efb3c8bd6 (diff)
downloadpython-openstackclient-8dbf141d52c84d0a7311e62d39d229fdc80876fd.tar.gz
stop image downloads to memory
+ Fixes issue with large images hogging memory + stream image downloads + output to stdout if file not specified Change-Id: Ia01ff9b21a2dac5d0ccf2bd58a8640e88c5cbb36 Story: 2007672 Task: 39776 (cherry picked from commit 5bdcd590ecacbc0aa8db2cbafa0ab1a9f3c28ce0)
-rw-r--r--openstackclient/image/v1/image.py6
-rw-r--r--openstackclient/image/v2/image.py6
-rw-r--r--openstackclient/tests/unit/image/v2/test_image.py3
-rw-r--r--releasenotes/notes/fix-openstak-image-save-sdk-port-eb160e8ffc92e514.yaml7
4 files changed, 19 insertions, 3 deletions
diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py
index cf1d6817..64aa3fcd 100644
--- a/openstackclient/image/v1/image.py
+++ b/openstackclient/image/v1/image.py
@@ -478,7 +478,11 @@ class SaveImage(command.Command):
image_client = self.app.client_manager.image
image = image_client.find_image(parsed_args.image)
- image_client.download_image(image.id, output=parsed_args.file)
+ output_file = parsed_args.file
+ if output_file is None:
+ output_file = getattr(sys.stdout, "buffer", sys.stdout)
+
+ image_client.download_image(image.id, stream=True, output=output_file)
class SetImage(command.Command):
diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py
index 029f57a3..2836e764 100644
--- a/openstackclient/image/v2/image.py
+++ b/openstackclient/image/v2/image.py
@@ -803,7 +803,11 @@ class SaveImage(command.Command):
image_client = self.app.client_manager.image
image = image_client.find_image(parsed_args.image)
- image_client.download_image(image.id, output=parsed_args.file)
+ output_file = parsed_args.file
+ if output_file is None:
+ output_file = getattr(sys.stdout, "buffer", sys.stdout)
+
+ image_client.download_image(image.id, stream=True, output=output_file)
class SetImage(command.Command):
diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py
index 310f6b76..a7f60398 100644
--- a/openstackclient/tests/unit/image/v2/test_image.py
+++ b/openstackclient/tests/unit/image/v2/test_image.py
@@ -1614,7 +1614,7 @@ class TestImageSave(TestImage):
verifylist = [
('file', '/path/to/file'),
- ('image', self.image.id)
+ ('image', self.image.id),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1622,6 +1622,7 @@ class TestImageSave(TestImage):
self.client.download_image.assert_called_once_with(
self.image.id,
+ stream=True,
output='/path/to/file')
diff --git a/releasenotes/notes/fix-openstak-image-save-sdk-port-eb160e8ffc92e514.yaml b/releasenotes/notes/fix-openstak-image-save-sdk-port-eb160e8ffc92e514.yaml
new file mode 100644
index 00000000..857f3c50
--- /dev/null
+++ b/releasenotes/notes/fix-openstak-image-save-sdk-port-eb160e8ffc92e514.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+ - Stream image download to avoid buffering data in memory which rapidly
+ exhausts memory resulting in OOM kill or system crash for all but the
+ smallest of images. Fixes https://storyboard.openstack.org/#!/story/2007672
+ - Restore default behavior of 'openstack image save' to send data to stdout
+ Relates to https://storyboard.openstack.org/#!/story/2007672. \ No newline at end of file