persist: merge "agent.json"

Manage "agent.json" with new store.

Signed-off-by: Wei Zhang <weizhang555.zw@gmail.com>
This commit is contained in:
Wei Zhang 2019-07-22 12:00:45 +08:00
parent 7d5e48f1b5
commit 99cf3f80d7
5 changed files with 58 additions and 12 deletions

View File

@ -11,6 +11,7 @@ import (
"time" "time"
"github.com/kata-containers/agent/protocols/grpc" "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" vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types"
"github.com/kata-containers/runtime/virtcontainers/types" "github.com/kata-containers/runtime/virtcontainers/types"
"github.com/mitchellh/mapstructure" "github.com/mitchellh/mapstructure"
@ -255,4 +256,10 @@ type agent interface {
// cleanup removes all on disk information generated by the agent // cleanup removes all on disk information generated by the agent
cleanup(s *Sandbox) cleanup(s *Sandbox)
// return data for saving
save() persistapi.AgentState
// load data from disk
load(persistapi.AgentState)
} }

View File

@ -24,6 +24,7 @@ import (
kataclient "github.com/kata-containers/agent/protocols/client" kataclient "github.com/kata-containers/agent/protocols/client"
"github.com/kata-containers/agent/protocols/grpc" "github.com/kata-containers/agent/protocols/grpc"
"github.com/kata-containers/runtime/virtcontainers/device/config" "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" vcAnnotations "github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
ns "github.com/kata-containers/runtime/virtcontainers/pkg/nsenter" ns "github.com/kata-containers/runtime/virtcontainers/pkg/nsenter"
vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types" 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) k.proxyBuiltIn = isProxyBuiltIn(sandbox.config.ProxyType)
// Fetch agent runtime info. // Fetch agent runtime info.
if err := sandbox.store.Load(store.Agent, &k.state); err != nil { if !sandbox.supportNewStore() {
k.Logger().Debug("Could not retrieve anything from storage") if err := sandbox.store.Load(store.Agent, &k.state); err != nil {
k.Logger().Debug("Could not retrieve anything from storage")
}
} }
return disableVMShutdown, nil return disableVMShutdown, nil
@ -686,7 +689,7 @@ func (k *kataAgent) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string)
k.proxy = proxy k.proxy = proxy
k.state.ProxyPid = pid k.state.ProxyPid = pid
k.state.URL = url k.state.URL = url
if sandbox != nil { if sandbox != nil && !sandbox.supportNewStore() {
if err := sandbox.store.Store(store.Agent, k.state); err != nil { if err := sandbox.store.Store(store.Agent, k.state); err != nil {
return err return err
} }
@ -841,9 +844,11 @@ func (k *kataAgent) stopSandbox(sandbox *Sandbox) error {
// clean up agent state // clean up agent state
k.state.ProxyPid = -1 k.state.ProxyPid = -1
k.state.URL = "" k.state.URL = ""
if err := sandbox.store.Store(store.Agent, k.state); err != nil { if !sandbox.supportNewStore() {
// ignore error if err := sandbox.store.Store(store.Agent, k.state); err != nil {
k.Logger().WithError(err).WithField("sandbox", sandbox.id).Error("failed to clean up agent state") // ignore error
k.Logger().WithError(err).WithField("sandbox", sandbox.id).Error("failed to clean up agent state")
}
} }
return nil 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) 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
}

View File

@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/kata-containers/agent/protocols/grpc" "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" vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types"
"github.com/kata-containers/runtime/virtcontainers/types" "github.com/kata-containers/runtime/virtcontainers/types"
specs "github.com/opencontainers/runtime-spec/specs-go" specs "github.com/opencontainers/runtime-spec/specs-go"
@ -233,3 +234,11 @@ func (n *noopAgent) markDead() {
func (n *noopAgent) cleanup(s *Sandbox) { 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) {}

View File

@ -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 { func (s *Sandbox) Save() error {
var ( var (
ss = persistapi.SandboxState{} ss = persistapi.SandboxState{}
@ -166,6 +172,7 @@ func (s *Sandbox) Save() error {
s.dumpDevices(&ss, cs) s.dumpDevices(&ss, cs)
s.dumpProcess(cs) s.dumpProcess(cs)
s.dumpMounts(cs) s.dumpMounts(cs)
s.dumpAgent(&ss)
if err := s.newStore.ToDisk(ss, cs); err != nil { if err := s.newStore.ToDisk(ss, cs); err != nil {
return err return err
@ -196,6 +203,12 @@ func (s *Sandbox) loadHypervisor(hs persistapi.HypervisorState) {
s.hypervisor.load(hs) 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) { func (s *Sandbox) loadDevices(devStates []persistapi.DeviceState) {
s.devManager.LoadDevices(devStates) s.devManager.LoadDevices(devStates)
} }
@ -245,6 +258,7 @@ func (s *Sandbox) Restore() error {
s.loadState(ss) s.loadState(ss)
s.loadHypervisor(ss.HypervisorState) s.loadHypervisor(ss.HypervisorState)
s.loadDevices(ss.Devices) s.loadDevices(ss.Devices)
s.loadAgent(ss.AgentState)
return nil return nil
} }

View File

@ -8,12 +8,12 @@ package persistapi
// ============= sandbox level resources ============= // ============= sandbox level resources =============
// ProxyState save proxy state data // AgentState save agent state data
type ProxyState struct { type AgentState struct {
// Pid of proxy process // Pid of proxy process
Pid int ProxyPid int
// URL to connect to proxy // URL to connect to agent
URL string URL string
} }
@ -46,8 +46,8 @@ type SandboxState struct {
// HypervisorState saves hypervisor specific data // HypervisorState saves hypervisor specific data
HypervisorState HypervisorState HypervisorState HypervisorState
// ProxyState saves state data of proxy process // AgentState saves state data of agent
ProxyState ProxyState AgentState AgentState
// Network saves network configuration of sandbox // Network saves network configuration of sandbox
Network NetworkInfo Network NetworkInfo