func main() { var opts cliOpts var flagSet *flag.FlagSet defHostLabel, err := os.Hostname() // parse rest of the args that require creating state flagSet = flag.NewFlagSet("netplugin", flag.ExitOnError) flagSet.BoolVar(&opts.debug, "debug", false, "Show debugging information generated by netplugin") flagSet.StringVar(&opts.syslog, "syslog", "", "Log to syslog at proto://ip:port -- use 'kernel' to log via kernel syslog") flagSet.BoolVar(&opts.jsonLog, "json-log", false, "Format logs as JSON") flagSet.StringVar(&opts.hostLabel, "host-label", defHostLabel, "label used to identify endpoints homed for this host, default is host name. If -config flag is used then host-label must be specified in the the configuration passed.") flagSet.StringVar(&opts.pluginMode, "plugin-mode", "docker", "plugin mode docker|kubernetes") flagSet.StringVar(&opts.cfgFile, "config", "", "plugin configuration. Use '-' to read configuration from stdin") flagSet.StringVar(&opts.vtepIP, "vtep-ip", "", "My VTEP ip address") flagSet.StringVar(&opts.ctrlIP, "ctrl-ip", "", "Local ip address to be used for control communication") flagSet.StringVar(&opts.vlanIntf, "vlan-if", "", "VLAN uplink interface") flagSet.BoolVar(&opts.version, "version", false, "Show version") flagSet.StringVar(&opts.dbURL, "cluster-store", "etcd://127.0.0.1:2379", "state store url") err = flagSet.Parse(os.Args[1:]) if err != nil { log.Fatalf("Failed to parse command. Error: %s", err) } if opts.version { fmt.Printf(version.String()) os.Exit(0) } // Make sure we are running as root usr, err := user.Current() if (err != nil) || (usr.Username != "root") { log.Fatalf("This process can only be run as root") } if opts.debug { log.SetLevel(log.DebugLevel) os.Setenv("CONTIV_TRACE", "1") } if opts.jsonLog { log.SetFormatter(&log.JSONFormatter{}) } else { log.SetFormatter(&log.TextFormatter{FullTimestamp: true, TimestampFormat: time.StampNano}) } if opts.syslog != "" { configureSyslog(opts.syslog) } if flagSet.NFlag() < 1 { log.Infof("host-label not specified, using default (%s)", opts.hostLabel) } // default to using local IP addr localIP, err := cluster.GetLocalAddr() if err != nil { log.Fatalf("Error getting local address. Err: %v", err) } if opts.ctrlIP == "" { opts.ctrlIP = localIP } if opts.vtepIP == "" { opts.vtepIP = opts.ctrlIP } // parse store URL parts := strings.Split(opts.dbURL, "://") if len(parts) < 2 { log.Fatalf("Invalid cluster-store-url %s", opts.dbURL) } stateStore := parts[0] // initialize the config pluginConfig := plugin.Config{ Drivers: plugin.Drivers{ Network: "ovs", State: stateStore, }, Instance: core.InstanceInfo{ HostLabel: opts.hostLabel, CtrlIP: opts.ctrlIP, VtepIP: opts.vtepIP, VlanIntf: opts.vlanIntf, DbURL: opts.dbURL, PluginMode: opts.pluginMode, }, } // Create a new agent ag := agent.NewAgent(&pluginConfig) // Process all current state ag.ProcessCurrentState() // post initialization processing ag.PostInit() // handle events if err := ag.HandleEvents(); err != nil { log.Infof("Netplugin exiting due to error: %v", err) os.Exit(1) } }
// NewNPCluster creates a new cluster of netplugin/netmaster func NewNPCluster(its *integTestSuite) (*NPCluster, error) { // get local host name hostLabel, err := os.Hostname() if err != nil { log.Fatalf("Failed to fetch hostname. Error: %s", err) } // get local IP addr localIP, err := cluster.GetLocalAddr() if err != nil { log.Fatalf("Error getting local address. Err: %v", err) } // create master daemon md := &daemon.MasterDaemon{ ListenURL: ":9999", ClusterStore: its.clusterStore, ClusterMode: "test", DNSEnabled: false, } // initialize the plugin config pluginConfig := plugin.Config{ Drivers: plugin.Drivers{ Network: "ovs", State: strings.Split(its.clusterStore, "://")[0], }, Instance: core.InstanceInfo{ HostLabel: hostLabel, CtrlIP: localIP, VtepIP: localIP, VlanIntf: "eth2", DbURL: its.clusterStore, PluginMode: "test", }, } // initialize master daemon md.Init() // Run daemon FSM go md.RunMasterFsm() // Wait for a second for master to initialize time.Sleep(10 * time.Second) // set forwarding mode if required if its.fwdMode != "bridge" || its.fabricMode != "default" { err := contivModel.CreateGlobal(&contivModel.Global{ Key: "global", Name: "global", NetworkInfraType: its.fabricMode, Vlans: "1-4094", Vxlans: "1-10000", FwdMode: its.fwdMode, ArpMode: its.arpMode, }) if err != nil { log.Fatalf("Error creating global state. Err: %v", err) } } // Create a new agent ag := agent.NewAgent(&pluginConfig) // Process all current state ag.ProcessCurrentState() // post initialization processing ag.PostInit() // handle events go func() { if err := ag.HandleEvents(); err != nil { log.Infof("Netplugin exiting due to error: %v", err) os.Exit(1) } }() // Wait for a second for things to settle down time.Sleep(time.Second) cl := &NPCluster{ MasterDaemon: md, PluginAgent: ag, HostLabel: hostLabel, LocalIP: localIP, } return cl, nil }