Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES/7228.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed not supporting the new rename of the S3 storage backend.
5 changes: 4 additions & 1 deletion pulpcore/app/serializers/domain.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
BACKEND_CHOICES = (
("pulpcore.app.models.storage.FileSystem", "Use local filesystem as storage"),
# ("pulpcore.app.models.storage.PulpSFTPStorage", "Use SFTP server as storage"),
("storages.backends.s3boto3.S3Boto3Storage", "Use Amazon S3 as storage"),
("storages.backends.s3boto3.S3Boto3Storage", "Use Amazon S3 as storage [deprecated]"),
("storages.backends.s3.S3Storage", "Use Amazon S3 as storage"),
("storages.backends.azure_storage.AzureStorage", "Use Azure Blob as storage"),
# ("storages.backends.gcloud.GoogleCloudStorage", "Use Google Cloud as storage"),
)
Expand Down Expand Up @@ -115,6 +116,7 @@ class SFTPSettingsSerializer(BaseSettingsClass):
class AmazonS3SettingsSerializer(BaseSettingsClass):
"""A Serializer for Amazon S3 storage settings."""

STORAGE_CLASS = "storages.backends.s3.S3Storage"
SETTING_MAPPING = {
"aws_s3_access_key_id": "access_key",
"aws_access_key_id": "access_key",
Expand Down Expand Up @@ -261,6 +263,7 @@ class StorageSettingsSerializer(serializers.Serializer):
STORAGE_MAPPING = {
"pulpcore.app.models.storage.FileSystem": FileSystemSettingsSerializer,
"pulpcore.app.models.storage.PulpSFTPStorage": SFTPSettingsSerializer,
"storages.backends.s3.S3Storage": AmazonS3SettingsSerializer,
"storages.backends.s3boto3.S3Boto3Storage": AmazonS3SettingsSerializer,
"storages.backends.azure_storage.AzureStorage": AzureSettingsSerializer,
"storages.backends.gcloud.GoogleCloudStorage": GoogleSettingsSerializer,
Expand Down
5 changes: 4 additions & 1 deletion pulpcore/app/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,10 @@ def get_artifact_url(artifact, headers=None, http_method=None):
or not artifact_domain.redirect_to_object_storage
):
return _artifact_serving_distribution().artifact_url(artifact)
elif artifact_domain.storage_class == "storages.backends.s3boto3.S3Boto3Storage":
elif artifact_domain.storage_class in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
parameters = {"ResponseContentDisposition": content_disposition}
if headers and headers.get("Content-Type"):
parameters["ResponseContentType"] = headers.get("Content-Type")
Expand Down
1 change: 1 addition & 0 deletions pulpcore/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
# Storage-type mapped to storage-response-map
STORAGE_RESPONSE_MAP = {
"storages.backends.s3boto3.S3Boto3Storage": S3_RESPONSE_HEADER_MAP,
"storages.backends.s3.S3Storage": S3_RESPONSE_HEADER_MAP,
"storages.backends.azure_storage.AzureStorage": AZURE_RESPONSE_HEADER_MAP,
"storages.backends.gcloud.GoogleCloudStorage": GCS_RESPONSE_HEADER_MAP,
}
5 changes: 4 additions & 1 deletion pulpcore/content/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,10 @@ def _set_params_from_headers(hdrs, storage_domain):
return FileResponse(path, headers=headers)
elif not domain.redirect_to_object_storage:
return ArtifactResponse(content_artifact.artifact, headers=headers)
elif domain.storage_class == "storages.backends.s3boto3.S3Boto3Storage":
elif domain.storage_class in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
headers["Content-Disposition"] = content_disposition
parameters = _set_params_from_headers(headers, domain.storage_class)
url = URL(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

OBJECT_STORAGES = (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
"storages.backends.azure_storage.AzureStorage",
"storages.backends.gcloud.GoogleCloudStorage",
)
Expand Down
10 changes: 8 additions & 2 deletions pulpcore/tests/functional/api/test_crud_domains.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def test_special_domain_creation(domains_api_client, gen_object_with_cleanup):
"pulpcore.app.models.storage.FileSystem",
# "pulpcore.app.models.storage.PulpSFTPStorage",
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
"storages.backends.azure_storage.AzureStorage",
# "storages.backends.gcloud.GoogleCloudStorage",
}
Expand All @@ -200,7 +201,7 @@ def test_special_domain_creation(domains_api_client, gen_object_with_cleanup):
"key_filename": "/etc/pulp/certs/storage_id_ed25519",
},
},
"storages.backends.s3boto3.S3Boto3Storage": {
"storages.backends.s3.S3Storage": {
"AWS_ACCESS_KEY_ID": "random",
"AWS_SECRET_ACCESS_KEY": "random",
"AWS_STORAGE_BUCKET_NAME": "pulp3",
Expand All @@ -223,6 +224,9 @@ def test_special_domain_creation(domains_api_client, gen_object_with_cleanup):
"GS_CUSTOM_ENDPOINT": "http://custom-endpoint",
},
}
storage_settings["storages.backends.s3boto3.S3Boto3Storage"] = storage_settings[
"storages.backends.s3.S3Storage"
]

installed_backends = []
domain_names = set()
Expand All @@ -240,7 +244,8 @@ def test_special_domain_creation(domains_api_client, gen_object_with_cleanup):
assert e.status == 400
assert "Backend is not installed on Pulp." in e.body
else:
installed_backends.append(backend)
if backend != "storages.backends.s3boto3.S3Boto3Storage":
installed_backends.append(backend)
domain_names.add(domain.name)
# Try creating domains with correct settings
for backend in installed_backends:
Expand All @@ -253,6 +258,7 @@ def test_special_domain_creation(domains_api_client, gen_object_with_cleanup):
domain_names.add(domain.name)

# Try creating domains with incorrect settings
storage_types.remove("storages.backends.s3boto3.S3Boto3Storage")
for backend in installed_backends:
random_backend = random.choice(tuple(storage_types - {backend}))
body = {
Expand Down
47 changes: 44 additions & 3 deletions pulpcore/tests/unit/serializers/test_domain.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def _no_validate_storage_backend(monkeypatch):
params=[
"pulpcore.app.models.storage.FileSystem",
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
"storages.backends.azure_storage.AzureStorage",
]
)
Expand All @@ -41,7 +42,10 @@ def storage_class(request):
def serializer_class(storage_class):
if storage_class == "pulpcore.app.models.storage.FileSystem":
return FileSystemSettingsSerializer
elif storage_class == "storages.backends.s3boto3.S3Boto3Storage":
elif storage_class in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
return AmazonS3SettingsSerializer
elif storage_class == "storages.backends.azure_storage.AzureStorage":
return AzureSettingsSerializer
Expand All @@ -51,14 +55,28 @@ def serializer_class(storage_class):
def required_settings(storage_class):
if storage_class == "pulpcore.app.models.storage.FileSystem":
return {"location": "/var/lib/pulp/media/"}
elif storage_class == "storages.backends.s3boto3.S3Boto3Storage":
elif storage_class in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
return {"access_key": "testing", "secret_key": "secret", "bucket_name": "test"}
elif storage_class == "storages.backends.azure_storage.AzureStorage":
return {"account_name": "test", "account_key": "secret", "azure_container": "test"}


@pytest.fixture
def all_settings(serializer_class, required_settings):
def extra_required_settings(storage_class):
"""For fields required in the serializer's validate, but not on the field itself."""
if storage_class in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
return {"secret_key": "secret"}
return {}


@pytest.fixture
def all_settings(serializer_class, required_settings, extra_required_settings):
serializer = serializer_class()
fields = serializer.get_fields()
default_settings = {
Expand Down Expand Up @@ -113,6 +131,29 @@ def test_using_setting_names(storage_class, serializer_class, all_settings):
assert storage_settings == all_settings


@pytest.mark.django_db
def test_cloudfront_s3_storage_settings(storage_class, required_settings):
if storage_class not in (
"storages.backends.s3boto3.S3Boto3Storage",
"storages.backends.s3.S3Storage",
):
pytest.skip("This test only make sense when using S3 as storage backend.")

domain = SimpleNamespace(storage_class=storage_class, **MIN_DOMAIN_SETTINGS)
data = {
"storage_settings": {
"secret_key": "secret_key",
"custom_domain": "custom_domain.cloudfront.net",
"cloudfront_key_id": "key_id",
"cloudfront_key": "cloudfront_key",
**required_settings,
}
}
serializer = DomainSerializer(domain, data=data, partial=True)

assert serializer.is_valid(raise_exception=True)


class DomainSettingsBaseMixin:
storage_class = None
serializer_class = None
Expand Down
Loading