// Run runs the specified VMTServer. This should never exit. func (s *VMTServer) Run(_ []string) error { if s.Kubeconfig == "" && s.Master == "" { glog.Warningf("Neither --kubeconfig nor --master was specified. Using default API client. This might not work.") } glog.V(3).Infof("Master is %s", s.Master) if s.MetaConfigPath == "" { glog.Fatalf("The path to the VMT config file is not provided.Exiting...") os.Exit(1) } if (s.EtcdConfigFile != "" && len(s.EtcdServerList) != 0) || (s.EtcdConfigFile == "" && len(s.EtcdServerList) == 0) { glog.Fatalf("specify either --etcd-servers or --etcd-config") } // This creates a client, first loading any specified kubeconfig // file, and then overriding the Master flag, if non-empty. kubeconfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.Kubeconfig}, &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: s.Master}}).ClientConfig() if err != nil { glog.Errorf("Error getting kubeconfig: %s", err) return err } // This specifies the number and the max number of query per second to the api server. kubeconfig.QPS = 20.0 kubeconfig.Burst = 30 kubeClient, err := client.New(kubeconfig) if err != nil { glog.Fatalf("Invalid API configuration: %v", err) } // TODO not clear // go func() { // mux := http.NewServeMux() // healthz.InstallHandler(mux) // if s.EnableProfiling { // mux.HandleFunc("/debug/pprof/", pprof.Index) // mux.HandleFunc("/debug/pprof/profile", pprof.Profile) // mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) // } // mux.Handle("/metrics", prometheus.Handler()) // server := &http.Server{ // Addr: net.JoinHostPort(s.Address.String(), strconv.Itoa(s.Port)), // Handler: mux, // } // glog.Fatal(server.ListenAndServe()) // }() // serverAddr, targetType, nameOrAddress, targetIdentifier, password vmtMeta, err := metadata.NewVMTMeta(s.MetaConfigPath) if err != nil { glog.Errorf("Get error when loading configurations: %s", err) os.Exit(1) } glog.V(3).Infof("Finished loading configuration from %s", s.MetaConfigPath) etcdclientBuilder := etcdhelper.NewEtcdClientBuilder().ServerList(s.EtcdServerList).SetTransport(s.EtcdCA, s.EtcdClientCertificate, s.EtcdClientKey) etcdClient, err := etcdclientBuilder.CreateAndTest() if err != nil { glog.Errorf("Error creating etcd client instance for vmt service: %s", err) return err } s.EtcdPathPrefix = master.DefaultEtcdPathPrefix etcdStorage, err := newEtcd(etcdClient, latest.InterfacesFor, latest.Version, "", s.EtcdPathPrefix) if err != nil { glog.Warningf("Error creating etcd storage instance for vmt service: %s", err) return err } vmtConfig := vmturbo.NewVMTConfig(kubeClient, etcdStorage, vmtMeta) vmtService := vmturbo.NewVMTurboService(vmtConfig) vmtService.Run() select {} }
func (s *SimulatorBuilder) Build() (*ActionSimulator, error) { etcdclientBuilder := etcdhelper.NewEtcdClientBuilder().ServerList(s.EtcdServerList).SetTransport(s.EtcdCA, s.EtcdClientCertificate, s.EtcdClientKey) etcdClient, err := etcdclientBuilder.CreateAndTest() if err != nil { glog.Errorf("Error creating etcd client instance for vmt service: %s", err) return nil, err } etcdStorage, err := newEtcd(etcdClient, latest.InterfacesFor, latest.Version, "", s.EtcdPathPrefix) if err != nil { glog.Warningf("Error creating etcd storage instance for vmt service: %s", err) return nil, err } simulator := &ActionSimulator{ kubeClient: s.KubeClient, etcdStorage: etcdStorage, } if s.Action != "" { simulator.action = s.Action } else { glog.Warningf("--action was not specified.") } if s.Destination != "" { simulator.destination = s.Destination } else { glog.Warningf("--destination was not specified.") } if s.PodToMove != "" { simulator.podToMove = s.PodToMove } else { glog.Warningf("--pod was not specified.") } if s.Namespace != "" { simulator.namespace = s.Namespace } else { glog.Warningf("--namespace was not specified. use default.") simulator.namespace = "default" } if s.Label != "" { simulator.label = s.Label } else { glog.Warningf("--label was not specified.") } if s.NewReplica != "" { simulator.newReplica = s.NewReplica } else { glog.Warningf("--new replica was not specified.") } return simulator, nil }