Skip to content

Commit cd54cbe

Browse files
method to delete webapp log files
1 parent c1ea4ae commit cd54cbe

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

pythonanywhere/api.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,32 @@ def get_ssl_info(self):
174174
result = response.json()
175175
result["not_after"] = datetime.strptime(result["not_after"], "%Y%m%dT%H%M%SZ")
176176
return result
177+
178+
def delete_log(self, log_type, index=0):
179+
if index:
180+
print(snakesay(
181+
'Deleting old (archive number {index}) {type} log file for {domain} via API'.format(index=index,
182+
type=log_type,
183+
domain=self.domain)))
184+
else:
185+
print(snakesay(
186+
'Deleting current {type} log file for {domain} via API'.format(type=log_type, domain=self.domain)))
187+
188+
if index == 1:
189+
url = get_api_endpoint("files").format(username=getpass.getuser()) + "path/var/log/{domain}.{type}.log.1/".format(
190+
domain=self.domain, type=log_type)
191+
elif index > 1:
192+
url = get_api_endpoint("files").format(
193+
username=getpass.getuser()) + "path/var/log/{domain}.{type}.log.{index}.gz/".format(
194+
domain=self.domain, type=log_type, index=index)
195+
else:
196+
url = get_api_endpoint("files").format(username=getpass.getuser()) + "path/var/log/{domain}.{type}.log/".format(
197+
domain=self.domain, type=log_type)
198+
response = call_api(url, "delete")
199+
if not response.ok:
200+
raise Exception(
201+
"DELETE log file via API failed, got {response}:{response_text}".format(
202+
response=response,
203+
response_text=response.text,
204+
)
205+
)

tests/test_api.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,41 @@ def test_raises_if_get_does_not_return_200(self, api_responses, api_token):
328328

329329
assert 'GET SSL details via API failed, got' in str(e.value)
330330
assert 'nope' in str(e.value)
331+
332+
333+
class TestDeleteWebappLog:
334+
335+
def test_delete_current_access_log(self, api_responses, api_token):
336+
expected_url = get_api_endpoint(flavour="files").format(
337+
username=getpass.getuser()) + "path/var/log/mydomain.com.access.log/"
338+
api_responses.add(responses.DELETE, expected_url, status=200)
339+
340+
Webapp("mydomain.com").delete_log(log_type="access")
341+
342+
post = api_responses.calls[0]
343+
assert post.request.url == expected_url
344+
assert post.request.body is None
345+
assert post.request.headers['Authorization'] == 'Token {api_token}'.format(api_token=api_token)
346+
347+
def test_delete_old_access_log(self, api_responses, api_token):
348+
expected_url = get_api_endpoint(flavour="files").format(
349+
username=getpass.getuser()) + "path/var/log/mydomain.com.access.log.1/"
350+
api_responses.add(responses.DELETE, expected_url, status=200)
351+
352+
Webapp("mydomain.com").delete_log(log_type="access", index=1)
353+
354+
post = api_responses.calls[0]
355+
assert post.request.url == expected_url
356+
assert post.request.body is None
357+
assert post.request.headers['Authorization'] == 'Token {api_token}'.format(api_token=api_token)
358+
359+
def test_raises_if_post_does_not_20x(self, api_responses, api_token):
360+
expected_url = get_api_endpoint(flavour="files").format(
361+
username=getpass.getuser()) + "path/var/log/mydomain.com.access.log/"
362+
api_responses.add(responses.DELETE, expected_url, status=404, body="nope")
363+
364+
with pytest.raises(Exception) as e:
365+
Webapp("mydomain.com").delete_log(log_type="access")
366+
367+
assert "DELETE log file via API failed" in str(e.value)
368+
assert "nope" in str(e.value)

0 commit comments

Comments
 (0)