Skip to content

Commit 1bb8bcf

Browse files
🐛 Fix incorrect setup of IN_DEBT transaction state (#7908)
1 parent 9b7bd7c commit 1bb8bcf

File tree

3 files changed

+60
-17
lines changed

3 files changed

+60
-17
lines changed

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/credit_transactions_db.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,27 +187,31 @@ async def sum_wallet_credits(
187187
*,
188188
product_name: ProductName,
189189
wallet_id: WalletID,
190+
include_pending_transactions: bool = True,
190191
) -> WalletTotalCredits:
191192
async with transaction_context(engine, connection) as conn:
193+
statuses = [
194+
CreditTransactionStatus.BILLED,
195+
CreditTransactionStatus.IN_DEBT,
196+
]
197+
if include_pending_transactions:
198+
statuses.append(CreditTransactionStatus.PENDING)
192199
sum_stmt = sa.select(
193200
sa.func.sum(resource_tracker_credit_transactions.c.osparc_credits)
194201
).where(
195202
(resource_tracker_credit_transactions.c.product_name == product_name)
196203
& (resource_tracker_credit_transactions.c.wallet_id == wallet_id)
197-
& (
198-
resource_tracker_credit_transactions.c.transaction_status.in_(
199-
[
200-
CreditTransactionStatus.BILLED,
201-
CreditTransactionStatus.PENDING,
202-
CreditTransactionStatus.IN_DEBT,
203-
]
204-
)
205-
)
204+
& (resource_tracker_credit_transactions.c.transaction_status.in_(statuses))
206205
)
207206

208207
result = await conn.execute(sum_stmt)
209208
row = result.first()
210209
if row is None or row[0] is None:
210+
_logger.warning(
211+
"No credits found for wallet %s with product %s",
212+
wallet_id,
213+
product_name,
214+
)
211215
return WalletTotalCredits(
212216
wallet_id=wallet_id, available_osparc_credits=Decimal(0)
213217
)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/process_message_running_service.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,17 +295,24 @@ async def _process_stop_event(
295295
msg.created_at,
296296
running_service.pricing_unit_cost,
297297
)
298-
299-
wallet_total_credits = await credit_transactions_db.sum_wallet_credits(
300-
db_engine,
301-
product_name=running_service.product_name,
302-
wallet_id=running_service.wallet_id,
298+
wallet_total_credits_without_pending_transactions = (
299+
# NOTE: Include_pending_transactions=False will ensure that we do not count the current running transactions.
300+
# This is important because we are closing the transaction now and we do not want to count it again.
301+
await credit_transactions_db.sum_wallet_credits(
302+
db_engine,
303+
product_name=running_service.product_name,
304+
wallet_id=running_service.wallet_id,
305+
include_pending_transactions=False,
306+
)
303307
)
304308
_transaction_status = (
305309
CreditTransactionStatus.BILLED
306-
if wallet_total_credits.available_osparc_credits - computed_credits >= 0
310+
if wallet_total_credits_without_pending_transactions.available_osparc_credits
311+
- computed_credits
312+
>= 0
307313
else CreditTransactionStatus.IN_DEBT
308314
)
315+
309316
# Adjust the status if the platform status is not OK
310317
if msg.simcore_platform_status != SimcorePlatformStatus.OK:
311318
_transaction_status = CreditTransactionStatus.NOT_BILLED

services/resource-usage-tracker/tests/unit/with_dbs/test_api_credit_transactions.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from collections.abc import Iterator
1+
from collections.abc import Callable, Iterator
22
from datetime import UTC, datetime, timedelta
33
from decimal import Decimal
4-
from typing import Callable
54

65
import httpx
76
import pytest
87
import sqlalchemy as sa
98
from faker import Faker
9+
from fastapi import FastAPI
1010
from models_library.api_schemas_resource_usage_tracker.credit_transactions import (
1111
CreditTransactionCreateBody,
1212
WalletTotalCredits,
@@ -32,6 +32,9 @@
3232
from simcore_postgres_database.models.resource_tracker_service_runs import (
3333
resource_tracker_service_runs,
3434
)
35+
from simcore_service_resource_usage_tracker.services.modules.db import (
36+
credit_transactions_db,
37+
)
3538
from simcore_service_resource_usage_tracker.services.service_runs import ServiceRunPage
3639
from starlette import status
3740
from yarl import URL
@@ -520,3 +523,32 @@ async def test_list_service_runs_with_transaction_status_filter(
520523
assert isinstance(result, ServiceRunPage)
521524
assert len(result.items) == 1
522525
assert result.total == 1
526+
527+
528+
async def test_sum_wallet_credits_db(
529+
mocked_redis_server: None,
530+
resource_tracker_setup_db: None,
531+
rpc_client: RabbitMQRPCClient,
532+
product_name: ProductName,
533+
initialized_app: FastAPI,
534+
):
535+
engine = initialized_app.state.engine
536+
output_including_pending_transaction = (
537+
await credit_transactions_db.sum_wallet_credits(
538+
engine, product_name=product_name, wallet_id=_WALLET_ID
539+
)
540+
)
541+
assert output_including_pending_transaction.available_osparc_credits == Decimal(
542+
"-310.00"
543+
)
544+
output_excluding_pending_transaction = (
545+
await credit_transactions_db.sum_wallet_credits(
546+
engine,
547+
product_name=product_name,
548+
wallet_id=_WALLET_ID,
549+
include_pending_transactions=False,
550+
)
551+
)
552+
assert output_excluding_pending_transaction.available_osparc_credits == Decimal(
553+
"-240.00"
554+
)

0 commit comments

Comments
 (0)