From 4928041943acd80d3aed16e10400ce0cd37b7c99 Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Fri, 17 Aug 2018 11:26:56 +0800 Subject: [PATCH 1/3] architecture.md: add network hotplug diagram To document the design we have agreed on network hotplug support. Fixes: #220 Signed-off-by: Peng Tao --- .../kata-containers-network-hotplug.png | Bin 0 -> 52234 bytes architecture.md | 31 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 arch-images/kata-containers-network-hotplug.png diff --git a/arch-images/kata-containers-network-hotplug.png b/arch-images/kata-containers-network-hotplug.png new file mode 100644 index 0000000000000000000000000000000000000000..1829fc860a7e40b708f30490c9359a46def91506 GIT binary patch literal 52234 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 Date: Fri, 17 Aug 2018 14:46:02 +0800 Subject: [PATCH 2/3] api: update kata api design doc To match the storage and network hotplug APIs we actually implemented. Signed-off-by: Peng Tao --- design/kata-api-design.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/design/kata-api-design.md b/design/kata-api-design.md index 7d8aa59e2d..241bbee022 100644 --- a/design/kata-api-design.md +++ b/design/kata-api-design.md @@ -31,11 +31,12 @@ To fulfill the [kata design requirements](kata-design-requirements.md), and base ### Sandbox Hotplug API |Name|Description| |---|---| -|sandbox.AddStorage()| Add new storage to the sandbox.| -|sandbox.AddNetwork()| Add new nic to the sandbox.| -|sandbox.ListNetwork()| List all nics and their configurations in the sandbox.| -|sandbox.UpdateNetwork()| Update the configuration of an existing network interface.| -|sandbox.UpdateRoute()| Update the sandbox route table (e.g. for portmapping support).| +|sandbox.AddDevice()| Add new storage device to the sandbox.| +|sandbox.AddInterface()| Add new nic to the sandbox.| +|sandbox.RemoveInterface()| Remove a nic from the sandbox.| +|sandbox.ListInterfaces()| List all nics and their configurations in the sandbox.| +|sandbox.UpdateRoutes()| Update the sandbox route table (e.g. for portmapping support).| +|sandbox.ListRoutes()| List the sandbox route table.| ### Sandbox Relay API |Name|Description| From 6b450c0bb8c4ff04d62f9bed3fbefd000ca57c7d Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Fri, 17 Aug 2018 16:03:34 +0800 Subject: [PATCH 3/3] uml: add txt source of network hotplug uml So that anyone can paste it into https://www.planttext.com/ to modify the png file. Signed-off-by: Peng Tao --- .../kata-containers-network-hotplug-uml.txt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 arch-images/kata-containers-network-hotplug-uml.txt diff --git a/arch-images/kata-containers-network-hotplug-uml.txt b/arch-images/kata-containers-network-hotplug-uml.txt new file mode 100644 index 0000000000..6f12169184 --- /dev/null +++ b/arch-images/kata-containers-network-hotplug-uml.txt @@ -0,0 +1,47 @@ +@startuml + +User->CLI: network add-interface +CLI->virtcontainers: AddInterface +virtcontainers->QEMU:QMP-hot-add-network +virtcontainers->agent:UpdateInterface +note right +the agent's UpdateInterface code will need to be augmented +to have a timeout/wait associated with this for the network +device to appear (ie, wait for qmp to complete) +end note +agent->User: err, interface detail + +User->CLI: network del-interface +CLI->virtcontainers: DeleteInterface +note right +There will be no call to the agent. We rely on guest kernel +to clean up any state associated with the interface. +end note +virtcontainers->QEMU:QMP-hot-delete-network +virtcontainers->User: err, interface detail + +User->CLI: network list-interface +CLI->virtcontainers: ListInterfaces +virtcontainers->agent:ListInterfaces +agent->User: err, list of interface details + +User->CLI: network update-routes +CLI->virtcontainers: UpdateRoutes +note right +routes are handled in a 'one shot' basis, +setting all of the routes for the network. This needs to +be called after interfaces are added, and should be called +after interfaces are removed. It should be fine to call once +after adding all of the expected interfaces. If you know all +the resulting routes, simply calling set routes with the +complete list should suffice. +end note +virtcontainers->agent:UpdateRoutes +agent->User: err, list of routes + +User->CLI: network list-routes +CLI->virtcontainers: ListRoutes +virtcontainers->agent:ListRoutes +agent->User: err, list of routes + +@enduml