Add SimInfos as hostlabels for migrating cellular suites

SimInfos is a list of SimInfo, converting as hostlabels

BUG=b:317121870
TEST=Unit tests

Change-Id: Ieba8987b91b70901b48a71c8e2094194888dfa90
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/5190608
Reviewed-by: Derek Beckett <dbeckett@chromium.org>
Commit-Queue: Varun Srivastav <varunsrivastav@google.com>
Tested-by: Varun Srivastav <varunsrivastav@google.com>
(cherry picked from commit 8e5df5d72410262774a2ec034d3acb6f79798c34)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/5314741
Auto-Submit: Varun Srivastav <varunsrivastav@google.com>
diff --git a/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info.go b/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info.go
index 979bb54..5d51357 100644
--- a/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info.go
+++ b/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info.go
@@ -47,6 +47,7 @@
 	PowerUnitHostName   string
 	PowerUnitOutlet     string
 	HydraHostName       string
+	SimInfos            []string
 }
 
 // joinHostAndPort joins host and port to a single address.
@@ -103,9 +104,13 @@
 	}
 
 	cacheInfo := dut.GetCacheServer()
-
 	addr := joinHostAndPort(chromeOS.Ssh)
 
+	var SimInfos []string
+	if chromeOS.GetSimInfos() != nil && len(chromeOS.GetSimInfos()) > 0 {
+		SimInfos = simInfoConverter(chromeOS.GetSimInfos())
+	}
+
 	// Servo address.
 	var servo string
 	var servoHostname string
@@ -273,6 +278,7 @@
 		PowerUnitHostName:   powerUnitHostName,
 		PowerUnitOutlet:     powerUnitOutlet,
 		HydraHostName:       hydraHostName,
+		SimInfos:            SimInfos,
 	}, nil
 }
 
@@ -359,9 +365,65 @@
 		labels = append(labels, fmt.Sprintf("working_bluetooth_btpeer:%v", dut.BTPeers))
 	}
 
+	if dut.SimInfos != nil && len(dut.SimInfos) > 0 {
+		labels = append(labels, dut.SimInfos...)
+	}
+
 	return attrMap, labels, nil
 }
 
+// simInfoConverter converts SIMInfo labels to Autotest labels
+// converter logic is copied from go/src/infra/libs/skylab/inventory/autotest/labels/siminfo.go
+func simInfoConverter(simInfos []*labapi.SIMInfo) []string {
+	var labels []string
+	for _, s := range simInfos {
+		sim_id := ""
+		if v := s.GetSlotId(); v != 0 {
+			sim_id = strconv.Itoa(int(v))
+			lv := "sim_slot_id:" + sim_id
+			labels = append(labels, lv)
+		}
+		if v := s.GetType(); v != *labapi.SIMType_SIM_UNKNOWN.Enum() {
+			lv := "sim_" + sim_id + "_type:" + v.String()
+			labels = append(labels, lv)
+		}
+		if eid := s.GetEid(); eid != "" {
+			lv := "sim_" + sim_id + "_eid:" + eid
+			labels = append(labels, lv)
+		}
+		if s.GetTestEsim() {
+			lv := "sim_" + sim_id + "_test_esim:True"
+			labels = append(labels, lv)
+		}
+		lv := "sim_" + sim_id + "_num_profiles:" + strconv.Itoa(len(s.GetProfileInfo()))
+		labels = append(labels, lv)
+		for j, p := range s.GetProfileInfo() {
+			profile_id := strconv.Itoa(j)
+			if k := p.GetIccid(); k != "" {
+				lv := "sim_" + sim_id + "_" + profile_id + "_iccid:" + k
+				labels = append(labels, lv)
+			}
+			if k := p.GetSimPin(); k != "" {
+				lv := "sim_" + sim_id + "_" + profile_id + "_pin:" + k
+				labels = append(labels, lv)
+			}
+			if k := p.GetSimPuk(); k != "" {
+				lv := "sim_" + sim_id + "_" + profile_id + "_puk:" + k
+				labels = append(labels, lv)
+			}
+			if k := p.GetCarrierName(); k != *labapi.NetworkProvider_NETWORK_OTHER.Enum() {
+				lv := "sim_" + sim_id + "_" + profile_id + "_carrier_name:" + k.String()
+				labels = append(labels, lv)
+			}
+			if k := p.GetOwnNumber(); k != "" {
+				lv := "sim_" + sim_id + "_" + profile_id + "_own_number:" + k
+				labels = append(labels, lv)
+			}
+		}
+	}
+	return labels
+}
+
 // FillAndroidInfo extraction Android information from a device.
 func FillAndroidInfo(device *api.CrosTestRequest_Device) *AndroidInfo {
 	android := device.Dut.GetAndroid()
diff --git a/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info_test.go b/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info_test.go
index 2a10499..c4b1dec 100644
--- a/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info_test.go
+++ b/src/chromiumos/test/execution/cmd/cros-test/internal/device/dut_info_test.go
@@ -72,6 +72,14 @@
 			ServoHostname:   "c6-r9-r7-labstation",
 			ServoPort:       "9996",
 			Phase:           "PHASE_UNSPECIFIED",
+			SimInfos: []string{
+				"sim_slot_id:1", "sim_1_num_profiles:1", "sim_1_0_iccid:1", "sim_1_0_pin:1111",
+				"sim_1_0_puk:49830420", "sim_1_0_carrier_name:NETWORK_TMOBILE",
+				"sim_1_0_own_number:6507891159", "sim_slot_id:2", "sim_2_type:SIM_PHYSICAL",
+				"sim_2_num_profiles:1", "sim_2_0_iccid:2", "sim_2_0_pin:2222",
+				"sim_2_0_puk:49830420", "sim_2_0_carrier_name:NETWORK_ATT",
+				"sim_2_0_own_number:6507891159",
+			},
 		},
 		{
 			Addr:            "[0:0:0:0:0:ffff:7f00:1]:2",
@@ -116,6 +124,34 @@
 								Port:    9996,
 							},
 						},
+						SimInfos: []*labapi.SIMInfo{
+							{
+								SlotId: 1,
+								Type:   *labapi.SIMType_SIM_UNKNOWN.Enum(),
+								ProfileInfo: []*labapi.SIMProfileInfo{
+									{
+										Iccid:       "1",
+										SimPin:      "1111",
+										SimPuk:      "49830420",
+										CarrierName: *labapi.NetworkProvider_NETWORK_TMOBILE.Enum(),
+										OwnNumber:   "6507891159",
+									},
+								},
+							},
+							{
+								SlotId: 2,
+								Type:   *labapi.SIMType_SIM_PHYSICAL.Enum(),
+								ProfileInfo: []*labapi.SIMProfileInfo{
+									{
+										Iccid:       "2",
+										SimPin:      "2222",
+										SimPuk:      "49830420",
+										CarrierName: *labapi.NetworkProvider_NETWORK_ATT.Enum(),
+										OwnNumber:   "6507891159",
+									},
+								},
+							},
+						},
 					},
 				},
 			},
@@ -210,6 +246,14 @@
 			HwIDList:            []string{"hwid_component:hwid123"},
 			CacheServer:         "cache1:8001",
 			HWID:                "Atlas 123-34",
+			SimInfos: []string{
+				"sim_slot_id:1", "sim_1_num_profiles:1", "sim_1_0_iccid:1", "sim_1_0_pin:1111",
+				"sim_1_0_puk:49830420", "sim_1_0_carrier_name:NETWORK_TMOBILE",
+				"sim_1_0_own_number:6507891159", "sim_slot_id:2", "sim_2_type:SIM_PHYSICAL",
+				"sim_2_num_profiles:1", "sim_2_0_iccid:2", "sim_2_0_pin:2222",
+				"sim_2_0_puk:49830420", "sim_2_0_carrier_name:NETWORK_ATT",
+				"sim_2_0_own_number:6507891159",
+			},
 		},
 	}
 	input := []*api.CrosTestRequest_Device{
@@ -257,6 +301,34 @@
 						Sku:           "123",
 						HwidComponent: []string{"hwid123"},
 						Hwid:          "Atlas 123-34",
+						SimInfos: []*labapi.SIMInfo{
+							{
+								SlotId: 1,
+								Type:   *labapi.SIMType_SIM_UNKNOWN.Enum(),
+								ProfileInfo: []*labapi.SIMProfileInfo{
+									{
+										Iccid:       "1",
+										SimPin:      "1111",
+										SimPuk:      "49830420",
+										CarrierName: *labapi.NetworkProvider_NETWORK_TMOBILE.Enum(),
+										OwnNumber:   "6507891159",
+									},
+								},
+							},
+							{
+								SlotId: 2,
+								Type:   *labapi.SIMType_SIM_PHYSICAL.Enum(),
+								ProfileInfo: []*labapi.SIMProfileInfo{
+									{
+										Iccid:       "2",
+										SimPin:      "2222",
+										SimPuk:      "49830420",
+										CarrierName: *labapi.NetworkProvider_NETWORK_ATT.Enum(),
+										OwnNumber:   "6507891159",
+									},
+								},
+							},
+						},
 					},
 				},
 				CacheServer: &labapi.CacheServer{Address: &labapi.IpEndpoint{Address: "cache1", Port: 8001}},