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
This commit is contained in:
Simon Merrick 2020-11-19 20:05:54 +13:00
parent 7146deef00
commit 5bdcd590ec
4 changed files with 19 additions and 3 deletions

View File

@ -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):

View File

@ -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):

View File

@ -1618,7 +1618,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)
@ -1626,6 +1626,7 @@ class TestImageSave(TestImage):
self.client.download_image.assert_called_once_with(
self.image.id,
stream=True,
output='/path/to/file')

View File

@ -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.