使用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
}
欢迎在评论区留下你宝贵的意见,不论好坏都是我前进的动力(cnblogs 排名提升)!
如果喜欢,记得点赞、推荐、关注、收藏、转发 ... ;)