Skip to content
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
4 changes: 2 additions & 2 deletions src/openstack_billing_db/billing.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ def get_runtime_for_instance(
runtime = instance.get_runtime_during(start, end)
for interval_start, interval_end in excluded_intervals:
excluded_runtime = instance.get_runtime_during(
start_time=interval_start,
end_time=interval_end,
start_time=interval_start.replace(tzinfo=None),
end_time=interval_end.replace(tzinfo=None),
)
runtime = runtime - excluded_runtime

Expand Down
45 changes: 44 additions & 1 deletion src/openstack_billing_db/tests/unit/test_billing.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import uuid
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
import pytest

from openstack_billing_db import billing
Expand Down Expand Up @@ -36,6 +36,49 @@ def test_instance_simple_runtime():
assert r.total_seconds_stopped == 0


def test_instance_runtime_timezone_mismatch():
"""Test that mismatched timezones between start/end and excluded_intervals raises an error."""
time = datetime(year=2000, month=1, day=1, hour=0, minute=0, second=0)
events = [
InstanceEvent(time=time, name="create", message=""),
InstanceEvent(time=time + timedelta(days=15), name="delete", message=""),
]
i = Instance(
uuid=uuid.uuid4().hex, name=uuid.uuid4().hex, flavor=FLAVORS[1], events=events
)

# Start and end are timezone-naive
start = datetime(year=2000, month=1, day=1, hour=0, minute=0, second=0)
end = datetime(year=2000, month=2, day=1, hour=0, minute=0, second=0)

# excluded_intervals are timezone-aware
excluded_intervals = [
(
datetime(
year=2000,
month=1,
day=7,
hour=0,
minute=0,
second=0,
tzinfo=timezone.utc,
),
datetime(
year=2000,
month=1,
day=8,
hour=0,
minute=0,
second=0,
tzinfo=timezone.utc,
),
),
]

# Runs without error
billing.get_runtime_for_instance(i, start, end, excluded_intervals)


def test_billing_add_su_hours():
invoice = billing.ProjectInvoice(
project_name="foo",
Expand Down
Loading