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:
committed by
=Michael Hohn
parent
fc29fc5653
commit
2d88b351ff
12
README.md
12
README.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
6
pkg/qldbstore/interfaces.go
Normal file
6
pkg/qldbstore/interfaces.go
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package qldbstore
|
||||||
|
|
||||||
|
type DBLocation struct {
|
||||||
|
Prefix string
|
||||||
|
File string
|
||||||
|
}
|
||||||
138
pkg/qpstore/container.go
Normal file
138
pkg/qpstore/container.go
Normal 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
13
pkg/qpstore/interfaces.go
Normal 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)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
Reference in New Issue
Block a user