diff --git a/virtcontainers/agent.go b/virtcontainers/agent.go index d95cdbf63..d1044bd76 100644 --- a/virtcontainers/agent.go +++ b/virtcontainers/agent.go @@ -152,6 +152,9 @@ type agent interface { // get agent url getAgentURL() (string, error) + // update the agent using some elements from another agent + reuseAgent(agent agent) error + // createSandbox will tell the agent to perform necessary setup for a Sandbox. createSandbox(sandbox *Sandbox) error diff --git a/virtcontainers/hyperstart_agent.go b/virtcontainers/hyperstart_agent.go index 34b381b13..b338369c2 100644 --- a/virtcontainers/hyperstart_agent.go +++ b/virtcontainers/hyperstart_agent.go @@ -964,6 +964,17 @@ func (h *hyper) getAgentURL() (string, error) { return "", nil } +func (h *hyper) reuseAgent(agent agent) error { + a, ok := agent.(*hyper) + if !ok { + return fmt.Errorf("Bug: get a wrong type of agent") + } + + h.client = a.client + + return nil +} + func (h *hyper) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string) error { if url == "" { return fmt.Errorf("invalid empty proxy url") diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index e96ec088a..335a0a781 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -537,6 +537,17 @@ func (k *kataAgent) getAgentURL() (string, error) { return k.agentURL() } +func (k *kataAgent) reuseAgent(agent agent) error { + a, ok := agent.(*kataAgent) + if !ok { + return fmt.Errorf("Bug: get a wrong type of agent") + } + + k.installReqFunc(a.client) + k.client = a.client + return nil +} + func (k *kataAgent) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string) error { if url == "" { var err error diff --git a/virtcontainers/noop_agent.go b/virtcontainers/noop_agent.go index f9e447f2d..86d5abe5a 100644 --- a/virtcontainers/noop_agent.go +++ b/virtcontainers/noop_agent.go @@ -184,6 +184,11 @@ func (n *noopAgent) reseedRNG(data []byte) error { return nil } +// reuseAgent is the Noop agent reuser. It does nothing. +func (n *noopAgent) reuseAgent(agent agent) error { + return nil +} + // getAgentURL is the Noop agent url getter. It returns nothing. func (n *noopAgent) getAgentURL() (string, error) { return "", nil diff --git a/virtcontainers/vm.go b/virtcontainers/vm.go index 534a78c5a..ac22d9283 100644 --- a/virtcontainers/vm.go +++ b/virtcontainers/vm.go @@ -319,6 +319,10 @@ func (v *VM) assignSandbox(s *Sandbox) error { return err } + if err := s.agent.reuseAgent(v.agent); err != nil { + return err + } + // First make sure the symlinks do not exist os.RemoveAll(sbSharePath) os.RemoveAll(sbSockDir)