Add package download to openstack CLI

usage: openstack package download [-h] <ID> [file]

Download a package to a filename or stdout.

Partially implements: blueprint openstack-client-plugin-support

Change-Id: I5e782f35dbfc09fe460e30f48a853f8df53d1518
This commit is contained in:
zhurong 2017-08-17 16:43:07 +08:00
parent 54a1c60570
commit e1d7761459
3 changed files with 67 additions and 0 deletions

View File

@ -751,3 +751,48 @@ class UpdatePackage(command.ShowOne):
)
return self.dict2columns(to_display)
class DownloadPackage(command.Command):
"""Download a package to a filename or stdout."""
def get_parser(self, prog_name):
parser = super(DownloadPackage, self).get_parser(prog_name)
parser.add_argument(
"id",
metavar="<ID>",
help=("Package ID to download."),
)
parser.add_argument(
"filename",
metavar="file", nargs="?",
help=("Filename to save package to. If it is not "
"specified and there is no stdout redirection "
"the package won't be saved."),
)
return parser
def take_action(self, parsed_args):
LOG.debug("take_action({0})".format(parsed_args))
client = self.app.client_manager.application_catalog
def download_to_fh(package_id, fh):
try:
fh.write(client.packages.download(package_id))
except common_exceptions.HTTPNotFound:
raise exceptions.CommandError("Package with id %s not "
"found" % parsed_args.id)
if parsed_args.filename:
with open(parsed_args.filename, 'wb') as fh:
download_to_fh(parsed_args.id, fh)
print("Package downloaded to %s" % parsed_args.filename)
elif not sys.stdout.isatty():
download_to_fh(parsed_args.id, sys.stdout)
else:
msg = ("No stdout redirection or local file specified for "
"downloaded package. Please specify a local file to "
"save downloaded package or redirect output to "
"another source.")
raise exceptions.CommandError(msg)

View File

@ -758,3 +758,24 @@ class TestUpdatePackage(TestPackage):
self.package_mock.update.assert_called_with(
'123', {'tags': ['foo']})
class TestDownloadPackage(TestPackage):
def setUp(self):
super(TestDownloadPackage, self).setUp()
self.package_mock.download.return_value = \
b'This is a fake package buffer'
# Command to test
self.cmd = osc_pkg.DownloadPackage(self.app, None)
def test_package_download(self):
arglist = ['1234', '/tmp/foo.zip']
verifylist = [('id', '1234'), ('filename', '/tmp/foo.zip')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.package_mock.download.assert_called_with('1234')

View File

@ -58,6 +58,7 @@ openstack.application_catalog.v1 =
package_import = muranoclient.osc.v1.package:ImportPackage
package_show = muranoclient.osc.v1.package:ShowPackage
package_update = muranoclient.osc.v1.package:UpdatePackage
package_download = muranoclient.osc.v1.package:DownloadPackage
bundle_import = muranoclient.osc.v1.package:ImportBundle