Add networking configuration to the libpod DB

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>

Closes: #109
Approved by: mheon
This commit is contained in:
Matthew Heon 2017-12-05 17:50:29 -05:00 committed by Atomic Bot
parent 2bc20dd4d2
commit 16237fe067
4 changed files with 57 additions and 10 deletions

View File

@ -14,6 +14,7 @@ import (
"github.com/containerd/cgroups"
"github.com/containers/storage"
"github.com/containers/storage/pkg/archive"
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/docker/docker/daemon/caps"
"github.com/docker/docker/pkg/mount"
"github.com/docker/docker/pkg/namesgenerator"
@ -119,6 +120,13 @@ type ContainerConfig struct {
MountLabel string `json:"MountLabel,omitempty"`
// Src path to be mounted on /dev/shm in container
ShmDir string `json:"ShmDir,omitempty"`
// CreateNetNS indicates that libpod should create and configure a new
// network namespace for the container
CreateNetNS bool `json:"createNetNS"`
// PortMappings are the ports forwarded to the container's network
// namespace
// These are not used unless CreateNetNS is true
PortMappings []ocicni.PortMapping
// Static directory for container content that will persist across
// reboot
StaticDir string `json:"staticDir"`
@ -130,7 +138,7 @@ type ContainerConfig struct {
// about a container
Labels map[string]string `json:"labels,omitempty"`
// Mounts list contains all additional mounts by the container runtime.
Mounts []string
Mounts []string `json:"mounts,omitempty"`
// StopSignal is the signal that will be used to stop the container
StopSignal uint `json:"stopSignal,omitempty"`
// Shared namespaces with container

View File

@ -6,6 +6,7 @@ import (
"github.com/containers/storage"
"github.com/containers/storage/pkg/idtools"
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/pkg/errors"
)
@ -402,6 +403,22 @@ func WithStopSignal(signal uint) CtrCreateOption {
}
}
// WithNetNS indicates that the container should be given a new network
// namespace with a minimal configuration
// An optional array of port mappings can be provided
func WithNetNS(portMappings []ocicni.PortMapping) CtrCreateOption {
return func(ctr *Container) error {
if ctr.valid {
return ErrCtrFinalized
}
ctr.config.CreateNetNS = true
copy(ctr.config.PortMappings, portMappings)
return nil
}
}
// Pod Creation Options
// WithPodName sets the name of the pod

View File

@ -15,7 +15,7 @@ import (
// DBSchema is the current DB schema version
// Increments every time a change is made to the database's tables
const DBSchema = 2
const DBSchema = 3
// SQLState is a state implementation backed by a persistent SQLite3 database
type SQLState struct {
@ -267,7 +267,7 @@ func (s *SQLState) HasContainer(id string) (bool, error) {
func (s *SQLState) AddContainer(ctr *Container) (err error) {
const (
addCtr = `INSERT INTO containers VALUES (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
);`
addCtrState = `INSERT INTO containerState VALUES (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?
@ -287,6 +287,16 @@ func (s *SQLState) AddContainer(ctr *Container) (err error) {
return errors.Wrapf(err, "error marshaling container %s labels to JSON", ctr.ID())
}
mounts, err := json.Marshal(ctr.config.Mounts)
if err != nil {
return errors.Wrapf(err, "error marshaling container %s mounts to JSON", ctr.ID())
}
portsJSON, err := json.Marshal(ctr.config.PortMappings)
if err != nil {
return errors.Wrapf(err, "error marshaling container %s port mappings to JSON", ctr.ID())
}
tx, err := s.db.Begin()
if err != nil {
return errors.Wrapf(err, "error beginning database transaction")
@ -299,10 +309,6 @@ func (s *SQLState) AddContainer(ctr *Container) (err error) {
}
}()
mounts, err := json.Marshal(ctr.config.Mounts)
if err != nil {
return errors.Wrapf(err, "error marshaling container %s monunts to JSON", ctr.ID())
}
// Add static container information
_, err = tx.Exec(addCtr,
ctr.ID(),
@ -311,6 +317,8 @@ func (s *SQLState) AddContainer(ctr *Container) (err error) {
ctr.config.MountLabel,
string(mounts),
ctr.config.ShmDir,
boolToSQL(ctr.config.CreateNetNS),
string(portsJSON),
ctr.config.StaticDir,
boolToSQL(ctr.config.Stdin),
string(labelsJSON),

View File

@ -154,6 +154,7 @@ func prepareDB(db *sql.DB) (err error) {
// TODO add Pod ID to CreateStaticContainer as a FOREIGN KEY referencing podStatic(Id)
// TODO add ctr shared namespaces information - A separate table, probably? So we can FOREIGN KEY the ID
// TODO schema migration might be necessary and should be handled here
// TODO maybe make a port mappings table instead of JSONing the array and storing it?
// Enable foreign keys in SQLite
if _, err := db.Exec("PRAGMA foreign_keys = ON;"); err != nil {
@ -169,6 +170,8 @@ func prepareDB(db *sql.DB) (err error) {
MountLabel TEXT NOT NULL,
Mounts TEXT NOT NULL,
ShmDir TEXT NOT NULL,
CreateNetNS INTEGER NOT NULL,
PortMappings TEXT NOT NULL,
StaticDir TEXT NOT NULL,
Stdin INTEGER NOT NULL,
LabelsJSON TEXT NOT NULL,
@ -178,6 +181,7 @@ func prepareDB(db *sql.DB) (err error) {
RootfsImageName TEXT NOT NULL,
UseImageConfig INTEGER NOT NULL,
CHECK (Stdin IN (0, 1)),
CHECK (CreateNetNS IN (0, 1)),
CHECK (UseImageConfig IN (0, 1)),
CHECK (StopSignal>=0)
);
@ -273,6 +277,8 @@ func ctrFromScannable(row scannable, runtime *Runtime, specsDir string, lockDir
mountLabel string
mounts string
shmDir string
createNetNS int
portMappingsJSON string
staticDir string
stdin int
labelsJSON string
@ -299,6 +305,8 @@ func ctrFromScannable(row scannable, runtime *Runtime, specsDir string, lockDir
&mountLabel,
&mounts,
&shmDir,
&createNetNS,
&portMappingsJSON,
&staticDir,
&stdin,
&labelsJSON,
@ -335,10 +343,8 @@ func ctrFromScannable(row scannable, runtime *Runtime, specsDir string, lockDir
ctr.config.UseImageConfig = boolFromSQL(useImageConfig)
ctr.config.ProcessLabel = processLabel
ctr.config.MountLabel = mountLabel
if err := json.Unmarshal([]byte(mounts), &ctr.config.Mounts); err != nil {
return nil, errors.Wrapf(err, "error parsing container %s mounts JSON", id)
}
ctr.config.ShmDir = shmDir
ctr.config.CreateNetNS = boolFromSQL(createNetNS)
ctr.config.StaticDir = staticDir
ctr.config.Stdin = boolFromSQL(stdin)
ctr.config.StopSignal = stopSignal
@ -362,6 +368,14 @@ func ctrFromScannable(row scannable, runtime *Runtime, specsDir string, lockDir
}
ctr.config.Labels = labels
if err := json.Unmarshal([]byte(mounts), &ctr.config.Mounts); err != nil {
return nil, errors.Wrapf(err, "error parsing container %s mounts JSON", id)
}
if err := json.Unmarshal([]byte(portMappingsJSON), &ctr.config.PortMappings); err != nil {
return nil, errors.Wrapf(err, "error parsing container %s port mappings JSON", id)
}
createdTime, err := timeFromSQL(createdTimeString)
if err != nil {
return nil, errors.Wrapf(err, "error parsing container %s created time", id)