Skip to content

Commit fdcba1d

Browse files
author
João Silva
committed
!41 bug(Filters): [#80] Start scan with filters is not working Closes #80
1 parent fbe2942 commit fdcba1d

7 files changed

Lines changed: 94 additions & 65 deletions

File tree

probely_cli/cli/commands/targets/start_scan.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
logger = logging.getLogger(__name__)
1313

14+
1415
def validate_and_retrieve_extra_payload(args):
1516
extra_payload = validate_and_retrieve_yaml_content(args.yaml_file_path)
1617

@@ -47,4 +48,5 @@ def start_scans_command_handler(args):
4748
scans = [start_scan(targets_ids[0], extra_payload)]
4849
else:
4950
scans = start_scans(targets_ids, extra_payload)
51+
5052
display_scans_response_output(args, scans)

probely_cli/sdk/client.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ class ProbelyAPIClient:
6363
_session_cache: Union[Session, None] = None
6464

6565
@classmethod
66-
def get(cls, url, query_params=None):
67-
return cls._send_request("get", url, query_params=query_params)
66+
def get(cls, url, query_params: dict = None, payload: dict = None):
67+
return cls._send_request("get", url, query_params=query_params, payload=payload)
6868

6969
@classmethod
7070
def post(cls, url, query_params: dict = None, payload: dict = None):
@@ -73,11 +73,16 @@ def post(cls, url, query_params: dict = None, payload: dict = None):
7373
)
7474

7575
@classmethod
76-
def patch(cls, url, payload: dict = None):
77-
return cls._send_request("patch", url, payload=payload)
76+
def patch(cls, url, query_params: dict = None, payload: dict = None):
77+
return cls._send_request(
78+
"patch", url, query_params=query_params, payload=payload
79+
)
7880

79-
def delete(self, url):
80-
return self._send_request("delete", url)
81+
@classmethod
82+
def delete(cls, url, query_params: dict = None, payload: dict = None):
83+
return cls._send_request(
84+
"delete", url, query_params=query_params, payload=payload
85+
)
8186

8287
@classmethod
8388
def _send_request(

probely_cli/sdk/scans.py

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from probely_cli.sdk.client import ProbelyAPIClient
1111
from probely_cli.sdk.helpers import validate_resource_ids
1212
from probely_cli.settings import (
13-
PROBELY_API_BULK_START_SCANS_URL,
13+
PROBELY_API_SCANS_BULK_START_URL,
1414
PROBELY_API_PAGE_SIZE,
1515
PROBELY_API_SCAN_CANCEL_URL,
1616
PROBELY_API_SCAN_PAUSE_URL,
@@ -19,18 +19,18 @@
1919
PROBELY_API_SCANS_BULK_PAUSE_URL,
2020
PROBELY_API_SCANS_BULK_RESUME_URL,
2121
PROBELY_API_SCANS_URL,
22-
PROBELY_API_START_SCAN_URL,
22+
PROBELY_API_TARGETS_START_SCAN_URL,
2323
PROBELY_API_TARGETS_URL,
2424
)
2525

2626
logger = logging.getLogger(__name__)
2727

2828

2929
def start_scan(target_id: str, extra_payload: dict = None) -> dict:
30-
scan_target_url = PROBELY_API_START_SCAN_URL.format(target_id=target_id)
30+
scan_target_url = PROBELY_API_TARGETS_START_SCAN_URL.format(target_id=target_id)
3131

3232
resp_status_code, resp_content = ProbelyAPIClient.post(
33-
scan_target_url, extra_payload
33+
scan_target_url, payload=extra_payload
3434
)
3535

3636
if resp_status_code != 200:
@@ -47,19 +47,20 @@ def start_scan(target_id: str, extra_payload: dict = None) -> dict:
4747
def start_scans(target_ids: List[str], extra_payload: dict = None) -> List[dict]:
4848
validate_resource_ids(PROBELY_API_TARGETS_URL, target_ids)
4949

50-
url = PROBELY_API_BULK_START_SCANS_URL
50+
url = PROBELY_API_SCANS_BULK_START_URL
5151
extra_payload = extra_payload or {}
5252

5353
payload = {
5454
"targets": [{"id": target_id} for target_id in target_ids],
5555
**extra_payload,
5656
}
5757

58-
resp_status_code, resp_content = ProbelyAPIClient.post(url, payload)
58+
resp_status_code, resp_content = ProbelyAPIClient.post(url, payload=payload)
59+
60+
if resp_status_code == 400:
61+
raise ProbelyBadRequest(resp_content)
5962

6063
if resp_status_code != 200:
61-
if resp_status_code == 400:
62-
raise ProbelyBadRequest(resp_content)
6364
raise ProbelyRequestFailed(resp_content)
6465

6566
scans = resp_content
@@ -72,8 +73,10 @@ def cancel_scans(scan_ids: List[str]) -> List[dict]:
7273
for scan_id in scan_ids:
7374
retrieve_scan(scan_id)
7475

76+
payload = {"scans": [{"id": scan_id} for scan_id in scan_ids]}
77+
7578
resp_status_code, resp_content = ProbelyAPIClient.post(
76-
scan_cancel_url, {"scans": [{"id": scan_id} for scan_id in scan_ids]}
79+
scan_cancel_url, payload=payload
7780
)
7881

7982
if resp_status_code != 200:
@@ -88,24 +91,25 @@ def cancel_scans(scan_ids: List[str]) -> List[dict]:
8891

8992

9093
def cancel_scan(scan_id: str) -> dict:
91-
9294
scan = retrieve_scan(scan_id)
9395
target = scan.get("target", {})
9496

9597
scan_cancel_url = PROBELY_API_SCAN_CANCEL_URL.format(
9698
target_id=target.get("id"), scan_id=scan_id
9799
)
98100

99-
resp_status_code, resp_content = ProbelyAPIClient().post(
100-
scan_cancel_url,
101-
{
102-
"target_options": {
103-
"site": target.get("site"),
104-
"scanning_agent": target.get("scanning_agent"),
105-
},
106-
"has_sequence_navigation": scan.get("has_sequence_navigation"),
107-
"user_data": scan.get("user_data"),
101+
payload = {
102+
"target_options": {
103+
"site": target.get("site"),
104+
"scanning_agent": target.get("scanning_agent"),
108105
},
106+
"has_sequence_navigation": scan.get("has_sequence_navigation"),
107+
"user_data": scan.get("user_data"),
108+
}
109+
110+
resp_status_code, resp_content = ProbelyAPIClient.post(
111+
scan_cancel_url,
112+
payload=payload,
109113
)
110114

111115
if resp_status_code != 200:
@@ -122,16 +126,18 @@ def pause_scan(scan_id: str) -> dict:
122126
target_id=target.get("id"), scan_id=scan_id
123127
)
124128

129+
payload = {
130+
"target_options": {
131+
"site": target.get("site"),
132+
"scanning_agent": target.get("scanning_agent"),
133+
},
134+
"has_sequence_navigation": scan.get("has_sequence_navigation"),
135+
"user_data": scan.get("user_data"),
136+
}
137+
125138
resp_status_code, resp_content = ProbelyAPIClient.post(
126139
scan_pause_url,
127-
{
128-
"target_options": {
129-
"site": target.get("site"),
130-
"scanning_agent": target.get("scanning_agent"),
131-
},
132-
"has_sequence_navigation": scan.get("has_sequence_navigation"),
133-
"user_data": scan.get("user_data"),
134-
},
140+
payload=payload,
135141
)
136142

137143
if resp_status_code != 200:
@@ -146,8 +152,11 @@ def pause_scans(scan_ids: List[str]) -> List[dict]:
146152
for scan_id in scan_ids:
147153
scan = retrieve_scan(scan_id)
148154

155+
payload = {"scans": [{"id": scan_id} for scan_id in scan_ids]}
156+
149157
resp_status_code, resp_content = ProbelyAPIClient.post(
150-
scan_pause_url, {"scans": [{"id": scan_id} for scan_id in scan_ids]}
158+
scan_pause_url,
159+
payload=payload,
151160
)
152161

153162
if resp_status_code != 200:
@@ -169,16 +178,18 @@ def resume_scan(scan_id: str) -> dict:
169178
target_id=target.get("id"), scan_id=scan_id
170179
)
171180

172-
resp_status_code, resp_content = ProbelyAPIClient().post(
173-
scan_resume_url,
174-
{
175-
"target_options": {
176-
"site": target.get("site"),
177-
"scanning_agent": target.get("scanning_agent"),
178-
},
179-
"has_sequence_navigation": scan.get("has_sequence_navigation"),
180-
"user_data": scan.get("user_data"),
181+
payload = {
182+
"target_options": {
183+
"site": target.get("site"),
184+
"scanning_agent": target.get("scanning_agent"),
181185
},
186+
"has_sequence_navigation": scan.get("has_sequence_navigation"),
187+
"user_data": scan.get("user_data"),
188+
}
189+
190+
resp_status_code, resp_content = ProbelyAPIClient.post(
191+
scan_resume_url,
192+
payload=payload,
182193
)
183194

184195
if resp_status_code != 200:
@@ -198,7 +209,9 @@ def resume_scans(scan_ids: List[str], ignore_blackout_period=False) -> List[Dict
198209
"overrides": {"ignore_blackout_period": ignore_blackout_period},
199210
}
200211

201-
resp_status_code, resp_content = ProbelyAPIClient.post(scan_resume_url, payload)
212+
resp_status_code, resp_content = ProbelyAPIClient.post(
213+
scan_resume_url, payload=payload
214+
)
202215

203216
if resp_status_code != 200:
204217
raise ProbelyRequestFailed(resp_content, resp_status_code)

probely_cli/sdk/targets.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@
1010
)
1111
from probely_cli.sdk.enums import TargetAPISchemaTypeEnum, TargetTypeEnum
1212
from probely_cli.sdk.helpers import validate_resource_ids
13-
13+
from .client import ProbelyAPIClient
1414
from ..settings import (
1515
PROBELY_API_TARGETS_BULK_DELETE_URL,
1616
PROBELY_API_TARGETS_BULK_UPDATE_URL,
1717
PROBELY_API_TARGETS_DELETE_URL,
1818
PROBELY_API_TARGETS_RETRIEVE_URL,
1919
PROBELY_API_TARGETS_URL,
2020
)
21-
from .client import ProbelyAPIClient
2221

2322
logger = logging.getLogger(__name__)
2423

@@ -46,7 +45,7 @@ def retrieve_target(target_id: str) -> dict:
4645
def delete_target(target_id: str) -> str:
4746
url = PROBELY_API_TARGETS_DELETE_URL.format(id=target_id)
4847

49-
resp_status_code, resp_content = ProbelyAPIClient().delete(url=url)
48+
resp_status_code, resp_content = ProbelyAPIClient.delete(url=url)
5049

5150
if resp_status_code == 404:
5251
raise ProbelyObjectNotFound(id=target_id)
@@ -160,7 +159,7 @@ def add_target(
160159

161160
merge(body_data, arguments_settings, strategy=Strategy.REPLACE)
162161

163-
resp_status_code, resp_content = ProbelyAPIClient().post(
162+
resp_status_code, resp_content = ProbelyAPIClient.post(
164163
url=create_target_url, query_params=query_params, payload=body_data
165164
)
166165

@@ -177,7 +176,7 @@ def add_target(
177176
def update_target(target_id: str, payload: dict) -> dict:
178177
url = PROBELY_API_TARGETS_RETRIEVE_URL.format(id=target_id)
179178

180-
resp_status_code, resp_content = ProbelyAPIClient.patch(url, payload)
179+
resp_status_code, resp_content = ProbelyAPIClient.patch(url, payload=payload)
181180

182181
if resp_status_code != 200:
183182
if resp_status_code == 400:
@@ -195,7 +194,7 @@ def update_targets(target_ids: List[str], payload: dict) -> List[Dict]:
195194
url = PROBELY_API_TARGETS_BULK_UPDATE_URL
196195
update_payload = {"ids": target_ids, **payload}
197196

198-
resp_status_code, resp_content = ProbelyAPIClient.post(url, update_payload)
197+
resp_status_code, resp_content = ProbelyAPIClient.post(url, payload=update_payload)
199198

200199
if resp_status_code != 200:
201200
if resp_status_code == 400:

probely_cli/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,13 @@ def get_probely_api_base_url():
108108
PROBELY_API_TARGETS_DELETE_URL = PROBELY_API_TARGETS_URL + "{id}/"
109109
PROBELY_API_TARGETS_BULK_DELETE_URL = PROBELY_API_TARGETS_URL + "bulk/delete/"
110110
PROBELY_API_TARGETS_BULK_UPDATE_URL = PROBELY_API_TARGETS_URL + "bulk/update/"
111+
PROBELY_API_TARGETS_START_SCAN_URL = PROBELY_API_TARGETS_URL + "{target_id}/scan_now/"
111112

112113
PROBELY_API_SCANS_URL = PROBELY_API_BASE_URL + "scans/"
113-
PROBELY_API_START_SCAN_URL = PROBELY_API_TARGETS_URL + "{target_id}/scan_now/"
114114
PROBELY_API_SCANS_BULK_CANCEL_URL = PROBELY_API_SCANS_URL + "bulk/cancel/"
115115
PROBELY_API_SCANS_BULK_RESUME_URL = PROBELY_API_SCANS_URL + "bulk/resume/"
116116
PROBELY_API_SCANS_BULK_PAUSE_URL = PROBELY_API_SCANS_URL + "bulk/pause/"
117-
PROBELY_API_BULK_START_SCANS_URL = PROBELY_API_SCANS_URL + "bulk/start/"
117+
PROBELY_API_SCANS_BULK_START_URL = PROBELY_API_SCANS_URL + "bulk/start/"
118118
PROBELY_API_SCAN_PAUSE_URL = (
119119
PROBELY_API_TARGETS_URL + "{target_id}/scans/{scan_id}/pause/"
120120
)

tests/sdk/test_scans.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
start_scans,
1919
)
2020
from probely_cli.settings import (
21-
PROBELY_API_BULK_START_SCANS_URL,
22-
PROBELY_API_START_SCAN_URL,
21+
PROBELY_API_SCANS_BULK_START_URL,
22+
PROBELY_API_TARGETS_START_SCAN_URL,
2323
)
2424

2525

@@ -32,22 +32,26 @@
3232
)
3333
@patch("probely_cli.sdk.client.ProbelyAPIClient.post")
3434
def test_start_scan(
35-
api_client_mock: Mock, valid_scans_start_api_response: Dict, payload
35+
api_client_mock: Mock,
36+
valid_scans_start_api_response: Dict,
37+
payload,
3638
):
3739
"""
3840
Test that start_scan successfully starts a scan and returns the scan details,
3941
both with and without an extra payload.
4042
"""
4143
target_id = valid_scans_start_api_response["target"]["id"]
4244
expected_response = valid_scans_start_api_response
43-
expected_endpoint_url = PROBELY_API_START_SCAN_URL.format(target_id=target_id)
45+
expected_endpoint_url = PROBELY_API_TARGETS_START_SCAN_URL.format(
46+
target_id=target_id
47+
)
4448

4549
api_client_mock.return_value = (200, expected_response)
4650

47-
result = start_scan(target_id, payload) if payload else start_scan(target_id)
51+
result = start_scan(target_id, payload)
4852

4953
assert result == expected_response
50-
api_client_mock.assert_called_once_with(expected_endpoint_url, payload)
54+
api_client_mock.assert_called_once_with(expected_endpoint_url, payload=payload)
5155

5256

5357
@patch("probely_cli.sdk.client.ProbelyAPIClient.post")
@@ -82,7 +86,7 @@ def test_start_scans__successful_api_call(
8286
valid_scans_start_api_response: Dict,
8387
):
8488
validate_resource_ids_mock.return_value = None # target IDs are valid
85-
expected_endpoint_url = PROBELY_API_BULK_START_SCANS_URL
89+
expected_endpoint_url = PROBELY_API_SCANS_BULK_START_URL
8690
payload = {"overrides": {"scan_profile": "lightning"}}
8791
target_ids = ["target_id1", "target_id2"]
8892
expected_payload_on_api_call = {
@@ -96,7 +100,7 @@ def test_start_scans__successful_api_call(
96100

97101
assert result == expected_response
98102
api_client_mock.assert_called_once_with(
99-
expected_endpoint_url, expected_payload_on_api_call
103+
expected_endpoint_url, payload=expected_payload_on_api_call
100104
)
101105

102106

@@ -154,7 +158,9 @@ def test_cancel_scan(
154158
scan = cancel_scans([scan_id_to_cancel])
155159

156160
mock_client.assert_called_once()
157-
scans_to_cancel = mock_client.call_args[0][1]
161+
_args, kwargs = mock_client.call_args
162+
163+
scans_to_cancel = kwargs["payload"]
158164

159165
assert scans_to_cancel is not None
160166
assert scans_to_cancel["scans"][0]["id"] == scan_id_to_cancel
@@ -223,7 +229,9 @@ def test_resume_scan(
223229
scan = resume_scans([scan_id_to_resume])
224230

225231
mock_client.assert_called_once()
226-
scans_to_resume = mock_client.call_args[0][1]
232+
_args, kwargs = mock_client.call_args
233+
234+
scans_to_resume = kwargs["payload"]
227235

228236
assert scans_to_resume is not None
229237
assert scans_to_resume["scans"][0]["id"] == scan_id_to_resume
@@ -282,7 +290,9 @@ def test_pause_scans(
282290
scan = pause_scans([scan_id_to_pause])
283291

284292
mock_client.assert_called_once()
285-
scans_to_pause = mock_client.call_args[0][1]
293+
_args, kwargs = mock_client.call_args
294+
295+
scans_to_pause = kwargs["payload"]
286296

287297
assert scans_to_pause is not None
288298
assert scans_to_pause["scans"][0]["id"] == scan_id_to_pause

0 commit comments

Comments
 (0)