aboutsummaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2018-03-07 12:24:56 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2018-03-08 16:40:21 +0000
commitc657511bce7bc1c5da4b5554a4850aa4046711b0 (patch)
tree7f369caa423e86e7a5751abc433f7052a019374b /libpod
parentfcc36633557fd52daa2f48dbeb991d89fd5645bc (diff)
downloadpodman-c657511bce7bc1c5da4b5554a4850aa4046711b0.tar.gz
podman-c657511bce7bc1c5da4b5554a4850aa4046711b0.tar.bz2
podman-c657511bce7bc1c5da4b5554a4850aa4046711b0.zip
Add location in DB for saving files to bind mount in
Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #462 Approved by: baude
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container.go6
-rw-r--r--libpod/sql_state.go30
-rw-r--r--libpod/sql_state_internal.go24
-rw-r--r--libpod/test_common.go4
4 files changed, 54 insertions, 10 deletions
diff --git a/libpod/container.go b/libpod/container.go
index 96fda27c1..95db85b70 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -148,6 +148,12 @@ type containerState struct {
// Only populated if we created a network namespace for the container,
// and the network namespace is currently active
Routes []*types.Route `json:"routes,omitempty"`
+ // BindMounts contains files that will be bind-mounted into the
+ // container when it is mounted.
+ // These include /etc/hosts and /etc/resolv.conf
+ // This maps the path the file will be mounted to in the container to
+ // the path of the file on disk outside the container
+ BindMounts map[string]string `json:"bindMounts,omitempty"`
}
// ExecSession contains information on an active exec session
diff --git a/libpod/sql_state.go b/libpod/sql_state.go
index 41cc435cc..f583febda 100644
--- a/libpod/sql_state.go
+++ b/libpod/sql_state.go
@@ -16,7 +16,7 @@ import (
// DBSchema is the current DB schema version
// Increments every time a change is made to the database's tables
-const DBSchema = 13
+const DBSchema = 14
// SQLState is a state implementation backed by a persistent SQLite3 database
type SQLState struct {
@@ -105,7 +105,8 @@ func (s *SQLState) Refresh() (err error) {
NetNSPath=?,
ExecSessions=?,
IPs=?,
- Routes=?;`
+ Routes=?,
+ BindMounts=?;`
if !s.valid {
return ErrDBClosed
@@ -136,7 +137,8 @@ func (s *SQLState) Refresh() (err error) {
"",
"{}",
"[]",
- "[]")
+ "[]",
+ "{}")
if err != nil {
return errors.Wrapf(err, "error refreshing database state")
}
@@ -274,7 +276,8 @@ func (s *SQLState) UpdateContainer(ctr *Container) error {
NetNSPath,
ExecSessions,
IPs,
- Routes
+ Routes,
+ BindMounts
FROM containerState WHERE ID=?;`
var (
@@ -291,6 +294,7 @@ func (s *SQLState) UpdateContainer(ctr *Container) error {
execSessions string
ipsJSON string
routesJSON string
+ bindMountsJSON string
)
if !s.valid {
@@ -315,7 +319,8 @@ func (s *SQLState) UpdateContainer(ctr *Container) error {
&netNSPath,
&execSessions,
&ipsJSON,
- &routesJSON)
+ &routesJSON,
+ &bindMountsJSON)
if err != nil {
// The container may not exist in the database
if err == sql.ErrNoRows {
@@ -359,6 +364,12 @@ func (s *SQLState) UpdateContainer(ctr *Container) error {
newState.Routes = routes
}
+ bindMounts := make(map[string]string)
+ if err := json.Unmarshal([]byte(bindMountsJSON), &bindMounts); err != nil {
+ return errors.Wrapf(err, "error parsing container %s bind mounts JSON", ctr.ID())
+ }
+ newState.BindMounts = bindMounts
+
if newState.Mountpoint != "" {
newState.Mounted = true
}
@@ -422,7 +433,8 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) {
NetNSPath=?,
ExecSessions=?,
IPs=?,
- Routes=?
+ Routes=?,
+ BindMounts=?
WHERE Id=?;`
if !ctr.valid {
@@ -449,6 +461,11 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) {
return errors.Wrapf(err, "error marshalling container %s routes to JSON", ctr.ID())
}
+ bindMountsJSON, err := json.Marshal(ctr.state.BindMounts)
+ if err != nil {
+ return errors.Wrapf(err, "error marshalling container %s bind mounts to JSON", ctr.ID())
+ }
+
if !s.valid {
return ErrDBClosed
}
@@ -482,6 +499,7 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) {
execSessionsJSON,
ipsJSON,
routesJSON,
+ bindMountsJSON,
ctr.ID())
if err != nil {
return errors.Wrapf(err, "error updating container %s state in database", ctr.ID())
diff --git a/libpod/sql_state_internal.go b/libpod/sql_state_internal.go
index fdde45632..7729fb6ec 100644
--- a/libpod/sql_state_internal.go
+++ b/libpod/sql_state_internal.go
@@ -36,7 +36,8 @@ const (
containerState.NetNSPath,
containerState.ExecSessions,
containerState.IPs,
- containerState.Routes
+ containerState.Routes,
+ containerState.BindMounts
FROM containers
INNER JOIN
containerState ON containers.Id = containerState.Id `
@@ -278,6 +279,7 @@ func prepareDB(db *sql.DB) (err error) {
ExecSessions TEXT NOT NULL,
IPs TEXT NOT NULL,
Routes TEXT NOT NULL,
+ BindMounts TEXT NOT NULL,
CHECK (State>0),
CHECK (OomKilled IN (0, 1)),
@@ -488,6 +490,7 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) {
execSessions string
ipsJSON string
routesJSON string
+ bindMountsJSON string
)
err := row.Scan(
@@ -542,7 +545,8 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) {
&netNSPath,
&execSessions,
&ipsJSON,
- &routesJSON)
+ &routesJSON,
+ &bindMountsJSON)
if err != nil {
if err == sql.ErrNoRows {
return nil, ErrNoSuchCtr
@@ -641,6 +645,12 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) {
ctr.state.Routes = routes
}
+ bindMounts := make(map[string]string)
+ if err := json.Unmarshal([]byte(bindMountsJSON), &bindMounts); err != nil {
+ return nil, errors.Wrapf(err, "error parsing container %s bind mounts JSON", id)
+ }
+ ctr.state.BindMounts = bindMounts
+
labels := make(map[string]string)
if err := json.Unmarshal([]byte(labelsJSON), &labels); err != nil {
return nil, errors.Wrapf(err, "error parsing container %s labels JSON", id)
@@ -778,7 +788,7 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) {
addCtrState = `INSERT INTO containerState VALUES (
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
- ?, ?, ?, ?
+ ?, ?, ?, ?, ?
);`
addRegistry = "INSERT INTO registry VALUES (?, ?);"
checkCtrInPod = "SELECT 1 FROM containers WHERE Id=? AND Pod=?;"
@@ -835,6 +845,11 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) {
return errors.Wrapf(err, "error marshalling container %s routes to JSON", ctr.ID())
}
+ bindMountsJSON, err := json.Marshal(ctr.state.BindMounts)
+ if err != nil {
+ return errors.Wrapf(err, "error marshalling container %s bind mounts to JSON", ctr.ID())
+ }
+
netNSPath := ""
if ctr.state.NetNS != nil {
netNSPath = ctr.state.NetNS.Path()
@@ -959,7 +974,8 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) {
netNSPath,
execSessionsJSON,
ipsJSON,
- routesJSON)
+ routesJSON,
+ bindMountsJSON)
if err != nil {
return errors.Wrapf(err, "error adding container %s state to database", ctr.ID())
}
diff --git a/libpod/test_common.go b/libpod/test_common.go
index 75d9516b1..69dcf70ac 100644
--- a/libpod/test_common.go
+++ b/libpod/test_common.go
@@ -67,6 +67,10 @@ func getTestContainer(id, name, locksDir string) (*Container, error) {
PID: 46765,
},
},
+ BindMounts: map[string]string{
+ "/1/2/3": "/4/5/6",
+ "/test/file.test": "/test2/file2.test",
+ },
},
valid: true,
}