refactor: Access a bucket by calling zerver.lib.uploads.get_bucket.

This commit is contained in:
ryanreh99
2020-10-27 02:40:53 +05:30
committed by Tim Abbott
parent f4eae83542
commit 1c370a975c
3 changed files with 9 additions and 11 deletions

View File

@@ -15,7 +15,6 @@ import subprocess
import tempfile import tempfile
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
import boto3
import orjson import orjson
from boto3.resources.base import ServiceResource from boto3.resources.base import ServiceResource
from django.apps import apps from django.apps import apps
@@ -29,6 +28,7 @@ from analytics.models import RealmCount, StreamCount, UserCount
from scripts.lib.zulip_tools import overwrite_symlink from scripts.lib.zulip_tools import overwrite_symlink
from zerver.lib.avatar_hash import user_avatar_path_from_ids from zerver.lib.avatar_hash import user_avatar_path_from_ids
from zerver.lib.pysa import mark_sanitized from zerver.lib.pysa import mark_sanitized
from zerver.lib.upload import get_bucket
from zerver.models import ( from zerver.models import (
AlertWord, AlertWord,
Attachment, Attachment,
@@ -1272,9 +1272,7 @@ def _save_s3_object_to_file(key: ServiceResource, output_dir: str, processing_av
def export_files_from_s3(realm: Realm, bucket_name: str, output_dir: Path, def export_files_from_s3(realm: Realm, bucket_name: str, output_dir: Path,
processing_avatars: bool=False, processing_emoji: bool=False, processing_avatars: bool=False, processing_emoji: bool=False,
processing_realm_icon_and_logo: bool=False) -> None: processing_realm_icon_and_logo: bool=False) -> None:
session = boto3.Session(settings.S3_KEY, settings.S3_SECRET_KEY) bucket = get_bucket(bucket_name)
s3 = session.resource('s3')
bucket = s3.Bucket(bucket_name)
records = [] records = []
logging.info("Downloading uploaded files from %s", bucket_name) logging.info("Downloading uploaded files from %s", bucket_name)

View File

@@ -6,7 +6,6 @@ import secrets
import shutil import shutil
from typing import Any, Dict, Iterable, List, Optional, Tuple from typing import Any, Dict, Iterable, List, Optional, Tuple
import boto3
import orjson import orjson
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from django.conf import settings from django.conf import settings
@@ -32,7 +31,7 @@ from zerver.lib.message import get_last_message_id
from zerver.lib.server_initialization import create_internal_realm, server_initialized from zerver.lib.server_initialization import create_internal_realm, server_initialized
from zerver.lib.streams import render_stream_description from zerver.lib.streams import render_stream_description
from zerver.lib.timestamp import datetime_to_timestamp from zerver.lib.timestamp import datetime_to_timestamp
from zerver.lib.upload import BadImageError, guess_type, sanitize_name from zerver.lib.upload import BadImageError, get_bucket, guess_type, sanitize_name
from zerver.lib.utils import generate_api_key, process_list_in_batches from zerver.lib.utils import generate_api_key, process_list_in_batches
from zerver.models import ( from zerver.models import (
AlertWord, AlertWord,
@@ -656,8 +655,7 @@ def import_uploads(realm: Realm, import_dir: Path, processes: int, processing_av
bucket_name = settings.S3_AVATAR_BUCKET bucket_name = settings.S3_AVATAR_BUCKET
else: else:
bucket_name = settings.S3_AUTH_UPLOADS_BUCKET bucket_name = settings.S3_AUTH_UPLOADS_BUCKET
session = boto3.Session(settings.S3_KEY, settings.S3_SECRET_KEY) bucket = get_bucket(bucket_name)
bucket = session.resource('s3').Bucket(bucket_name)
count = 0 count = 0
for record in records: for record in records:

View File

@@ -267,9 +267,11 @@ class ZulipUploadBackend:
### S3 ### S3
def get_bucket(session: Session, bucket_name: str) -> ServiceResource: def get_bucket(bucket_name: str, session: Optional[Session]=None) -> ServiceResource:
# See https://github.com/python/typeshed/issues/2706 # See https://github.com/python/typeshed/issues/2706
# for why this return type is a `ServiceResource`. # for why this return type is a `ServiceResource`.
if session is None:
session = boto3.Session(settings.S3_KEY, settings.S3_SECRET_KEY)
bucket = session.resource('s3').Bucket(bucket_name) bucket = session.resource('s3').Bucket(bucket_name)
return bucket return bucket
@@ -336,12 +338,12 @@ class S3UploadBackend(ZulipUploadBackend):
def __init__(self) -> None: def __init__(self) -> None:
self.session = boto3.Session(settings.S3_KEY, settings.S3_SECRET_KEY) self.session = boto3.Session(settings.S3_KEY, settings.S3_SECRET_KEY)
self.avatar_bucket = get_bucket(self.session, settings.S3_AVATAR_BUCKET) self.avatar_bucket = get_bucket(settings.S3_AVATAR_BUCKET, self.session)
network_location = urllib.parse.urlparse( network_location = urllib.parse.urlparse(
self.avatar_bucket.meta.client.meta.endpoint_url).netloc self.avatar_bucket.meta.client.meta.endpoint_url).netloc
self.avatar_bucket_url = f"https://{self.avatar_bucket.name}.{network_location}" self.avatar_bucket_url = f"https://{self.avatar_bucket.name}.{network_location}"
self.uploads_bucket = get_bucket(self.session, settings.S3_AUTH_UPLOADS_BUCKET) self.uploads_bucket = get_bucket(settings.S3_AUTH_UPLOADS_BUCKET, self.session)
def delete_file_from_s3(self, path_id: str, bucket: ServiceResource) -> bool: def delete_file_from_s3(self, path_id: str, bucket: ServiceResource) -> bool:
key = bucket.Object(path_id) key = bucket.Object(path_id)