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

Proposed by Robert Gildein
Status: Merged
Approved by: Martin Kalcok
Approved revision: 7327b64dd3fc5bf4c46bf7d1462c36e6cc0c7563
Merged at revision: 59e1dd5d0aae75789574285ab2f073ab192c1d05
Proposed branch: ~rgildein/juju-verify:bug/1920914
Merge into: ~canonical-solutions-engineering/juju-verify:master
Diff against target: 114 lines (+52/-10)
2 files modified
juju_verify/juju_verify.py (+19/-2)
tests/unit/test_juju_verify.py (+33/-8)
Reviewer Review Type Date Requested Status
Martin Kalcok (community) Approve
🤖 prod-jenkaas-bootstack (community) continuous-integration Approve
Canonical Solutions Engineering Team Pending
Review via email: mp+400337@code.launchpad.net

Commit message

Add support for multiple units/machines arguments

This change provides support for using multiple units/machines as
arguments. Without these changes, only the last argument was taken into
account, so `--units ceph-osd/0 --units ceph-osd/1` used only
"ceph-osd/1".

Closes-bug: LP#1920914

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: Needs Fixing (continuous-integration)
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
Martin Kalcok (martin-kalcok) wrote :

Looks good, +1. Thanks.

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

Change successfully merged at revision 59e1dd5d0aae75789574285ab2f073ab192c1d05

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/juju_verify/juju_verify.py b/juju_verify/juju_verify.py
2index 7d3d86e..704fb09 100644
3--- a/juju_verify/juju_verify.py
4+++ b/juju_verify/juju_verify.py
5@@ -22,6 +22,7 @@ import argparse
6 import logging
7 import os
8 import sys
9+import typing
10 from typing import List, Union
11
12 from juju import errors, loop
13@@ -91,11 +92,27 @@ async def connect_model(model_name: Union[str, None]) -> Model:
14 return model
15
16
17+class ExtendAction(argparse.Action): # pylint: disable=too-few-public-methods
18+ """Extend action for argparse.
19+
20+ NOTE (rgildein): This action should be removed after python 3.6 support ends, because
21+ since Python 3.8 the "extend" is available directly in stdlib.
22+ """
23+
24+ @typing.no_type_check
25+ def __call__(self, parser, namespace, values, option_string=None):
26+ """Extend existing items with values."""
27+ items = getattr(namespace, self.dest) or []
28+ items = [*items, *values] # extend list of items
29+ setattr(namespace, self.dest, items)
30+
31+
32 def parse_args() -> argparse.Namespace:
33 """Parse cli arguments."""
34 description = "Verify that it's safe to perform selected action on " \
35 "specified units"
36 parser = argparse.ArgumentParser(description=description)
37+ parser.register("action", "extend", ExtendAction)
38
39 parser.add_argument('--model', '-m', required=False,
40 help='Connect to specific model.')
41@@ -106,9 +123,9 @@ def parse_args() -> argparse.Namespace:
42 default='info', choices=['trace', 'debug', 'info'])
43
44 target = parser.add_mutually_exclusive_group(required=True)
45- target.add_argument('--units', '-u', nargs='+', type=str,
46+ target.add_argument('--units', '-u', action="extend", nargs='+', type=str,
47 help='Units to check.')
48- target.add_argument('--machines', '-M', nargs='+', type=str,
49+ target.add_argument('--machines', '-M', action="extend", nargs='+', type=str,
50 help='Check all units on the machine.')
51 return parser.parse_args()
52
53diff --git a/tests/unit/test_juju_verify.py b/tests/unit/test_juju_verify.py
54index 308843d..2aa0a7a 100644
55--- a/tests/unit/test_juju_verify.py
56+++ b/tests/unit/test_juju_verify.py
57@@ -16,10 +16,10 @@
58 # this program. If not, see https://www.gnu.org/licenses/.
59 """Test suite for the entrypoint function and helpers."""
60
61-import argparse
62 import logging
63 import os
64 import sys
65+from argparse import Namespace
66 from asyncio import Future
67 from unittest.mock import ANY, MagicMock
68
69@@ -166,13 +166,38 @@ def test_unsupported_log_levels(fail, log_level):
70 fail.assert_called_with(expected_msg)
71
72
73-def test_parse_args(mocker):
74- """Rudimentary test for argument parsing."""
75- parser = mocker.patch.object(argparse.ArgumentParser, 'parse_args')
76-
77- juju_verify.parse_args()
78-
79- parser.assert_called_once()
80+@pytest.mark.parametrize("args, exp_args", [
81+ (["reboot", "--units", "ceph-osd/0", "ceph-osd/1"],
82+ dict(check="reboot", machines=None, units=["ceph-osd/0", "ceph-osd/1"])),
83+ (["reboot", "--machines", "0", "1"],
84+ dict(check="reboot", units=None, machines=["0", "1"])),
85+ (["reboot", "--machines", "0", "--machines", "1"],
86+ dict(check="reboot", units=None, machines=["0", "1"])),
87+ (["reboot", "--machine", "0", "--machine", "1"],
88+ dict(check="reboot", units=None, machines=["0", "1"])),
89+ (["reboot", "--machine", "0", "--machine", "1", "2"],
90+ dict(check="reboot", units=None, machines=["0", "1", "2"])),
91+])
92+def test_parse_args(args, exp_args, mocker):
93+ """Test for argument parsing."""
94+ mocker.patch("sys.argv", ["juju-verify", *args])
95+ exp_result = Namespace(**exp_args, log_level="info", model=None)
96+
97+ result = juju_verify.parse_args()
98+ assert result == exp_result
99+
100+
101+@pytest.mark.parametrize("args", [
102+ ["--units", "ceph-osd/0"],
103+ ["--machines", "0"],
104+ ["reboot", "--units", "ceph-osd/0", "--machines", "0"]
105+])
106+def test_parse_args_error(args, mocker):
107+ """Test for argument parsing raise error."""
108+ mocker.patch("sys.argv", ["juju-verify", *args])
109+
110+ with pytest.raises(SystemExit):
111+ juju_verify.parse_args()
112
113
114 def test_main_entrypoint_target_units(mocker):

Subscribers

People subscribed via source and target branches