mirror of
https://github.com/containers/podman.git
synced 2025-06-22 09:58:10 +08:00
Merge pull request #17615 from vrothberg/RUN-1788
sqlite: complete Pod methods
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -86,7 +86,7 @@ func sqliteInitTables(conn *sql.DB) (defErr error) {
|
|||||||
ExitCode INTEGER,
|
ExitCode INTEGER,
|
||||||
JSON TEXT NOT NULL,
|
JSON TEXT NOT NULL,
|
||||||
FOREIGN KEY (ID) REFERENCES ContainerConfig(ID) DEFERRABLE INITIALLY DEFERRED,
|
FOREIGN KEY (ID) REFERENCES ContainerConfig(ID) DEFERRABLE INITIALLY DEFERRED,
|
||||||
CHECK (ExitCode BETWEEN 0 AND 255)
|
CHECK (ExitCode BETWEEN -1 AND 255)
|
||||||
);`
|
);`
|
||||||
|
|
||||||
const containerExecSession = `
|
const containerExecSession = `
|
||||||
@ -120,7 +120,7 @@ func sqliteInitTables(conn *sql.DB) (defErr error) {
|
|||||||
ID TEXT PRIMARY KEY NOT NULL,
|
ID TEXT PRIMARY KEY NOT NULL,
|
||||||
Timestamp INTEGER NOT NULL,
|
Timestamp INTEGER NOT NULL,
|
||||||
ExitCode INTEGER NOT NULL,
|
ExitCode INTEGER NOT NULL,
|
||||||
CHECK (ExitCode BETWEEN 0 AND 255)
|
CHECK (ExitCode BETWEEN -1 AND 255)
|
||||||
);`
|
);`
|
||||||
|
|
||||||
const podConfig = `
|
const podConfig = `
|
||||||
@ -266,17 +266,24 @@ func finalizeCtrSqlite(ctr *Container) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Finalize a pod that was pulled out of the database.
|
// Finalize a pod that was pulled out of the database.
|
||||||
func finalizePodSqlite(pod *Pod) error {
|
func (s *SQLiteState) createPod(rawJSON string) (*Pod, error) {
|
||||||
// Get the lock
|
config := new(PodConfig)
|
||||||
lock, err := pod.runtime.lockManager.RetrieveLock(pod.config.LockID)
|
if err := json.Unmarshal([]byte(rawJSON), config); err != nil {
|
||||||
if err != nil {
|
return nil, fmt.Errorf("unmarshalling pod config: %w", err)
|
||||||
return fmt.Errorf("retrieving lock for pod %s: %w", pod.ID(), err)
|
}
|
||||||
|
lock, err := s.runtime.lockManager.RetrieveLock(config.LockID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("retrieving lock for pod %s: %w", config.ID, err)
|
||||||
}
|
}
|
||||||
pod.lock = lock
|
|
||||||
|
|
||||||
|
pod := new(Pod)
|
||||||
|
pod.config = config
|
||||||
|
pod.state = new(podState)
|
||||||
|
pod.lock = lock
|
||||||
|
pod.runtime = s.runtime
|
||||||
pod.valid = true
|
pod.valid = true
|
||||||
|
|
||||||
return nil
|
return pod, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finalize a volume that was pulled out of the database
|
// Finalize a volume that was pulled out of the database
|
||||||
@ -343,10 +350,10 @@ func (s *SQLiteState) addContainer(ctr *Container) (defErr error) {
|
|||||||
}
|
}
|
||||||
deps := ctr.Dependencies()
|
deps := ctr.Dependencies()
|
||||||
|
|
||||||
pod := sql.NullString{}
|
podID := sql.NullString{}
|
||||||
if ctr.config.Pod != "" {
|
if ctr.config.Pod != "" {
|
||||||
pod.Valid = true
|
podID.Valid = true
|
||||||
pod.String = ctr.config.Pod
|
podID.String = ctr.config.Pod
|
||||||
}
|
}
|
||||||
|
|
||||||
tx, err := s.conn.Begin()
|
tx, err := s.conn.Begin()
|
||||||
@ -364,7 +371,7 @@ func (s *SQLiteState) addContainer(ctr *Container) (defErr error) {
|
|||||||
if _, err := tx.Exec("INSERT INTO IDNamespace VALUES (?);", ctr.ID()); err != nil {
|
if _, err := tx.Exec("INSERT INTO IDNamespace VALUES (?);", ctr.ID()); err != nil {
|
||||||
return fmt.Errorf("adding container id to database: %w", err)
|
return fmt.Errorf("adding container id to database: %w", err)
|
||||||
}
|
}
|
||||||
if _, err := tx.Exec("INSERT INTO ContainerConfig VALUES (?, ?, ?, ?);", ctr.ID(), ctr.Name(), pod, configJSON); err != nil {
|
if _, err := tx.Exec("INSERT INTO ContainerConfig VALUES (?, ?, ?, ?);", ctr.ID(), ctr.Name(), podID, configJSON); err != nil {
|
||||||
return fmt.Errorf("adding container config to database: %w", err)
|
return fmt.Errorf("adding container config to database: %w", err)
|
||||||
}
|
}
|
||||||
if _, err := tx.Exec("INSERT INTO ContainerState VALUES (?, ?, ?, ?);", ctr.ID(), int(ctr.state.State), ctr.state.ExitCode, stateJSON); err != nil {
|
if _, err := tx.Exec("INSERT INTO ContainerState VALUES (?, ?, ?, ?);", ctr.ID(), int(ctr.state.State), ctr.state.ExitCode, stateJSON); err != nil {
|
||||||
@ -405,11 +412,13 @@ func (s *SQLiteState) addContainer(ctr *Container) (defErr error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// removeContainer remove the specified container from the database.
|
||||||
func (s *SQLiteState) removeContainer(ctr *Container) (defErr error) {
|
func (s *SQLiteState) removeContainer(ctr *Container) (defErr error) {
|
||||||
tx, err := s.conn.Begin()
|
tx, err := s.conn.Begin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("beginning container %s removal transaction: %w", ctr.ID(), err)
|
return fmt.Errorf("beginning container %s removal transaction: %w", ctr.ID(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if defErr != nil {
|
if defErr != nil {
|
||||||
if err := tx.Rollback(); err != nil {
|
if err := tx.Rollback(); err != nil {
|
||||||
@ -418,26 +427,8 @@ func (s *SQLiteState) removeContainer(ctr *Container) (defErr error) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// TODO TODO TODO:
|
if err := s.removeContainerWithTx(ctr.ID(), tx); err != nil {
|
||||||
// Need to verify that at least 1 row was deleted from ContainerConfig.
|
return err
|
||||||
// Otherwise return ErrNoSuchCtr.
|
|
||||||
if _, err := tx.Exec("DELETE FROM IDNamespace WHERE ID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s id from database: %w", ctr.ID(), err)
|
|
||||||
}
|
|
||||||
if _, err := tx.Exec("DELETE FROM ContainerConfig WHERE ID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s config from database: %w", ctr.ID(), err)
|
|
||||||
}
|
|
||||||
if _, err := tx.Exec("DELETE FROM ContainerState WHERE ID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s state from database: %w", ctr.ID(), err)
|
|
||||||
}
|
|
||||||
if _, err := tx.Exec("DELETE FROM ContainerDependency WHERE ID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s dependencies from database: %w", ctr.ID(), err)
|
|
||||||
}
|
|
||||||
if _, err := tx.Exec("DELETE FROM ContainerVolume WHERE ContainerID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s volumes from database: %w", ctr.ID(), err)
|
|
||||||
}
|
|
||||||
if _, err := tx.Exec("DELETE FROM ContainerExecSession WHERE ContainerID=?;", ctr.ID()); err != nil {
|
|
||||||
return fmt.Errorf("removing container %s exec sessions from database: %w", ctr.ID(), err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
if err := tx.Commit(); err != nil {
|
||||||
@ -447,6 +438,33 @@ func (s *SQLiteState) removeContainer(ctr *Container) (defErr error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// removeContainerWithTx removes the container with the specified transaction.
|
||||||
|
// Callers are responsible for committing.
|
||||||
|
func (s *SQLiteState) removeContainerWithTx(id string, tx *sql.Tx) error {
|
||||||
|
// TODO TODO TODO:
|
||||||
|
// Need to verify that at least 1 row was deleted from ContainerConfig.
|
||||||
|
// Otherwise return ErrNoSuchCtr.
|
||||||
|
if _, err := tx.Exec("DELETE FROM IDNamespace WHERE ID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s id from database: %w", id, err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("DELETE FROM ContainerConfig WHERE ID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s config from database: %w", id, err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("DELETE FROM ContainerState WHERE ID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s state from database: %w", id, err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("DELETE FROM ContainerDependency WHERE ID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s dependencies from database: %w", id, err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("DELETE FROM ContainerVolume WHERE ContainerID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s volumes from database: %w", id, err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("DELETE FROM ContainerExecSession WHERE ContainerID=?;", id); err != nil {
|
||||||
|
return fmt.Errorf("removing container %s exec sessions from database: %w", id, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// networkModify allows you to modify or add a new network, to add a new network use the new bool
|
// networkModify allows you to modify or add a new network, to add a new network use the new bool
|
||||||
func (s *SQLiteState) networkModify(ctr *Container, network string, opts types.PerNetworkOptions, new, disconnect bool) error {
|
func (s *SQLiteState) networkModify(ctr *Container, network string, opts types.PerNetworkOptions, new, disconnect bool) error {
|
||||||
if !s.valid {
|
if !s.valid {
|
||||||
|
Reference in New Issue
Block a user