Introduce structs/interfacess for new storage units

This commit simply splits the interfaces but introduces no new structs

     - Introduce the QueryPackStore, mrvacommander/pkg/qpstore
     - Introduce the CodeQL database store, pkg/qldbstore/interfaces.go
This commit is contained in:
Michael Hohn
2024-06-11 14:16:41 -07:00
committed by =Michael Hohn
parent fc29fc5653
commit 2d88b351ff
8 changed files with 176 additions and 31 deletions

View File

@@ -99,6 +99,18 @@ These are simple steps using a single container.
### Manually create needed postgres databases ### Manually create needed postgres databases
This is still necessary after `docker-compose up` to avoid
[error] failed to initialize database, got error failed to connect to
`user=exampleuser database=server_db`: 172.25.0.3:5432 (postgres): server
error: FATAL: database "server_db" does not exist (SQLSTATE 3D000)
from
./server -loglevel=debug -mode=container
The steps:
# on the host # on the host
psql -h localhost -p 5432 -U exampleuser -d postgres psql -h localhost -p 5432 -U exampleuser -d postgres

View File

@@ -13,6 +13,7 @@ import (
"mrvacommander/pkg/agent" "mrvacommander/pkg/agent"
"mrvacommander/pkg/logger" "mrvacommander/pkg/logger"
"mrvacommander/pkg/qpstore"
"mrvacommander/pkg/queue" "mrvacommander/pkg/queue"
"mrvacommander/pkg/server" "mrvacommander/pkg/server"
"mrvacommander/pkg/storage" "mrvacommander/pkg/storage"
@@ -74,7 +75,7 @@ func main() {
ss := storage.NewStorageSingle(config.Storage.StartingID) ss := storage.NewStorageSingle(config.Storage.StartingID)
sr := agent.NewRunnerSingle(2, sq) // FIXME take value from configuration sr := agent.NewRunnerSingle(2, sq) // FIXME take value from configuration
qp, err := storage.NewQueryPackStore(config.Storage.StartingID) qp, err := qpstore.NewStore(config.Storage.StartingID)
if err != nil { if err != nil {
slog.Error("Unable to initialize query pack storage") slog.Error("Unable to initialize query pack storage")
os.Exit(1) os.Exit(1)
@@ -121,7 +122,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
qp, err := storage.NewQueryPackStore(config.Storage.StartingID) qp, err := qpstore.NewStore(config.Storage.StartingID)
if err != nil { if err != nil {
slog.Error("Unable to initialize query pack storage") slog.Error("Unable to initialize query pack storage")
os.Exit(1) os.Exit(1)

View File

@@ -3,6 +3,7 @@ package agent
import ( import (
"mrvacommander/pkg/common" "mrvacommander/pkg/common"
"mrvacommander/pkg/logger" "mrvacommander/pkg/logger"
"mrvacommander/pkg/qpstore"
"mrvacommander/pkg/queue" "mrvacommander/pkg/queue"
"mrvacommander/pkg/storage" "mrvacommander/pkg/storage"
@@ -36,7 +37,7 @@ type RunnerVisibles struct {
Logger logger.Logger Logger logger.Logger
Queue queue.Queue Queue queue.Queue
// TODO extra package for query pack storage // TODO extra package for query pack storage
QueryPackStore storage.Storage QueryPackStore qpstore.Storage
// TODO extra package for ql db storage // TODO extra package for ql db storage
QLDBStore storage.Storage QLDBStore storage.Storage
} }

View File

@@ -0,0 +1,6 @@
package qldbstore
type DBLocation struct {
Prefix string
File string
}

138
pkg/qpstore/container.go Normal file
View File

@@ -0,0 +1,138 @@
package qpstore
import (
"fmt"
"log/slog"
"mrvacommander/pkg/common"
"mrvacommander/pkg/qldbstore"
"sync"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
var (
DBmutex sync.Mutex
)
type StorageVisibles struct{}
type StorageContainer struct {
// Database version of StorageSingle
RequestID int
DB *gorm.DB
modules *StorageVisibles
}
type DBSpec struct {
Host string
Port int
User string
Password string
DBname string
}
func (s *StorageContainer) SetupDB() error {
// TODO set up query pack storage
return nil
}
func (s *StorageContainer) LoadState() error {
// TODO load the state
return nil
}
func (s *StorageContainer) hasTables() bool {
// TODO query to check for tables
return false
}
func (s *StorageContainer) NextID() int {
// TODO update via db
return 12345
}
func (s *StorageContainer) SaveQueryPack(tgz []byte, sessionID int) (storagePath string, error error) {
// TODO save and return path
return "todo:no-path-yet", nil
}
func (s *StorageContainer) FindAvailableDBs(analysisReposRequested []common.OwnerRepo) (notFoundRepos []common.OwnerRepo, analysisRepos *map[common.OwnerRepo]qldbstore.DBLocation) {
// TODO s.FindAvailableDBs() via postgres
analysisRepos = &map[common.OwnerRepo]qldbstore.DBLocation{}
notFoundRepos = []common.OwnerRepo{}
return notFoundRepos, analysisRepos
}
func (s *StorageContainer) Setup(v *StorageVisibles) {
s.modules = v
}
func NewStore(startingID int) (Storage, error) {
// TODO drop the startingID
db, err := ConnectDB(DBSpec{
Host: "postgres",
Port: 5432,
User: "exampleuser",
Password: "examplepass",
DBname: "querypack_db",
})
if err != nil {
return nil, err
}
s := StorageContainer{RequestID: startingID, DB: db}
if err := s.SetupDB(); err != nil {
return nil, err
}
if err = s.loadState(); err != nil {
return nil, err
}
return &s, nil
}
func NewStorageContainer(startingID int) (*StorageContainer, error) {
db, err := ConnectDB(DBSpec{
Host: "postgres",
Port: 5432,
User: "exampleuser",
Password: "examplepass",
DBname: "server_db",
})
if err != nil {
return nil, err
}
s := StorageContainer{RequestID: startingID, DB: db}
if err := s.SetupDB(); err != nil {
return nil, err
}
if err = s.loadState(); err != nil {
return nil, err
}
return &s, nil
}
func ConnectDB(s DBSpec) (*gorm.DB, error) {
// Open the database connection
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
s.Host, s.Port, s.User, s.Password, s.DBname)
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
slog.Error("Error connecting to the database", "err", err)
return nil, err
}
return db, nil
}
func (s *StorageContainer) loadState() error {
// TODO load the state
return nil
}

13
pkg/qpstore/interfaces.go Normal file
View File

@@ -0,0 +1,13 @@
package qpstore
import (
"mrvacommander/pkg/common"
"mrvacommander/pkg/qldbstore"
)
type Storage interface {
NextID() int
SaveQueryPack(tgz []byte, sessionID int) (storagePath string, error error)
FindAvailableDBs(analysisReposRequested []common.OwnerRepo) (not_found_repos []common.OwnerRepo,
analysisRepos *map[common.OwnerRepo]qldbstore.DBLocation)
}

View File

@@ -3,6 +3,7 @@ package server
import ( import (
"mrvacommander/pkg/common" "mrvacommander/pkg/common"
"mrvacommander/pkg/logger" "mrvacommander/pkg/logger"
"mrvacommander/pkg/qpstore"
"mrvacommander/pkg/queue" "mrvacommander/pkg/queue"
"mrvacommander/pkg/storage" "mrvacommander/pkg/storage"
) )
@@ -46,7 +47,7 @@ type CommanderVisibles struct {
Queue queue.Queue Queue queue.Queue
ServerStore storage.Storage ServerStore storage.Storage
// TODO extra package for query pack storage // TODO extra package for query pack storage
QueryPackStore storage.Storage QueryPackStore qpstore.Storage
// TODO extra package for ql db storage // TODO extra package for ql db storage
QLDBStore storage.Storage QLDBStore storage.Storage
} }

View File

@@ -41,33 +41,6 @@ func NewQLDBStore() (*StorageContainer, error) {
return nil, nil return nil, nil
} }
func NewQueryPackStore(startingID int) (*StorageContainer, error) {
// TODO set up querypack_db
// TODO drop the startingID
db, err := ConnectDB(DBSpec{
Host: "postgres",
Port: 5432,
User: "exampleuser",
Password: "examplepass",
DBname: "querypack_db",
})
if err != nil {
return nil, err
}
s := StorageContainer{RequestID: startingID, DB: db}
if err := s.SetupDB(); err != nil {
return nil, err
}
if err = s.loadState(); err != nil {
return nil, err
}
return &s, nil
}
func NewStorageContainer(startingID int) (*StorageContainer, error) { func NewStorageContainer(startingID int) (*StorageContainer, error) {
db, err := ConnectDB(DBSpec{ db, err := ConnectDB(DBSpec{