Have the config setup tool automatically prepare the S3 or GCS storage with CORS config
This commit is contained in:
parent
3a3945779d
commit
53e5fc6265
3 changed files with 62 additions and 5 deletions
|
@ -54,6 +54,10 @@ class BaseStorage(StoragePaths):
|
||||||
# Set the IO buffer to 64kB
|
# Set the IO buffer to 64kB
|
||||||
buffer_size = 64 * 1024
|
buffer_size = 64 * 1024
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
|
""" Called to perform any storage system setup. """
|
||||||
|
pass
|
||||||
|
|
||||||
def get_direct_download_url(self, path, expires_in=60, requires_cors=False):
|
def get_direct_download_url(self, path, expires_in=60, requires_cors=False):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,13 @@ class _CloudStorage(BaseStorage):
|
||||||
return path[1:]
|
return path[1:]
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
def get_cloud_conn(self):
|
||||||
|
self._initialize_cloud_conn()
|
||||||
|
return self._cloud_conn
|
||||||
|
|
||||||
|
def get_cloud_bucket(self):
|
||||||
|
return self._cloud_bucket
|
||||||
|
|
||||||
def get_content(self, path):
|
def get_content(self, path):
|
||||||
self._initialize_cloud_conn()
|
self._initialize_cloud_conn()
|
||||||
path = self._init_path(path)
|
path = self._init_path(path)
|
||||||
|
@ -221,6 +228,25 @@ class S3Storage(_CloudStorage):
|
||||||
connect_kwargs, upload_params, storage_path, s3_access_key,
|
connect_kwargs, upload_params, storage_path, s3_access_key,
|
||||||
s3_secret_key, s3_bucket)
|
s3_secret_key, s3_bucket)
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
|
self.get_cloud_bucket().set_cors_xml("""<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||||
|
<CORSRule>
|
||||||
|
<AllowedOrigin>*</AllowedOrigin>
|
||||||
|
<AllowedMethod>GET</AllowedMethod>
|
||||||
|
<MaxAgeSeconds>3000</MaxAgeSeconds>
|
||||||
|
<AllowedHeader>Authorization</AllowedHeader>
|
||||||
|
</CORSRule>
|
||||||
|
<CORSRule>
|
||||||
|
<AllowedOrigin>*</AllowedOrigin>
|
||||||
|
<AllowedMethod>PUT</AllowedMethod>
|
||||||
|
<MaxAgeSeconds>3000</MaxAgeSeconds>
|
||||||
|
<AllowedHeader>Content-Type</AllowedHeader>
|
||||||
|
<AllowedHeader>x-amz-acl</AllowedHeader>
|
||||||
|
<AllowedHeader>origin</AllowedHeader>
|
||||||
|
</CORSRule>
|
||||||
|
</CORSConfiguration>""")
|
||||||
|
|
||||||
|
|
||||||
class GoogleCloudStorage(_CloudStorage):
|
class GoogleCloudStorage(_CloudStorage):
|
||||||
def __init__(self, storage_path, access_key, secret_key, bucket_name):
|
def __init__(self, storage_path, access_key, secret_key, bucket_name):
|
||||||
|
@ -230,6 +256,24 @@ class GoogleCloudStorage(_CloudStorage):
|
||||||
connect_kwargs, upload_params, storage_path,
|
connect_kwargs, upload_params, storage_path,
|
||||||
access_key, secret_key, bucket_name)
|
access_key, secret_key, bucket_name)
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
|
self.get_cloud_bucket().set_cors_xml("""<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CorsConfig>
|
||||||
|
<Cors>
|
||||||
|
<Origins>
|
||||||
|
<Origin>*</Origin>
|
||||||
|
</Origins>
|
||||||
|
<Methods>
|
||||||
|
<Method>GET</Method>
|
||||||
|
<Method>PUT</Method>
|
||||||
|
</Methods>
|
||||||
|
<ResponseHeaders>
|
||||||
|
<ResponseHeader>Content-Type</ResponseHeader>
|
||||||
|
</ResponseHeaders>
|
||||||
|
<MaxAgeSec>3000</MaxAgeSec>
|
||||||
|
</Cors>
|
||||||
|
</CorsConfig>""")
|
||||||
|
|
||||||
def stream_write(self, path, fp, content_type=None, content_encoding=None):
|
def stream_write(self, path, fp, content_type=None, content_encoding=None):
|
||||||
# Minimum size of upload part size on S3 is 5MB
|
# Minimum size of upload part size on S3 is 5MB
|
||||||
self._initialize_cloud_conn()
|
self._initialize_cloud_conn()
|
||||||
|
|
|
@ -15,6 +15,13 @@ from util.oauth import GoogleOAuthConfig, GithubOAuthConfig
|
||||||
|
|
||||||
SSL_FILENAMES = ['ssl.cert', 'ssl.key']
|
SSL_FILENAMES = ['ssl.cert', 'ssl.key']
|
||||||
|
|
||||||
|
def get_storage_provider(config):
|
||||||
|
parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}])
|
||||||
|
try:
|
||||||
|
return get_storage_driver(parameters)
|
||||||
|
except TypeError:
|
||||||
|
raise Exception('Missing required storage configuration parameter(s)')
|
||||||
|
|
||||||
def validate_service_for_config(service, config):
|
def validate_service_for_config(service, config):
|
||||||
""" Attempts to validate the configuration for the given service. """
|
""" Attempts to validate the configuration for the given service. """
|
||||||
if not service in _VALIDATORS:
|
if not service in _VALIDATORS:
|
||||||
|
@ -57,16 +64,18 @@ def _validate_redis(config):
|
||||||
|
|
||||||
def _validate_registry_storage(config):
|
def _validate_registry_storage(config):
|
||||||
""" Validates registry storage. """
|
""" Validates registry storage. """
|
||||||
parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}])
|
driver = get_storage_provider(config)
|
||||||
try:
|
|
||||||
driver = get_storage_driver(parameters)
|
|
||||||
except TypeError:
|
|
||||||
raise Exception('Missing required storage configuration parameter(s)')
|
|
||||||
|
|
||||||
# Put and remove a temporary file.
|
# Put and remove a temporary file.
|
||||||
driver.put_content('_verify', 'testing 123')
|
driver.put_content('_verify', 'testing 123')
|
||||||
driver.remove('_verify')
|
driver.remove('_verify')
|
||||||
|
|
||||||
|
# Run setup on the driver if the read/write succeeded.
|
||||||
|
try:
|
||||||
|
driver.setup()
|
||||||
|
except Exception as ex:
|
||||||
|
raise Exception('Could not prepare storage: %s' % str(ex))
|
||||||
|
|
||||||
|
|
||||||
def _validate_mailing(config):
|
def _validate_mailing(config):
|
||||||
""" Validates sending email. """
|
""" Validates sending email. """
|
||||||
|
|
Reference in a new issue