Skip to content
Snippets Groups Projects
Commit 1d74a651 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'image-check-http-errors' into 'master'

Handle HTTP errors on image checks

See merge request !654
parents 02de936e a6822c71
No related branches found
No related tags found
1 merge request!654Handle HTTP errors on image checks
...@@ -4,6 +4,7 @@ from arkindex.images.models import ImageServer, Image, Zone ...@@ -4,6 +4,7 @@ from arkindex.images.models import ImageServer, Image, Zone
from arkindex.dataimport.models import DataFile from arkindex.dataimport.models import DataFile
from arkindex.project.aws import S3FileStatus from arkindex.project.aws import S3FileStatus
from django.db.models import F, Value, CharField from django.db.models import F, Value, CharField
from requests.exceptions import RequestException
from rest_framework.exceptions import ValidationError, APIException from rest_framework.exceptions import ValidationError, APIException
from rest_framework import serializers from rest_framework import serializers
import re import re
...@@ -59,10 +60,12 @@ class ImageSerializer(serializers.ModelSerializer): ...@@ -59,10 +60,12 @@ class ImageSerializer(serializers.ModelSerializer):
elif value == S3FileStatus.Checked: elif value == S3FileStatus.Checked:
# Perform image validation if we are updating an existing image to Checked # Perform image validation if we are updating an existing image to Checked
try: try:
if not self.instance.server.read_only: if self.instance.server.s3_bucket and not self.instance.server.read_only:
self.instance.check_hash(raise_exc=True) self.instance.check_hash(raise_exc=True)
self.instance.perform_check(raise_exc=True) self.instance.perform_check(raise_exc=True)
except (AssertionError, ValueError) as e: except (AssertionError, ValueError, RequestException) as e:
self.instance.status = S3FileStatus.Error
self.instance.save()
raise ValidationError(str(e)) raise ValidationError(str(e))
return value return value
......
...@@ -7,6 +7,7 @@ from django.test import override_settings ...@@ -7,6 +7,7 @@ from django.test import override_settings
from django.urls import reverse from django.urls import reverse
from unittest.mock import patch, call from unittest.mock import patch, call
import random import random
import responses
class ImageMethods: class ImageMethods:
...@@ -229,6 +230,26 @@ class TestImageApi(FixtureAPITestCase): ...@@ -229,6 +230,26 @@ class TestImageApi(FixtureAPITestCase):
self.assertEqual(check_hash_mock.call_args, call(raise_exc=True)) self.assertEqual(check_hash_mock.call_args, call(raise_exc=True))
self.assertEqual(perform_check_mock.call_args, call(raise_exc=True)) self.assertEqual(perform_check_mock.call_args, call(raise_exc=True))
@responses.activate
def test_update_image_check_fail(self):
"""
Test setting an image's status to Checked runs the image checks
"""
url = 'https://test-server.eu/images/notfound/info.json'
responses.add(responses.GET, url, status=404)
img = self.server.images.create(
status=S3FileStatus.Unchecked,
path='notfound',
)
response = self.client.put(
reverse('api:image-retrieve', kwargs={'pk': str(img.id)}),
{'status': 'checked'},
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), {'status': [f'404 Client Error: Not Found for url: {url}']})
img.refresh_from_db()
self.assertEqual(img.status, S3FileStatus.Error)
@patch('arkindex.images.serializers.Image.perform_check') @patch('arkindex.images.serializers.Image.perform_check')
@patch('arkindex.images.serializers.Image.check_hash') @patch('arkindex.images.serializers.Image.check_hash')
def test_update_image_server_read_only(self, check_hash_mock, perform_check_mock): def test_update_image_server_read_only(self, check_hash_mock, perform_check_mock):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment