From 6ecdbef0fcbdde1f6ea6441bc58efb91422a008e Mon Sep 17 00:00:00 2001 From: Eric Harney Date: Tue, 26 Feb 2019 11:41:27 -0500 Subject: [PATCH] Re-enable shell completion cache This enables writing ids to a local completion cache when using the manilaclient shell, which allows tools/manila.bash_completion to complete commands such as: manila delete a Share ids are recorded on "manila list" operations. Caching can be expanded to cover additional types of manila objects using this same infrastructure. Uses ~/.cache/manilaclient/ to match path standards, and uses SHA-1 since Python running w/ FIPS mode may not have MD5. Also, fix a small bug in the fakes used in our test suite. We were adding the shares count (an optional param) to all the list responses, while this is something that should be done only if the param with_count is set to True. Co-Authored-By: Victoria Martinez de la Cruz Closes-Bug: #1712835 Change-Id: I7f4dedf1dd4b7db6cf24fc1c4ed2a8d3685f714c --- manilaclient/base.py | 11 +++++++---- manilaclient/tests/unit/utils.py | 10 ++++++++++ manilaclient/tests/unit/v2/fakes.py | 6 +++++- manilaclient/tests/unit/v2/test_shell.py | 1 + manilaclient/v2/shell.py | 14 ++++++++++++++ tools/manila.bash_completion | 2 +- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/manilaclient/base.py b/manilaclient/base.py index 491096137..67544ec80 100644 --- a/manilaclient/base.py +++ b/manilaclient/base.py @@ -96,14 +96,14 @@ class Manager(utils.HookableMixin): """ base_dir = cliutils.env('manilaclient_UUID_CACHE_DIR', 'MANILACLIENT_UUID_CACHE_DIR', - default="~/.manilaclient") + default="~/.cache/manilaclient") # NOTE(sirp): Keep separate UUID caches for each username + endpoint # pair username = cliutils.env('OS_USERNAME', 'MANILA_USERNAME') url = cliutils.env('OS_URL', 'MANILA_URL') - uniqifier = hashlib.md5(username.encode('utf-8') + - url.encode('utf-8')).hexdigest() + uniqifier = hashlib.sha1(username.encode('utf-8') + + url.encode('utf-8')).hexdigest() cache_dir = os.path.expanduser(os.path.join(base_dir, uniqifier)) @@ -139,7 +139,10 @@ class Manager(utils.HookableMixin): def write_to_completion_cache(self, cache_type, val): cache = getattr(self, "_%s_cache" % cache_type, None) if cache: - cache.write("%s\n" % val) + try: + cache.write("%s\n" % val) + except UnicodeEncodeError: + pass def _get(self, url, response_key=None): resp, body = self.api.client.get(url) diff --git a/manilaclient/tests/unit/utils.py b/manilaclient/tests/unit/utils.py index 48c92952c..0b642d438 100644 --- a/manilaclient/tests/unit/utils.py +++ b/manilaclient/tests/unit/utils.py @@ -48,6 +48,16 @@ class TestCase(testtools.TestCase): self.addCleanup(patcher.stop) return new_attr + def mock_completion(self): + patcher = mock.patch( + 'manilaclient.base.Manager.write_to_completion_cache') + patcher.start() + self.addCleanup(patcher.stop) + + patcher = mock.patch('manilaclient.base.Manager.completion_cache') + patcher.start() + self.addCleanup(patcher.stop) + class TestResponse(requests.Response): """Class used to wrap requests.Response. diff --git a/manilaclient/tests/unit/v2/fakes.py b/manilaclient/tests/unit/v2/fakes.py index 091be8a80..5f9817d5c 100644 --- a/manilaclient/tests/unit/v2/fakes.py +++ b/manilaclient/tests/unit/v2/fakes.py @@ -225,6 +225,7 @@ class FakeHTTPClient(fakes.FakeHTTPClient): def get_shares_detail(self, **kw): endpoint = "http://127.0.0.1:8786/v2" share_id = '1234' + shares = { 'shares': [ { @@ -241,8 +242,11 @@ class FakeHTTPClient(fakes.FakeHTTPClient): ], }, ], - 'count': 2, } + + if kw.get('with_count'): + shares.update({'count': 2}) + return (200, {}, shares) def get_snapshots_1234(self, **kw): diff --git a/manilaclient/tests/unit/v2/test_shell.py b/manilaclient/tests/unit/v2/test_shell.py index 61840805a..49e38bd2b 100644 --- a/manilaclient/tests/unit/v2/test_shell.py +++ b/manilaclient/tests/unit/v2/test_shell.py @@ -63,6 +63,7 @@ class ShellTest(test_utils.TestCase): for var in self.FAKE_ENV: self.useFixture(fixtures.EnvironmentVariable(var, self.FAKE_ENV[var])) + self.mock_completion() self.shell = shell.OpenStackManilaShell() diff --git a/manilaclient/v2/shell.py b/manilaclient/v2/shell.py index 0a5c59e3e..f1d7e426a 100644 --- a/manilaclient/v2/shell.py +++ b/manilaclient/v2/shell.py @@ -28,6 +28,7 @@ from manilaclient.common.apiclient import utils as apiclient_utils from manilaclient.common import cliutils from manilaclient.common import constants from manilaclient import exceptions +import manilaclient.v2.shares def _wait_for_resource_status(cs, @@ -2328,6 +2329,19 @@ def do_list(cs, args): if args.count: print("Shares in total: %s" % total_count) + with cs.shares.completion_cache('uuid', + manilaclient.v2.shares.Share, + mode="w"): + for share in shares: + cs.shares.write_to_completion_cache('uuid', share.id) + + with cs.shares.completion_cache('name', + manilaclient.v2.shares.Share, + mode="w"): + for share in shares: + if share.name is not None: + cs.shares.write_to_completion_cache('name', share.name) + @cliutils.arg( '--share-id', diff --git a/tools/manila.bash_completion b/tools/manila.bash_completion index 717681b7c..8491e8ab4 100644 --- a/tools/manila.bash_completion +++ b/tools/manila.bash_completion @@ -7,7 +7,7 @@ _manila() opts="$(manila bash_completion)" - COMPLETION_CACHE=~/.manilaclient/*/*-cache + COMPLETION_CACHE=~/.cache/manilaclient/*/*-cache opts+=" "$(cat $COMPLETION_CACHE 2> /dev/null | tr '\n' ' ') COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )