Skip to content
Snippets Groups Projects
main.go 3.18 KiB
Newer Older
  • Learn to ignore specific revisions
  • package main
    
    import (
    	"flag"
    	"fmt"
    	"os"
    
    Neil-Jocelyn Schark's avatar
    Neil-Jocelyn Schark committed
    	"strings"
    
    
    	venvmanager "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/venv-manager"
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    )
    
    func main() {
    	var dialConnectionURL string
    	var yamlFilepath string
    	var customContainerRegistryURL string
    
    	var sdnConfigFilepath string
    
    Neil Schark's avatar
    Neil Schark committed
    	var mode string
    
    	dialOption := grpc.WithTransportCredentials(insecure.NewCredentials())
    
    
    Neil Schark's avatar
    Neil Schark committed
    	flag.StringVar(&mode, "mode", "extract", "")
    
    	flag.StringVar(&dialConnectionURL, "controller", "localhost:55055", "")
    
    	flag.StringVar(&yamlFilepath, "topology", "venv.clab.yaml", "")
    
    	flag.StringVar(&customContainerRegistryURL, "registry", "", "")
    
    	flag.StringVar(&sdnConfigFilepath, "sdnconfig", "sdn_config.json", "")
    
    
    	// Define own output of --help and parsing error, as some library also uses the flags library and adds there flags to ours, which is not intended.
    	flag.Usage = func() {
    		fmt.Printf("Usable flags of the venv-manager:\n\n")
    
    Neil Schark's avatar
    Neil Schark committed
    		fmt.Println("--mode string\n\t The mode of the venv-manager. use either 'extract' or 'deploy'. (Default: 'extract')")
    
    		fmt.Println("--controller string\n\t Controller URL and Port. (Default: 'localhost:55055')")
    
    		fmt.Println("--topology string\n\t Filename of the resulting topology file. (Default: 'venv.clab.yaml')")
    		fmt.Println("--sdnconfig string\n\t Filename of the resulting SDN configuration file. (Default: 'sdn_config.json')")
    
    Neil-Jocelyn Schark's avatar
    Neil-Jocelyn Schark committed
    		fmt.Println("--registry string\n\t URL of the container registry to use. Keep in mind that cEOS images and prebuild linux images with the gnmi target are not available on dockerhub. (Default: none (dockerhub))")
    
    		fmt.Println("--help\n\t Shows this help screen.")
    	}
    	flag.Parse()
    
    
    Neil-Jocelyn Schark's avatar
    Neil-Jocelyn Schark committed
    	customContainerRegistryURL = ensureLastCharIsSlash(customContainerRegistryURL)
    
    
    Neil Schark's avatar
    Neil Schark committed
    	if mode == "extract" {
    		fmt.Println("I will try to connect to goSDN located at", dialConnectionURL)
    		venvManager := venvmanager.NewVenvManager(dialConnectionURL, dialOption, yamlFilepath, sdnConfigFilepath, customContainerRegistryURL)
    
    Neil Schark's avatar
    Neil Schark committed
    		fmt.Println("Generating topology file...")
    		err := venvManager.CreateTopologyFile()
    		if err != nil {
    			printErrAndAbort(err)
    		}
    
    		fmt.Println("Generating SDN configuration file...")
    		err = venvManager.CreateSDNConfigFile()
    		if err != nil {
    			printErrAndAbort(err)
    		}
    	} else if mode == "deploy" {
    		fmt.Println("I will try to connect to goSDN located at", dialConnectionURL)
    		venvManager := venvmanager.NewVenvManager(dialConnectionURL, dialOption, yamlFilepath, sdnConfigFilepath, customContainerRegistryURL)
    
    		//TODO: read topology file and tell containerlab to start environment.
    
    Neil Schark's avatar
    Neil Schark committed
    
    
    Neil Schark's avatar
    Neil Schark committed
    		err := venvManager.ReadAndSendSDNConfig()
    		if err != nil {
    			printErrAndAbort(err)
    		}
    	} else {
    		fmt.Println("No valid mode selected. Choose either 'extract' or 'deploy'.")
    
    Neil Schark's avatar
    Neil Schark committed
    	}
    
    
    	fmt.Println("All done!")
    
    Neil-Jocelyn Schark's avatar
    Neil-Jocelyn Schark committed
    // Ensures that the last char of a string is a slash, if this string is not empty.
    
    Neil-Jocelyn Schark's avatar
    Neil-Jocelyn Schark committed
    func ensureLastCharIsSlash(inputString string) string {
    	if len(inputString) == 0 {
    		return inputString
    	}
    
    	if strings.HasSuffix(inputString, "/") {
    		return inputString
    	}
    
    	return inputString + "/"
    }
    
    Neil Schark's avatar
    Neil Schark committed
    
    func printErrAndAbort(err error) {
    	fmt.Println(err)
    	fmt.Println("An error occurred, exiting.")
    	os.Exit(1)
    }