-
Manuel Kieweg authoredManuel Kieweg authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
controller.go 2.80 KiB
package nucleus
import (
"code.fbi.h-da.de/cocsn/gosdn/database"
"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/client/ciena"
"github.com/BurntSushi/toml"
log "github.com/sirupsen/logrus"
"os"
)
type controllerConfig struct {
CliSocket string
DatabaseSocket string
DatabaseUser string
DatabasePassword string
DatabaseCrypto bool
ConfigPath string
}
type clientConfigs struct {
Client []interfaces.ClientConfig `toml:"client"`
}
// Core is the representation of the controllers core
type Core struct {
//Assert type with clients[key].(*MCPClient)
clients map[string]interfaces.Client
database database.Database
config controllerConfig
IsRunning chan bool
}
//Init does start-up housekeeping like reading controller and client config files
func (c *Core) Init(socket, configFileController, configFileClient string, IsRunningChannel chan bool) {
if err := c.readControllerConfig(configFileController); err != nil {
log.Fatal(err)
}
if socket != "localhost:55055" {
c.config.CliSocket = socket
}
c.AttachDatabase()
c.IsRunning = IsRunningChannel
if err := c.readClientConfig(configFileClient); err != nil {
log.Fatal(err)
}
}
// AttachDatabase connects to the database and passes the connectio to the controller core
func (c *Core) AttachDatabase() {
c.database = database.NewDatabaseClient(c.config.DatabaseSocket, c.config.DatabaseUser, c.config.DatabasePassword, c.config.DatabaseCrypto)
}
// Shutdown waits for the shutdown signal and gracefully shuts down once it arrived
func (c *Core) Shutdown() {
<-c.IsRunning
log.Info("Received shutdown signal. Shutting down")
f, err := os.Create(c.config.ConfigPath)
if err != nil {
log.Fatal(err)
}
enc := toml.NewEncoder(f)
if err := enc.Encode(c.config); err != nil {
log.Fatal(err)
}
log.Info("Shutdown complete")
os.Exit(0)
}
func (c *Core) readControllerConfig(configFileController string) error {
if configFileController == "" {
configFileController = "configs/gosdn.toml"
}
if _, err := os.Stat(configFileController); err != nil {
return err
}
c.config = controllerConfig{}
if _, err := toml.DecodeFile(configFileController, &c.config); err != nil {
return err
}
if c.config.ConfigPath == "" {
c.config.ConfigPath = configFileController
}
return nil
}
func (c *Core) readClientConfig(configFileClient string) error {
if configFileClient == "" {
configFileClient = "configs/clients.toml"
}
if _, err := os.Stat(configFileClient); err != nil {
return err
}
clients := clientConfigs{}
if _, err := toml.DecodeFile(configFileClient, &clients); err != nil {
return err
}
for _, client := range clients.Client {
c.clients[client.Identifier] = ciena.NewMCPClient(client.Endpoint, client.Username, client.Password, &c.database, &client)
}
return nil
}