Skip to content
Snippets Groups Projects
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
}