Add StopIfFree node command to tell free nodes to stop asking for new work (#866)

This commit is contained in:
bmc-msft
2021-05-07 13:55:50 -04:00
committed by GitHub
parent eba6fa4456
commit 221a3316a1
9 changed files with 71 additions and 2 deletions

View File

@ -16,7 +16,12 @@ from onefuzztypes.events import (
)
from onefuzztypes.models import Error
from onefuzztypes.models import Node as BASE_NODE
from onefuzztypes.models import NodeAssignment, NodeCommand, NodeCommandAddSshKey
from onefuzztypes.models import (
NodeAssignment,
NodeCommand,
NodeCommandAddSshKey,
NodeCommandStopIfFree,
)
from onefuzztypes.models import NodeTasks as BASE_NODE_TASK
from onefuzztypes.models import Result, StopNodeCommand, StopTaskNodeCommand
from onefuzztypes.primitives import PoolName
@ -26,6 +31,7 @@ from ..__version__ import __version__
from ..azure.vmss import get_instance_id
from ..events import send_event
from ..orm import MappingIntStrAny, ORMMixin, QueryFilter
from ..versions import is_minimum_version
NODE_EXPIRATION_TIME: datetime.timedelta = datetime.timedelta(hours=1)
NODE_REIMAGE_TIME: datetime.timedelta = datetime.timedelta(days=7)
@ -338,6 +344,11 @@ class Node(BASE_NODE, ORMMixin):
if not self.reimage_requested and not self.delete_requested:
logging.info("setting reimage_requested: %s", self.machine_id)
self.reimage_requested = True
# if we're going to reimage, make sure the node doesn't pick up new work
# too.
self.send_stop_if_free()
self.save()
def add_ssh_public_key(self, public_key: str) -> Result[None]:
@ -355,6 +366,10 @@ class Node(BASE_NODE, ORMMixin):
)
return None
def send_stop_if_free(self) -> None:
if is_minimum_version(version=self.version, minimum="2.16.1"):
self.send_message(NodeCommand(stop_if_free=NodeCommandStopIfFree()))
def stop(self, done: bool = False) -> None:
self.to_reimage(done=done)
self.send_message(NodeCommand(stop=StopNodeCommand()))

View File

@ -440,10 +440,19 @@ class Scaleset(BASE_SCALESET, ORMMixin):
return
def _resize_shrink(self, to_remove: int) -> None:
logging.info(
SCALESET_LOG_PREFIX + "shrinking scaleset. scaleset_id:%s to_remove:%d",
self.scaleset_id,
to_remove,
)
queue = ScalesetShrinkQueue(self.scaleset_id)
for _ in range(to_remove):
queue.add_entry()
nodes = Node.search_states(scaleset_id=self.scaleset_id)
for node in nodes:
node.send_stop_if_free()
def resize(self) -> None:
# no longer needing to resize
if self.state != ScalesetState.resize: