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  }