@startuml participant "Language SDK" order 10 box "Engine" participant "Resource Monitor" order 15 participant "Step Generator" order 20 participant "Step Executor" order 25 end box participant "Resource Provider" order 30 "Language SDK" -> "Resource Monitor" ++ : RegisterResourceRequest(type, name, inputs, options) "Resource Monitor" -> "Step Generator" ++ : RegisterResourceEvent(type, name, inputs, options) "Step Generator" -> "Resource Provider" ++ : CheckRequest(type, inputs, old inputs) "Step Generator" <- "Resource Provider" -- : CheckResponse(inputs', failures) "Step Generator" -> "Resource Provider" ++ : DiffRequest(type, inputs', old state, options) "Step Generator" <- "Resource Provider" -- : DiffResponse(diffs) "Step Generator" -> "Step Executor" --++ : [DeleteStep(old state), CreateStep(inputs', options)] note left This is fire-and-forget on the part of the step generator. The steps will run in parallel with steps for other resources. end note "Step Executor" -> "Resource Provider" ++ : DeleteRequest(type, old state) "Step Executor" <- "Resource Provider" -- : DeleteResponse() "Step Executor" -> "Resource Provider" ++ : CreateRequest(type, inputs', old state) "Step Executor" <- "Resource Provider" -- : CreateResponse(new state) "Resource Monitor" <- "Step Executor" -- : done(new state) "Language SDK" <- "Resource Monitor" -- : RegisterResourceResponse(urn, ID, new state) @enduml