Merge ~bjornt/maas:bug-2007297-3.3 into maas:3.3

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 838e056e32b76969965b5e8000abe1425a95119a
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:bug-2007297-3.3
Merge into: maas:3.3
Diff against target: 127 lines (+34/-2)
3 files modified
src/provisioningserver/drivers/pod/lxd.py (+5/-0)
src/provisioningserver/drivers/pod/tests/test_lxd.py (+28/-2)
utilities/check-imports (+1/-0)
Reviewer Review Type Date Requested Status
Björn Tillenius Approve
MAAS Lander Needs Fixing
Review via email: mp+466159@code.launchpad.net

Commit message

Bug #2007297: LXD REST API connection goes via proxy

Create a Session before instantiating the pylxd Client
(cherry picked from commit 33963ee1eb39c745729dd10cf789f6af04d80e94)

Set pylxd session to not trust the environment
(cherry picked from commit 58e3a2328dd308056170b3af3921ed1842a08a8f)

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b bug-2007297-3.3 lp:~bjornt/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/5572/console
COMMIT: 838e056e32b76969965b5e8000abe1425a95119a

review: Needs Fixing
Revision history for this message
Björn Tillenius (bjornt) wrote :

Self-approve backport

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/provisioningserver/drivers/pod/lxd.py b/src/provisioningserver/drivers/pod/lxd.py
2index 0181eaf..2e276d3 100644
3--- a/src/provisioningserver/drivers/pod/lxd.py
4+++ b/src/provisioningserver/drivers/pod/lxd.py
5@@ -13,6 +13,7 @@ from urllib.parse import urlparse
6 import uuid
7
8 from pylxd import Client
9+from pylxd.client import get_session_for_url
10 from pylxd.exceptions import ClientConnectionFailed, LXDAPIException, NotFound
11 import urllib3
12
13@@ -850,11 +851,15 @@ class LXDPodDriver(PodDriver):
14 raise Error("No certificates available")
15
16 def client_with_certs(cert):
17+ session = get_session_for_url(endpoint, cert=cert, verify=False)
18+ # Don't inherit proxy environment variables
19+ session.trust_env = False
20 client = self._pylxd_client_class(
21 endpoint=endpoint,
22 project=project,
23 cert=cert,
24 verify=False,
25+ session=session,
26 )
27 if not client.trusted and password:
28 try:
29diff --git a/src/provisioningserver/drivers/pod/tests/test_lxd.py b/src/provisioningserver/drivers/pod/tests/test_lxd.py
30index 4b0c6fc..47b7fc3 100644
31--- a/src/provisioningserver/drivers/pod/tests/test_lxd.py
32+++ b/src/provisioningserver/drivers/pod/tests/test_lxd.py
33@@ -12,6 +12,7 @@ from unittest.mock import ANY, MagicMock, Mock, PropertyMock, sentinel
34
35 from fixtures import EnvironmentVariable, TempDir
36 from pylxd.exceptions import ClientConnectionFailed, LXDAPIException, NotFound
37+from requests import Session
38 from testtools.testcase import ExpectedException
39 from twisted.internet.defer import inlineCallbacks
40
41@@ -126,6 +127,7 @@ class FakeClient:
42 project: str
43 cert: Optional[Tuple[str, str]]
44 verify: bool
45+ session: Session
46
47 _PROXIES = (
48 "host_info",
49@@ -142,6 +144,7 @@ class FakeClient:
50 self.trusted = False
51 self._fail_auth = False
52 self.host_info = self.fake_lxd.host_info
53+ self.api = FakeAPINode(self.session)
54
55 def authenticate(self, password):
56 if self._fail_auth:
57@@ -155,6 +158,13 @@ class FakeClient:
58 raise AttributeError(name)
59
60
61+@dataclasses.dataclass
62+class FakeAPINode:
63+ """A fake pylxd.client._APINode"""
64+
65+ session: Session
66+
67+
68 class FakeLXD:
69 """A fake LXD server."""
70
71@@ -192,8 +202,16 @@ class FakeLXD:
72 project="default",
73 cert=None,
74 verify=False,
75+ session=None,
76 ):
77- client = FakeClient(self, endpoint, project, cert, verify)
78+ client = FakeClient(
79+ fake_lxd=self,
80+ endpoint=endpoint,
81+ project=project,
82+ cert=cert,
83+ verify=verify,
84+ session=session,
85+ )
86
87 if self._client_behaviors is not None:
88 try:
89@@ -255,10 +273,13 @@ class FakeLXDCluster:
90 project="default",
91 cert=None,
92 verify=False,
93+ session=None,
94 ):
95 if self.client_idx == len(self.clients):
96 self.client_idx = 0
97- client = self.clients[self.client_idx](endpoint, project, cert, verify)
98+ client = self.clients[self.client_idx](
99+ endpoint, project, cert, verify, session
100+ )
101 client._PROXIES += ("cluster", "cluster/members")
102 self.client_idx += 1
103 return client
104@@ -463,6 +484,11 @@ class TestLXDPodDriver(MAASTestCase):
105 self.assertIsInstance(client.cert, tuple)
106 self.assertFalse(client.verify)
107
108+ def test_get_client_should_not_trust_environment(self):
109+ context = self.make_context()
110+ with self.driver._get_client(None, context) as client:
111+ self.assertFalse(client.api.session.trust_env)
112+
113 def test_get_client_no_certificates_no_password(self):
114 context = self.make_context(with_cert=False, with_password=False)
115 pod_id = factory.make_name("pod_id")
116diff --git a/utilities/check-imports b/utilities/check-imports
117index 401e068..1b70608 100755
118--- a/utilities/check-imports
119+++ b/utilities/check-imports
120@@ -439,6 +439,7 @@ checks = [
121 RackControllerRule
122 | Rule(
123 Allow("apiclient.testing.credentials.make_api_credentials"),
124+ Allow("requests|requests.**"),
125 Allow(StandardLibraries),
126 Allow(TestingLibraries),
127 ),

Subscribers

People subscribed via source and target branches