Merge ~bjornt/maas:refresh-credendtials-fix into maas:master

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: eeec4f9ba2b82fd61672e7f66497a94adce41bf1
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:refresh-credendtials-fix
Merge into: maas:master
Diff against target: 348 lines (+74/-137)
3 files modified
src/provisioningserver/refresh/__init__.py (+10/-6)
src/provisioningserver/refresh/tests/test_refresh.py (+52/-130)
src/provisioningserver/utils/tests/test_services.py (+12/-1)
Reviewer Review Type Date Requested Status
Adam Collard (community) Approve
MAAS Lander Approve
Review via email: mp+404681@code.launchpad.net

Commit message

Pass Credentials() rather than a dict in refresh().

maas_api_helpers was refactored not to use plain dicts anymore, but
refresh() wasn't updated to reflect the change.

No tests were failing, since they all mocked at a very high level. I
changed one test to mock at the urlopen level instead, which should
catch issues like this in the future.

I also removed some tests that now are redundant, and changed other
tests to check only what the test is focused on.

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

UNIT TESTS
-b refresh-credendtials-fix lp:~bjornt/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/10317/console
COMMIT: 556a6059a5ea92eea94bed38a0ae8193d9966fb0

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

Putting it in work in progress until i've fixed all the test failures

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

All tests should be passing now.

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

UNIT TESTS
-b refresh-credendtials-fix lp:~bjornt/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: eeec4f9ba2b82fd61672e7f66497a94adce41bf1

review: Approve
Revision history for this message
Adam Collard (adam-collard) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/provisioningserver/refresh/__init__.py b/src/provisioningserver/refresh/__init__.py
index 8764eec..8931227 100644
--- a/src/provisioningserver/refresh/__init__.py
+++ b/src/provisioningserver/refresh/__init__.py
@@ -13,6 +13,7 @@ from provisioningserver.config import is_dev_environment
13from provisioningserver.logger import get_maas_logger13from provisioningserver.logger import get_maas_logger
14from provisioningserver.refresh.maas_api_helper import (14from provisioningserver.refresh.maas_api_helper import (
15 capture_script_output,15 capture_script_output,
16 Credentials,
16 MD_VERSION,17 MD_VERSION,
17 signal,18 signal,
18 SignalException,19 SignalException,
@@ -75,12 +76,15 @@ def refresh(
75 maas_url = "http://127.0.0.1:5240/MAAS"76 maas_url = "http://127.0.0.1:5240/MAAS"
76 url = "%s/metadata/%s/" % (maas_url, MD_VERSION)77 url = "%s/metadata/%s/" % (maas_url, MD_VERSION)
7778
78 creds = {79 creds = Credentials()
79 "consumer_key": consumer_key,80 creds.update(
80 "token_key": token_key,81 {
81 "token_secret": token_secret,82 "consumer_key": consumer_key,
82 "consumer_secret": "",83 "token_key": token_key,
83 }84 "token_secret": token_secret,
85 "consumer_secret": "",
86 }
87 )
8488
85 scripts = {89 scripts = {
86 name: config90 name: config
diff --git a/src/provisioningserver/refresh/tests/test_refresh.py b/src/provisioningserver/refresh/tests/test_refresh.py
index 7f841f0..e5c6519 100644
--- a/src/provisioningserver/refresh/tests/test_refresh.py
+++ b/src/provisioningserver/refresh/tests/test_refresh.py
@@ -18,6 +18,7 @@ from maastesting.factory import factory
18from maastesting.matchers import MockAnyCall18from maastesting.matchers import MockAnyCall
19from maastesting.testcase import MAASTestCase19from maastesting.testcase import MAASTestCase
20from provisioningserver import refresh20from provisioningserver import refresh
21from provisioningserver.refresh import maas_api_helper
21from provisioningserver.refresh.maas_api_helper import (22from provisioningserver.refresh.maas_api_helper import (
22 MD_VERSION,23 MD_VERSION,
23 SignalException,24 SignalException,
@@ -47,6 +48,11 @@ class TestGetArchitecture(MAASTestCase):
47 mock_get_architectures.assert_not_called()48 mock_get_architectures.assert_not_called()
4849
4950
51class FakeResponse:
52
53 status = 200
54
55
50class TestRefresh(MAASTestCase):56class TestRefresh(MAASTestCase):
51 def setUp(self):57 def setUp(self):
52 super().setUp()58 super().setUp()
@@ -56,6 +62,14 @@ class TestRefresh(MAASTestCase):
56 # by default, fake running in snap so sudo is not used62 # by default, fake running in snap so sudo is not used
57 self.mock_running_in_snap = self.patch(refresh, "running_in_snap")63 self.mock_running_in_snap = self.patch(refresh, "running_in_snap")
58 self.mock_running_in_snap.return_value = True64 self.mock_running_in_snap.return_value = True
65 self.urlopen_calls = []
66 self.patch(
67 maas_api_helper.urllib.request, "urlopen"
68 ).side_effect = self._fake_urlopen
69
70 def _fake_urlopen(self, request, post_data=None):
71 self.urlopen_calls.append((request, post_data))
72 return FakeResponse()
5973
60 def _cleanup(self, path):74 def _cleanup(self, path):
61 if os.path.exists(path):75 if os.path.exists(path):
@@ -108,7 +122,6 @@ class TestRefresh(MAASTestCase):
108 )122 )
109123
110 def test_refresh_accepts_defined_url(self):124 def test_refresh_accepts_defined_url(self):
111 signal = self.patch(refresh, "signal")
112 script_name = factory.make_name("script_name")125 script_name = factory.make_name("script_name")
113 info_scripts = self.create_scripts_success(script_name)126 info_scripts = self.create_scripts_success(script_name)
114127
@@ -116,55 +129,34 @@ class TestRefresh(MAASTestCase):
116 consumer_key = factory.make_name("consumer_key")129 consumer_key = factory.make_name("consumer_key")
117 token_key = factory.make_name("token_key")130 token_key = factory.make_name("token_key")
118 token_secret = factory.make_name("token_secret")131 token_secret = factory.make_name("token_secret")
119 url = factory.make_url()132 base_url = factory.make_simple_http_url()
120133
121 with patch.dict(refresh.NODE_INFO_SCRIPTS, info_scripts, clear=True):134 with patch.dict(refresh.NODE_INFO_SCRIPTS, info_scripts, clear=True):
122 refresh.refresh(135 refresh.refresh(
123 system_id, consumer_key, token_key, token_secret, url136 system_id, consumer_key, token_key, token_secret, base_url
124 )137 )
125 self.assertThat(138 requests = [call[0] for call in self.urlopen_calls]
126 signal,
127 MockAnyCall(
128 "%s/metadata/%s/" % (url, MD_VERSION),
129 {
130 "consumer_secret": "",
131 "consumer_key": consumer_key,
132 "token_key": token_key,
133 "token_secret": token_secret,
134 },
135 "WORKING",
136 "Starting %s [1/1]" % script_name,
137 ),
138 )
139
140 def test_refresh_signals_starting(self):
141 signal = self.patch(refresh, "signal")
142 script_name = factory.make_name("script_name")
143 info_scripts = self.create_scripts_success(script_name)
144139
145 system_id = factory.make_name("system_id")140 for request in requests:
146 consumer_key = factory.make_name("consumer_key")141 self.assertEqual(
147 token_key = factory.make_name("token_key")142 f"{base_url}/metadata/{MD_VERSION}/", request.full_url
148 token_secret = factory.make_name("token_secret")
149 url = factory.make_url()
150
151 with patch.dict(refresh.NODE_INFO_SCRIPTS, info_scripts, clear=True):
152 refresh.refresh(
153 system_id, consumer_key, token_key, token_secret, url
154 )143 )
155 self.assertThat(144 auth_header = request.get_header("Authorization")
156 signal,145 self.assertTrue(
157 MockAnyCall(146 auth_header.startswith("OAuth oauth_nonce="), auth_header
158 "%s/metadata/%s/" % (url, MD_VERSION),147 )
159 {148 self.assertIn(f'oauth_consumer_key="{consumer_key}"', auth_header)
160 "consumer_secret": "",149 self.assertIn(f'oauth_token="{token_key}"', auth_header)
161 "consumer_key": consumer_key,150
162 "token_key": token_key,151 self.assertIn(
163 "token_secret": token_secret,152 f"Starting {script_name}", requests[0].data.decode("ascii")
164 },153 )
165 "WORKING",154 self.assertIn(
166 "Starting %s [1/1]" % script_name,155 f'filename="{script_name}"', requests[1].data.decode("ascii")
167 ),156 )
157 self.assertIn(
158 f"Finished refreshing {system_id}",
159 requests[2].data.decode("ascii"),
168 )160 )
169161
170 def test_refresh_signals_results(self):162 def test_refresh_signals_results(self):
@@ -194,13 +186,8 @@ class TestRefresh(MAASTestCase):
194 self.assertThat(186 self.assertThat(
195 signal,187 signal,
196 MockAnyCall(188 MockAnyCall(
197 "%s/metadata/%s/" % (url, MD_VERSION),189 ANY,
198 {190 ANY,
199 "consumer_secret": "",
200 "consumer_key": consumer_key,
201 "token_key": token_key,
202 "token_secret": token_secret,
203 },
204 "WORKING",191 "WORKING",
205 files={192 files={
206 script_name: b"test script\n",193 script_name: b"test script\n",
@@ -261,13 +248,8 @@ class TestRefresh(MAASTestCase):
261 self.assertThat(248 self.assertThat(
262 signal,249 signal,
263 MockAnyCall(250 MockAnyCall(
264 "%s/metadata/%s/" % (url, MD_VERSION),251 ANY,
265 {252 ANY,
266 "consumer_secret": "",
267 "consumer_key": consumer_key,
268 "token_key": token_key,
269 "token_secret": token_secret,
270 },
271 "WORKING",253 "WORKING",
272 files={254 files={
273 script_name: b"[Errno 8] Exec format error",255 script_name: b"[Errno 8] Exec format error",
@@ -298,13 +280,8 @@ class TestRefresh(MAASTestCase):
298 self.assertThat(280 self.assertThat(
299 signal,281 signal,
300 MockAnyCall(282 MockAnyCall(
301 "%s/metadata/%s/" % (url, MD_VERSION),283 ANY,
302 {284 ANY,
303 "consumer_secret": "",
304 "consumer_key": consumer_key,
305 "token_key": token_key,
306 "token_secret": token_secret,
307 },
308 "WORKING",285 "WORKING",
309 files={286 files={
310 script_name: b"Unable to execute script",287 script_name: b"Unable to execute script",
@@ -335,13 +312,8 @@ class TestRefresh(MAASTestCase):
335 self.assertThat(312 self.assertThat(
336 signal,313 signal,
337 MockAnyCall(314 MockAnyCall(
338 "%s/metadata/%s/" % (url, MD_VERSION),315 ANY,
339 {316 ANY,
340 "consumer_secret": "",
341 "consumer_key": consumer_key,
342 "token_key": token_key,
343 "token_secret": token_secret,
344 },
345 "WORKING",317 "WORKING",
346 files={318 files={
347 script_name: b"[Errno 0] Exec format error",319 script_name: b"[Errno 0] Exec format error",
@@ -383,13 +355,8 @@ class TestRefresh(MAASTestCase):
383 self.assertThat(355 self.assertThat(
384 signal,356 signal,
385 MockAnyCall(357 MockAnyCall(
386 "%s/metadata/%s/" % (url, MD_VERSION),358 ANY,
387 {359 ANY,
388 "consumer_secret": "",
389 "consumer_key": consumer_key,
390 "token_key": token_key,
391 "token_secret": token_secret,
392 },
393 "TIMEDOUT",360 "TIMEDOUT",
394 files={361 files={
395 script_name: b"",362 script_name: b"",
@@ -400,36 +367,6 @@ class TestRefresh(MAASTestCase):
400 ),367 ),
401 )368 )
402369
403 def test_refresh_signals_finished(self):
404 signal = self.patch(refresh, "signal")
405 script_name = factory.make_name("script_name")
406 info_scripts = self.create_scripts_success(script_name)
407
408 system_id = factory.make_name("system_id")
409 consumer_key = factory.make_name("consumer_key")
410 token_key = factory.make_name("token_key")
411 token_secret = factory.make_name("token_secret")
412 url = factory.make_url()
413
414 with patch.dict(refresh.NODE_INFO_SCRIPTS, info_scripts, clear=True):
415 refresh.refresh(
416 system_id, consumer_key, token_key, token_secret, url
417 )
418 self.assertThat(
419 signal,
420 MockAnyCall(
421 "%s/metadata/%s/" % (url, MD_VERSION),
422 {
423 "consumer_secret": "",
424 "consumer_key": consumer_key,
425 "token_key": token_key,
426 "token_secret": token_secret,
427 },
428 "OK",
429 "Finished refreshing %s" % system_id,
430 ),
431 )
432
433 def test_refresh_signals_failure(self):370 def test_refresh_signals_failure(self):
434 signal = self.patch(refresh, "signal")371 signal = self.patch(refresh, "signal")
435 info_scripts = self.create_scripts_failure()372 info_scripts = self.create_scripts_failure()
@@ -447,13 +384,8 @@ class TestRefresh(MAASTestCase):
447 self.assertThat(384 self.assertThat(
448 signal,385 signal,
449 MockAnyCall(386 MockAnyCall(
450 "%s/metadata/%s/" % (url, MD_VERSION),387 ANY,
451 {388 ANY,
452 "consumer_secret": "",
453 "consumer_key": consumer_key,
454 "token_key": token_key,
455 "token_secret": token_secret,
456 },
457 "FAILED",389 "FAILED",
458 "Failed refreshing %s" % system_id,390 "Failed refreshing %s" % system_id,
459 ),391 ),
@@ -477,13 +409,8 @@ class TestRefresh(MAASTestCase):
477 self.assertThat(409 self.assertThat(
478 signal,410 signal,
479 MockAnyCall(411 MockAnyCall(
480 "%s/metadata/%s/" % (url, MD_VERSION),412 ANY,
481 {413 ANY,
482 "consumer_secret": "",
483 "consumer_key": consumer_key,
484 "token_key": token_key,
485 "token_secret": token_secret,
486 },
487 "WORKING",414 "WORKING",
488 "Starting %s [1/1]" % script_name,415 "Starting %s [1/1]" % script_name,
489 ),416 ),
@@ -509,13 +436,8 @@ class TestRefresh(MAASTestCase):
509 self.assertThat(436 self.assertThat(
510 signal,437 signal,
511 MockAnyCall(438 MockAnyCall(
512 "%s/metadata/%s/" % (url, MD_VERSION),439 ANY,
513 {440 ANY,
514 "consumer_secret": "",
515 "consumer_key": consumer_key,
516 "token_key": token_key,
517 "token_secret": token_secret,
518 },
519 "WORKING",441 "WORKING",
520 "Starting %s [1/1]" % script_name,442 "Starting %s [1/1]" % script_name,
521 ),443 ),
diff --git a/src/provisioningserver/utils/tests/test_services.py b/src/provisioningserver/utils/tests/test_services.py
index f845567..ab4b5af 100644
--- a/src/provisioningserver/utils/tests/test_services.py
+++ b/src/provisioningserver/utils/tests/test_services.py
@@ -154,7 +154,18 @@ class FakeRefresher:
154 def fake_signal(154 def fake_signal(
155 self, url, creds, status, error=None, files=None, exit_status=None155 self, url, creds, status, error=None, files=None, exit_status=None
156 ):156 ):
157 self.testcase.assertEqual(self.credentials, creds)157 self.testcase.assertEqual(
158 self.credentials["token_key"], creds.token_key
159 )
160 self.testcase.assertEqual(
161 self.credentials["token_secret"], creds.token_secret
162 )
163 self.testcase.assertEqual(
164 self.credentials["consumer_key"], creds.consumer_key
165 )
166 self.testcase.assertEqual(
167 self.credentials["consumer_secret"], creds.consumer_secret
168 )
158 script_runs = self.script_runs[url]169 script_runs = self.script_runs[url]
159 if status == "WORKING":170 if status == "WORKING":
160 if error.startswith("Starting"):171 if error.startswith("Starting"):

Subscribers

People subscribed via source and target branches