Skip to content

Commit f237d85

Browse files
committed
param search helper function
1 parent a1b36ff commit f237d85

4 files changed

Lines changed: 57 additions & 31 deletions

File tree

package/cloudshell/iac/terraform/downloaders/gitlab_downloader.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import re
22
from dataclasses import dataclass
3+
from typing import List
34
from urllib.error import HTTPError, URLError
45
from retry import retry
56
from cloudshell.iac.terraform.downloaders.base_git_downloader import GitScriptDownloaderBase
67
from cloudshell.iac.terraform.services.gitlab_api_handler import GitlabApiHandler
8+
from urllib.parse import unquote
79

810

911
@dataclass
@@ -16,7 +18,7 @@ class CommonGitLabUrlData:
1618

1719

1820
@dataclass
19-
class GitLabRawUrlData(CommonGitLabUrlData):
21+
class GitLabBrowserUrlData(CommonGitLabUrlData):
2022
gitlab_user: str
2123
project_name: str
2224

@@ -28,7 +30,7 @@ class GitLabApiUrlData(CommonGitLabUrlData):
2830
api_endpoint: str
2931

3032

31-
def extract_data_from_raw_url(url) -> GitLabRawUrlData:
33+
def extract_data_from_browser_url(url) -> GitLabBrowserUrlData:
3234
"""
3335
Take api style url and extract data
3436
Sample Raw Browser url: "http://192.168.85.26/quali_natti/terraformstuff/-/tree/test-branch/rds/project1"
@@ -42,13 +44,24 @@ def extract_data_from_raw_url(url) -> GitLabRawUrlData:
4244
raise ValueError(f"No GitLab URL Data found in RAW url '{url}'")
4345

4446
groups = match.groupdict()
45-
return GitLabRawUrlData(protocol=groups['protocol'],
46-
domain=groups['domain'],
47-
gitlab_user=groups['user'],
48-
project_name=groups['project'],
49-
sha=groups['sha'],
50-
path=groups['path'],
51-
full_url=url)
47+
return GitLabBrowserUrlData(protocol=groups['protocol'],
48+
domain=groups['domain'],
49+
gitlab_user=groups['user'],
50+
project_name=groups['project'],
51+
sha=groups['sha'],
52+
path=groups['path'],
53+
full_url=url)
54+
55+
56+
def get_query_param_val(param_key: str, params_list: List[List[str]]) -> str:
57+
"""
58+
look for target param in 2D list of key pair values
59+
[[k1,v1],[k2,v2]]
60+
if not found return empty string
61+
"""
62+
target_param_search = [x for x in params_list if x[0] == param_key]
63+
param_val = target_param_search[0][1] if target_param_search else ""
64+
return param_val
5265

5366

5467
def extract_data_from_api_url(url) -> GitLabApiUrlData:
@@ -68,26 +81,23 @@ def extract_data_from_api_url(url) -> GitLabApiUrlData:
6881
groups = match.groupdict()
6982
query_params = groups['params']
7083

71-
# remove the leading '?'
84+
# remove the leading '?' of the query param string
7285
query_params = query_params.split("?")[-1]
7386

7487
# split into 2D list [[k1,v1],[k2,v2]]
7588
params_list = [x.split("=") for x in query_params.split("&")]
7689

7790
# search for target params
78-
path_param_search = [x for x in params_list if x[0] == "path"]
79-
sha_param_search = [x for x in params_list if x[0] == "sha"]
80-
ref_param_search = [x for x in params_list if x[0] == "ref"]
81-
sha = sha_param_search[0][1] if sha_param_search else ""
82-
path = path_param_search[0][1] if path_param_search else ""
83-
ref = ref_param_search[0][1] if ref_param_search else ""
91+
path = get_query_param_val("path", params_list)
92+
sha = get_query_param_val("sha", params_list)
93+
ref = get_query_param_val("ref", params_list)
8494

8595
# take sha param if passed, otherwise use the ref
8696
sha = sha if sha else ref
8797

88-
# url encoded path not necessary for archive api
89-
path = path.replace("%2F", "/").replace("%2D", "-")
90-
sha = sha.replace("%2D", "-")
98+
# url encoded path not necessary
99+
path = unquote(path)
100+
sha = unquote(sha)
91101
return GitLabApiUrlData(protocol=groups['protocol'],
92102
domain=groups['domain'],
93103
api_version=groups['api_version'],
@@ -127,7 +137,7 @@ def download_repo(self, url: str, token: str, branch: str = "") -> str:
127137
if is_api_url:
128138
url_data = extract_data_from_api_url(url)
129139
else:
130-
url_data = extract_data_from_raw_url(url)
140+
url_data = extract_data_from_browser_url(url)
131141

132142
# allow service branch attr to override the url defined sha
133143
sha = branch if branch else url_data.sha

package/tests/integration_tests/test_gitlab_downloader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_api_url_download(self):
2020
self.working_dir = working_dir
2121
assert working_dir
2222

23-
def test_raw_url_download(self):
23+
def test_browser_url_download(self):
2424
working_dir = self.downloader.download_repo(url=self.gitlab_vars.natural_url,
2525
token=self.gitlab_vars.token,
2626
branch=self.gitlab_vars.branch)

package/tests/unit_tests/test_gitlab_url_extractor.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ class TestGitlabUrlExtractor(unittest.TestCase):
1010
api style url:
1111
http://<domain>/api/v4/projects/<project_id>/repository/archive.zip?path=<path>=<branch>
1212
"""
13-
RAW_URL = "http://192.168.85.26/quali_natti/terraformstuff/-/tree/test-branch/parent-dir/hello-world"
13+
BROWSER_URL = "http://192.168.85.26/quali_natti/terraformstuff/-/tree/test-branch/parent-dir/hello-world"
1414
API_URL = "http://192.168.85.26/api/v4/projects/2/repository/archive.zip?path=parent%2Ddir%2Fhello%2Dworld&sha=test%2Dbranch"
1515

16-
def test_raw_url(self):
17-
url_data = gitlab_downloader.extract_data_from_raw_url(self.RAW_URL)
16+
def test_browser_url(self):
17+
url_data = gitlab_downloader.extract_data_from_browser_url(self.BROWSER_URL)
1818
assert url_data
1919

2020
def test_api_url(self):
@@ -23,16 +23,16 @@ def test_api_url(self):
2323

2424
def test_api_url_validate(self):
2525
assert gitlab_downloader.is_gitlab_api_url(self.API_URL)
26-
assert not gitlab_downloader.is_gitlab_api_url(self.RAW_URL)
26+
assert not gitlab_downloader.is_gitlab_api_url(self.BROWSER_URL)
2727

28-
def test_raw_vs_url(self):
29-
raw_data = gitlab_downloader.extract_data_from_raw_url(self.RAW_URL)
28+
def test_browser_vs_api_url_data(self):
29+
browser_data = gitlab_downloader.extract_data_from_browser_url(self.BROWSER_URL)
3030
api_data = gitlab_downloader.extract_data_from_api_url(self.API_URL)
31-
self.assertEqual(raw_data.domain, api_data.domain)
32-
self.assertEqual(raw_data.path, api_data.path)
33-
self.assertEqual(raw_data.branch, api_data.sha)
31+
self.assertEqual(browser_data.domain, api_data.domain)
32+
self.assertEqual(browser_data.path, api_data.path)
33+
self.assertEqual(browser_data.sha, api_data.sha)
3434

3535
def test_raises(self):
3636
url_arg = "http://www.google.com"
3737
self.assertRaises(ValueError, gitlab_downloader.extract_data_from_api_url, url_arg)
38-
self.assertRaises(ValueError, gitlab_downloader.extract_data_from_raw_url, url_arg)
38+
self.assertRaises(ValueError, gitlab_downloader.extract_data_from_browser_url, url_arg)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import unittest
2+
from cloudshell.iac.terraform.downloaders.gitlab_downloader import get_query_param_val
3+
4+
5+
class TestQueryParamSearch(unittest.TestCase):
6+
QUERY_PARAMS = [["path", "parentdir/rds"], ["sha", "abcdefg"]]
7+
8+
def test_param_search(self):
9+
path = get_query_param_val("path", self.QUERY_PARAMS)
10+
sha = get_query_param_val("sha", self.QUERY_PARAMS)
11+
self.assertEqual(path, "parentdir/rds")
12+
self.assertEqual(sha, "abcdefg")
13+
14+
def test_not_found(self):
15+
ref = get_query_param_val("ref", self.QUERY_PARAMS)
16+
self.assertEqual(ref, "")

0 commit comments

Comments
 (0)