Merge ~troyanov/maas:backport-fix-2009186-to-3.2 into maas:3.2

Proposed by Anton Troyanov
Status: Merged
Approved by: Anton Troyanov
Approved revision: 6e26a71968e094d08abac179be46a48ce13e3a2c
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~troyanov/maas:backport-fix-2009186-to-3.2
Merge into: maas:3.2
Diff against target: 60 lines (+29/-2)
2 files modified
src/maascli/api.py (+4/-1)
src/maascli/tests/test_api.py (+25/-1)
Reviewer Review Type Date Requested Status
MAAS Lander Needs Fixing
Anton Troyanov Approve
Review via email: mp+438403@code.launchpad.net

Commit message

fix(cli): use profile.url to build absolute uri

When MAAS is behind a load-balancer or proxy
(e.g. HAProxy with `mode tcp`), CLI should use MAAS URL stored in profile
to build absolute URI of a resource, instead of relying on `uri` property
returned by `/describe`.

Resolves LP:2009186

(cherry picked from commit 28c72b81ed318b283cd3f2ddcae2e199ca067228)

To post a comment you must log in.
Revision history for this message
Anton Troyanov (troyanov) wrote :

Self approve backport to 3.2

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b backport-fix-2009186-to-3.2 lp:~troyanov/maas/+git/maas into -b 3.2 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/2087/consoleText
COMMIT: 6e26a71968e094d08abac179be46a48ce13e3a2c

review: Needs Fixing
Revision history for this message
Anton Troyanov (troyanov) wrote :

jenkins: !test

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maascli/api.py b/src/maascli/api.py
2index d121309..7196977 100644
3--- a/src/maascli/api.py
4+++ b/src/maascli/api.py
5@@ -90,7 +90,10 @@ class Action(Command):
6 # Override these in subclasses; see `register_actions`.
7 profile = handler = action = None
8
9- uri = property(lambda self: self.handler["uri"])
10+ _maas_url = property(lambda self: urlparse(self.profile["url"]))
11+ uri = property(
12+ lambda self: f"{self._maas_url.scheme}://{self._maas_url.netloc}{self.handler['path']}"
13+ )
14 method = property(lambda self: self.action["method"])
15 credentials = property(lambda self: self.profile["credentials"])
16 op = property(lambda self: self.action["op"])
17diff --git a/src/maascli/tests/test_api.py b/src/maascli/tests/test_api.py
18index a767648..9b2f659 100644
19--- a/src/maascli/tests/test_api.py
20+++ b/src/maascli/tests/test_api.py
21@@ -304,7 +304,8 @@ class TestAction(MAASTestCase):
22 "name": factory.make_name("handler"),
23 "handler_name": factory.make_name("handler"),
24 "params": [],
25- "uri": "http://example.com/api/2.0/",
26+ "path": "/MAAS/api/2.0",
27+ "uri": "http://example.com/MAAS/api/2.0/",
28 }
29 action = {"name": "action", "op": "test", "method": "GET"}
30 action_name = safe_name(action["name"])
31@@ -342,6 +343,29 @@ class TestAction(MAASTestCase):
32 action_parser(options)
33 mock_materializer.assert_called_once()
34
35+ def test_action_build_correct_uri(self):
36+ handler = {
37+ "name": factory.make_name("handler"),
38+ "handler_name": factory.make_name("handler"),
39+ "params": [],
40+ "path": "/MAAS/api/2.0/resource",
41+ }
42+ action = {"name": "action", "op": "test", "method": "GET"}
43+ action_name = safe_name(action["name"])
44+ action_bases = api.get_action_class_bases(handler, action)
45+ profile = make_profile()
46+ profile["url"] = "http://localhost:5240/MAAS"
47+
48+ action_ns = {"action": action, "handler": handler, "profile": profile}
49+ action_class = type(action_name, action_bases, action_ns)
50+
51+ parser = ArgumentParser()
52+ action_parser = action_class(parser)
53+
54+ self.assertEqual(
55+ "http://localhost:5240/MAAS/api/2.0/resource", action_parser.uri
56+ )
57+
58
59 class TestActionHelp(MAASTestCase):
60 def make_help(self):

Subscribers

People subscribed via source and target branches