Merge ~rgildein/juju-verify:bug1921505 into ~canonical-solutions-engineering/juju-verify:master

Proposed by Robert Gildein
Status: Merged
Approved by: Martin Kalcok
Approved revision: 600312f24dd930e40f5166815bfec2463de250e9
Merged at revision: f5f65933228c96286b4edb8469672b7cba0916dd
Proposed branch: ~rgildein/juju-verify:bug1921505
Merge into: ~canonical-solutions-engineering/juju-verify:master
Diff against target: 233 lines (+33/-82)
6 files modified
juju_verify/utils/unit.py (+11/-0)
juju_verify/verifiers/base.py (+2/-32)
juju_verify/verifiers/nova_compute.py (+2/-2)
tests/unit/utils/test_unit.py (+10/-2)
tests/unit/verifiers/test_base.py (+3/-38)
tests/unit/verifiers/test_nova_compute.py (+5/-8)
Reviewer Review Type Date Requested Status
Martin Kalcok (community) Approve
Alvaro Uria (community) Needs Information
🤖 prod-jenkaas-bootstack (community) continuous-integration Approve
Review via email: mp+401950@code.launchpad.net

Commit message

removed `BaseVerifier.run_action_on_units`

The function `BaseVerifier.run_action_on_units` was used with restriction
that prevents actions being run on units other than those that are part
of the self.units.

Because this restriction was no longer useful, it has been removed, and
without it, there is no reason for the `run_action_on_units` function
to be part of the `BaseVerifier`. At the same time, the
`run_action_on_unit` function has been moved from `BaseVerifier` to
`utils.unit`.

Fixes: LP#1921505

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :

A CI job is currently in progress. A follow up comment will be added when it completes.

Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alvaro Uria (aluria) wrote :

+1, change lgtm. Have you run the functional tests to confirm all looks good?

review: Needs Information
Revision history for this message
Martin Kalcok (martin-kalcok) wrote :

I ran the func tests and they all passed.

Change LGTM, thanks.

review: Approve
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision f5f65933228c96286b4edb8469672b7cba0916dd

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/juju_verify/utils/unit.py b/juju_verify/utils/unit.py
2index 84bc3f8..6ff3fb0 100644
3--- a/juju_verify/utils/unit.py
4+++ b/juju_verify/utils/unit.py
5@@ -66,6 +66,17 @@ def run_action_on_units(
6 return result_map
7
8
9+def run_action_on_unit(unit: Unit, action: str, **params: str) -> Action:
10+ """Run juju action on single unit.
11+
12+ For more info, see docstring for 'run_action_on_units'. The only
13+ difference is that this function returns Action object directly, not
14+ dict {unit_id: action}.
15+ """
16+ results = run_action_on_units([unit], action, **params)
17+ return results[unit.entity_id]
18+
19+
20 def parse_charm_name(charm_url: str) -> str:
21 """Parse charm name from full charm url.
22
23diff --git a/juju_verify/verifiers/base.py b/juju_verify/verifiers/base.py
24index 7057d88..504c15f 100644
25--- a/juju_verify/verifiers/base.py
26+++ b/juju_verify/verifiers/base.py
27@@ -201,42 +201,12 @@ class BaseVerifier:
28 err = VerificationError('Verification failed: {}'.format(exc))
29 raise err from exc
30
31- def run_action_on_all(self, action: str,
32- **params: str) -> Dict[str, Action]:
33+ def run_action_on_all(self, action: str, **params: str) -> Dict[str, Action]:
34 """Run juju action on all units in self.units.
35
36 For more info, see docstring for 'run_action_on_units'.
37 """
38- return self.run_action_on_units(self.unit_ids, action, **params)
39-
40- def run_action_on_unit(self, unit: str, action: str,
41- **params: str) -> Action:
42- """Run juju action on single unit.
43-
44- For more info, see docstring for 'run_action_on_units'. The only
45- difference is that this function returns Action object directly, not
46- dict {unit_id: action}.
47- """
48- results = self.run_action_on_units([unit], action, **params)
49- return results[unit]
50-
51- def run_action_on_units(self, units: List[str], action: str,
52- **params: str) -> Dict[str, Action]:
53- """Run juju action on specified units.
54-
55- Units are specified by string that must match Unit.entity_id in
56- self.units. All actions that are executed are also awaited, if any
57- of the actions fails, VerificationError is raised.
58-
59- :param units: List of unit IDs on which to run action
60- :param action: Action to run on units
61- :param params: Additional parameters for the action
62- :return: Dict in format {unit_id: action} where unit_ids are strings
63- provided in 'units' and actions are their matching,
64- juju.Action objects that have been executed and awaited.
65- """
66- target_units = [self.unit_from_id(unit_id) for unit_id in units]
67- return run_action_on_units(target_units, action=action, **params)
68+ return run_action_on_units(self.units, action, **params)
69
70 def verify_shutdown(self) -> Result:
71 """Child classes must override this method with custom implementation.
72diff --git a/juju_verify/verifiers/nova_compute.py b/juju_verify/verifiers/nova_compute.py
73index 1e08ba0..c04a971 100644
74--- a/juju_verify/verifiers/nova_compute.py
75+++ b/juju_verify/verifiers/nova_compute.py
76@@ -19,6 +19,7 @@ import json
77 import logging
78
79 from juju_verify.utils.action import data_from_action
80+from juju_verify.utils.unit import run_action_on_unit
81 from juju_verify.verifiers.base import BaseVerifier
82 from juju_verify.verifiers.result import aggregate_results, Result, Severity
83
84@@ -55,8 +56,7 @@ class NovaCompute(BaseVerifier):
85 target_nodes = [data_from_action(action, 'node-name')
86 for _, action in node_name_actions.items()]
87
88- nova_unit = self.units[0].entity_id
89- action = self.run_action_on_unit(nova_unit, 'list-compute-nodes')
90+ action = run_action_on_unit(self.units[0], 'list-compute-nodes')
91 compute_nodes = json.loads(data_from_action(action, 'compute-nodes'))
92
93 affected_zones = {node['zone'] for node in compute_nodes
94diff --git a/tests/unit/utils/test_unit.py b/tests/unit/utils/test_unit.py
95index e519520..b92088b 100644
96--- a/tests/unit/utils/test_unit.py
97+++ b/tests/unit/utils/test_unit.py
98@@ -17,7 +17,7 @@
99 """Utils unit test suite."""
100 import asyncio
101 from typing import List
102-from unittest.mock import MagicMock, call
103+from unittest.mock import MagicMock, call, patch
104
105 import pytest
106 from juju.action import Action
107@@ -30,7 +30,7 @@ from juju_verify.utils.unit import (
108 verify_charm_unit,
109 parse_charm_name,
110 get_first_active_unit,
111- get_applications_names
112+ get_applications_names, run_action_on_unit
113 )
114
115
116@@ -109,6 +109,14 @@ def test_run_action_on_units(mocker, model, all_units):
117 assert str(exc.value) == expect_err
118
119
120+@patch("juju_verify.utils.unit.run_action_on_units")
121+def test_base_verifier_run_action_on_unit(mock_run_action_on_units, model):
122+ """Test running action on single unit from the verifier."""
123+ unit = model.units["nova-compute/0"]
124+ run_action_on_unit(unit, "test")
125+ mock_run_action_on_units.assert_called_with([unit], "test")
126+
127+
128 @pytest.mark.parametrize("charm_url, exp_name", [
129 ("cs:focal/nova-compute-141", "nova-compute"),
130 ("cs:hacluster-74", "hacluster"),
131diff --git a/tests/unit/verifiers/test_base.py b/tests/unit/verifiers/test_base.py
132index d68a960..a0b3e03 100644
133--- a/tests/unit/verifiers/test_base.py
134+++ b/tests/unit/verifiers/test_base.py
135@@ -17,7 +17,7 @@
136 """Base class test suite."""
137 import asyncio
138 from unittest import mock
139-from unittest.mock import MagicMock, PropertyMock, call
140+from unittest.mock import MagicMock, PropertyMock
141
142 import pytest
143 from juju.model import Model
144@@ -189,48 +189,13 @@ def test_base_verifier_unit_from_id():
145
146
147 @mock.patch("juju_verify.verifiers.base.run_action_on_units")
148-def test_base_verifier_run_action_on_unit(mock_run_action_on_units, mocker, model):
149- """Test running action on single unit from the verifier."""
150- # Put spy on unit_id resolution
151- id_to_unit = mocker.spy(BaseVerifier, 'unit_from_id')
152- units = list(model.units.values())
153-
154- verifier = BaseVerifier(units)
155- verifier.run_action_on_unit(units[1].entity_id, "test")
156-
157- id_to_unit.assert_has_calls([call(verifier, units[1].entity_id)])
158- mock_run_action_on_units.assert_called_with([units[1]], action="test")
159-
160-
161-@mock.patch("juju_verify.verifiers.base.run_action_on_units")
162-def test_base_verifier_run_action_on_all_units(mock_run_action_on_units, mocker, model):
163+def test_base_verifier_run_action_on_all_units(mock_run_action_on_units, model):
164 """Test running action on all units in verifier."""
165- # Put spy on unit_id resolution
166- id_to_unit = mocker.spy(BaseVerifier, 'unit_from_id')
167 units = list(model.units.values())
168-
169 verifier = BaseVerifier(units)
170 verifier.run_action_on_all("test")
171
172- id_to_unit.assert_has_calls([call(verifier, unit.entity_id) for unit in units])
173- mock_run_action_on_units.assert_called_with(units, action="test")
174-
175-
176-@mock.patch("juju_verify.verifiers.base.run_action_on_units")
177-def test_base_verifier_run_action_on_units(mock_run_action_on_units, mocker, model):
178- """Test running action on list of units and returning results."""
179- # Put spy on unit_id resolution
180- id_to_unit = mocker.spy(BaseVerifier, 'unit_from_id')
181- units = list(model.units.values())
182- run_on_units = [unit for id_, unit in model.units.items()
183- if id_.startswith("nova-compute")]
184-
185- verifier = BaseVerifier(units)
186- verifier.run_action_on_units([unit.entity_id for unit in run_on_units], "test")
187-
188- id_to_unit.assert_has_calls(
189- [call(verifier, unit.entity_id) for unit in run_on_units])
190- mock_run_action_on_units.assert_called_with(run_on_units, action="test")
191+ mock_run_action_on_units.assert_called_with(units, "test")
192
193
194 def test_base_verifier_check_has_sub_machines(mocker):
195diff --git a/tests/unit/verifiers/test_nova_compute.py b/tests/unit/verifiers/test_nova_compute.py
196index 5d2bdff..58450af 100644
197--- a/tests/unit/verifiers/test_nova_compute.py
198+++ b/tests/unit/verifiers/test_nova_compute.py
199@@ -23,7 +23,7 @@ from juju.model import Model
200 from juju.unit import Unit
201 from pytest import param
202
203-from juju_verify.verifiers import NovaCompute
204+from juju_verify.verifiers.nova_compute import NovaCompute
205 from juju_verify.verifiers.result import Result, Severity, Partial
206
207
208@@ -118,21 +118,18 @@ def test_nova_compute_empty_az(all_hosts, remove_hosts, host_state,
209 mocker.patch.object(NovaCompute,
210 'run_action_on_all').return_value = action_results
211
212- # mock result 'list-compute-nodes' action. Number of nodes in zone
213- # is parametrized.
214+ # mock result 'list-compute-nodes' action. Number of nodes in zone is parametrized.
215 raw_compute_nodes = [{'host': host,
216 'zone': zone,
217 'state': host_state,
218 'status': host_status}
219 for host in host_pool[:all_hosts]]
220
221- compute_nodes_data = {'results': {
222- 'compute-nodes': json.dumps(raw_compute_nodes)}}
223+ compute_nodes_data = {'results': {'compute-nodes': json.dumps(raw_compute_nodes)}}
224 mock_compute_node_result = MagicMock()
225 mock_compute_node_result.data = compute_nodes_data
226- mocker.patch.object(NovaCompute,
227- 'run_action_on_unit'
228- ).return_value = mock_compute_node_result
229+ mocker.patch('juju_verify.verifiers.nova_compute.run_action_on_unit'
230+ ).return_value = mock_compute_node_result
231
232 # run verifier
233 verifier = NovaCompute(units)

Subscribers

People subscribed via source and target branches