diff --git a/virtcontainers/agent.go b/virtcontainers/agent.go index 050de36aa9..3b162ec591 100644 --- a/virtcontainers/agent.go +++ b/virtcontainers/agent.go @@ -11,6 +11,7 @@ import ( "time" "github.com/kata-containers/agent/protocols/grpc" + persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api" vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types" "github.com/kata-containers/runtime/virtcontainers/types" "github.com/mitchellh/mapstructure" @@ -255,4 +256,10 @@ type agent interface { // cleanup removes all on disk information generated by the agent cleanup(s *Sandbox) + + // return data for saving + save() persistapi.AgentState + + // load data from disk + load(persistapi.AgentState) } diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index 6e1579ee24..4f52e85a20 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -24,6 +24,7 @@ import ( kataclient "github.com/kata-containers/agent/protocols/client" "github.com/kata-containers/agent/protocols/grpc" "github.com/kata-containers/runtime/virtcontainers/device/config" + persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api" vcAnnotations "github.com/kata-containers/runtime/virtcontainers/pkg/annotations" ns "github.com/kata-containers/runtime/virtcontainers/pkg/nsenter" vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types" @@ -286,8 +287,10 @@ func (k *kataAgent) init(ctx context.Context, sandbox *Sandbox, config interface k.proxyBuiltIn = isProxyBuiltIn(sandbox.config.ProxyType) // Fetch agent runtime info. - if err := sandbox.store.Load(store.Agent, &k.state); err != nil { - k.Logger().Debug("Could not retrieve anything from storage") + if !sandbox.supportNewStore() { + if err := sandbox.store.Load(store.Agent, &k.state); err != nil { + k.Logger().Debug("Could not retrieve anything from storage") + } } return disableVMShutdown, nil @@ -686,7 +689,7 @@ func (k *kataAgent) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string) k.proxy = proxy k.state.ProxyPid = pid k.state.URL = url - if sandbox != nil { + if sandbox != nil && !sandbox.supportNewStore() { if err := sandbox.store.Store(store.Agent, k.state); err != nil { return err } @@ -841,9 +844,11 @@ func (k *kataAgent) stopSandbox(sandbox *Sandbox) error { // clean up agent state k.state.ProxyPid = -1 k.state.URL = "" - if err := sandbox.store.Store(store.Agent, k.state); err != nil { - // ignore error - k.Logger().WithError(err).WithField("sandbox", sandbox.id).Error("failed to clean up agent state") + if !sandbox.supportNewStore() { + if err := sandbox.store.Store(store.Agent, k.state); err != nil { + // ignore error + k.Logger().WithError(err).WithField("sandbox", sandbox.id).Error("failed to clean up agent state") + } } return nil @@ -2074,3 +2079,14 @@ func (k *kataAgent) cleanup(s *Sandbox) { k.Logger().WithError(err).Errorf("failed to cleanup vm share path %s", path) } } + +func (k *kataAgent) save() (s persistapi.AgentState) { + s.ProxyPid = k.state.ProxyPid + s.URL = k.state.URL + return +} + +func (k *kataAgent) load(s persistapi.AgentState) { + k.state.ProxyPid = s.ProxyPid + k.state.URL = s.URL +} diff --git a/virtcontainers/noop_agent.go b/virtcontainers/noop_agent.go index 307caa7f2a..4c1eec3fc2 100644 --- a/virtcontainers/noop_agent.go +++ b/virtcontainers/noop_agent.go @@ -10,6 +10,7 @@ import ( "time" "github.com/kata-containers/agent/protocols/grpc" + persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api" vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types" "github.com/kata-containers/runtime/virtcontainers/types" specs "github.com/opencontainers/runtime-spec/specs-go" @@ -233,3 +234,11 @@ func (n *noopAgent) markDead() { func (n *noopAgent) cleanup(s *Sandbox) { } + +// save is the Noop agent state saver. It does nothing. +func (n *noopAgent) save() (s persistapi.AgentState) { + return +} + +// load is the Noop agent state loader. It does nothing. +func (n *noopAgent) load(s persistapi.AgentState) {} diff --git a/virtcontainers/persist.go b/virtcontainers/persist.go index 394388f45d..ccf9f00557 100644 --- a/virtcontainers/persist.go +++ b/virtcontainers/persist.go @@ -154,6 +154,12 @@ func (s *Sandbox) dumpMounts(cs map[string]persistapi.ContainerState) { } } +func (s *Sandbox) dumpAgent(ss *persistapi.SandboxState) { + if s.agent != nil { + ss.AgentState = s.agent.save() + } +} + func (s *Sandbox) Save() error { var ( ss = persistapi.SandboxState{} @@ -166,6 +172,7 @@ func (s *Sandbox) Save() error { s.dumpDevices(&ss, cs) s.dumpProcess(cs) s.dumpMounts(cs) + s.dumpAgent(&ss) if err := s.newStore.ToDisk(ss, cs); err != nil { return err @@ -196,6 +203,12 @@ func (s *Sandbox) loadHypervisor(hs persistapi.HypervisorState) { s.hypervisor.load(hs) } +func (s *Sandbox) loadAgent(as persistapi.AgentState) { + if s.agent != nil { + s.agent.load(as) + } +} + func (s *Sandbox) loadDevices(devStates []persistapi.DeviceState) { s.devManager.LoadDevices(devStates) } @@ -245,6 +258,7 @@ func (s *Sandbox) Restore() error { s.loadState(ss) s.loadHypervisor(ss.HypervisorState) s.loadDevices(ss.Devices) + s.loadAgent(ss.AgentState) return nil } diff --git a/virtcontainers/persist/api/sandbox.go b/virtcontainers/persist/api/sandbox.go index 96828df51e..65b8df3656 100644 --- a/virtcontainers/persist/api/sandbox.go +++ b/virtcontainers/persist/api/sandbox.go @@ -8,12 +8,12 @@ package persistapi // ============= sandbox level resources ============= -// ProxyState save proxy state data -type ProxyState struct { +// AgentState save agent state data +type AgentState struct { // Pid of proxy process - Pid int + ProxyPid int - // URL to connect to proxy + // URL to connect to agent URL string } @@ -46,8 +46,8 @@ type SandboxState struct { // HypervisorState saves hypervisor specific data HypervisorState HypervisorState - // ProxyState saves state data of proxy process - ProxyState ProxyState + // AgentState saves state data of agent + AgentState AgentState // Network saves network configuration of sandbox Network NetworkInfo