add proxy_state_updated events (#908)

This commit is contained in:
bmc-msft
2021-05-21 12:47:54 -04:00
committed by GitHub
parent 2f81c44f01
commit a4bb670fb2
6 changed files with 145 additions and 9 deletions

View File

@ -37,6 +37,7 @@ Each event will be submitted via HTTP POST to the user provided URL.
* [proxy_created](#proxy_created) * [proxy_created](#proxy_created)
* [proxy_deleted](#proxy_deleted) * [proxy_deleted](#proxy_deleted)
* [proxy_failed](#proxy_failed) * [proxy_failed](#proxy_failed)
* [proxy_state_updated](#proxy_state_updated)
* [regression_reported](#regression_reported) * [regression_reported](#regression_reported)
* [scaleset_created](#scaleset_created) * [scaleset_created](#scaleset_created)
* [scaleset_deleted](#scaleset_deleted) * [scaleset_deleted](#scaleset_deleted)
@ -1411,6 +1412,61 @@ Each event will be submitted via HTTP POST to the user provided URL.
} }
``` ```
### proxy_state_updated
#### Example
```json
{
"proxy_id": "00000000-0000-0000-0000-000000000000",
"region": "eastus",
"state": "init"
}
```
#### Schema
```json
{
"definitions": {
"VmState": {
"description": "An enumeration.",
"enum": [
"init",
"extensions_launch",
"extensions_failed",
"vm_allocation_failed",
"running",
"stopping",
"stopped"
],
"title": "VmState"
}
},
"properties": {
"proxy_id": {
"format": "uuid",
"title": "Proxy Id",
"type": "string"
},
"region": {
"title": "Region",
"type": "string"
},
"state": {
"$ref": "#/definitions/VmState"
}
},
"required": [
"region",
"proxy_id",
"state"
],
"title": "EventProxyStateUpdated",
"type": "object"
}
```
### regression_reported ### regression_reported
#### Example #### Example
@ -4963,6 +5019,29 @@ Each event will be submitted via HTTP POST to the user provided URL.
"title": "EventProxyFailed", "title": "EventProxyFailed",
"type": "object" "type": "object"
}, },
"EventProxyStateUpdated": {
"properties": {
"proxy_id": {
"format": "uuid",
"title": "Proxy Id",
"type": "string"
},
"region": {
"title": "Region",
"type": "string"
},
"state": {
"$ref": "#/definitions/VmState"
}
},
"required": [
"region",
"proxy_id",
"state"
],
"title": "EventProxyStateUpdated",
"type": "object"
},
"EventRegressionReported": { "EventRegressionReported": {
"properties": { "properties": {
"container": { "container": {
@ -5248,6 +5327,7 @@ Each event will be submitted via HTTP POST to the user provided URL.
"proxy_created", "proxy_created",
"proxy_deleted", "proxy_deleted",
"proxy_failed", "proxy_failed",
"proxy_state_updated",
"scaleset_created", "scaleset_created",
"scaleset_deleted", "scaleset_deleted",
"scaleset_failed", "scaleset_failed",
@ -5858,6 +5938,19 @@ Each event will be submitted via HTTP POST to the user provided URL.
}, },
"title": "UserInfo", "title": "UserInfo",
"type": "object" "type": "object"
},
"VmState": {
"description": "An enumeration.",
"enum": [
"init",
"extensions_launch",
"extensions_failed",
"vm_allocation_failed",
"running",
"stopping",
"stopped"
],
"title": "VmState"
} }
}, },
"properties": { "properties": {
@ -5899,6 +5992,9 @@ Each event will be submitted via HTTP POST to the user provided URL.
{ {
"$ref": "#/definitions/EventProxyDeleted" "$ref": "#/definitions/EventProxyDeleted"
}, },
{
"$ref": "#/definitions/EventProxyStateUpdated"
},
{ {
"$ref": "#/definitions/EventScalesetFailed" "$ref": "#/definitions/EventScalesetFailed"
}, },

View File

@ -11,7 +11,12 @@ from uuid import UUID, uuid4
from azure.mgmt.compute.models import VirtualMachine from azure.mgmt.compute.models import VirtualMachine
from onefuzztypes.enums import ErrorCode, VmState from onefuzztypes.enums import ErrorCode, VmState
from onefuzztypes.events import EventProxyCreated, EventProxyDeleted, EventProxyFailed from onefuzztypes.events import (
EventProxyCreated,
EventProxyDeleted,
EventProxyFailed,
EventProxyStateUpdated,
)
from onefuzztypes.models import ( from onefuzztypes.models import (
Authentication, Authentication,
Error, Error,
@ -81,7 +86,7 @@ class Proxy(ORMMixin):
return return
else: else:
self.save_proxy_config() self.save_proxy_config()
self.state = VmState.extensions_launch self.set_state(VmState.extensions_launch)
else: else:
result = vm.create() result = vm.create()
if isinstance(result, Error): if isinstance(result, Error):
@ -115,8 +120,7 @@ class Proxy(ORMMixin):
EventProxyFailed(region=self.region, proxy_id=self.proxy_id, error=error) EventProxyFailed(region=self.region, proxy_id=self.proxy_id, error=error)
) )
self.error = error self.error = error
self.state = VmState.stopping self.set_state(VmState.stopping)
self.save()
def extensions_launch(self) -> None: def extensions_launch(self) -> None:
vm = self.get_vm() vm = self.get_vm()
@ -146,7 +150,7 @@ class Proxy(ORMMixin):
self.set_failed(result) self.set_failed(result)
return return
elif result: elif result:
self.state = VmState.running self.set_state(VmState.running)
self.save() self.save()
@ -298,3 +302,16 @@ class Proxy(ORMMixin):
def delete(self) -> None: def delete(self) -> None:
super().delete() super().delete()
send_event(EventProxyDeleted(region=self.region, proxy_id=self.proxy_id)) send_event(EventProxyDeleted(region=self.region, proxy_id=self.proxy_id))
def set_state(self, state: VmState) -> None:
if self.state == state:
return
self.state = state
self.save()
send_event(
EventProxyStateUpdated(
region=self.region, proxy_id=self.proxy_id, state=self.state
)
)

View File

@ -41,8 +41,7 @@ def main(mytimer: func.TimerRequest, dashboard: func.Out[str]) -> None: # noqa:
) )
if not proxy.is_used(): if not proxy.is_used():
logging.info("stopping one proxy in %s.", proxy.region) logging.info("stopping one proxy in %s.", proxy.region)
proxy.state = VmState.stopping proxy.set_state(VmState.stopping)
proxy.save()
scalesets = Scaleset.search() scalesets = Scaleset.search()
for scaleset in scalesets: for scaleset in scalesets:

View File

@ -21,7 +21,7 @@ def main(mytimer: func.TimerRequest, dashboard: func.Out[str]) -> None: # noqa:
logging.error( logging.error(
PROXY_LOG_PREFIX + "alive check failed, stopping: %s", proxy.region PROXY_LOG_PREFIX + "alive check failed, stopping: %s", proxy.region
) )
proxy.state = VmState.stopping proxy.set_state(VmState.stopping)
proxy.save() proxy.save()
else: else:
proxy.save_proxy_config() proxy.save_proxy_config()

View File

@ -16,6 +16,7 @@ from onefuzztypes.enums import (
ScalesetState, ScalesetState,
TaskState, TaskState,
TaskType, TaskType,
VmState,
) )
from onefuzztypes.events import ( from onefuzztypes.events import (
Event, Event,
@ -33,6 +34,7 @@ from onefuzztypes.events import (
EventProxyCreated, EventProxyCreated,
EventProxyDeleted, EventProxyDeleted,
EventProxyFailed, EventProxyFailed,
EventProxyStateUpdated,
EventRegressionReported, EventRegressionReported,
EventScalesetCreated, EventScalesetCreated,
EventScalesetDeleted, EventScalesetDeleted,
@ -163,6 +165,11 @@ def main() -> None:
proxy_id=UUID(int=0), proxy_id=UUID(int=0),
error=Error(code=ErrorCode.PROXY_FAILED, errors=["example error message"]), error=Error(code=ErrorCode.PROXY_FAILED, errors=["example error message"]),
), ),
EventProxyStateUpdated(
region=Region("eastus"),
proxy_id=UUID(int=0),
state=VmState.init,
),
EventPoolCreated( EventPoolCreated(
pool_name=PoolName("example"), pool_name=PoolName("example"),
os=OS.linux, os=OS.linux,

View File

@ -10,7 +10,15 @@ from uuid import UUID, uuid4
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from .enums import OS, Architecture, NodeState, ScalesetState, TaskState, TaskType from .enums import (
OS,
Architecture,
NodeState,
ScalesetState,
TaskState,
TaskType,
VmState,
)
from .models import ( from .models import (
AutoScaleConfig, AutoScaleConfig,
Error, Error,
@ -135,6 +143,12 @@ class EventProxyFailed(BaseEvent):
error: Error error: Error
class EventProxyStateUpdated(BaseEvent):
region: Region
proxy_id: UUID
state: VmState
class EventNodeCreated(BaseEvent): class EventNodeCreated(BaseEvent):
machine_id: UUID machine_id: UUID
scaleset_id: Optional[UUID] scaleset_id: Optional[UUID]
@ -198,6 +212,7 @@ Event = Union[
EventProxyFailed, EventProxyFailed,
EventProxyCreated, EventProxyCreated,
EventProxyDeleted, EventProxyDeleted,
EventProxyStateUpdated,
EventScalesetFailed, EventScalesetFailed,
EventScalesetCreated, EventScalesetCreated,
EventScalesetDeleted, EventScalesetDeleted,
@ -225,6 +240,7 @@ class EventType(Enum):
proxy_created = "proxy_created" proxy_created = "proxy_created"
proxy_deleted = "proxy_deleted" proxy_deleted = "proxy_deleted"
proxy_failed = "proxy_failed" proxy_failed = "proxy_failed"
proxy_state_updated = "proxy_state_updated"
scaleset_created = "scaleset_created" scaleset_created = "scaleset_created"
scaleset_deleted = "scaleset_deleted" scaleset_deleted = "scaleset_deleted"
scaleset_failed = "scaleset_failed" scaleset_failed = "scaleset_failed"
@ -253,6 +269,7 @@ EventTypeMap = {
EventType.proxy_created: EventProxyCreated, EventType.proxy_created: EventProxyCreated,
EventType.proxy_deleted: EventProxyDeleted, EventType.proxy_deleted: EventProxyDeleted,
EventType.proxy_failed: EventProxyFailed, EventType.proxy_failed: EventProxyFailed,
EventType.proxy_state_updated: EventProxyStateUpdated,
EventType.scaleset_created: EventScalesetCreated, EventType.scaleset_created: EventScalesetCreated,
EventType.scaleset_deleted: EventScalesetDeleted, EventType.scaleset_deleted: EventScalesetDeleted,
EventType.scaleset_failed: EventScalesetFailed, EventType.scaleset_failed: EventScalesetFailed,