Skip to content

Commit 44ad862

Browse files
erick-GeGemgonnav
andauthored
BITMAKER-5846: Show storage size in JobDetailPage (#245)
* Show storage size in JobDetailPage * style(docker): Fix warnings of unmatched case in FROM - AS --------- Co-authored-by: mgonnav <mateo@emegona.com>
1 parent 3d39508 commit 44ad862

9 files changed

Lines changed: 69 additions & 30 deletions

File tree

estela-api/api/serializers/job.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
from rest_framework import serializers
33

44
from api import errors
5+
from api.exceptions import DataBaseError
56
from api.serializers.job_specific import (
67
SpiderJobArgSerializer,
78
SpiderJobEnvVarSerializer,
89
SpiderJobTagSerializer,
910
)
10-
from api.utils import delete_stats_from_redis, update_stats_from_redis
11-
from config.job_manager import job_manager
11+
from api.utils import (
12+
delete_stats_from_redis,
13+
update_stats_from_redis,
14+
get_collection_name,
15+
)
16+
from config.job_manager import job_manager, spiderdata_db_client
1217
from core.models import (
1318
DataStatus,
1419
SpiderJob,
@@ -31,6 +36,7 @@ class SpiderJobSerializer(serializers.ModelSerializer):
3136
required=False, read_only=True, help_text="Current job status."
3237
)
3338
spider = serializers.SerializerMethodField("get_spider")
39+
storage_size = serializers.SerializerMethodField("get_storage_size")
3440

3541
class Meta:
3642
model = SpiderJob
@@ -50,11 +56,28 @@ class Meta:
5056
"cronjob",
5157
"data_expiry_days",
5258
"data_status",
59+
"storage_size",
5360
)
5461

5562
def get_spider(self, instance):
5663
return {"sid": instance.spider.sid, "name": instance.spider.name}
5764

65+
def get_storage_size(self, instance):
66+
if not spiderdata_db_client.get_connection():
67+
raise DataBaseError({"error": errors.UNABLE_CONNECT_DB})
68+
69+
pid = str(instance.spider.project.pid)
70+
collections = ["items", "requests", "logs"]
71+
total_size = sum(
72+
[
73+
spiderdata_db_client.get_dataset_size(
74+
pid, get_collection_name(instance, collection)
75+
)
76+
for collection in collections
77+
]
78+
)
79+
return total_size
80+
5881

5982
class SpiderJobCreateEnvVarSerializer(serializers.Serializer):
6083
evid = serializers.IntegerField(required=False, help_text="Env var id.")

estela-api/api/utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,20 @@ def get_proxy_provider_envs(proxy_provider):
108108
}
109109
)
110110
return env_vars
111+
112+
113+
def get_collection_name(job, data_type):
114+
if (
115+
job.cronjob is not None
116+
and job.cronjob.unique_collection
117+
and data_type == "items"
118+
):
119+
job_collection_name = "{}-scj{}-job_{}".format(
120+
job.spider.sid, job.cronjob.cjid, data_type
121+
)
122+
else:
123+
job_collection_name = "{}-{}-job_{}".format(
124+
job.spider.sid, job.jid, data_type
125+
)
126+
127+
return job_collection_name

estela-api/api/views/job_data.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from api import errors
1313
from api.exceptions import DataBaseError
1414
from api.mixins import BaseViewSet
15+
from api.utils import get_collection_name
1516
from config.job_manager import spiderdata_db_client
1617
from core.models import SpiderJob
1718
from core.tasks import get_chain_to_process_usage_data
@@ -98,7 +99,7 @@ def list(self, request, *args, **kwargs):
9899
raise DataBaseError({"error": errors.UNABLE_CONNECT_DB})
99100

100101
job = SpiderJob.objects.filter(jid=kwargs["jid"]).get()
101-
job_collection_name = self.get_collection_name(job, data_type)
102+
job_collection_name = get_collection_name(job, data_type)
102103

103104
count = spiderdata_db_client.get_estimated_item_count(
104105
kwargs["pid"], job_collection_name
@@ -147,21 +148,6 @@ def list(self, request, *args, **kwargs):
147148
}
148149
)
149150

150-
def get_collection_name(self, job, data_type):
151-
if (
152-
job.cronjob is not None
153-
and job.cronjob.unique_collection
154-
and data_type == "items"
155-
):
156-
job_collection_name = "{}-scj{}-job_{}".format(
157-
job.spider.sid, job.cronjob.cjid, data_type
158-
)
159-
else:
160-
job_collection_name = "{}-{}-job_{}".format(
161-
job.spider.sid, job.jid, data_type
162-
)
163-
164-
return job_collection_name
165151

166152
@swagger_auto_schema(
167153
methods=["GET"],
@@ -196,7 +182,7 @@ def download(self, request, *args, **kwargs):
196182
data_type = request.query_params.get("type", "items")
197183

198184
job = SpiderJob.objects.filter(jid=kwargs["jid"]).get()
199-
job_collection_name = self.get_collection_name(job, data_type)
185+
job_collection_name = get_collection_name(job, data_type)
200186

201187
data = []
202188
if data_type == "stats":
@@ -242,7 +228,7 @@ def delete(self, request, *args, **kwargs):
242228
if not spiderdata_db_client.get_connection():
243229
raise DataBaseError({"error": errors.UNABLE_CONNECT_DB})
244230

245-
job_collection_name = self.get_collection_name(job, data_type)
231+
job_collection_name = get_collection_name(job, data_type)
246232
deleted_data = spiderdata_db_client.delete_dataset_data(
247233
kwargs["pid"], job_collection_name
248234
)

estela-api/docker-conf/Dockerfile-celery-beat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build Stage
2-
FROM python:3.9-slim as builder
2+
FROM python:3.9-slim AS builder
33

44
ENV PYTHONDONTWRITEBYTECODE=1 \
55
PYTHONUNBUFFERED=1

estela-api/docker-conf/Dockerfile-celery-worker

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build Stage
2-
FROM python:3.9-slim as builder
2+
FROM python:3.9-slim AS builder
33

44
ENV PYTHONDONTWRITEBYTECODE=1 \
55
PYTHONUNBUFFERED=1

estela-api/docker-conf/Dockerfile-django-api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build Stage
2-
FROM python:3.9-slim as builder
2+
FROM python:3.9-slim AS builder
33

44
ENV PYTHONDONTWRITEBYTECODE=1 \
55
PYTHONUNBUFFERED=1

estela-api/docs/api.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,6 +2386,10 @@ definitions:
23862386
- PERSISTENT
23872387
- PENDING
23882388
- DELETED
2389+
storage_size:
2390+
title: Storage size
2391+
type: string
2392+
readOnly: true
23892393
ProjectJob:
23902394
required:
23912395
- results

estela-web/src/pages/JobDetailPage/index.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ export class JobDetailPage extends Component<RouteComponentProps<RouteParams>, J
306306
loaded: true,
307307
dataStatus: response.dataStatus,
308308
dataExpiryDays: response.dataExpiryDays == null ? 1 : response.dataExpiryDays,
309+
storageSize: response.storageSize,
309310
});
310311
},
311312
(error: unknown) => {
@@ -660,6 +661,7 @@ export class JobDetailPage extends Component<RouteComponentProps<RouteParams>, J
660661
totalResponseBytes,
661662
items,
662663
status,
664+
storageSize,
663665
} = this.state;
664666
const getProxyTag = (): string => {
665667
const desiredItem = envVars.find((item) => item.name === "ESTELA_PROXY_NAME");
@@ -933,15 +935,13 @@ export class JobDetailPage extends Component<RouteComponentProps<RouteParams>, J
933935
</Card>
934936
</Content>
935937
<Content className="my-2 grid lg:grid-cols-12 grid-cols-12 gap-1 items-start lg:w-full">
936-
<Card
937-
className="opacity-40 cursor-not-allowed w-full col-span-2 flex flex-col"
938-
style={{ borderRadius: "8px" }}
939-
bordered={false}
940-
>
938+
<Card className="w-full col-span-2 flex flex-col" style={{ borderRadius: "8px" }} bordered={false}>
941939
<Text className="py-0 text-estela-black-medium font-medium text-base">Storage</Text>
942940
<Row className="grid grid-cols-1 py-1 mt-3">
943941
<Col>
944-
<Text className="font-bold text-estela-black-full text-lg">-/-</Text>
942+
<Text className="font-bold text-estela-black-full text-lg">
943+
{`${formatBytes(storageSize).quantity} ${formatBytes(storageSize).type}`}
944+
</Text>
945945
</Col>
946946
<Col>
947947
<Text className="text-estela-black-medium text-xs">of project</Text>
@@ -950,7 +950,9 @@ export class JobDetailPage extends Component<RouteComponentProps<RouteParams>, J
950950
<Content className="w-full bg-estela-white-low rounded-full h-2.5 dark:bg-estela-white-low">
951951
<div
952952
className="bg-estela-states-green-medium h-2.5 rounded-full"
953-
style={{ width: "0%" }}
953+
style={{
954+
width: "100%",
955+
}}
954956
></div>
955957
</Content>
956958
</Col>

estela-web/src/services/api/generated-api/models/SpiderJob.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ export interface SpiderJob {
124124
* @memberof SpiderJob
125125
*/
126126
dataStatus?: SpiderJobDataStatusEnum;
127+
/**
128+
*
129+
* @type {string}
130+
* @memberof SpiderJob
131+
*/
132+
readonly storageSize?: string;
127133
}
128134

129135
/**
@@ -161,6 +167,7 @@ export function SpiderJobFromJSONTyped(json: any, ignoreDiscriminator: boolean):
161167
'cronjob': !exists(json, 'cronjob') ? undefined : json['cronjob'],
162168
'dataExpiryDays': !exists(json, 'data_expiry_days') ? undefined : json['data_expiry_days'],
163169
'dataStatus': !exists(json, 'data_status') ? undefined : json['data_status'],
170+
'storageSize': !exists(json, 'storage_size') ? undefined : json['storage_size'],
164171
};
165172
}
166173

0 commit comments

Comments
 (0)