[VOL-3678] First implementation of the BBSim-sadis-server

Change-Id: I5077a8f861f4cc6af9759f31a4a415042c05eba3
diff --git a/cmd/bbsim-sadis-server.go b/cmd/bbsim-sadis-server.go
new file mode 100644
index 0000000..e18d880
--- /dev/null
+++ b/cmd/bbsim-sadis-server.go
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+
+ * 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 main
+
+import (
+	"context"
+	"github.com/opencord/bbsim-sadis-server/internal/core"
+	"github.com/opencord/bbsim-sadis-server/internal/utils"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+	"sync"
+)
+
+var (
+	logger log.CLogger
+	cf     *utils.ConfigFlags
+)
+
+func init() {
+	ctx := context.Background()
+
+	cf = utils.NewConfigFlags()
+	cf.ParseCommandArguments()
+
+	// Setup this package so that it's log level can be modified at run time
+	var err error
+	logger, err = log.RegisterPackage(cf.LogFormat, log.ErrorLevel, log.Fields{})
+	if err != nil {
+		panic(err)
+	}
+
+	// Set the instance ID as the hostname
+	instanceID := utils.GetHostName()
+
+	logLevel, err := log.StringToLogLevel(cf.LogLevel)
+
+	if err != nil {
+		logger.Errorw(ctx, "provided-log-level-is-not-valid", log.Fields{"err": err, "providedLevel": cf.LogLevel})
+	}
+
+	//Setup default logger - applies for packages that do not have specific logger set
+	if _, err := log.SetDefaultLogger(cf.LogFormat, logLevel, log.Fields{"instanceId": instanceID}); err != nil {
+		logger.With(log.Fields{"error": err}).Fatal(ctx, "Cannot setup logging")
+	}
+
+	// Update all loggers (provisioned via init) with a common field
+	if err := log.UpdateAllLoggers(log.Fields{"instanceId": instanceID}); err != nil {
+		logger.With(log.Fields{"error": err}).Fatal(ctx, "Cannot setup logging")
+	}
+
+	// Update all loggers to log level specified as input parameter
+	log.SetAllLogLevel(logLevel)
+
+	core.SetupLogger(logLevel, cf.LogFormat)
+}
+
+func main() {
+	ctx := context.Background()
+	logger.Info(ctx, "bbsim-sadis-server-started")
+
+	var config *rest.Config
+	var err error
+
+	// if kubeconfig is provided use that, otherwise assume we're running within the cluster
+	if cf.Kubeconfig != "" {
+		config, err = clientcmd.BuildConfigFromFlags("", cf.Kubeconfig)
+	} else {
+		config, err = rest.InClusterConfig()
+	}
+	if err != nil {
+		panic(err.Error())
+	}
+
+	clientset, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		panic(err.Error())
+	}
+
+	store := core.NewStore()
+
+	watcher := core.NewWatcher(clientset, store, cf)
+	server := core.NewServer(store)
+
+	wg := sync.WaitGroup{}
+
+	wg.Add(2)
+
+	go watcher.Watch(ctx, &wg)
+	go server.StartSadisServer(&wg)
+
+	wg.Wait()
+}