|
|
|
package database
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/rand"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"git.phc.dm.unipi.it/phc/cluster-dashboard/backend/executor"
|
|
|
|
"git.phc.dm.unipi.it/phc/cluster-dashboard/backend/model"
|
|
|
|
)
|
|
|
|
|
|
|
|
// simpleDB è una implementazione di [database.Database] che tiene giusto una cache in memoria e
|
|
|
|
// quando il server viene riavviato perde tutte le statistiche che ha accumulato. Più avanti si
|
|
|
|
// potrebbe pensare di scrivere queste informazioni in un file o usare un vero database.
|
|
|
|
type simpleDB struct {
|
|
|
|
Executor executor.Service
|
|
|
|
|
|
|
|
// lastUpdate tiene traccia di quando abbiamo aggiornato l'ultima volta tutti i dati
|
|
|
|
lastUpdate *time.Time
|
|
|
|
|
|
|
|
// Nodes is a map from hostname to node info
|
|
|
|
nodes map[string]*model.Node
|
|
|
|
|
|
|
|
// Jobs is a map from job id to job info
|
|
|
|
jobs map[string]*model.Job
|
|
|
|
|
|
|
|
// The following are maps from hostname to a list of sampled temperatures, used memory, used storage space and network upload and download rate.
|
|
|
|
|
|
|
|
temperatureSamples map[string][]model.Sample[float64]
|
|
|
|
memorySamples map[string][]model.Sample[int64]
|
|
|
|
storageSamples map[string][]model.Sample[int64]
|
|
|
|
networkUploadSamples map[string][]model.Sample[int64]
|
|
|
|
networkDownloadSamples map[string][]model.Sample[int64]
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSimpleDatabase(ex executor.Service) Database {
|
|
|
|
return &simpleDB{Executor: ex}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) GetNode(hostname string) (*model.Node, error) {
|
|
|
|
return &model.Node{
|
|
|
|
Hostname: hostname,
|
|
|
|
StartTime: time.Now().Add(-1 * time.Hour),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) GetJob(id string) (*model.Job, error) {
|
|
|
|
return &model.Job{
|
|
|
|
Id: id,
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) AllNodes() ([]*model.Node, error) {
|
|
|
|
return []*model.Node{
|
|
|
|
{
|
|
|
|
Hostname: "node-1",
|
|
|
|
StartTime: time.Now().Add(-1 * time.Hour),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Hostname: "node-2",
|
|
|
|
StartTime: time.Now().Add(-1 * time.Hour),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Hostname: "node-3",
|
|
|
|
StartTime: time.Now().Add(-1 * time.Hour),
|
|
|
|
},
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) AllJobs() ([]*model.Job, error) {
|
|
|
|
return []*model.Job{
|
|
|
|
{
|
|
|
|
Id: "job-1",
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Id: "job-2",
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Id: "job-3",
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Id: "job-4",
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Id: "job-5",
|
|
|
|
Name: "example-job",
|
|
|
|
Status: "active",
|
|
|
|
Nodes: []string{"node-1", "node-2"},
|
|
|
|
Resources: []string{},
|
|
|
|
},
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryVoltageSamples(from, to time.Time) ([]model.Sample[float64], error) {
|
|
|
|
return generateFakeFloat64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryMemorySamples(from, to time.Time) ([]model.Sample[int64], error) {
|
|
|
|
return generateFakeInt64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryStorageSamples(from, to time.Time) ([]model.Sample[int64], error) {
|
|
|
|
return generateFakeInt64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryCPUSamples(from, to time.Time) ([]model.Sample[float64], error) {
|
|
|
|
return generateFakeFloat64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryNetworkUploadSamples(from, to time.Time) ([]model.Sample[int64], error) {
|
|
|
|
return generateFakeInt64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *simpleDB) QueryNetworkDownloadSamples(from, to time.Time) ([]model.Sample[int64], error) {
|
|
|
|
return generateFakeInt64Samples(100), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateFakeFloat64Samples(amount int) []model.Sample[float64] {
|
|
|
|
fakeSamples := make([]model.Sample[float64], amount)
|
|
|
|
|
|
|
|
for i := range fakeSamples {
|
|
|
|
fakeSamples[i] = model.Sample[float64]{
|
|
|
|
Timestamp: time.Now().Add(time.Duration(i-amount) * time.Second),
|
|
|
|
Value: rand.Float64(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fakeSamples
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateFakeInt64Samples(amount int) []model.Sample[int64] {
|
|
|
|
fakeSamples := make([]model.Sample[int64], amount)
|
|
|
|
|
|
|
|
for i := range fakeSamples {
|
|
|
|
fakeSamples[i] = model.Sample[int64]{
|
|
|
|
Timestamp: time.Now().Add(time.Duration(i-amount) * time.Second),
|
|
|
|
Value: rand.Int63n(1000),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fakeSamples
|
|
|
|
}
|