Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -187,27 +187,31 @@ async def sum_wallet_credits(
*,
product_name: ProductName,
wallet_id: WalletID,
include_pending_transactions: bool = True,
) -> WalletTotalCredits:
async with transaction_context(engine, connection) as conn:
statuses = [
CreditTransactionStatus.BILLED,
CreditTransactionStatus.IN_DEBT,
]
if include_pending_transactions:
statuses.append(CreditTransactionStatus.PENDING)
sum_stmt = sa.select(
sa.func.sum(resource_tracker_credit_transactions.c.osparc_credits)
).where(
(resource_tracker_credit_transactions.c.product_name == product_name)
& (resource_tracker_credit_transactions.c.wallet_id == wallet_id)
& (
resource_tracker_credit_transactions.c.transaction_status.in_(
[
CreditTransactionStatus.BILLED,
CreditTransactionStatus.PENDING,
CreditTransactionStatus.IN_DEBT,
]
)
)
& (resource_tracker_credit_transactions.c.transaction_status.in_(statuses))
)

result = await conn.execute(sum_stmt)
row = result.first()
if row is None or row[0] is None:
_logger.warning(
"No credits found for wallet %s with product %s",
wallet_id,
product_name,
)
return WalletTotalCredits(
wallet_id=wallet_id, available_osparc_credits=Decimal(0)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,17 +295,24 @@ async def _process_stop_event(
msg.created_at,
running_service.pricing_unit_cost,
)

wallet_total_credits = await credit_transactions_db.sum_wallet_credits(
db_engine,
product_name=running_service.product_name,
wallet_id=running_service.wallet_id,
# NOTE: Include_pending_transactions=False will ensure that we do not count the current running transactions.
# This is important because we are closing the transaction now and we do not want to count it again.
wallet_total_credits_without_pending_transactions = (
await credit_transactions_db.sum_wallet_credits(
db_engine,
product_name=running_service.product_name,
wallet_id=running_service.wallet_id,
include_pending_transactions=False,
)
)
_transaction_status = (
CreditTransactionStatus.BILLED
if wallet_total_credits.available_osparc_credits - computed_credits >= 0
if wallet_total_credits_without_pending_transactions.available_osparc_credits
- computed_credits
>= 0
else CreditTransactionStatus.IN_DEBT
)

# Adjust the status if the platform status is not OK
if msg.simcore_platform_status != SimcorePlatformStatus.OK:
_transaction_status = CreditTransactionStatus.NOT_BILLED
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from collections.abc import Iterator
from collections.abc import Callable, Iterator
from datetime import UTC, datetime, timedelta
from decimal import Decimal
from typing import Callable

import httpx
import pytest
Expand Down Expand Up @@ -32,6 +31,9 @@
from simcore_postgres_database.models.resource_tracker_service_runs import (
resource_tracker_service_runs,
)
from simcore_service_resource_usage_tracker.services.modules.db import (
credit_transactions_db,
)
from simcore_service_resource_usage_tracker.services.service_runs import ServiceRunPage
from starlette import status
from yarl import URL
Expand Down Expand Up @@ -520,3 +522,32 @@ async def test_list_service_runs_with_transaction_status_filter(
assert isinstance(result, ServiceRunPage)
assert len(result.items) == 1
assert result.total == 1


async def test_sum_wallet_credits_db(
mocked_redis_server: None,
resource_tracker_setup_db: None,
rpc_client: RabbitMQRPCClient,
product_name: ProductName,
initialized_app,
):
engine = initialized_app.state.engine
output_including_pending_transaction = (
await credit_transactions_db.sum_wallet_credits(
engine, product_name=product_name, wallet_id=_WALLET_ID
)
)
assert output_including_pending_transaction.available_osparc_credits == Decimal(
"-310.00"
)
output_excluding_pending_transaction = (
await credit_transactions_db.sum_wallet_credits(
engine,
product_name=product_name,
wallet_id=_WALLET_ID,
include_pending_transactions=False,
)
)
assert output_excluding_pending_transaction.available_osparc_credits == Decimal(
"-240.00"
)
Loading