Loading go-apps/meep-ctrl-engine/go.mod +2 −4 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ module github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-ctrl-engine go 1.12 require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store v0.0.0 Loading @@ -10,18 +11,15 @@ require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog v0.0.0 github.com/flimzy/diff v0.1.5 // indirect github.com/flimzy/kivik v1.8.1 github.com/flimzy/testy v0.1.16 // indirect github.com/go-kivik/couchdb v1.8.1 github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.7.3 github.com/imdario/mergo v0.3.8 // indirect github.com/pkg/errors v0.8.1 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect ) replace ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch => ../../go-packages/meep-couch github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model => ../../go-packages/meep-ctrl-engine-model github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store => ../../go-packages/meep-metric-store Loading go-apps/meep-ctrl-engine/go.sum +8 −25 Original line number Diff line number Diff line github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db h1:Zkf5kwhxdW0xV7WM/crqIcOP5LCFGnAmumWSFAewJ74= github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db/go.mod h1:RU+6d0CNIRSp6yo1mXLIIrnFa/3LHhvcDVLVJyovptM= github.com/KromDaniel/rejonson v0.0.0-20180822072824-00b5bcf2b351 h1:1u1XrfCBnY+GijnyU6O1k4odp5TnqZQTsp5v7+n/E4Y= github.com/KromDaniel/rejonson v0.0.0-20180822072824-00b5bcf2b351/go.mod h1:HxwfbuElTuGf+/uKZfjJrCnv0BmmpkPJDI7gBwj1KkM= github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52 h1:trnwuu/Q8T59kgRjXcSDBODnyZP9wes+bnLn0lx4PgM= github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52/go.mod h1:DdR6ymcLl8+sN/XOVNjnYO1NDYfgHskGjreZUDuQCTY= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345 h1:fgSpoKViTSqRb4hjDNj10ig5wUvO0CayCzFdLf6fuRM= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72 h1:uGeGZl8PxSq8VZGG4QK5njJTFA4/G/x5CYORvQVXtAE= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/flimzy/diff v0.1.5 h1:QfOwp+TuGCeWWFxFtXqCdepnz0SeaImgNfMm6vWz3y8= github.com/flimzy/diff v0.1.5/go.mod h1:lFJtC7SPsK0EroDmGTSrdtWKAxOk3rO+q+e04LL05Hs= github.com/flimzy/kivik v1.8.1 h1:URl7e0OnfSvAu3ZHQ5BkvzRZlCmyYuDyWUCcPWIHlU0= github.com/flimzy/kivik v1.8.1/go.mod h1:S2aPycbG0eDFll4wgXt9uacSNkXISPufutnc9sv+mdA= github.com/flimzy/testy v0.1.16 h1:nchF7XYCkfHJiZKMRhAVKQp8jzpXFPwJYnSrnFysqlI= github.com/flimzy/testy v0.1.16/go.mod h1:3szguN8NXqgq9bt9Gu8TQVj698PJWmyx/VY1frwwKrM= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-kivik/couchdb v1.8.1 h1:2yjmysS48JYpyWTkx2E3c7ASZP8Kh0eABWnkKlV8bbw= github.com/go-kivik/couchdb v1.8.1/go.mod h1:5XJRkAMpBlEVA4q0ktIZjUPYBjoBmRoiWvwUBzP3BOQ= github.com/go-kivik/kivik v1.8.1/go.mod h1:nIuJ8z4ikBrVUSk3Ua8NoDqYKULPNjuddjqRvlSUyyQ= github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA= github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZsA= github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= Loading @@ -40,37 +31,29 @@ github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e h1:txQ github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= go-apps/meep-ctrl-engine/server/ctrl-engine.go +12 −13 Original line number Diff line number Diff line Loading @@ -26,9 +26,9 @@ import ( "strings" "time" "github.com/flimzy/kivik" "github.com/gorilla/mux" couch "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch" ceModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ms "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store" Loading @@ -42,11 +42,10 @@ type Scenario struct { } const scenarioDBName = "scenarios" const activeScenarioName = "active" const moduleName string = "meep-ctrl-engine" const moduleMonEngine string = "mon-engine" var db *kivik.DB var scenarioStore *couch.Connector var virtWatchdog *watchdog.Watchdog var rc *redis.Connector var activeModel *mod.Model Loading Loading @@ -78,7 +77,7 @@ func CtrlEngineInit() (err error) { log.Debug("CtrlEngineInit") // Make Scenario DB connection db, err = connectDb(scenarioDBName) scenarioStore, err = couch.NewConnector(couchDBAddr, scenarioDBName) if err != nil { log.Error("Failed connection to Scenario DB. Error: ", err) return err Loading @@ -86,7 +85,7 @@ func CtrlEngineInit() (err error) { log.Info("Connected to Scenario DB") // Retrieve scenario list from DB scenarioList, err := getScenarioList(db) scenarioList, err := scenarioStore.GetDocList() if err != nil { log.Error(err.Error()) return err Loading @@ -104,7 +103,7 @@ func CtrlEngineInit() (err error) { } // Update scenario in DB rev, err := setScenario(db, s.Name, validScenario) rev, err := scenarioStore.UpdateDoc(s.Name, validScenario) if err != nil { return errors.New("Failed to update scenario with error: " + err.Error()) } Loading Loading @@ -181,7 +180,7 @@ func ceCreateScenario(w http.ResponseWriter, r *http.Request) { } // Add new scenario to DB rev, err := addScenario(db, scenarioName, validScenario) rev, err := scenarioStore.AddDoc(scenarioName, validScenario) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusConflict) Loading @@ -205,7 +204,7 @@ func ceDeleteScenario(w http.ResponseWriter, r *http.Request) { log.Debug("Scenario name: ", scenarioName) // Remove scenario from DB err := removeScenario(db, scenarioName) err := scenarioStore.DeleteDoc(scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading @@ -223,7 +222,7 @@ func ceDeleteScenarioList(w http.ResponseWriter, r *http.Request) { log.Debug("ceDeleteScenarioList") // Remove all scenario from DB err := removeAllScenarios(db) err := scenarioStore.DeleteAllDocs() if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -253,7 +252,7 @@ func ceGetScenario(w http.ResponseWriter, r *http.Request) { // Retrieve scenario from DB var scenario []byte scenario, err := getScenario(false, db, scenarioName) scenario, err := scenarioStore.GetDoc(false, scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading @@ -279,7 +278,7 @@ func ceGetScenarioList(w http.ResponseWriter, r *http.Request) { log.Debug("ceGetScenarioList") // Retrieve scenario list from DB scenarioList, err := getScenarioList(db) scenarioList, err := scenarioStore.GetDocList() if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -331,7 +330,7 @@ func ceSetScenario(w http.ResponseWriter, r *http.Request) { } // Update scenario in DB rev, err := setScenario(db, scenarioName, validScenario) rev, err := scenarioStore.UpdateDoc(scenarioName, validScenario) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -373,7 +372,7 @@ func ceActivateScenario(w http.ResponseWriter, r *http.Request) { // Retrieve scenario to activate from DB var scenario []byte scenario, err := getScenario(false, db, scenarioName) scenario, err := scenarioStore.GetDoc(false, scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading go-apps/meep-ctrl-engine/server/scenario-store.go→go-packages/meep-couch/db.go +181 −0 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package server package couchdb import ( "context" Loading @@ -25,91 +25,101 @@ import ( log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) // Establish DB connections func connectDb(dbName string) (*kivik.DB, error) { var client *Client // Client - Implements a couchDB client type Client struct { addr string dbClient *kivik.Client } // Connector - Implements a CouchDB connector type Connector struct { dbName string dbHandle *kivik.DB } // NewConnector - Creates and initialize a CouchDB connector to a database func NewConnector(addr string, dbName string) (rc *Connector, err error) { rc = new(Connector) // Connect to CouchDB log.Debug("Establish new couchDB connection") dbClient, err := kivik.New(context.TODO(), "couch", couchDBAddr) if client == nil { log.Debug("Establish new couchDB client connection") c := new(Client) c.addr = addr c.dbClient, err = kivik.New(context.TODO(), "couch", addr) if err != nil { return nil, err } client = c } // Create Scenario DB if id does not exist log.Debug("Check if scenario DB exists: " + dbName) debExists, err := dbClient.DBExists(context.TODO(), dbName) rc.dbName = dbName // Create DB if not exist exists, err := client.dbClient.DBExists(context.TODO(), rc.dbName) if err != nil { return nil, err } if !debExists { log.Debug("Create new DB: " + dbName) err = dbClient.CreateDB(context.TODO(), dbName) if !exists { log.Debug("Create DB: " + dbName) err = client.dbClient.CreateDB(context.TODO(), dbName) if err != nil { return nil, err } } // Open scenario DB log.Debug("Open scenario DB: " + dbName) db, err := dbClient.DB(context.TODO(), dbName) // Open DB log.Debug("Open DB: " + dbName) rc.dbHandle, err = client.dbClient.DB(context.TODO(), dbName) if err != nil { return nil, err } return db, nil return rc, nil } // Get scenario from DB func getScenario(returnNilOnNotFound bool, db *kivik.DB, scenarioName string) (scenario []byte, err error) { // Get scenario from DB log.Debug("Get scenario from DB: " + scenarioName) row, err := db.Get(context.TODO(), scenarioName) // getDocument - Get document from DB func (dbCon *Connector) GetDoc(returnNilOnNotFound bool, docName string) (doc []byte, err error) { log.Debug("Get document from DB: " + docName) row, err := dbCon.dbHandle.Get(context.TODO(), docName) if err != nil { // that's a call to the couch DB.. in order not to return nil, we override it if returnNilOnNotFound { //specifically for the case where there is nothing.. so the scenario object will be empty // specifically for the case where there is nothing.. so the document object will be empty return nil, nil } return nil, err } // Decode JSON-encoded document err = row.ScanDoc(&scenario) return scenario, err err = row.ScanDoc(&doc) return doc, err } // Get scenario list from DB func getScenarioList(db *kivik.DB) (scenarioList [][]byte, err error) { // Retrieve all scenarios from DB log.Debug("Get all scenarios from DB") rows, err := db.AllDocs(context.TODO()) // getDocList - Get document list from DB func (dbCon *Connector) GetDocList() (docList [][]byte, err error) { log.Debug("Get all docs from DB") rows, err := dbCon.dbHandle.AllDocs(context.TODO()) if err != nil { return nil, err } // Loop through scenarios and populate scenario list to return log.Debug("Loop through scenarios") // Loop through docs and populate doc list to return log.Debug("Loop through docs") for rows.Next() { var scenario []byte if rows.ID() != activeScenarioName { scenario, err = getScenario(false, db, rows.ID()) var doc []byte doc, err = dbCon.GetDoc(false, rows.ID()) if err == nil { // Append scenario to list scenarioList = append(scenarioList, scenario) } // Append to list docList = append(docList, doc) } } return scenarioList, nil return docList, nil } // Add scenario to DB func addScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, error) { // Add scenario to couch DB log.Debug("Add new scenario to DB: " + scenarioName) rev, err := db.Put(context.TODO(), scenarioName, scenario) // addDoc - Add scenario to DB func (dbCon *Connector) AddDoc(docName string, doc []byte) (string, error) { log.Debug("Add new doc to DB: " + docName) rev, err := dbCon.dbHandle.Put(context.TODO(), docName, doc) if err != nil { return "", err } Loading @@ -117,17 +127,17 @@ func addScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, er return rev, nil } // Update scenario in DB func setScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, error) { // updateDoc - Update a document in DB func (dbCon *Connector) UpdateDoc(docName string, doc []byte) (string, error) { log.Debug("Update doc from DB: " + docName) // Remove previous version err := removeScenario(db, scenarioName) err := dbCon.DeleteDoc(docName) if err != nil { return "", err } // Add updated version rev, err := addScenario(db, scenarioName, scenario) rev, err := dbCon.AddDoc(docName, doc) if err != nil { return "", err } Loading @@ -135,18 +145,17 @@ func setScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, er return rev, nil } // Remove scenario from DB func removeScenario(db *kivik.DB, scenarioName string) error { // Get latest Rev of stored scenario from couchDB rev, err := db.Rev(context.TODO(), scenarioName) // deleteDoc - Remove a document from DB func (dbCon *Connector) DeleteDoc(docName string) error { log.Debug("Delete doc from DB: " + docName) // Get latest Rev of stored document rev, err := dbCon.dbHandle.Rev(context.TODO(), docName) if err != nil { return err } // Remove scenario from couchDB log.Debug("Remove scenario from DB: " + scenarioName) _, err = db.Delete(context.TODO(), scenarioName, rev) // Remove doc from couchDB _, err = dbCon.dbHandle.Delete(context.TODO(), docName, rev) if err != nil { return err } Loading @@ -154,20 +163,18 @@ func removeScenario(db *kivik.DB, scenarioName string) error { return nil } // Remove all scenarios from DB func removeAllScenarios(db *kivik.DB) error { // deleteAllDocs - Remove all documents from DB func (dbCon *Connector) DeleteAllDocs() error { log.Debug("Delete all docs from DB") // Retrieve all scenarios from DB log.Debug("Get all scenarios from DB") rows, err := db.AllDocs(context.TODO()) rows, err := dbCon.dbHandle.AllDocs(context.TODO()) if err != nil { return err } // Loop through scenarios and remove each one log.Debug("Loop through scenarios") // Loop through docs and remove each one for rows.Next() { _ = removeScenario(db, rows.ID()) _ = dbCon.DeleteDoc(rows.ID()) } return nil Loading go-packages/meep-couch/db_test.go 0 → 100644 +143 −0 Original line number Diff line number Diff line /* * Copyright (c) 2019 InterDigital Communications, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package couchdb import ( "fmt" "testing" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) var couchDBAddr = "http://localhost:30985/" var dbName1 = "unit-test1" var dbName2 = "unit-test2" func TestCouchDB(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) con1, err := NewConnector(couchDBAddr, dbName1) if err != nil { log.Debug(err) t.Errorf("Error creating connector") } else if con1 == nil { t.Errorf("Received a nil connector") } con2, err := NewConnector(couchDBAddr, dbName2) if err != nil { log.Debug(err) t.Errorf("Error creating connector") } else if con2 == nil { t.Errorf("Received a nil connector") } testDb(t, con1) testDb(t, con2) err = con1.DeleteAllDocs() if err != nil { t.Errorf("Deleting all docs returned an error (con1)") } err = con2.DeleteAllDocs() if err != nil { t.Errorf("Deleting all docs returned an error (con2)") } } func testDb(t *testing.T, c *Connector) { //Empty DB err := c.DeleteAllDocs() if err != nil { log.Debug(err) t.Errorf("deleteAllDocs shouls not return an error") } // Get inexistent doc doc, err := c.GetDoc(false, "not-a-document") if err == nil { t.Errorf("getDoc should return an error (inexistent doc)") } else if doc != nil { t.Errorf("getDoc should return nil for inexistent doc") } // Get inexistent doc doc, err = c.GetDoc(true, "not-a-document") if err != nil { t.Errorf("getDoc error should be suppressed (inexistent doc)") } else if doc != nil { t.Errorf("getDoc should return nil for inexistent doc") } // Get doc list docList, err := c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (empty doc list)") } else if len(docList) != 0 { t.Errorf("getDocList should return an empty list (empty doc list)") } doc1 := []byte(`{"data":"This is document #1"}`) doc1Update := []byte(`{"data":"This is document #1 update"}`) doc2 := []byte(`{"data":"This is document #2"}`) doc3 := []byte(`{"data":"This is document #3"}`) rev1, err := c.AddDoc("doc1", doc1) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev1) rev2, err := c.AddDoc("doc2", doc2) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev2) rev3, err := c.AddDoc("doc3", doc3) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev3) // Get doc list docList, err = c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (3 doc list)") } else if len(docList) != 3 { t.Errorf("getDocList should return a 3 document list (3 doc list)") } rev1, err = c.UpdateDoc("doc1", doc1Update) if err != nil { log.Debug(err) t.Errorf("updateDoc returned an error") } log.Debug(rev1) // Get doc list docList, err = c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (3 doc list)") } else if len(docList) != 3 { t.Errorf("getDocList should return a 3 document list (3 doc list)") } } Loading
go-apps/meep-ctrl-engine/go.mod +2 −4 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ module github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-ctrl-engine go 1.12 require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store v0.0.0 Loading @@ -10,18 +11,15 @@ require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog v0.0.0 github.com/flimzy/diff v0.1.5 // indirect github.com/flimzy/kivik v1.8.1 github.com/flimzy/testy v0.1.16 // indirect github.com/go-kivik/couchdb v1.8.1 github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.7.3 github.com/imdario/mergo v0.3.8 // indirect github.com/pkg/errors v0.8.1 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect ) replace ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch => ../../go-packages/meep-couch github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model => ../../go-packages/meep-ctrl-engine-model github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store => ../../go-packages/meep-metric-store Loading
go-apps/meep-ctrl-engine/go.sum +8 −25 Original line number Diff line number Diff line github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db h1:Zkf5kwhxdW0xV7WM/crqIcOP5LCFGnAmumWSFAewJ74= github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db/go.mod h1:RU+6d0CNIRSp6yo1mXLIIrnFa/3LHhvcDVLVJyovptM= github.com/KromDaniel/rejonson v0.0.0-20180822072824-00b5bcf2b351 h1:1u1XrfCBnY+GijnyU6O1k4odp5TnqZQTsp5v7+n/E4Y= github.com/KromDaniel/rejonson v0.0.0-20180822072824-00b5bcf2b351/go.mod h1:HxwfbuElTuGf+/uKZfjJrCnv0BmmpkPJDI7gBwj1KkM= github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52 h1:trnwuu/Q8T59kgRjXcSDBODnyZP9wes+bnLn0lx4PgM= github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52/go.mod h1:DdR6ymcLl8+sN/XOVNjnYO1NDYfgHskGjreZUDuQCTY= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345 h1:fgSpoKViTSqRb4hjDNj10ig5wUvO0CayCzFdLf6fuRM= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72 h1:uGeGZl8PxSq8VZGG4QK5njJTFA4/G/x5CYORvQVXtAE= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/flimzy/diff v0.1.5 h1:QfOwp+TuGCeWWFxFtXqCdepnz0SeaImgNfMm6vWz3y8= github.com/flimzy/diff v0.1.5/go.mod h1:lFJtC7SPsK0EroDmGTSrdtWKAxOk3rO+q+e04LL05Hs= github.com/flimzy/kivik v1.8.1 h1:URl7e0OnfSvAu3ZHQ5BkvzRZlCmyYuDyWUCcPWIHlU0= github.com/flimzy/kivik v1.8.1/go.mod h1:S2aPycbG0eDFll4wgXt9uacSNkXISPufutnc9sv+mdA= github.com/flimzy/testy v0.1.16 h1:nchF7XYCkfHJiZKMRhAVKQp8jzpXFPwJYnSrnFysqlI= github.com/flimzy/testy v0.1.16/go.mod h1:3szguN8NXqgq9bt9Gu8TQVj698PJWmyx/VY1frwwKrM= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-kivik/couchdb v1.8.1 h1:2yjmysS48JYpyWTkx2E3c7ASZP8Kh0eABWnkKlV8bbw= github.com/go-kivik/couchdb v1.8.1/go.mod h1:5XJRkAMpBlEVA4q0ktIZjUPYBjoBmRoiWvwUBzP3BOQ= github.com/go-kivik/kivik v1.8.1/go.mod h1:nIuJ8z4ikBrVUSk3Ua8NoDqYKULPNjuddjqRvlSUyyQ= github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA= github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZsA= github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= Loading @@ -40,37 +31,29 @@ github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e h1:txQ github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
go-apps/meep-ctrl-engine/server/ctrl-engine.go +12 −13 Original line number Diff line number Diff line Loading @@ -26,9 +26,9 @@ import ( "strings" "time" "github.com/flimzy/kivik" "github.com/gorilla/mux" couch "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch" ceModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ms "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store" Loading @@ -42,11 +42,10 @@ type Scenario struct { } const scenarioDBName = "scenarios" const activeScenarioName = "active" const moduleName string = "meep-ctrl-engine" const moduleMonEngine string = "mon-engine" var db *kivik.DB var scenarioStore *couch.Connector var virtWatchdog *watchdog.Watchdog var rc *redis.Connector var activeModel *mod.Model Loading Loading @@ -78,7 +77,7 @@ func CtrlEngineInit() (err error) { log.Debug("CtrlEngineInit") // Make Scenario DB connection db, err = connectDb(scenarioDBName) scenarioStore, err = couch.NewConnector(couchDBAddr, scenarioDBName) if err != nil { log.Error("Failed connection to Scenario DB. Error: ", err) return err Loading @@ -86,7 +85,7 @@ func CtrlEngineInit() (err error) { log.Info("Connected to Scenario DB") // Retrieve scenario list from DB scenarioList, err := getScenarioList(db) scenarioList, err := scenarioStore.GetDocList() if err != nil { log.Error(err.Error()) return err Loading @@ -104,7 +103,7 @@ func CtrlEngineInit() (err error) { } // Update scenario in DB rev, err := setScenario(db, s.Name, validScenario) rev, err := scenarioStore.UpdateDoc(s.Name, validScenario) if err != nil { return errors.New("Failed to update scenario with error: " + err.Error()) } Loading Loading @@ -181,7 +180,7 @@ func ceCreateScenario(w http.ResponseWriter, r *http.Request) { } // Add new scenario to DB rev, err := addScenario(db, scenarioName, validScenario) rev, err := scenarioStore.AddDoc(scenarioName, validScenario) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusConflict) Loading @@ -205,7 +204,7 @@ func ceDeleteScenario(w http.ResponseWriter, r *http.Request) { log.Debug("Scenario name: ", scenarioName) // Remove scenario from DB err := removeScenario(db, scenarioName) err := scenarioStore.DeleteDoc(scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading @@ -223,7 +222,7 @@ func ceDeleteScenarioList(w http.ResponseWriter, r *http.Request) { log.Debug("ceDeleteScenarioList") // Remove all scenario from DB err := removeAllScenarios(db) err := scenarioStore.DeleteAllDocs() if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -253,7 +252,7 @@ func ceGetScenario(w http.ResponseWriter, r *http.Request) { // Retrieve scenario from DB var scenario []byte scenario, err := getScenario(false, db, scenarioName) scenario, err := scenarioStore.GetDoc(false, scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading @@ -279,7 +278,7 @@ func ceGetScenarioList(w http.ResponseWriter, r *http.Request) { log.Debug("ceGetScenarioList") // Retrieve scenario list from DB scenarioList, err := getScenarioList(db) scenarioList, err := scenarioStore.GetDocList() if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -331,7 +330,7 @@ func ceSetScenario(w http.ResponseWriter, r *http.Request) { } // Update scenario in DB rev, err := setScenario(db, scenarioName, validScenario) rev, err := scenarioStore.UpdateDoc(scenarioName, validScenario) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading Loading @@ -373,7 +372,7 @@ func ceActivateScenario(w http.ResponseWriter, r *http.Request) { // Retrieve scenario to activate from DB var scenario []byte scenario, err := getScenario(false, db, scenarioName) scenario, err := scenarioStore.GetDoc(false, scenarioName) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusNotFound) Loading
go-apps/meep-ctrl-engine/server/scenario-store.go→go-packages/meep-couch/db.go +181 −0 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package server package couchdb import ( "context" Loading @@ -25,91 +25,101 @@ import ( log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) // Establish DB connections func connectDb(dbName string) (*kivik.DB, error) { var client *Client // Client - Implements a couchDB client type Client struct { addr string dbClient *kivik.Client } // Connector - Implements a CouchDB connector type Connector struct { dbName string dbHandle *kivik.DB } // NewConnector - Creates and initialize a CouchDB connector to a database func NewConnector(addr string, dbName string) (rc *Connector, err error) { rc = new(Connector) // Connect to CouchDB log.Debug("Establish new couchDB connection") dbClient, err := kivik.New(context.TODO(), "couch", couchDBAddr) if client == nil { log.Debug("Establish new couchDB client connection") c := new(Client) c.addr = addr c.dbClient, err = kivik.New(context.TODO(), "couch", addr) if err != nil { return nil, err } client = c } // Create Scenario DB if id does not exist log.Debug("Check if scenario DB exists: " + dbName) debExists, err := dbClient.DBExists(context.TODO(), dbName) rc.dbName = dbName // Create DB if not exist exists, err := client.dbClient.DBExists(context.TODO(), rc.dbName) if err != nil { return nil, err } if !debExists { log.Debug("Create new DB: " + dbName) err = dbClient.CreateDB(context.TODO(), dbName) if !exists { log.Debug("Create DB: " + dbName) err = client.dbClient.CreateDB(context.TODO(), dbName) if err != nil { return nil, err } } // Open scenario DB log.Debug("Open scenario DB: " + dbName) db, err := dbClient.DB(context.TODO(), dbName) // Open DB log.Debug("Open DB: " + dbName) rc.dbHandle, err = client.dbClient.DB(context.TODO(), dbName) if err != nil { return nil, err } return db, nil return rc, nil } // Get scenario from DB func getScenario(returnNilOnNotFound bool, db *kivik.DB, scenarioName string) (scenario []byte, err error) { // Get scenario from DB log.Debug("Get scenario from DB: " + scenarioName) row, err := db.Get(context.TODO(), scenarioName) // getDocument - Get document from DB func (dbCon *Connector) GetDoc(returnNilOnNotFound bool, docName string) (doc []byte, err error) { log.Debug("Get document from DB: " + docName) row, err := dbCon.dbHandle.Get(context.TODO(), docName) if err != nil { // that's a call to the couch DB.. in order not to return nil, we override it if returnNilOnNotFound { //specifically for the case where there is nothing.. so the scenario object will be empty // specifically for the case where there is nothing.. so the document object will be empty return nil, nil } return nil, err } // Decode JSON-encoded document err = row.ScanDoc(&scenario) return scenario, err err = row.ScanDoc(&doc) return doc, err } // Get scenario list from DB func getScenarioList(db *kivik.DB) (scenarioList [][]byte, err error) { // Retrieve all scenarios from DB log.Debug("Get all scenarios from DB") rows, err := db.AllDocs(context.TODO()) // getDocList - Get document list from DB func (dbCon *Connector) GetDocList() (docList [][]byte, err error) { log.Debug("Get all docs from DB") rows, err := dbCon.dbHandle.AllDocs(context.TODO()) if err != nil { return nil, err } // Loop through scenarios and populate scenario list to return log.Debug("Loop through scenarios") // Loop through docs and populate doc list to return log.Debug("Loop through docs") for rows.Next() { var scenario []byte if rows.ID() != activeScenarioName { scenario, err = getScenario(false, db, rows.ID()) var doc []byte doc, err = dbCon.GetDoc(false, rows.ID()) if err == nil { // Append scenario to list scenarioList = append(scenarioList, scenario) } // Append to list docList = append(docList, doc) } } return scenarioList, nil return docList, nil } // Add scenario to DB func addScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, error) { // Add scenario to couch DB log.Debug("Add new scenario to DB: " + scenarioName) rev, err := db.Put(context.TODO(), scenarioName, scenario) // addDoc - Add scenario to DB func (dbCon *Connector) AddDoc(docName string, doc []byte) (string, error) { log.Debug("Add new doc to DB: " + docName) rev, err := dbCon.dbHandle.Put(context.TODO(), docName, doc) if err != nil { return "", err } Loading @@ -117,17 +127,17 @@ func addScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, er return rev, nil } // Update scenario in DB func setScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, error) { // updateDoc - Update a document in DB func (dbCon *Connector) UpdateDoc(docName string, doc []byte) (string, error) { log.Debug("Update doc from DB: " + docName) // Remove previous version err := removeScenario(db, scenarioName) err := dbCon.DeleteDoc(docName) if err != nil { return "", err } // Add updated version rev, err := addScenario(db, scenarioName, scenario) rev, err := dbCon.AddDoc(docName, doc) if err != nil { return "", err } Loading @@ -135,18 +145,17 @@ func setScenario(db *kivik.DB, scenarioName string, scenario []byte) (string, er return rev, nil } // Remove scenario from DB func removeScenario(db *kivik.DB, scenarioName string) error { // Get latest Rev of stored scenario from couchDB rev, err := db.Rev(context.TODO(), scenarioName) // deleteDoc - Remove a document from DB func (dbCon *Connector) DeleteDoc(docName string) error { log.Debug("Delete doc from DB: " + docName) // Get latest Rev of stored document rev, err := dbCon.dbHandle.Rev(context.TODO(), docName) if err != nil { return err } // Remove scenario from couchDB log.Debug("Remove scenario from DB: " + scenarioName) _, err = db.Delete(context.TODO(), scenarioName, rev) // Remove doc from couchDB _, err = dbCon.dbHandle.Delete(context.TODO(), docName, rev) if err != nil { return err } Loading @@ -154,20 +163,18 @@ func removeScenario(db *kivik.DB, scenarioName string) error { return nil } // Remove all scenarios from DB func removeAllScenarios(db *kivik.DB) error { // deleteAllDocs - Remove all documents from DB func (dbCon *Connector) DeleteAllDocs() error { log.Debug("Delete all docs from DB") // Retrieve all scenarios from DB log.Debug("Get all scenarios from DB") rows, err := db.AllDocs(context.TODO()) rows, err := dbCon.dbHandle.AllDocs(context.TODO()) if err != nil { return err } // Loop through scenarios and remove each one log.Debug("Loop through scenarios") // Loop through docs and remove each one for rows.Next() { _ = removeScenario(db, rows.ID()) _ = dbCon.DeleteDoc(rows.ID()) } return nil Loading
go-packages/meep-couch/db_test.go 0 → 100644 +143 −0 Original line number Diff line number Diff line /* * Copyright (c) 2019 InterDigital Communications, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package couchdb import ( "fmt" "testing" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) var couchDBAddr = "http://localhost:30985/" var dbName1 = "unit-test1" var dbName2 = "unit-test2" func TestCouchDB(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) con1, err := NewConnector(couchDBAddr, dbName1) if err != nil { log.Debug(err) t.Errorf("Error creating connector") } else if con1 == nil { t.Errorf("Received a nil connector") } con2, err := NewConnector(couchDBAddr, dbName2) if err != nil { log.Debug(err) t.Errorf("Error creating connector") } else if con2 == nil { t.Errorf("Received a nil connector") } testDb(t, con1) testDb(t, con2) err = con1.DeleteAllDocs() if err != nil { t.Errorf("Deleting all docs returned an error (con1)") } err = con2.DeleteAllDocs() if err != nil { t.Errorf("Deleting all docs returned an error (con2)") } } func testDb(t *testing.T, c *Connector) { //Empty DB err := c.DeleteAllDocs() if err != nil { log.Debug(err) t.Errorf("deleteAllDocs shouls not return an error") } // Get inexistent doc doc, err := c.GetDoc(false, "not-a-document") if err == nil { t.Errorf("getDoc should return an error (inexistent doc)") } else if doc != nil { t.Errorf("getDoc should return nil for inexistent doc") } // Get inexistent doc doc, err = c.GetDoc(true, "not-a-document") if err != nil { t.Errorf("getDoc error should be suppressed (inexistent doc)") } else if doc != nil { t.Errorf("getDoc should return nil for inexistent doc") } // Get doc list docList, err := c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (empty doc list)") } else if len(docList) != 0 { t.Errorf("getDocList should return an empty list (empty doc list)") } doc1 := []byte(`{"data":"This is document #1"}`) doc1Update := []byte(`{"data":"This is document #1 update"}`) doc2 := []byte(`{"data":"This is document #2"}`) doc3 := []byte(`{"data":"This is document #3"}`) rev1, err := c.AddDoc("doc1", doc1) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev1) rev2, err := c.AddDoc("doc2", doc2) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev2) rev3, err := c.AddDoc("doc3", doc3) if err != nil { log.Debug(err) t.Errorf("addDoc returned an error") } log.Debug(rev3) // Get doc list docList, err = c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (3 doc list)") } else if len(docList) != 3 { t.Errorf("getDocList should return a 3 document list (3 doc list)") } rev1, err = c.UpdateDoc("doc1", doc1Update) if err != nil { log.Debug(err) t.Errorf("updateDoc returned an error") } log.Debug(rev1) // Get doc list docList, err = c.GetDocList() if err != nil { t.Errorf("getDocList should not return an error (3 doc list)") } else if len(docList) != 3 { t.Errorf("getDocList should return a 3 document list (3 doc list)") } }