Skip to content

Commit 34c7f02

Browse files
Remove circular dependency in BatteriesStatus
And simplify BatteriesStatus code. Signed-off-by: ela-kotulska-frequenz <[email protected]>
1 parent 3057baf commit 34c7f02

File tree

3 files changed

+37
-84
lines changed

3 files changed

+37
-84
lines changed

src/frequenz/sdk/actor/power_distributing/_batteries_status.py

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
from ..._internal.asyncio import AsyncConstructible
1212
from ...microgrid._battery import BatteryStatus, BatteryStatusTracker
13-
from .result import PartialFailure, Result, Success
1413

1514
_logger = logging.getLogger(__name__)
1615

@@ -72,8 +71,6 @@ def get_working_batteries(self, battery_ids: Set[int]) -> Set[int]:
7271
battery_ids: batteries ids
7372
7473
Raises:
75-
RuntimeError: If `async_init` method was not called at the beginning to
76-
initialized object.
7774
KeyError: If any battery in the given batteries is not in the pool.
7875
7976
Returns:
@@ -101,29 +98,23 @@ def get_working_batteries(self, battery_ids: Set[int]) -> Set[int]:
10198
)
10299
return uncertain
103100

104-
def update_last_request_status(self, result: Result):
101+
def update_status(self, succeed_batteries: Set[int], failed_batteries: Set[int]):
105102
"""Update batteries in pool based on the last result from the request.
106103
107104
Args:
108-
result: Summary of what batteries failed and succeed in last request.
109-
110-
Raises:
111-
RuntimeError: If `async_init` method was not called at the beginning to
112-
initialize object.
105+
succeed_batteries: Batteries that succeed request
106+
failed_batteries: Batteries that failed request.
113107
"""
114-
if isinstance(result, Success):
115-
for bat_id in result.used_batteries:
116-
self._batteries[bat_id].unblock()
117-
118-
elif isinstance(result, PartialFailure):
119-
for bat_id in result.failed_batteries:
120-
duration = self._batteries[bat_id].block()
121-
if duration > 0:
122-
_logger.warning(
123-
"Battery %d failed last response. Block it for %f sec",
124-
bat_id,
125-
duration,
126-
)
127-
128-
for bat_id in result.succeed_batteries:
129-
self._batteries[bat_id].unblock()
108+
for battery_id in succeed_batteries:
109+
self._batteries[battery_id].unblock()
110+
111+
for battery_id in failed_batteries:
112+
duration = self._batteries[battery_id].block()
113+
if duration > 0:
114+
_logger.warning(
115+
"Battery %d failed last response. Block it for %f sec",
116+
battery_id,
117+
duration,
118+
)
119+
120+
self._batteries[battery_id].block()

src/frequenz/sdk/actor/power_distributing/power_distributing.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,15 @@ async def run(self) -> None:
308308
excess_power=distribution.remaining_power,
309309
)
310310
else:
311+
succeed_batteries = set(battery_distribution.keys())
311312
response = Success(
312313
request=request,
313314
succeed_power=distributed_power_value,
314-
used_batteries=set(battery_distribution.keys()),
315+
used_batteries=succeed_batteries,
315316
excess_power=distribution.remaining_power,
316317
)
317318

318-
battery_pool.update_last_request_status(response)
319+
battery_pool.update_status(succeed_batteries, failed_batteries)
319320
await user.channel.send(response)
320321

321322
async def _set_distributed_power(

tests/actor/test_battery_pool.py

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -689,12 +689,8 @@ def scenario_block_component(
689689

690690
failed_batteries = {pairs[2].bat_id, pairs[4].bat_id}
691691
# Notify that batteries 4 and 6 failed in last request.
692-
resp = self.fake_PartialFailure(
693-
requested_batteries=batteries,
694-
failed_batteries=failed_batteries,
695-
succeed_batteries=batteries - failed_batteries,
696-
)
697-
battery_pool.update_last_request_status(resp)
692+
succeed_batteries = batteries - failed_batteries
693+
battery_pool.update_status(succeed_batteries, failed_batteries)
698694
expected = expected - failed_batteries
699695
working_batteries = battery_pool.get_working_batteries(batteries)
700696
assert working_batteries == expected
@@ -707,12 +703,8 @@ def scenario_block_component(
707703
failed_batteries = {pairs[0].bat_id}
708704
# Notify that another battery failed in last request. Now we have three
709705
# batteries blocked.
710-
resp = self.fake_PartialFailure(
711-
requested_batteries=batteries,
712-
failed_batteries=failed_batteries,
713-
succeed_batteries=working_batteries - failed_batteries,
714-
)
715-
battery_pool.update_last_request_status(resp)
706+
succeed_batteries = working_batteries - failed_batteries
707+
battery_pool.update_status(succeed_batteries, failed_batteries)
716708
expected = expected - failed_batteries
717709
working_batteries = battery_pool.get_working_batteries(batteries)
718710
assert working_batteries == expected
@@ -729,10 +721,7 @@ def scenario_block_component(
729721
working_batteries = battery_pool.get_working_batteries(batteries)
730722
assert working_batteries == expected
731723

732-
success_resp: Success = self.fake_Success(
733-
requested_batteries=batteries, used_batteries=batteries
734-
)
735-
battery_pool.update_last_request_status(success_resp)
724+
battery_pool.update_status(batteries, set())
736725
assert battery_pool.get_working_batteries(batteries) == batteries
737726

738727
def scenario_blocking_timeout_increases(
@@ -757,13 +746,8 @@ def scenario_blocking_timeout_increases(
757746
for timeout in expected_blocking_timeout:
758747
# Notify that batteries failed in last request.
759748
failed_batteries = {pairs[idx].bat_id for idx in [2, 4, 0]}
760-
resp = self.fake_PartialFailure(
761-
requested_batteries=batteries,
762-
failed_batteries=failed_batteries,
763-
succeed_batteries=expected - failed_batteries,
764-
)
765-
766-
battery_pool.update_last_request_status(resp)
749+
succeed_batteries = expected - failed_batteries
750+
battery_pool.update_status(succeed_batteries, failed_batteries)
767751
expected = expected - failed_batteries
768752
assert battery_pool.get_working_batteries(batteries) == expected
769753

@@ -784,12 +768,8 @@ def scenario_blocking_timeout_increases(
784768
# Now the next timeout should be 30 (Tested in loop above).
785769
# Notify that battery all batteries, except 4 succeed.
786770
failed_batteries = {pairs[4].bat_id}
787-
resp = self.fake_PartialFailure(
788-
requested_batteries=batteries,
789-
failed_batteries=failed_batteries,
790-
succeed_batteries=batteries - failed_batteries,
791-
)
792-
battery_pool.update_last_request_status(resp)
771+
succeed_batteries = batteries - failed_batteries
772+
battery_pool.update_status(succeed_batteries, failed_batteries)
793773
expected = batteries - failed_batteries
794774
assert battery_pool.get_working_batteries(batteries) == expected
795775

@@ -804,12 +784,8 @@ def scenario_blocking_timeout_increases(
804784
# Battery 1 should has timeout 2 sec (it reset)
805785
# Battery 4 should not reset its timeout (30 sec since last fail response.)
806786
failed_batteries = {pairs[4].bat_id, pairs[1].bat_id}
807-
resp = self.fake_PartialFailure(
808-
requested_batteries=batteries,
809-
failed_batteries=failed_batteries,
810-
succeed_batteries=batteries - failed_batteries,
811-
)
812-
battery_pool.update_last_request_status(resp)
787+
succeed_batteries = batteries - failed_batteries
788+
battery_pool.update_status(succeed_batteries, failed_batteries)
813789
working_batteries = battery_pool.get_working_batteries(batteries)
814790
# Battery 4 should be blocked since last call
815791
expected = expected - {pairs[1].bat_id}
@@ -829,11 +805,7 @@ def scenario_blocking_timeout_increases(
829805
self.set_inverter_message(battery_pool, pairs, inverter_data)
830806
expected = expected | {pairs[4].bat_id}
831807
assert battery_pool.get_working_batteries(batteries) == expected
832-
833-
success_resp: Success = self.fake_Success(
834-
requested_batteries=batteries, used_batteries=batteries
835-
)
836-
battery_pool.update_last_request_status(success_resp)
808+
battery_pool.update_status(batteries, set())
837809
assert battery_pool.get_working_batteries(batteries) == batteries
838810

839811
def scenario_state_changes_for_blocked_component(
@@ -851,14 +823,10 @@ def scenario_state_changes_for_blocked_component(
851823
batteries = {pair.bat_id for pair in pairs}
852824
expected = batteries
853825

854-
failed = {pairs[idx].bat_id for idx in range(3)}
855826
# Notify that batteries batteries: 0..2 failed in last request.
856-
resp = self.fake_PartialFailure(
857-
requested_batteries=batteries,
858-
failed_batteries=failed,
859-
succeed_batteries=batteries - failed,
860-
)
861-
battery_pool.update_last_request_status(resp)
827+
failed = {pairs[idx].bat_id for idx in range(3)}
828+
succeed_batteries = batteries - failed
829+
battery_pool.update_status(succeed_batteries, failed)
862830
expected = batteries - failed
863831
assert battery_pool.get_working_batteries(batteries) == expected
864832

@@ -888,10 +856,7 @@ def scenario_state_changes_for_blocked_component(
888856
expected = expected = expected | {pairs[3].bat_id}
889857
assert battery_pool.get_working_batteries(batteries) == expected
890858

891-
success_resp: Success = self.fake_Success(
892-
requested_batteries=batteries, used_batteries=batteries
893-
)
894-
battery_pool.update_last_request_status(success_resp)
859+
battery_pool.update_status(batteries, set())
895860
assert battery_pool.get_working_batteries(batteries) == batteries
896861

897862
def scenario_unknown_batteries_are_used(
@@ -912,12 +877,8 @@ def scenario_unknown_batteries_are_used(
912877

913878
# Notify that battery 0 failed in last request.
914879
failed = {pairs[0].bat_id}
915-
resp = self.fake_PartialFailure(
916-
requested_batteries=batteries,
917-
failed_batteries=failed,
918-
succeed_batteries=batteries - failed,
919-
)
920-
battery_pool.update_last_request_status(resp)
880+
succeed_batteries = batteries - failed
881+
battery_pool.update_status(succeed_batteries, failed)
921882
expected = expected - failed
922883
assert battery_pool.get_working_batteries(batteries) == expected
923884

0 commit comments

Comments
 (0)