Skip to content

Commit 4937d5c

Browse files
authored
Fix redirects during partial Learn ingest (#2985)
1 parent a137315 commit 4937d5c

3 files changed

Lines changed: 119 additions & 13 deletions

File tree

ingest/autogenerateRedirects.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,27 @@ def readLegacyLearnDocMap(pathToFile):
138138
return ({key.replace("https://learn.netdata.cloud", ""): value for key, value in json.load(json_file).items()})
139139

140140

141-
def UpdateGHLinksBasedOnMap(mapMatrix, inputDictionary):
141+
def _github_repository_identity(url):
142+
parts = urlsplit(url)
143+
if parts.scheme not in {"http", "https"} or parts.netloc.lower() != "github.com":
144+
return None
145+
segments = [segment for segment in parts.path.split("/") if segment]
146+
if len(segments) < 2:
147+
return None
148+
return f"{segments[0]}/{segments[1]}".lower()
149+
150+
151+
def UpdateGHLinksBasedOnMap(
152+
mapMatrix, inputDictionary, ignored_github_repositories=()
153+
):
154+
ignored = {repository.lower() for repository in ignored_github_repositories}
155+
updated = {}
142156
for k, v in inputDictionary.items():
143157
if v in mapMatrix.keys():
144-
inputDictionary[k] = mapMatrix[v]
145-
else:
146-
pass
147-
return (inputDictionary)
158+
updated[k] = mapMatrix[v]
159+
elif _github_repository_identity(v) not in ignored:
160+
updated[k] = v
161+
return (updated)
148162

149163

150164
def addMovedRedirects(mapping):
@@ -367,22 +381,23 @@ def refresh_current_netlify_config():
367381
return redirects
368382

369383

370-
def main(GHLinksCorrelation):
384+
def main(GHLinksCorrelation, ignored_github_repositories=()):
371385

372386
mapping = reductTonew_learn_pathFromGHLinksCorrelation(GHLinksCorrelation)
373387
append_entries_to_json(addMovedRedirects(mapping))
374388
# print(GHLinksCorrelation)
375389
oldLearn = readLegacyLearnDocMap("LegacyLearnCorrelateLinksWithGHURLs.json")
376390
# print(oldLearn)
377-
oldLearn_redirects = UpdateGHLinksBasedOnMap(mapping, oldLearn)
391+
oldLearn_redirects = UpdateGHLinksBasedOnMap(
392+
mapping,
393+
oldLearn,
394+
ignored_github_repositories=ignored_github_repositories,
395+
)
378396
# print(mapping)
379397

380398
# print(oldLearn)
381-
try:
382-
finalDict = combineDictsOverwrite(readRedirectsFromFile("netlify.toml"), oldLearn_redirects)
383-
# print(finalDict)
384-
except Exception as e:
385-
print(f"An exception occurred: {e}")
399+
finalDict = combineDictsOverwrite(readRedirectsFromFile("netlify.toml"), oldLearn_redirects)
400+
# print(finalDict)
386401

387402
active_routes = set(mapping.values())
388403
finalDict = clean_redirects(finalDict, active_routes)

ingest/ingest.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3994,7 +3994,13 @@ def regenerate_grids_only(
39943994
for md_file in to_publish:
39953995
convert_github_links(file_dict[md_file]["learnPath"], file_dict)
39963996

3997-
genRedirects.main(file_dict)
3997+
ignored_redirect_repositories = set()
3998+
if IGNORE_ON_PREM_REPO:
3999+
ignored_redirect_repositories.add("netdata/netdata-cloud-onprem")
4000+
genRedirects.main(
4001+
file_dict,
4002+
ignored_github_repositories=ignored_redirect_repositories,
4003+
)
39984004
print(
39994005
"Done.",
40004006
"Uncorrelated links (links from our github repos that the files are not in Learn):",

ingest/test_redirect_cleanup.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
from unittest import mock
23

34
import autogenerateRedirects as redirects
45

@@ -76,5 +77,89 @@ def test_merge_preserves_external_host_identity(self):
7677
{"/old/": "https://example.net/release"},
7778
)
7879

80+
def test_ignored_repository_removes_only_its_unresolved_legacy_redirect(self):
81+
legacy = {
82+
"/on-prem": (
83+
"https://github.com/netdata/netdata-cloud-onprem/"
84+
"blob/master/docs/page.md"
85+
),
86+
"/agent": "https://github.com/netdata/netdata/blob/master/docs/page.md",
87+
}
88+
self.assertEqual(
89+
redirects.UpdateGHLinksBasedOnMap(
90+
{},
91+
legacy,
92+
ignored_github_repositories={"netdata/netdata-cloud-onprem"},
93+
),
94+
{"/agent": "https://github.com/netdata/netdata/blob/master/docs/page.md"},
95+
)
96+
97+
def test_non_ignored_unresolved_legacy_redirect_is_preserved(self):
98+
legacy = {
99+
"/on-prem": (
100+
"https://github.com/netdata/netdata-cloud-onprem/"
101+
"blob/master/docs/page.md"
102+
)
103+
}
104+
self.assertEqual(redirects.UpdateGHLinksBasedOnMap({}, legacy), legacy)
105+
106+
def test_ignored_on_prem_mapping_preserves_the_tracked_internal_redirect(self):
107+
source = "/docs/netdata-cloud-on-prem/light-poc-deployment"
108+
tracked = {source: "/docs/netdata-cloud-on-prem/poc-without-k8s"}
109+
legacy = {
110+
source: (
111+
"https://github.com/netdata/netdata-cloud-onprem/"
112+
"blob/master/docs/learn.netdata.cloud/poc-without-k8s.md"
113+
)
114+
}
115+
filtered = redirects.UpdateGHLinksBasedOnMap(
116+
{},
117+
legacy,
118+
ignored_github_repositories={"netdata/netdata-cloud-onprem"},
119+
)
120+
self.assertEqual(redirects.combineDictsOverwrite(tracked, filtered), tracked)
121+
with self.assertRaisesRegex(ValueError, "Conflicting redirect identity"):
122+
redirects.combineDictsOverwrite(
123+
tracked,
124+
redirects.UpdateGHLinksBasedOnMap({}, legacy),
125+
)
126+
127+
def test_current_mapping_wins_even_when_its_repository_is_ignored(self):
128+
github_url = (
129+
"https://github.com/netdata/netdata-cloud-onprem/"
130+
"blob/master/docs/page.md"
131+
)
132+
self.assertEqual(
133+
redirects.UpdateGHLinksBasedOnMap(
134+
{github_url: "/docs/current"},
135+
{"/old": github_url},
136+
ignored_github_repositories={"netdata/netdata-cloud-onprem"},
137+
),
138+
{"/old": "/docs/current"},
139+
)
140+
141+
def test_main_does_not_hide_redirect_conflicts(self):
142+
with (
143+
mock.patch.object(
144+
redirects,
145+
"reductTonew_learn_pathFromGHLinksCorrelation",
146+
return_value={},
147+
),
148+
mock.patch.object(redirects, "addMovedRedirects", return_value={}),
149+
mock.patch.object(redirects, "append_entries_to_json"),
150+
mock.patch.object(
151+
redirects,
152+
"readLegacyLearnDocMap",
153+
return_value={"/old": "/second"},
154+
),
155+
mock.patch.object(
156+
redirects,
157+
"readRedirectsFromFile",
158+
return_value={"/old": "/first"},
159+
),
160+
):
161+
with self.assertRaisesRegex(ValueError, "Conflicting redirect identity /old"):
162+
redirects.main({})
163+
79164
if __name__ == "__main__":
80165
unittest.main()

0 commit comments

Comments
 (0)