Skip to content

Commit aa6915c

Browse files
committed
ready: reuse existing env on ready platform
1 parent af9e68f commit aa6915c

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

lisa/environment.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@ def status(self, value: EnvironmentStatus) -> None:
228228
if self._status != value:
229229
if value == EnvironmentStatus.New:
230230
self._reset()
231+
if value == EnvironmentStatus.Prepared:
232+
# When transitioning to Prepared, clear the initialized flag.
233+
# This is necessary for scenarios where an environment is being reused
234+
# (e.g., reuse_dirty_env=True), so that it can go through
235+
# init steps again.
236+
self._is_initialized = False
231237
self._status = value
232238
environment_message = EnvironmentMessage(
233239
name=self.name,

lisa/sut_orchestrator/ready.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT license.
33

4+
from dataclasses import dataclass, field
45
from pathlib import Path
5-
from typing import List, Optional, Type
6+
from typing import Any, List, Optional, Type
7+
8+
from dataclasses_json import dataclass_json
69

710
from lisa import feature, features
8-
from lisa.environment import Environment
11+
from lisa.environment import Environment, EnvironmentStatus
912
from lisa.feature import Feature
1013
from lisa.platform_ import Platform
1114
from lisa.schema import DiskOptionSettings, NetworkInterfaceOptionSettings
@@ -14,11 +17,26 @@
1417
from . import READY
1518

1619

20+
@dataclass_json()
21+
@dataclass
22+
class ReadyPlatformSchema:
23+
# If set to True, a dirty environment will be retained and reused
24+
# instead of being deleted and recreated.
25+
reuse_dirty_env: bool = field(default=True)
26+
27+
1728
class ReadyPlatform(Platform):
1829
@classmethod
1930
def type_name(cls) -> str:
2031
return READY
2132

33+
def _initialize(self, *args: Any, **kwargs: Any) -> None:
34+
ready_runbook: ReadyPlatformSchema = self.runbook.get_extended_runbook(
35+
ReadyPlatformSchema
36+
)
37+
assert ready_runbook, "platform runbook cannot be empty"
38+
self._ready_runbook = ready_runbook
39+
2240
@classmethod
2341
def supported_features(cls) -> List[Type[Feature]]:
2442
return [
@@ -65,8 +83,14 @@ def _deploy_environment(self, environment: Environment, log: Logger) -> None:
6583
pass
6684

6785
def _delete_environment(self, environment: Environment, log: Logger) -> None:
68-
# ready platform doesn't support delete environment
69-
pass
86+
if self._ready_runbook.reuse_dirty_env:
87+
log.debug(
88+
f"Environment '{environment.name}' was marked as 'Deleted' "
89+
"because it was dirty. Now resetting it to 'Prepared' since "
90+
"'reuse_dirty_env' is true, allowing test cases to reuse "
91+
"the environment."
92+
)
93+
environment.status = EnvironmentStatus.Prepared
7094

7195

7296
class SerialConsole(features.SerialConsole):

0 commit comments

Comments
 (0)