From daebbd1e9314e5ff35a141b5ed04ac50257ed718 Mon Sep 17 00:00:00 2001 From: flyflypeng Date: Wed, 20 Jun 2018 07:33:45 +0800 Subject: [PATCH 1/4] virtcontainers: add rollback to remove sandbox network If error occurs after sandbox network created successfully, we need to rollback to remove the created sandbox network Fixes: #297 Signed-off-by: flyflypeng --- virtcontainers/api.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/virtcontainers/api.go b/virtcontainers/api.go index abaebb50e..ddbb16801 100644 --- a/virtcontainers/api.go +++ b/virtcontainers/api.go @@ -39,6 +39,8 @@ func CreateSandbox(sandboxConfig SandboxConfig, factory Factory) (VCSandbox, err } func createSandboxFromConfig(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) { + var err error + // Create the sandbox. s, err := createSandbox(sandboxConfig, factory) if err != nil { @@ -46,22 +48,29 @@ func createSandboxFromConfig(sandboxConfig SandboxConfig, factory Factory) (*San } // Create the sandbox network - if err := s.createNetwork(); err != nil { + if err = s.createNetwork(); err != nil { return nil, err } + // network rollback + defer func() { + if err != nil && s.networkNS.NetNsCreated { + s.removeNetwork() + } + }() + // Start the VM - if err := s.startVM(); err != nil { + if err = s.startVM(); err != nil { return nil, err } // Create Containers - if err := s.createContainers(); err != nil { + if err = s.createContainers(); err != nil { return nil, err } // The sandbox is completely created now, we can store it. - if err := s.storeSandbox(); err != nil { + if err = s.storeSandbox(); err != nil { return nil, err } From c2651a85a8668428babe4210b34d133ab8a61f12 Mon Sep 17 00:00:00 2001 From: flyflypeng Date: Wed, 20 Jun 2018 07:38:24 +0800 Subject: [PATCH 2/4] virtcontainers: add kata-proxy rollback If some errors occur after kata-proxy start, we need to rollback to kill kata-proxy process Fixes: #297 Signed-off-by: flyflypeng --- virtcontainers/kata_agent.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index 53559ca90..f3fcdb3f6 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -450,6 +450,8 @@ func (k *kataAgent) generateInterfacesAndRoutes(networkNS NetworkNamespace) ([]* } func (k *kataAgent) startProxy(sandbox *Sandbox) error { + var err error + if k.proxy == nil { return errorMissingProxy } @@ -475,10 +477,18 @@ func (k *kataAgent) startProxy(sandbox *Sandbox) error { return err } + // If error occurs after kata-proxy process start, + // then rollback to kill kata-proxy process + defer func() { + if err != nil && pid > 0 { + k.proxy.stop(sandbox, pid) + } + }() + // Fill agent state with proxy information, and store them. k.state.ProxyPid = pid k.state.URL = uri - if err := sandbox.storage.storeAgentState(sandbox.id, k.state); err != nil { + if err = sandbox.storage.storeAgentState(sandbox.id, k.state); err != nil { return err } From 7103c4f14a14433634306284e4e7f0017959a71e Mon Sep 17 00:00:00 2001 From: flyflypeng Date: Wed, 20 Jun 2018 07:51:05 +0800 Subject: [PATCH 3/4] virtcontainers: add qemu process rollback If some errors occur after qemu process start, then we need to rollback to kill qemu process Fixes: #297 Signed-off-by: flyflypeng --- virtcontainers/api.go | 21 +++++++++++++++++++++ virtcontainers/sandbox.go | 10 ++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/virtcontainers/api.go b/virtcontainers/api.go index ddbb16801..3fabd70da 100644 --- a/virtcontainers/api.go +++ b/virtcontainers/api.go @@ -64,6 +64,27 @@ func createSandboxFromConfig(sandboxConfig SandboxConfig, factory Factory) (*San return nil, err } + // rollback to stop VM if error occurs + defer func() { + if err != nil { + s.stopVM() + } + }() + + // Once startVM is done, we want to guarantee + // that the sandbox is manageable. For that we need + // to start the sandbox inside the VM. + if err = s.agent.startSandbox(s); err != nil { + return nil, err + } + + // rollback to stop sandbox in VM + defer func() { + if err != nil { + s.agent.stopSandbox(s) + } + }() + // Create Containers if err = s.createContainers(); err != nil { return nil, err diff --git a/virtcontainers/sandbox.go b/virtcontainers/sandbox.go index 316dbd72c..efd5d1d6a 100644 --- a/virtcontainers/sandbox.go +++ b/virtcontainers/sandbox.go @@ -971,10 +971,12 @@ func (s *Sandbox) startVM() error { s.Logger().Info("VM started") - // Once startVM is done, we want to guarantee - // that the sandbox is manageable. For that we need - // to start the sandbox inside the VM. - return s.agent.startSandbox(s) + return nil +} + +// stopVM: stop the sandbox's VM +func (s *Sandbox) stopVM() error { + return s.hypervisor.stopSandbox() } func (s *Sandbox) addContainer(c *Container) error { From 2993cb3dd4b8f043edd8cd55d34ce1daef03f4b0 Mon Sep 17 00:00:00 2001 From: flyflypeng Date: Tue, 19 Jun 2018 23:20:18 +0800 Subject: [PATCH 4/4] virtcontainers: fix kata-agent fail to start If kata-agent doesn't start in VM, we need to do some rollback operations to release related resources. add grpc check() to check kata-agent is running or not Fixes: #297 Signed-off-by: flyflypeng --- virtcontainers/kata_agent.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index f3fcdb3f6..831862af2 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -512,6 +512,11 @@ func (k *kataAgent) startSandbox(sandbox *Sandbox) error { hostname = hostname[:maxHostnameLen] } + // check grpc server is serving + if err = k.check(); err != nil { + return err + } + // // Setup network interfaces and routes //