summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2018-01-03 16:27:33 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2018-01-17 15:26:43 +0000
commitb814a94c341306875e40b13e4fe7ebffb1b57f5d (patch)
tree17c50c84d51a57684fb5747b0ff88477a7776d79
parent5696dfef6e57826f37624d98773286c89a5f005b (diff)
downloadpodman-b814a94c341306875e40b13e4fe7ebffb1b57f5d.tar.gz
podman-b814a94c341306875e40b13e4fe7ebffb1b57f5d.tar.bz2
podman-b814a94c341306875e40b13e4fe7ebffb1b57f5d.zip
Wire in logic for selecting backing state impl
Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #229 Approved by: rhatdan
-rw-r--r--libpod/options.go14
-rw-r--r--libpod/runtime.go27
2 files changed, 32 insertions, 9 deletions
diff --git a/libpod/options.go b/libpod/options.go
index 4890c71ff..ca4d104df 100644
--- a/libpod/options.go
+++ b/libpod/options.go
@@ -81,15 +81,21 @@ func WithSignaturePolicy(path string) RuntimeOption {
}
}
-// WithInMemoryState specifies that the runtime will be backed by an in-memory
-// state only, and state will not persist after the runtime is shut down
-func WithInMemoryState() RuntimeOption {
+// WithStateType sets the backing state implementation for libpod
+// Please note that information is not portable between backing states
+// As such, if this differs between two libpods running on the same system,
+// they will not share containers, and unspecified behavior may occur
+func WithStateType(storeType RuntimeStateStore) RuntimeOption {
return func(rt *Runtime) error {
if rt.valid {
return ErrRuntimeFinalized
}
- rt.config.InMemoryState = true
+ if storeType == InvalidStateStore {
+ return errors.Wrapf(ErrInvalidArg, "must provide a valid state store type")
+ }
+
+ rt.config.StateType = storeType
return nil
}
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 50aa97528..dc258ab4f 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -14,6 +14,21 @@ import (
"github.com/ulule/deepcopier"
)
+// RuntimeStateStore is a constant indicating which state store implementation
+// should be used by libpod
+type RuntimeStateStore int
+
+const (
+ // InvalidStateStore is an invalid state store
+ InvalidStateStore RuntimeStateStore = iota
+ // InMemoryStateStore is an in-memory state that will not persist data
+ // on containers and pods between libpod instances or after system
+ // reboot
+ InMemoryStateStore RuntimeStateStore = iota
+ // SQLiteStateStore is a state backed by a SQLite database
+ SQLiteStateStore RuntimeStateStore = iota
+)
+
// A RuntimeOption is a functional option which alters the Runtime created by
// NewRuntime
type RuntimeOption func(*Runtime) error
@@ -39,7 +54,7 @@ type RuntimeConfig struct {
InsecureRegistries []string
Registries []string
SignaturePolicyPath string
- InMemoryState bool
+ StateType RuntimeStateStore
RuntimePath string
ConmonPath string
ConmonEnvVars []string
@@ -57,7 +72,7 @@ var (
// Leave this empty so containers/storage will use its defaults
StorageConfig: storage.StoreOptions{},
ImageDefaultTransport: DefaultTransport,
- InMemoryState: false,
+ StateType: SQLiteStateStore,
RuntimePath: "/usr/bin/runc",
ConmonPath: findConmonPath(),
ConmonEnvVars: []string{
@@ -176,14 +191,14 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
runtime.netPlugin = netPlugin
// Set up the state
- if runtime.config.InMemoryState {
+ if runtime.config.StateType == InMemoryStateStore {
state, err := NewInMemoryState()
if err != nil {
return nil, err
}
runtime.state = state
- } else {
- dbPath := filepath.Join(runtime.config.StaticDir, "state.sql")
+ } else if runtime.config.StateType == SQLiteStateStore {
+ dbPath := filepath.Join(runtime.config.StaticDir, "sql_state.db")
specsDir := filepath.Join(runtime.config.StaticDir, "ocispec")
// Make a directory to hold JSON versions of container OCI specs
@@ -200,6 +215,8 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
return nil, err
}
runtime.state = state
+ } else {
+ return nil, errors.Wrapf(ErrInvalidArg, "unrecognized state type passed")
}
// We now need to see if the system has restarted