SEBA-258 - Added MONGODB backup

Change-Id: I2542e7dfc894dfa5a1269c6be99cfa8036b9911c
diff --git a/cmd/AbstractOLT/AbstractOLT.go b/cmd/AbstractOLT/AbstractOLT.go
index 869c2c0..3e50828 100644
--- a/cmd/AbstractOLT/AbstractOLT.go
+++ b/cmd/AbstractOLT/AbstractOLT.go
@@ -25,11 +25,14 @@
 	"net/http"
 	"os"
 	"strings"
+	"time"
 
 	"gerrit.opencord.org/abstract-olt/api"
 	"gerrit.opencord.org/abstract-olt/internal/pkg/settings"
 	"gerrit.opencord.org/abstract-olt/models"
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
+	"github.com/mongodb/mongo-go-driver/bson"
+	"github.com/mongodb/mongo-go-driver/mongo"
 	"golang.org/x/net/context"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials"
@@ -186,6 +189,9 @@
 	help := flag.Bool("help", false, "Show usage")
 	dummy := flag.Bool("dummy", false, "Run in dummy mode where YAML is not sent to XOS")
 
+	useMongo := flag.Bool("useMongo", false, "use mongo db for backup/restore")
+	mongodb := flag.String("mongodb", "mongodb://foundry:foundry@localhost:27017", "connect string for mongodb backup/restore")
+
 	flag.Parse()
 	settings.SetDummy(*dummy)
 
@@ -196,12 +202,17 @@
       -a [default false] : Run in Authentication mode currently very basic
       -listenAddress IP_ADDRESS [default localhost] -grpc_port [default 7777] PORT1 -rest_port [default 7778] PORT2: Listen for grpc on IP_ADDRESS:PORT1 and rest on IP_ADDRESS:PORT2
       -log_file [default $WORKING_DIR/AbstractOLT.log] LOG_FILE
+      -mongo [default false] use mongodb for backup restore
+      -mongodb [default mongodb://foundry:foundry@localhost:27017] connect string for mongodb - Required if mongo == true
       -h(elp) print this usage
+
 `
 		fmt.Println(usage)
 		return
 	}
 	settings.SetDebug(*debugPtr)
+	settings.SetMongo(*useMongo)
+	settings.SetMongodb(*mongodb)
 	fmt.Println("Startup Params: debug:", *debugPtr, " Authentication:", *useAuthentication, " SSL:", *useSsl, "Cert Directory", *certDirectory,
 		"ListenAddress:", *listenAddress, " grpc port:", *grpcPort, " rest port:", *restPort, "Logging to ", *logFile)
 
@@ -244,29 +255,70 @@
 	}()
 
 	// infinite loop
-	files, err := ioutil.ReadDir("backup")
-	if err != nil {
-		log.Fatal(err)
-	}
-	for _, file := range files {
-		fmt.Println(file.Name())
-		chassisHolder := models.ChassisHolder{}
-		if file.Name() != "BackupPlaceHolder" {
-			fileName := fmt.Sprintf("backup/%s", file.Name())
-			json, _ := ioutil.ReadFile(fileName)
-			err := chassisHolder.Deserialize([]byte(json))
+	if *useMongo {
+		client, err := mongo.NewClient(*mongodb)
+		client.Connect(context.Background())
+		defer client.Disconnect(context.Background())
+		if err != nil {
+			log.Fatalf("unable to connect to mongodb with %v\n", err)
+		}
+		collection := client.Database("AbstractOLT").Collection("backup")
+		cur, err := collection.Find(context.Background(), nil)
+		if err != nil {
+			log.Fatalf("Unable to connect to collection with %v\n", err)
+		}
+		defer cur.Close(context.Background())
+		for cur.Next(context.Background()) {
+			elem := bson.NewDocument()
+			err := cur.Decode(elem)
 			if err != nil {
-				fmt.Printf("Deserialize threw an error %v\n", err)
+				log.Fatal(err)
 			}
-			chassisMap := models.GetChassisMap()
-			(*chassisMap)[file.Name()] = &chassisHolder
-		} else {
-			fmt.Println("Ignoring BackupPlaceHolder")
+			clli := elem.LookupElement("_id").Value()
+			body := elem.LookupElement("body").Value()
+			_, bodyBin := (*body).Binary()
+
+			chassisHolder := models.ChassisHolder{}
+			err = chassisHolder.Deserialize(bodyBin)
+			if err != nil {
+				log.Printf("Deserialize threw an error for clli %s %v\n", (*clli).StringValue(), err)
+			} else {
+				chassisMap := models.GetChassisMap()
+				(*chassisMap)[(*clli).StringValue()] = &chassisHolder
+
+			}
+		}
+	} else {
+		files, err := ioutil.ReadDir("backup")
+		if err != nil {
+			log.Fatal(err)
+		}
+		for _, file := range files {
+			chassisHolder := models.ChassisHolder{}
+			if file.Name() != "BackupPlaceHolder" {
+				fileName := fmt.Sprintf("backup/%s", file.Name())
+				json, _ := ioutil.ReadFile(fileName)
+				err := chassisHolder.Deserialize([]byte(json))
+				if err != nil {
+					fmt.Printf("Deserialize threw an error %v\n", err)
+				}
+				chassisMap := models.GetChassisMap()
+				(*chassisMap)[file.Name()] = &chassisHolder
+			} else {
+				fmt.Println("Ignoring BackupPlaceHolder")
+			}
 		}
 	}
 
 	log.Printf("Entering infinite loop")
-	select {}
+	var ticker = time.NewTicker(60 * time.Second)
+	for {
+		select {
+		case <-ticker.C:
+			api.DoOutput()
+		}
+	}
+
 	//TODO publish periodic stats etc
 	fmt.Println("AbstractOLT")
 }