Machine Server

The machine state server is a centralized management application for device testing.

See the Design Doc.

Code structure

The main code is structure as:



  • types contains the Go types used across the rest of the modules.
  • The source module contains source.Source, a way to get update events from machines.
  • The store module contains store.Store, a way to persist and retrieve each machine's state.
  • The processor module contains processor.Processor, a way to update a machine state from an incoming event.

The main loop of machine state server looks like:

for event := range eventCh {
	store.Update(ctx, event.Host.Name, func(previous machine.Description) machine.Description {
		return processor.Process(ctx, previous, event)


The application that runs on each switchboard test machine and feeds information into the machine state server.

See the Design Doc.

Current Data Flow

User triggers powercycle for a machine.

powercycle_server_ansible<WebAPI(ListPowerCycleResponse)machineserverGET on /json/v1/powercycle/list
powercycle_server_ansible>WebAPImachineserverPOST to /json/v1/powercycle/complete/{id:.+}

powercycle_server_ansible report availability on startup.

powercycle_server_ansible>WebAPI(UpdatePowerCycleStateRequest)machineserverPOST to /json/v1/powercycle/state/update

How test_machine_monitor keeps machine.Description up to date.

test_machine_monitor>PubSub(Event)machineserverSends results from interrogate.
test_machine_monitor<WebAPI(Description)machineserverGET to /json/v1/machine/description/{id:.+}


  • initiator - The entity that starts the action.
  • message - Shows the direction of the data flow, the transport, and the struct being moved.
    • Set - A database operation
    • WebAPI - An HTTP Request
    • PubSub - A PubSub message.
  • target - Who the iniator is talking to.
  • Δ is used before a struct if only a part of that struct is being changed.