mirror of
https://github.com/mudler/LocalAI.git
synced 2025-05-20 10:35:01 +00:00
feat(p2p): add network explorer and community pools (#3125)
* WIP Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Fixups Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Wire up a simple explorer DB Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * wip Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * WIP Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactor: group services id so can be identified easily in the ledger table Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(discovery): discovery service now gather worker informations correctly Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(explorer): display network token Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(explorer): display form to add new networks Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(explorer): stop from overwriting networks Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(explorer): display only networks with active workers Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(explorer): list only clusters in a network if it has online workers Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * remove invalid and inactive networks if networks have no workers delete them from the database, similarly, if invalid. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * ci: add workflow to deploy new explorer versions automatically Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * build-api: build with p2p tag Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Allow to specify a connection timeout Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * logging Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Better p2p defaults Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Set loglevel Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Fix dht enable Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Default to info for loglevel Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Add navbar Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Slightly improve rendering Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Allow to copy the token easily Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * ci fixups Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
This commit is contained in:
parent
5fcafc3d1e
commit
9e3e892ac7
19 changed files with 1082 additions and 17 deletions
92
core/explorer/database_test.go
Normal file
92
core/explorer/database_test.go
Normal file
|
@ -0,0 +1,92 @@
|
|||
package explorer_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"github.com/mudler/LocalAI/core/explorer"
|
||||
)
|
||||
|
||||
var _ = Describe("Database", func() {
|
||||
var (
|
||||
dbPath string
|
||||
db *explorer.Database
|
||||
err error
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
// Create a temporary file path for the database
|
||||
dbPath = "test_db.json"
|
||||
db, err = explorer.NewDatabase(dbPath)
|
||||
Expect(err).To(BeNil())
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
// Clean up the temporary database file
|
||||
os.Remove(dbPath)
|
||||
})
|
||||
|
||||
Context("when managing tokens", func() {
|
||||
It("should add and retrieve a token", func() {
|
||||
token := "token123"
|
||||
t := explorer.TokenData{Name: "TokenName", Description: "A test token"}
|
||||
|
||||
err = db.Set(token, t)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
retrievedToken, exists := db.Get(token)
|
||||
Expect(exists).To(BeTrue())
|
||||
Expect(retrievedToken).To(Equal(t))
|
||||
})
|
||||
|
||||
It("should delete a token", func() {
|
||||
token := "token123"
|
||||
t := explorer.TokenData{Name: "TokenName", Description: "A test token"}
|
||||
|
||||
err = db.Set(token, t)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
err = db.Delete(token)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
_, exists := db.Get(token)
|
||||
Expect(exists).To(BeFalse())
|
||||
})
|
||||
|
||||
It("should persist data to disk", func() {
|
||||
token := "token123"
|
||||
t := explorer.TokenData{Name: "TokenName", Description: "A test token"}
|
||||
|
||||
err = db.Set(token, t)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
// Recreate the database object to simulate reloading from disk
|
||||
db, err = explorer.NewDatabase(dbPath)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
retrievedToken, exists := db.Get(token)
|
||||
Expect(exists).To(BeTrue())
|
||||
Expect(retrievedToken).To(Equal(t))
|
||||
|
||||
// Check the token list
|
||||
tokenList := db.TokenList()
|
||||
Expect(tokenList).To(ContainElement(token))
|
||||
})
|
||||
})
|
||||
|
||||
Context("when loading an empty or non-existent file", func() {
|
||||
It("should start with an empty database", func() {
|
||||
dbPath = "empty_db.json"
|
||||
db, err = explorer.NewDatabase(dbPath)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
_, exists := db.Get("nonexistent")
|
||||
Expect(exists).To(BeFalse())
|
||||
|
||||
// Clean up
|
||||
os.Remove(dbPath)
|
||||
})
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue