Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dev: move storage metadata collection to background job #5818

Merged
merged 3 commits into from
Oct 16, 2024
Merged
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
22 changes: 7 additions & 15 deletions apiserver/plane/app/views/asset/v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from plane.settings.storage import S3Storage
from plane.app.permissions import allow_permission, ROLE
from plane.utils.cache import invalidate_cache_directly
from plane.bgtasks.storage_metadata_task import get_asset_object_metadata


class UserAssetsV2Endpoint(BaseAPIView):
Expand Down Expand Up @@ -193,14 +194,11 @@ def post(self, request):
def patch(self, request, asset_id):
# get the asset id
asset = FileAsset.objects.get(id=asset_id, user_id=request.user.id)
storage = S3Storage(request=request)
# get the storage metadata
asset.is_uploaded = True
# get the storage metadata
if asset.storage_metadata is None:
asset.storage_metadata = storage.get_object_metadata(
object_name=asset.asset.name
)
if not asset.storage_metadata:
get_asset_object_metadata.delay(asset_id=str(asset_id))
# get the entity and save the asset id for the request field
self.entity_asset_save(
asset_id=asset_id,
Expand Down Expand Up @@ -446,14 +444,11 @@ def post(self, request, slug):
def patch(self, request, slug, asset_id):
# get the asset id
asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug)
storage = S3Storage(request=request)
# get the storage metadata
asset.is_uploaded = True
# get the storage metadata
if asset.storage_metadata is None:
asset.storage_metadata = storage.get_object_metadata(
object_name=asset.asset.name
)
if not asset.storage_metadata:
get_asset_object_metadata.delay(asset_id=str(asset_id))
# get the entity and save the asset id for the request field
self.entity_asset_save(
asset_id=asset_id,
Expand Down Expand Up @@ -686,14 +681,11 @@ def patch(self, request, slug, project_id, pk):
asset = FileAsset.objects.get(
id=pk,
)
storage = S3Storage(request=request)
# get the storage metadata
asset.is_uploaded = True
# get the storage metadata
if asset.storage_metadata is None:
asset.storage_metadata = storage.get_object_metadata(
object_name=asset.asset.name
)
if not asset.storage_metadata:
get_asset_object_metadata.delay(asset_id=str(pk))

# update the attributes
asset.attributes = request.data.get("attributes", asset.attributes)
Expand Down
21 changes: 20 additions & 1 deletion apiserver/plane/app/views/cycle/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,26 @@ def get(self, request, slug, project_id, pk=None):
.annotate(first_name=F("assignees__first_name"))
.annotate(last_name=F("assignees__last_name"))
.annotate(assignee_id=F("assignees__id"))
.annotate(avatar_url=F("assignees__avatar_url"))
.annotate(
avatar_url=Case(
# If `avatar_asset` exists, use it to generate the asset URL
When(
assignees__avatar_asset__isnull=False,
then=Concat(
Value("/api/assets/v2/static/"),
"assignees__avatar_asset", # Assuming avatar_asset has an id or relevant field
Value("/"),
),
),
# If `avatar_asset` is None, fall back to using `avatar` field directly
When(
assignees__avatar_asset__isnull=True,
then="assignees__avatar",
),
default=Value(None),
output_field=models.CharField(),
)
)
sriramveeraghanta marked this conversation as resolved.
Show resolved Hide resolved
.annotate(display_name=F("assignees__display_name"))
.values(
"first_name",
Expand Down
8 changes: 3 additions & 5 deletions apiserver/plane/app/views/issue/attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from plane.bgtasks.issue_activities_task import issue_activity
from plane.app.permissions import allow_permission, ROLE
from plane.settings.storage import S3Storage
from plane.bgtasks.storage_metadata_task import get_asset_object_metadata


class IssueAttachmentEndpoint(BaseAPIView):
Expand Down Expand Up @@ -254,10 +255,7 @@ def patch(self, request, slug, project_id, issue_id, pk):
issue_attachment.is_uploaded = True

# Get the storage metadata
if issue_attachment.storage_metadata is None:
storage = S3Storage(request=request)
issue_attachment.storage_metadata = storage.get_object_metadata(
issue_attachment.asset.name
)
if not issue_attachment.storage_metadata:
get_asset_object_metadata.delay(str(issue_attachment.id))
sriramveeraghanta marked this conversation as resolved.
Show resolved Hide resolved
issue_attachment.save()
return Response(status=status.HTTP_204_NO_CONTENT)
28 changes: 28 additions & 0 deletions apiserver/plane/bgtasks/storage_metadata_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Third party imports
from celery import shared_task

# Module imports
from plane.db.models import FileAsset
from plane.settings.storage import S3Storage
from plane.utils.exception_logger import log_exception


@shared_task
def get_asset_object_metadata(asset_id):
try:
# Get the asset
asset = FileAsset.objects.get(pk=asset_id)
# Create an instance of the S3 storage
storage = S3Storage()
# Get the storage
asset.storage_metadata = storage.get_object_metadata(
object_name=asset.asset.name
)
# Save the asset
asset.save()
return
except FileAsset.DoesNotExist:
return
except Exception as e:
log_exception(e)
return
sriramveeraghanta marked this conversation as resolved.
Show resolved Hide resolved
6 changes: 5 additions & 1 deletion apiserver/plane/settings/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ def __init__(self, request=None):
aws_access_key_id=self.aws_access_key_id,
aws_secret_access_key=self.aws_secret_access_key,
region_name=self.aws_region,
endpoint_url=f"{request.scheme}://{request.get_host()}",
endpoint_url=(
f"{request.scheme}://{request.get_host()}"
if request
else self.aws_s3_endpoint_url
),
config=boto3.session.Config(signature_version="s3v4"),
)
else:
Expand Down
8 changes: 3 additions & 5 deletions apiserver/plane/space/views/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from .base import BaseAPIView
from plane.db.models import DeployBoard, FileAsset
from plane.settings.storage import S3Storage
from plane.bgtasks.storage_metadata_task import get_asset_object_metadata


class EntityAssetEndpoint(BaseAPIView):
Expand Down Expand Up @@ -159,14 +160,11 @@ def patch(self, request, anchor, pk):

# get the asset id
asset = FileAsset.objects.get(id=pk, workspace=deploy_board.workspace)
storage = S3Storage(request=request)
# get the storage metadata
asset.is_uploaded = True
# get the storage metadata
if asset.storage_metadata is None:
asset.storage_metadata = storage.get_object_metadata(
object_name=asset.asset.name
)
if not asset.storage_metadata:
get_asset_object_metadata.delay(str(asset.id))

# update the attributes
asset.attributes = request.data.get("attributes", asset.attributes)
Expand Down
2 changes: 1 addition & 1 deletion deploy/selfhost/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ x-app-env: &app-env
- SECRET_KEY=${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5}
# DATA STORE SETTINGS
- USE_MINIO=${USE_MINIO:-1}
- AWS_REGION=${AWS_REGION:-""}
- AWS_REGION=${AWS_REGION:-}
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"access-key"}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"secret-key"}
- AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000}
Expand Down
4 changes: 2 additions & 2 deletions nginx/nginx.conf.dev
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ http {
proxy_pass http://space:3002/spaces/;
}

location /${BUCKET_NAME}/ {
location /${BUCKET_NAME} {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://plane-minio:9000/uploads/;
proxy_pass http://plane-minio:9000/${BUCKET_NAME};
sriramveeraghanta marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
4 changes: 2 additions & 2 deletions nginx/nginx.conf.template
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ http {
proxy_pass http://space:3000/spaces/;
}

location /${BUCKET_NAME}/ {
location /${BUCKET_NAME} {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://plane-minio:9000/uploads/;
proxy_pass http://plane-minio:9000/${BUCKET_NAME};
sriramveeraghanta marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Loading