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:
		
							parent
							
								
									2bc20dd4d2
								
							
						
					
					
						commit
						16237fe067
					
				|  | @ -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
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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), | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue