40 lines
863 B
Go
40 lines
863 B
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var ErrInstanceLimit = errors.New("instance limit reached")
|
|
|
|
func reserveSlot(tx *sql.Tx, uid string) error {
|
|
var count int
|
|
if err := tx.QueryRow(`SELECT count(*) FROM instances WHERE uid=?`, uid).Scan(&count); err != nil {
|
|
return err
|
|
}
|
|
if count >= 2 {
|
|
return ErrInstanceLimit
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Store) ReserveInstance(i Instance) error {
|
|
tx, err := s.DB.Begin()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer tx.Rollback()
|
|
if err = reserveSlot(tx, i.UID); err != nil {
|
|
return err
|
|
}
|
|
if err = insertInstance(tx, i); err != nil {
|
|
return err
|
|
}
|
|
return tx.Commit()
|
|
}
|
|
func insertInstance(tx *sql.Tx, i Instance) error {
|
|
_, err := tx.Exec(`INSERT INTO instances VALUES(?,?,?,?,?,?,?,?)`, i.ID, i.UID, i.Name, i.Version, i.ImageID, i.Status, i.ContainerID, time.Now().Unix())
|
|
return err
|
|
}
|