[VOL-4519] Add bbsimctl command to invalidate MDS count of an ONU

Change-Id: I8cdb6c0d5381b952a87e1d24d87cab81de0ddaf9
diff --git a/internal/bbsimctl/commands/onu.go b/internal/bbsimctl/commands/onu.go
index f929f39..80e5f0d 100644
--- a/internal/bbsimctl/commands/onu.go
+++ b/internal/bbsimctl/commands/onu.go
@@ -115,6 +115,12 @@
 	} `positional-args:"yes"`
 }
 
+type ONUInvalidateMds struct {
+	Args struct {
+		OnuSn OnuSnString
+	} `positional-args:"yes" required:"yes"`
+}
+
 type ONUOptions struct {
 	List              ONUList              `command:"list"`
 	Get               ONUGet               `command:"get"`
@@ -127,6 +133,7 @@
 	Alarms            AlarmOptions         `command:"alarms"`
 	Flows             ONUFlows             `command:"flows"`
 	Services          ONUServices          `command:"services"`
+	InvalidateMds     ONUInvalidateMds     `command:"invalidate_mds"`
 }
 
 func RegisterONUCommands(parser *flags.Parser) {
@@ -400,6 +407,27 @@
 	return nil
 }
 
+func (options *ONUInvalidateMds) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+	req := pb.ONURequest{
+		SerialNumber: string(options.Args.OnuSn),
+	}
+	res, err := client.InvalidateMds(ctx, &req)
+
+	if err != nil {
+		log.Fatalf("Cannot invalidate MDS counter on ONU %s: %v", options.Args.OnuSn, err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+
+	return nil
+}
+
 func (onuSn *OnuSnString) Complete(match string) []flags.Completion {
 	client, conn := connect()
 	defer conn.Close()