VOL-1123 Specify serial number for Ponsim v2 ONU on command line

Change-Id: I85a15c0e710f22d2869fbe47976036cfa1ee610d
diff --git a/ponsim/v2/README.md b/ponsim/v2/README.md
index 88841c7..9d004be 100644
--- a/ponsim/v2/README.md
+++ b/ponsim/v2/README.md
@@ -50,6 +50,8 @@
     	Enable promiscuous mode on network interfaces
   -quiet
     	Suppress debug and info logs
+  -serial_number string
+      Serial number of ONU device (default "PSMO12345678")
   -vcore_endpoint string
     	Voltha core endpoint address (default "vcore")
   -verbose
diff --git a/ponsim/v2/core/ponsim_onu.go b/ponsim/v2/core/ponsim_onu.go
index ac3a02a..ae40387 100644
--- a/ponsim/v2/core/ponsim_onu.go
+++ b/ponsim/v2/core/ponsim_onu.go
@@ -43,6 +43,7 @@
 	ParentAddress string
 	ParentPort    int32
 	AssignedPort  int32
+	SerialNumber  string
 	Conn          *grpc.ClientConn
 
 	oltClient ponsim.PonSimCommonClient
@@ -214,6 +215,7 @@
 				Id:      uuid.New().String(),
 				Address: common.GetInterfaceIP(o.InternalIf),
 				Port:    o.Port,
+				SerialNumber: o.SerialNumber,
 			}
 			common.Logger().Printf("Request details %+v\n", rreq)
 
diff --git a/ponsim/v2/grpc/nbi/ponsim_handler.go b/ponsim/v2/grpc/nbi/ponsim_handler.go
index 8205386..49fd71a 100644
--- a/ponsim/v2/grpc/nbi/ponsim_handler.go
+++ b/ponsim/v2/grpc/nbi/ponsim_handler.go
@@ -128,25 +128,28 @@
 		"handler": handler,
 	}).Info("Getting device information")
 
-	var out *voltha.PonSimDeviceInfo
+	out := &voltha.PonSimDeviceInfo{}
 
 	// Check which device type we're currently handling
 	if _, ok := (handler.device).(*core.PonSimOltDevice); ok {
 		common.Logger().WithFields(logrus.Fields{
 			"handler": handler,
 		}).Debug("Handling OLT device")
-		keys := make([]int32, 0, len((handler.device).(*core.PonSimOltDevice).GetOnus()))
-		for k := range (handler.device).(*core.PonSimOltDevice).GetOnus() {
-			keys = append(keys, k)
+		onus := (handler.device).(*core.PonSimOltDevice).GetOnus()
+		for k := range onus {
+			out.Onus = append(
+				out.Onus,
+				&voltha.PonSimOnuDeviceInfo {
+					UniPort: k,
+					SerialNumber: onus[k].Device.SerialNumber,
+				},
+			)
 		}
-		out = &voltha.PonSimDeviceInfo{NniPort: 0, UniPorts: []int32(keys)}
-
+		out.NniPort = 0
 	} else {
 		common.Logger().WithFields(logrus.Fields{
 			"handler": handler,
 		}).Debug("Handling ONU/OTHER device")
-
-		out = &voltha.PonSimDeviceInfo{}
 	}
 
 	common.Logger().WithFields(logrus.Fields{
diff --git a/ponsim/v2/grpc/sbi/olt_handler.go b/ponsim/v2/grpc/sbi/olt_handler.go
index a264532..2f98c96 100644
--- a/ponsim/v2/grpc/sbi/olt_handler.go
+++ b/ponsim/v2/grpc/sbi/olt_handler.go
@@ -48,6 +48,7 @@
 		PonSimDevice: core.PonSimDevice{
 			Address: request.Address, Port: request.Port, //GrpcSecurity: h.olt.GrpcSecurity,
 		}}
+	onu.SerialNumber = request.SerialNumber
 
 	if assignedPort, err := h.olt.AddOnu(onu); assignedPort == -1 || err != nil {
 		return &ponsim.RegistrationReply{
diff --git a/ponsim/v2/ponsim.go b/ponsim/v2/ponsim.go
index eab6a54..cbb863d 100644
--- a/ponsim/v2/ponsim.go
+++ b/ponsim/v2/ponsim.go
@@ -49,6 +49,7 @@
 	default_parent_port    = 50060
 	default_vcore_endpoint = "vcore"
 	default_fluentd_host   = ""
+	default_serial_number  = "PSMO12345678"
 
 	default_snapshot_len = 65535
 	default_promiscuous  = false
@@ -82,6 +83,7 @@
 	parent_port    int    = default_parent_port
 	vcore_endpoint string = default_vcore_endpoint
 	fluentd_host   string = default_fluentd_host
+	serial_number  string = default_serial_number
 
 	snapshot_len int32 = default_snapshot_len
 	promiscuous  bool  = default_promiscuous
@@ -158,6 +160,9 @@
 	help = fmt.Sprintf("Fluentd host address")
 	flag.StringVar(&fluentd_host, "fluentd", default_fluentd_host, help)
 
+	help = fmt.Sprintf("Serial number of ONU device")
+	flag.StringVar(&serial_number, "serial_number", default_serial_number, help)
+
 	flag.Parse()
 }
 
@@ -274,6 +279,7 @@
 		device = core.NewPonSimOnuDevice(pon)
 		device.(*core.PonSimOnuDevice).ParentAddress = parent_addr
 		device.(*core.PonSimOnuDevice).ParentPort = int32(parent_port)
+		device.(*core.PonSimOnuDevice).SerialNumber = serial_number
 
 	default:
 		log.Println("Unknown device type")
diff --git a/ponsim/v2/protos/ponsim_olt.proto b/ponsim/v2/protos/ponsim_olt.proto
index 82214a7..3b8a761 100644
--- a/ponsim/v2/protos/ponsim_olt.proto
+++ b/ponsim/v2/protos/ponsim_olt.proto
@@ -12,6 +12,7 @@
     string id = 1;
     string address = 2;
     int32 port = 3;
+    string serial_number = 4;
 }
 
 message RegistrationReply {