VOL-2474 Add bash completion to alarm commands

Change-Id: Ia0173fc5ffa604f5bee4c50105bd71864e9d102c
diff --git a/internal/bbsimctl/commands/alarms.go b/internal/bbsimctl/commands/alarms.go
index 3e3efec..eb4813c 100755
--- a/internal/bbsimctl/commands/alarms.go
+++ b/internal/bbsimctl/commands/alarms.go
@@ -33,6 +33,8 @@
 	DEFAULT_ALARM_LIST_FORMAT = "table{{ .Name }}"
 )
 
+type AlarmNameString string
+
 type AlarmListOutput struct {
 	Name string
 }
@@ -40,16 +42,16 @@
 type AlarmRaise struct {
 	Parameters []string `short:"p" description:"Additional Alarm Parameter in name=value form"`
 	Args       struct {
-		Name         string
-		SerialNumber string
+		Name         AlarmNameString
+		SerialNumber OnuSnString
 	} `positional-args:"yes" required:"yes"`
 }
 
 type AlarmClear struct {
 	Parameters []string `short:"p" description:"Additional Alarm Parameter in name=value form"`
 	Args       struct {
-		Name         string
-		SerialNumber string
+		Name         AlarmNameString
+		SerialNumber OnuSnString
 	} `positional-args:"yes" required:"yes"`
 }
 
@@ -111,7 +113,7 @@
 }
 
 func (o *AlarmRaise) Execute(args []string) error {
-	alarmType, err := alarmNameToEnum(o.Args.Name)
+	alarmType, err := alarmNameToEnum(string(o.Args.Name))
 	if err != nil {
 		return err
 	}
@@ -123,7 +125,7 @@
 	defer cancel()
 
 	req := pb.AlarmRequest{AlarmType: *alarmType,
-		SerialNumber: o.Args.SerialNumber,
+		SerialNumber: string(o.Args.SerialNumber),
 		Status:       "on"}
 
 	err = addParameters(o.Parameters, &req)
@@ -143,7 +145,7 @@
 }
 
 func (o *AlarmClear) Execute(args []string) error {
-	alarmType, err := alarmNameToEnum(o.Args.Name)
+	alarmType, err := alarmNameToEnum(string(o.Args.Name))
 	if err != nil {
 		return err
 	}
@@ -155,7 +157,7 @@
 	defer cancel()
 
 	req := pb.AlarmRequest{AlarmType: *alarmType,
-		SerialNumber: o.Args.SerialNumber,
+		SerialNumber: string(o.Args.SerialNumber),
 		Status:       "off"}
 
 	err = addParameters(o.Parameters, &req)
@@ -186,3 +188,14 @@
 	tableFormat.Execute(os.Stdout, true, alarmNames)
 	return nil
 }
+
+func (onuSn *AlarmNameString) Complete(match string) []flags.Completion {
+	list := make([]flags.Completion, 0)
+	for k := range AlarmNameMap {
+		if strings.HasPrefix(k, match) {
+			list = append(list, flags.Completion{Item: k})
+		}
+	}
+
+	return list
+}