使用golang为k8s结构体的labels属性进行赋值

通过反射给k8s的kind类型对象增加label信息

func AddLabels(kind interface{}, labels map[string]string) interface{} {
    origin := reflect.ValueOf(kind)
    if origin.Kind() == reflect.Ptr {
        origin = origin.Elem()
    }

    // 实例化一个新对象用于返回值,不能直接在“reflect.ValueOf”获取的值上进行set,会报错误 “”
    result := reflect.New(origin.Type()).Elem() // 实例
    result.Set(origin)                          // 赋值

    // deployment的时候需要给templte 中的labels 进行赋值
    if origin.FieldByName("Kind").String() == "Deployment" {
        tmpLabels := origin.FieldByName("Spec").FieldByName("Template").FieldByName("Labels").
            Interface().(map[string]string)
        if tmpLabels == nil {
            tmpLabels = make(map[string]string)
        }
        for key, value := range labels {
            relValue := filterSpecialCharacters4LabelValue(value)
            tmpLabels[key] = relValue
        }
        result.FieldByName("Spec").FieldByName("Template").FieldByName("Labels").
            Set(reflect.ValueOf(tmpLabels))
    }

    // 原类型中的labels赋值
    objMeta := origin.FieldByName("ObjectMeta").Interface().(v1.ObjectMeta)
    for key, value := range labels {
        relValue := filterSpecialCharacters4LabelValue(value)
        v1.SetMetaDataLabel(&objMeta, key, relValue)
    }
    result.FieldByName("ObjectMeta").Set(reflect.ValueOf(objMeta))

    return result.Interface()
}

// 过滤掉label value不支持的字符
func filterSpecialCharacters4LabelValue(content string) string {
    reg, _ := regexp.Compile(`[^-A-Za-z0-9_.]`)
    relValue := reg.ReplaceAllString(content, "-")

    regFirstAnEnd, _ := regexp.Compile(`^[^A-Za-z0-9]|[^A-Za-z0-9]$`)
    relValue = regFirstAnEnd.ReplaceAllString(relValue, "0")

    return relValue
}
posted @ 2022-10-12 16:48  远方V3  阅读(73)  评论(0编辑  收藏  举报