Skip to content

Commit 85e4066

Browse files
authored
Merge pull request #5677 from orchestral-st2/issue/get-key-value-by-name
Fixed a bug where key value pair was not returning data correctly when get_by_name function is called.
2 parents 70b7c2e + d5c13b1 commit 85e4066

5 files changed

Lines changed: 69 additions & 3 deletions

File tree

CHANGELOG.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Fixed
1919

2020
Contributed by @S-T-A-R-L-O-R-D
2121

22+
* Fixed a bug where calling 'get_by_name' on client for getting key details was not returning any results despite key being stored. #5677
23+
24+
Contributed by @bharath-orchestral
25+
2226

2327
* Fixed ``st2client/st2client/base.py`` file to use ``https_proxy``(not ``http_proxy``) to check HTTPS_PROXY environment variables.
2428

st2api/st2api/controllers/v1/keyvalue.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,14 @@ def get_all(
212212
# Set user scope prefix for the provided user (or current user if user not provided)
213213
# NOTE: It's very important raw_filters['prefix'] is set when requesting user scoped
214214
# items to avoid information leakage (aka user1 retrieves items for user2)
215+
name_for_keyref = ""
216+
if "name" in raw_filters and raw_filters["name"]:
217+
name_for_keyref = raw_filters["name"]
218+
else:
219+
name_for_keyref = prefix or ""
220+
215221
user_scope_prefix = get_key_reference(
216-
name=prefix or "", scope=FULL_USER_SCOPE, user=user
222+
name=name_for_keyref, scope=FULL_USER_SCOPE, user=user
217223
)
218224

219225
# Special cases for ALL_SCOPE
@@ -277,7 +283,10 @@ def get_all(
277283
if scope in [ALL_SCOPE, USER_SCOPE, FULL_USER_SCOPE]:
278284
# Retrieves all the user scoped items that the current user owns.
279285
raw_filters["scope"] = FULL_USER_SCOPE
280-
raw_filters["prefix"] = user_scope_prefix
286+
if "name" in raw_filters and raw_filters["name"]:
287+
raw_filters["name"] = user_scope_prefix
288+
else:
289+
raw_filters["prefix"] = user_scope_prefix
281290

282291
items = self._get_all(
283292
from_model_kwargs=from_model_kwargs,

st2client/st2client/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from st2client.models.core import ServiceRegistryGroupsManager
3939
from st2client.models.core import ServiceRegistryMembersManager
4040
from st2client.models.core import add_auth_token_to_kwargs_from_env
41+
from st2client.models.core import KeyValuePairResourceManager
4142

4243

4344
LOG = logging.getLogger(__name__)
@@ -273,7 +274,7 @@ def __init__(
273274
debug=self.debug,
274275
basic_auth=self.basic_auth,
275276
)
276-
self.managers["KeyValuePair"] = ResourceManager(
277+
self.managers["KeyValuePair"] = KeyValuePairResourceManager(
277278
models.KeyValuePair,
278279
self.endpoints["api"],
279280
cacert=self.cacert,

st2client/st2client/models/core.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,3 +879,38 @@ def list(self, group_id, **kwargs):
879879
result.append(item)
880880

881881
return result
882+
883+
884+
class KeyValuePairResourceManager(ResourceManager):
885+
@add_auth_token_to_kwargs_from_env
886+
def get_by_name(self, name, **kwargs):
887+
888+
token = kwargs.get("token", None)
889+
api_key = kwargs.get("api_key", None)
890+
params = kwargs.get("params", {})
891+
892+
for k, v in six.iteritems(kwargs):
893+
# Note: That's a special case to support api_key and token kwargs
894+
if k not in ["token", "api_key", "params"]:
895+
params[k] = v
896+
897+
url = "/%s/%s/?%s" % (
898+
self.resource.get_url_path_name(),
899+
name,
900+
urllib.parse.urlencode(params),
901+
)
902+
903+
if token:
904+
response = self.client.get(url, token=token)
905+
elif api_key:
906+
response = self.client.get(url, api_key=api_key)
907+
else:
908+
response = self.client.get(url)
909+
910+
if response.status_code == http_client.NOT_FOUND:
911+
# for query and query_with_count
912+
return []
913+
if response.status_code != http_client.OK:
914+
self.handle_error(response)
915+
916+
return self.resource.deserialize(parse_api_response(response))

st2client/tests/unit/test_models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,20 @@ def test_resource_clone_failed(self):
471471
mgr = models.ResourceManager(base.FakeResource, base.FAKE_ENDPOINT)
472472
source_ref = "spack.saction"
473473
self.assertRaises(Exception, mgr.clone, source_ref, "dpack", "daction")
474+
475+
476+
class TestKeyValuePairResourceManager(unittest2.TestCase):
477+
@mock.patch.object(
478+
httpclient.HTTPClient,
479+
"get",
480+
mock.MagicMock(
481+
return_value=base.FakeResponse(json.dumps(base.RESOURCES[0]), 200, "OK")
482+
),
483+
)
484+
def test_resource_get_by_name(self):
485+
mgr = models.KeyValuePairResourceManager(base.FakeResource, base.FAKE_ENDPOINT)
486+
# No X-Total-Count
487+
resource = mgr.get_by_name("abc")
488+
actual = resource.serialize()
489+
expected = json.loads(json.dumps(base.RESOURCES[0]))
490+
self.assertEqual(actual, expected)

0 commit comments

Comments
 (0)