[VOL-3622] Stop and restart gRPC server

Change-Id: I443e7ed75f79dd90782a1a4342c8e4d3a7294488
diff --git a/internal/bbsimctl/commands/olt.go b/internal/bbsimctl/commands/olt.go
index 5f6747e..bed3733 100644
--- a/internal/bbsimctl/commands/olt.go
+++ b/internal/bbsimctl/commands/olt.go
@@ -49,6 +49,15 @@
 
 type OltReboot struct{}
 
+type StopGrpcServer struct{}
+
+type StartGrpcServer struct{}
+type RestartGrpcServer struct {
+	Args struct {
+		Delay uint32
+	} `positional-args:"yes" required:"yes"`
+}
+
 type OltFlows struct{}
 
 type OltPoweronAllOnus struct{}
@@ -66,6 +75,9 @@
 	Flows           OltFlows           `command:"flows"`
 	PoweronAllOnus  OltPoweronAllOnus  `command:"poweronAllONUs"`
 	ShutdownAllOnus OltShutdownAllOnus `command:"shutdownAllONUs"`
+	StopServer      StopGrpcServer     `command:"stopServer"`
+	StartServer     StartGrpcServer    `command:"startServer"`
+	RestartServer   RestartGrpcServer  `command:"restartServer"`
 }
 
 func RegisterOltCommands(parser *flags.Parser) {
@@ -184,6 +196,63 @@
 	return nil
 }
 
+func (o *StopGrpcServer) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	res, err := client.StopgRPCServer(ctx, &pb.Empty{})
+
+	if err != nil {
+		log.Fatalf("Cannot stop Openolt server: %v", err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+	return nil
+}
+
+func (o *StartGrpcServer) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	res, err := client.StartgRPCServer(ctx, &pb.Empty{})
+
+	if err != nil {
+		log.Fatalf("Cannot start Openolt server: %v", err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+	return nil
+}
+
+func (o *RestartGrpcServer) Execute(args []string) error {
+	req := &pb.Timeout{
+		Delay: o.Args.Delay,
+	}
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	res, err := client.RestartgRPCServer(ctx, req)
+
+	if err != nil {
+		log.Fatalf("Cannot restart Openolt server: %v", err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+	return nil
+}
+
 func (o *OltFlows) Execute(args []string) error {
 	client, conn := connect()
 	defer conn.Close()