State of an API with OClib :D
This commit is contained in:
parent
b7ecea25eb
commit
c5f45e03f3
@ -3,6 +3,7 @@ package mongo
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"cloud.o-forge.io/core/oc-lib/dbs"
|
"cloud.o-forge.io/core/oc-lib/dbs"
|
||||||
@ -47,12 +48,36 @@ func (m *MongoDB) Init(collections []string, config MongoConf) {
|
|||||||
m.Logger.Info().Msg("Connecting to" + config.GetUrl())
|
m.Logger.Info().Msg("Connecting to" + config.GetUrl())
|
||||||
mngoCollections = collections
|
mngoCollections = collections
|
||||||
mngoConfig = config
|
mngoConfig = config
|
||||||
if err := m.createClient(config.GetUrl()); err != nil {
|
if err := m.createClient(config.GetUrl(), false); err != nil {
|
||||||
m.Logger.Error().Msg(err.Error())
|
m.Logger.Error().Msg(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) createClient(MongoURL string) error {
|
func (m *MongoDB) TestDB(config MongoConf) error {
|
||||||
|
err := m.createClient(config.GetUrl(), true)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *MongoDB) TestCollections(config MongoConf, neededCols []string) error {
|
||||||
|
mngoDB = mngoClient.Database(config.GetDatabase())
|
||||||
|
MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
existingCollections, err := mngoDB.ListCollectionNames(MngoCtx, bson.D{})
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("Error contacting MongoDB\n" + err.Error())
|
||||||
|
}
|
||||||
|
for _, col := range neededCols {
|
||||||
|
if slices.Contains(existingCollections, col) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return errors.New("Collection " + col + " not found")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MongoDB) createClient(MongoURL string, test bool) error {
|
||||||
if mngoClient != nil {
|
if mngoClient != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -72,7 +97,7 @@ func (m *MongoDB) createClient(MongoURL string) error {
|
|||||||
isConnected = false
|
isConnected = false
|
||||||
return errors.New("Mongodb connect " + MongoURL + ":" + err.Error())
|
return errors.New("Mongodb connect " + MongoURL + ":" + err.Error())
|
||||||
}
|
}
|
||||||
MngoCtx, cancel = context.WithTimeout(context.Background(), 60*time.Second)
|
MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
if err = mngoClient.Ping(MngoCtx, nil); err != nil {
|
if err = mngoClient.Ping(MngoCtx, nil); err != nil {
|
||||||
@ -80,12 +105,11 @@ func (m *MongoDB) createClient(MongoURL string) error {
|
|||||||
isConnected = false
|
isConnected = false
|
||||||
return errors.New("Mongodb ping " + MongoURL + ":" + err.Error())
|
return errors.New("Mongodb ping " + MongoURL + ":" + err.Error())
|
||||||
}
|
}
|
||||||
if !isConnected && mngoClient != nil {
|
if !isConnected && mngoClient != nil && !test {
|
||||||
m.Logger.Info().Msg("Connecting mongo client to db " + mngoConfig.GetDatabase())
|
m.Logger.Info().Msg("Connecting mongo client to db " + mngoConfig.GetDatabase())
|
||||||
m.prepareDB(mngoCollections, mngoConfig)
|
m.prepareDB(mngoCollections, mngoConfig)
|
||||||
m.Logger.Info().Msg("Database is READY")
|
m.Logger.Info().Msg("Database is READY")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +169,7 @@ func (m *MongoDB) createCollection(collection_name string, new_collection *mongo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) DeleteOne(id string, collection_name string) (int64, int, error) {
|
func (m *MongoDB) DeleteOne(id string, collection_name string) (int64, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return 0, 503, err
|
return 0, 503, err
|
||||||
}
|
}
|
||||||
filter := bson.M{"_id": id}
|
filter := bson.M{"_id": id}
|
||||||
@ -163,7 +187,7 @@ func (m *MongoDB) DeleteOne(id string, collection_name string) (int64, int, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) DeleteMultiple(f map[string]interface{}, collection_name string) (int64, int, error) {
|
func (m *MongoDB) DeleteMultiple(f map[string]interface{}, collection_name string) (int64, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return 0, 503, err
|
return 0, 503, err
|
||||||
}
|
}
|
||||||
filter := bson.D{}
|
filter := bson.D{}
|
||||||
@ -184,7 +208,7 @@ func (m *MongoDB) DeleteMultiple(f map[string]interface{}, collection_name strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) UpdateMultiple(set interface{}, filter map[string]interface{}, collection_name string) (int64, int, error) {
|
func (m *MongoDB) UpdateMultiple(set interface{}, filter map[string]interface{}, collection_name string) (int64, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return 0, 503, err
|
return 0, 503, err
|
||||||
}
|
}
|
||||||
var doc map[string]interface{}
|
var doc map[string]interface{}
|
||||||
@ -206,7 +230,7 @@ func (m *MongoDB) UpdateMultiple(set interface{}, filter map[string]interface{},
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) UpdateOne(set interface{}, id string, collection_name string) (string, int, error) {
|
func (m *MongoDB) UpdateOne(set interface{}, id string, collection_name string) (string, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return "", 503, err
|
return "", 503, err
|
||||||
}
|
}
|
||||||
var doc map[string]interface{}
|
var doc map[string]interface{}
|
||||||
@ -225,7 +249,7 @@ func (m *MongoDB) UpdateOne(set interface{}, id string, collection_name string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) StoreOne(obj interface{}, id string, collection_name string) (string, int, error) {
|
func (m *MongoDB) StoreOne(obj interface{}, id string, collection_name string) (string, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return "", 503, err
|
return "", 503, err
|
||||||
}
|
}
|
||||||
var doc map[string]interface{}
|
var doc map[string]interface{}
|
||||||
@ -246,7 +270,7 @@ func (m *MongoDB) StoreOne(obj interface{}, id string, collection_name string) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) LoadOne(id string, collection_name string) (*mongo.SingleResult, int, error) {
|
func (m *MongoDB) LoadOne(id string, collection_name string) (*mongo.SingleResult, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return nil, 503, err
|
return nil, 503, err
|
||||||
}
|
}
|
||||||
filter := bson.M{"_id": id}
|
filter := bson.M{"_id": id}
|
||||||
@ -265,7 +289,7 @@ func (m *MongoDB) LoadOne(id string, collection_name string) (*mongo.SingleResul
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) Search(filters *dbs.Filters, collection_name string) (*mongo.Cursor, int, error) {
|
func (m *MongoDB) Search(filters *dbs.Filters, collection_name string) (*mongo.Cursor, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return nil, 503, err
|
return nil, 503, err
|
||||||
}
|
}
|
||||||
opts := options.Find()
|
opts := options.Find()
|
||||||
@ -309,7 +333,7 @@ func (m *MongoDB) Search(filters *dbs.Filters, collection_name string) (*mongo.C
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) LoadFilter(filter map[string]interface{}, collection_name string) (*mongo.Cursor, int, error) {
|
func (m *MongoDB) LoadFilter(filter map[string]interface{}, collection_name string) (*mongo.Cursor, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return nil, 503, err
|
return nil, 503, err
|
||||||
}
|
}
|
||||||
f := bson.D{}
|
f := bson.D{}
|
||||||
@ -330,7 +354,7 @@ func (m *MongoDB) LoadFilter(filter map[string]interface{}, collection_name stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MongoDB) LoadAll(collection_name string) (*mongo.Cursor, int, error) {
|
func (m *MongoDB) LoadAll(collection_name string) (*mongo.Cursor, int, error) {
|
||||||
if err := m.createClient(mngoConfig.GetUrl()); err != nil {
|
if err := m.createClient(mngoConfig.GetUrl(), false); err != nil {
|
||||||
return nil, 503, err
|
return nil, 503, err
|
||||||
}
|
}
|
||||||
targetDBCollection := CollectionMap[collection_name]
|
targetDBCollection := CollectionMap[collection_name]
|
||||||
|
41
tools/api.go
Normal file
41
tools/api.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"cloud.o-forge.io/core/oc-lib/dbs/mongo"
|
||||||
|
)
|
||||||
|
|
||||||
|
var UncatchedError = []error{}
|
||||||
|
|
||||||
|
type State int
|
||||||
|
|
||||||
|
const (
|
||||||
|
ALIVE State = iota
|
||||||
|
REDUCED_SERVICE
|
||||||
|
UNPROCESSABLE_ENTITY
|
||||||
|
DB_FALLOUT
|
||||||
|
TEAPOT
|
||||||
|
DEAD
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s State) String() string {
|
||||||
|
return [...]string{"alive", "reduced service", "unprocessable entity", "database fallout",
|
||||||
|
"some things boils in here, i'm probably a teapot", "dead"}[s]
|
||||||
|
}
|
||||||
|
|
||||||
|
type API struct{}
|
||||||
|
|
||||||
|
func (a *API) GetState() State {
|
||||||
|
// Check if the database is up
|
||||||
|
err := mongo.MONGOService.TestDB(GetConfig())
|
||||||
|
if err != nil {
|
||||||
|
return DB_FALLOUT
|
||||||
|
}
|
||||||
|
err = mongo.MONGOService.TestCollections(GetConfig(), []string{})
|
||||||
|
if err != nil {
|
||||||
|
return UNPROCESSABLE_ENTITY
|
||||||
|
}
|
||||||
|
if len(UncatchedError) > 0 {
|
||||||
|
return TEAPOT
|
||||||
|
}
|
||||||
|
return ALIVE
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user