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:
parent
54a1c60570
commit
e1d7761459
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue