blob: 32c973b5725220c1ada0e4dfa09eb4473ab9e33a [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package swarming
import (
"fmt"
"strings"
"infra/libs/skylab/inventory"
)
func init() {
converters = append(converters, basicConverter)
reverters = append(reverters, basicReverter)
}
func basicConverter(dims Dimensions, ls *inventory.SchedulableLabels) {
if v := ls.GetBoard(); v != "" {
dims["label-board"] = []string{v}
}
if v := ls.GetModel(); v != "" {
dims["label-model"] = []string{v}
}
if v := ls.GetSku(); v != "" {
dims["label-sku"] = []string{v}
}
if v := ls.GetHwidSku(); v != "" {
dims["label-hwid_sku"] = []string{v}
}
if v := ls.GetBrand(); v != "" {
dims["label-brand"] = []string{v}
}
if v := ls.GetPlatform(); v != "" {
dims["label-platform"] = []string{v}
}
if v := ls.GetReferenceDesign(); v != "" {
dims["label-reference_design"] = []string{v}
}
if v := ls.GetWifiChip(); v != "" {
dims["label-wifi_chip"] = []string{v}
}
if v := ls.GetEcType(); v != inventory.SchedulableLabels_EC_TYPE_INVALID {
dims["label-ec_type"] = []string{v.String()}
}
if v := ls.GetOsType(); v != inventory.SchedulableLabels_OS_TYPE_INVALID {
dims["label-os_type"] = []string{v.String()}
}
if v := ls.GetPhase(); v != inventory.SchedulableLabels_PHASE_INVALID {
dims["label-phase"] = []string{v.String()}
}
for _, v := range ls.GetVariant() {
if v != "" {
appendDim(dims, "label-variant", v)
}
}
for _, c := range ls.GetHwidComponent() {
if strings.HasPrefix(c, "cellular/") {
if v := strings.Split(c, "/")[1]; v != "" {
dims["label-cellular_modem"] = []string{v}
}
}
}
}
func basicReverter(ls *inventory.SchedulableLabels, d Dimensions) Dimensions {
d = assignLastStringValueAndDropKey(d, ls.Board, "label-board")
d = assignLastStringValueAndDropKey(d, ls.Model, "label-model")
d = assignLastStringValueAndDropKey(d, ls.Sku, "label-sku")
d = assignLastStringValueAndDropKey(d, ls.HwidSku, "label-hwid_sku")
d = assignLastStringValueAndDropKey(d, ls.Brand, "label-brand")
d = assignLastStringValueAndDropKey(d, ls.Platform, "label-platform")
d = assignLastStringValueAndDropKey(d, ls.ReferenceDesign, "label-reference_design")
d = assignLastStringValueAndDropKey(d, ls.WifiChip, "label-wifi_chip")
if v, ok := getLastStringValue(d, "label-cellular_modem"); ok {
ls.HwidComponent = append(ls.HwidComponent, fmt.Sprintf("cellular/%s", v))
delete(d, "label-cellular_modem")
}
if v, ok := getLastStringValue(d, "label-ec_type"); ok {
if ec, ok := inventory.SchedulableLabels_ECType_value[v]; ok {
*ls.EcType = inventory.SchedulableLabels_ECType(ec)
}
delete(d, "label-ec_type")
}
if v, ok := getLastStringValue(d, "label-os_type"); ok {
if ot, ok := inventory.SchedulableLabels_OSType_value[v]; ok {
*ls.OsType = inventory.SchedulableLabels_OSType(ot)
}
delete(d, "label-os_type")
}
if v, ok := getLastStringValue(d, "label-phase"); ok {
if p, ok := inventory.SchedulableLabels_Phase_value[v]; ok {
*ls.Phase = inventory.SchedulableLabels_Phase(p)
}
delete(d, "label-phase")
}
ls.Variant = append(ls.Variant, d["label-variant"]...)
delete(d, "label-variant")
return d
}
func assignLastStringValueAndDropKey(d Dimensions, to *string, key string) Dimensions {
if v, ok := getLastStringValue(d, key); ok {
*to = v
}
delete(d, key)
return d
}
func getLastStringValue(d Dimensions, key string) (string, bool) {
if vs, ok := d[key]; ok {
if len(vs) > 0 {
return vs[len(vs)-1], true
}
return "", false
}
return "", false
}
func assignLastBoolValueAndDropKey(d Dimensions, to *bool, key string) Dimensions {
if v, ok := getLastBoolValue(d, key); ok {
*to = v
}
delete(d, key)
return d
}
func getLastBoolValue(d Dimensions, key string) (bool, bool) {
if s, ok := getLastStringValue(d, key); ok {
return strings.ToLower(s) == "true", true
}
return false, false
}