github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/cmd/edgecore/app/server.go (about) 1 package app 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 8 "github.com/mitchellh/go-ps" 9 "github.com/spf13/cobra" 10 "k8s.io/apiserver/pkg/util/term" 11 cliflag "k8s.io/component-base/cli/flag" 12 "k8s.io/component-base/cli/globalflag" 13 "k8s.io/klog" 14 15 "github.com/kubeedge/beehive/pkg/core" 16 "github.com/kubeedge/kubeedge/edge/cmd/edgecore/app/options" 17 "github.com/kubeedge/kubeedge/edge/pkg/common/dbm" 18 "github.com/kubeedge/kubeedge/edge/pkg/devicetwin" 19 "github.com/kubeedge/kubeedge/edge/pkg/edged" 20 "github.com/kubeedge/kubeedge/edge/pkg/edgehub" 21 "github.com/kubeedge/kubeedge/edge/pkg/eventbus" 22 "github.com/kubeedge/kubeedge/edge/pkg/metamanager" 23 "github.com/kubeedge/kubeedge/edge/pkg/servicebus" 24 "github.com/kubeedge/kubeedge/edge/test" 25 edgemesh "github.com/kubeedge/kubeedge/edgemesh/pkg" 26 "github.com/kubeedge/kubeedge/pkg/apis/componentconfig/edgecore/v1alpha1" 27 "github.com/kubeedge/kubeedge/pkg/apis/componentconfig/edgecore/v1alpha1/validation" 28 "github.com/kubeedge/kubeedge/pkg/util" 29 "github.com/kubeedge/kubeedge/pkg/util/flag" 30 "github.com/kubeedge/kubeedge/pkg/version" 31 "github.com/kubeedge/kubeedge/pkg/version/verflag" 32 ) 33 34 // NewEdgeCoreCommand create edgecore cmd 35 func NewEdgeCoreCommand() *cobra.Command { 36 opts := options.NewEdgeCoreOptions() 37 cmd := &cobra.Command{ 38 Use: "edgecore", 39 Long: `Edgecore is the core edge part of KubeEdge, which contains six modules: devicetwin, edged, 40 edgehub, eventbus, metamanager, and servicebus. DeviceTwin is responsible for storing device status 41 and syncing device status to the cloud. It also provides query interfaces for applications. Edged is an 42 agent that runs on edge nodes and manages containerized applications and devices. Edgehub is a web socket 43 client responsible for interacting with Cloud Service for the edge computing (like Edge Controller as in the KubeEdge 44 Architecture). This includes syncing cloud-side resource updates to the edge, and reporting 45 edge-side host and device status changes to the cloud. EventBus is a MQTT client to interact with MQTT 46 servers (mosquito), offering publish and subscribe capabilities to other components. MetaManager 47 is the message processor between edged and edgehub. It is also responsible for storing/retrieving metadata 48 to/from a lightweight database (SQLite).ServiceBus is a HTTP client to interact with HTTP servers (REST), 49 offering HTTP client capabilities to components of cloud to reach HTTP servers running at edge. `, 50 Run: func(cmd *cobra.Command, args []string) { 51 verflag.PrintAndExitIfRequested() 52 flag.PrintMinConfigAndExitIfRequested(v1alpha1.NewMinEdgeCoreConfig()) 53 flag.PrintDefaultConfigAndExitIfRequested(v1alpha1.NewDefaultEdgeCoreConfig()) 54 flag.PrintFlags(cmd.Flags()) 55 56 if errs := opts.Validate(); len(errs) > 0 { 57 klog.Fatal(util.SpliceErrors(errs)) 58 } 59 60 config, err := opts.Config() 61 if err != nil { 62 klog.Fatal(err) 63 } 64 65 if errs := validation.ValidateEdgeCoreConfiguration(config); len(errs) > 0 { 66 klog.Fatal(util.SpliceErrors(errs.ToAggregate().Errors())) 67 } 68 69 // To help debugging, immediately log version 70 klog.Infof("Version: %+v", version.Get()) 71 72 // Check the running environment by default 73 checkEnv := os.Getenv("CHECK_EDGECORE_ENVIRONMENT") 74 if checkEnv != "false" { 75 // Check running environment before run edge core 76 if err := environmentCheck(); err != nil { 77 klog.Fatal(fmt.Errorf("Failed to check the running environment: %v", err)) 78 } 79 } 80 81 registerModules(config) 82 // start all modules 83 core.Run() 84 }, 85 } 86 fs := cmd.Flags() 87 namedFs := opts.Flags() 88 flag.AddFlags(namedFs.FlagSet("global")) 89 verflag.AddFlags(namedFs.FlagSet("global")) 90 globalflag.AddGlobalFlags(namedFs.FlagSet("global"), cmd.Name()) 91 for _, f := range namedFs.FlagSets { 92 fs.AddFlagSet(f) 93 } 94 95 usageFmt := "Usage:\n %s\n" 96 cols, _, _ := term.TerminalSize(cmd.OutOrStdout()) 97 cmd.SetUsageFunc(func(cmd *cobra.Command) error { 98 fmt.Fprintf(cmd.OutOrStderr(), usageFmt, cmd.UseLine()) 99 cliflag.PrintSections(cmd.OutOrStderr(), namedFs, cols) 100 return nil 101 }) 102 cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { 103 fmt.Fprintf(cmd.OutOrStdout(), "%s\n\n"+usageFmt, cmd.Long, cmd.UseLine()) 104 cliflag.PrintSections(cmd.OutOrStdout(), namedFs, cols) 105 }) 106 107 return cmd 108 } 109 110 // findProcess find a running process by name 111 func findProcess(name string) (bool, error) { 112 processes, err := ps.Processes() 113 if err != nil { 114 return false, err 115 } 116 117 for _, process := range processes { 118 if process.Executable() == name { 119 return true, nil 120 } 121 } 122 123 return false, nil 124 } 125 126 // environmentCheck check the environment before edgecore start 127 // if Check failed, return errors 128 func environmentCheck() error { 129 // if kubelet is running, return error 130 if find, err := findProcess("kubelet"); err != nil { 131 return err 132 } else if find == true { 133 return errors.New("Kubelet should not running on edge node when running edgecore") 134 } 135 136 // if kube-proxy is running, return error 137 if find, err := findProcess("kube-proxy"); err != nil { 138 return err 139 } else if find == true { 140 return errors.New("Kube-proxy should not running on edge node when running edgecore") 141 } 142 143 return nil 144 } 145 146 // registerModules register all the modules started in edgecore 147 func registerModules(c *v1alpha1.EdgeCoreConfig) { 148 devicetwin.Register(c.Modules.DeviceTwin, c.Modules.Edged.HostnameOverride) 149 edged.Register(c.Modules.Edged) 150 edgehub.Register(c.Modules.EdgeHub, c.Modules.Edged.HostnameOverride) 151 eventbus.Register(c.Modules.EventBus, c.Modules.Edged.HostnameOverride) 152 edgemesh.Register(c.Modules.EdgeMesh) 153 metamanager.Register(c.Modules.MetaManager) 154 servicebus.Register(c.Modules.ServiceBus) 155 test.Register(c.Modules.DBTest) 156 // Nodte: Need to put it to the end, and wait for all models to register before executing 157 dbm.InitDBConfig(c.DataBase.DriverName, c.DataBase.AliasName, c.DataBase.DataSource) 158 }