summaryrefslogtreecommitdiff
path: root/libpod/container.go
diff options
context:
space:
mode:
Diffstat (limited to 'libpod/container.go')
-rw-r--r--libpod/container.go40
1 files changed, 35 insertions, 5 deletions
diff --git a/libpod/container.go b/libpod/container.go
index 4e5088b32..ca83bbffe 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -2,6 +2,7 @@ package libpod
import (
"fmt"
+ "io/ioutil"
"net"
"os"
"path/filepath"
@@ -113,7 +114,7 @@ func (ns LinuxNS) String() string {
// syncContainer() immediately after locking.
// ffjson: skip
type Container struct {
- config *Config
+ config *ContainerConfig
state *containerState
@@ -128,6 +129,11 @@ type Container struct {
rootlessSlirpSyncR *os.File
rootlessSlirpSyncW *os.File
+
+ // A restored container should have the same IP address as before
+ // being checkpointed. If requestedIP is set it will be used instead
+ // of config.StaticIP.
+ requestedIP net.IP
}
// containerState contains the current state of the container
@@ -200,11 +206,11 @@ type ExecSession struct {
PID int `json:"pid"`
}
-// Config contains all information that was used to create the
+// ContainerConfig contains all information that was used to create the
// container. It may not be changed once created.
// It is stored, read-only, on disk
// easyjson:json
-type Config struct {
+type ContainerConfig struct {
Spec *spec.Spec `json:"spec"`
ID string `json:"id"`
Name string `json:"name"`
@@ -385,8 +391,8 @@ func (t ContainerStatus) String() string {
// Unlocked
// Config returns the configuration used to create the container
-func (c *Container) Config() *Config {
- returnConfig := new(Config)
+func (c *Container) Config() *ContainerConfig {
+ returnConfig := new(ContainerConfig)
deepcopier.Copy(c.config).To(returnConfig)
return returnConfig
@@ -402,6 +408,30 @@ func (c *Container) Spec() *spec.Spec {
return returnSpec
}
+// specFromState returns the unmarshalled json config of the container. If the
+// config does not exist (e.g., because the container was never started) return
+// the spec from the config.
+func (c *Container) specFromState() (*spec.Spec, error) {
+ spec := c.config.Spec
+
+ if f, err := os.Open(c.state.ConfigPath); err == nil {
+ content, err := ioutil.ReadAll(f)
+ if err != nil {
+ return nil, errors.Wrapf(err, "error reading container config")
+ }
+ if err := json.Unmarshal([]byte(content), &spec); err != nil {
+ return nil, errors.Wrapf(err, "error unmarshalling container config")
+ }
+ } else {
+ // ignore when the file does not exist
+ if !os.IsNotExist(err) {
+ return nil, errors.Wrapf(err, "error opening container config")
+ }
+ }
+
+ return spec, nil
+}
+
// ID returns the container's ID
func (c *Container) ID() string {
return c.config.ID