github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/mdb-relayd/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"reflect"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/flags/loadflags"
    11  	"github.com/Cloud-Foundations/Dominator/lib/mdb"
    12  	"github.com/Cloud-Foundations/Dominator/lib/mdb/mdbd"
    13  	"github.com/Cloud-Foundations/Dominator/lib/srpc/setupclient"
    14  )
    15  
    16  var (
    17  	debug = flag.Bool("debug", false,
    18  		"If true, show debugging output")
    19  	mdbFile = flag.String("mdbFile", "/var/lib/Dominator/mdb",
    20  		"File to read MDB data from (default format is JSON)")
    21  
    22  	numMachines int
    23  )
    24  
    25  func printUsage() {
    26  	fmt.Fprintln(os.Stderr,
    27  		"Usage: mdb-relayd [flags...]")
    28  	fmt.Fprintln(os.Stderr, "Common flags:")
    29  	flag.PrintDefaults()
    30  }
    31  
    32  func showMdb(mdb *mdb.Mdb) {
    33  	mdb.DebugWrite(os.Stdout)
    34  	fmt.Println()
    35  }
    36  
    37  func main() {
    38  	if err := loadflags.LoadForDaemon("mdb-relayd"); err != nil {
    39  		fmt.Fprintln(os.Stderr, err)
    40  		os.Exit(1)
    41  	}
    42  	flag.Usage = printUsage
    43  	flag.Parse()
    44  	if flag.NArg() != 0 {
    45  		printUsage()
    46  		os.Exit(2)
    47  	}
    48  	if err := setupclient.SetupTls(true); err != nil {
    49  		fmt.Fprintln(os.Stderr, err)
    50  		os.Exit(1)
    51  	}
    52  	logger := log.New(os.Stderr, "", log.LstdFlags)
    53  	mdbChannel := mdbd.StartMdbDaemon(*mdbFile, logger)
    54  	oldMachines := make(map[string]mdb.Machine)
    55  	firstTime := true
    56  	for mdb := range mdbChannel {
    57  		if *debug {
    58  			showMdb(mdb)
    59  		}
    60  		numNew := 0
    61  		numChanged := 0
    62  		machinesToDelete := make(map[string]struct{})
    63  		for name := range oldMachines {
    64  			machinesToDelete[name] = struct{}{}
    65  		}
    66  		for _, machine := range mdb.Machines {
    67  			if machine.Hostname == "" {
    68  				logger.Println("Received machine with empty Hostname")
    69  				continue
    70  			}
    71  			delete(machinesToDelete, machine.Hostname)
    72  			if oldMachine, ok := oldMachines[machine.Hostname]; ok {
    73  				if !reflect.DeepEqual(oldMachine, machine) {
    74  					oldMachines[machine.Hostname] = machine
    75  					numChanged++
    76  				}
    77  			} else {
    78  				oldMachines[machine.Hostname] = machine
    79  				numNew++
    80  			}
    81  		}
    82  		if firstTime {
    83  			firstTime = false
    84  			logger.Printf("Initial MDB data: %d machines\n",
    85  				len(mdb.Machines))
    86  			continue
    87  		}
    88  		for name := range machinesToDelete {
    89  			delete(oldMachines, name)
    90  		}
    91  		logger.Printf("MDB update: %d new, %d removed, %d changed\n",
    92  			numNew, len(machinesToDelete), numChanged)
    93  	}
    94  }