in pkg/controller/service/vgroups.go [465:537]
func (mgr *VGroupManager) buildVGroupForServicePort(reqCtx *RequestContext, port v1.ServicePort,
candidates *EndpointWithENI, isUserManagedLB bool) (model.VServerGroup, error) {
vg := model.VServerGroup{
NamedKey: getVGroupNamedKey(reqCtx.Service, port),
ServicePort: port,
}
vg.VGroupName = vg.NamedKey.Key()
if isUserManagedLB && reqCtx.Anno.Get(VGroupPort) != "" {
vgroupId, err := vgroup(reqCtx.Anno.Get(VGroupPort), port)
if err != nil {
return vg, fmt.Errorf("vgroupid parse error: %s", err.Error())
}
if vgroupId != "" {
// check vgroup id is existed
_, err = mgr.cloud.DescribeVServerGroupAttribute(reqCtx.Ctx, vgroupId)
if err != nil {
return vg, fmt.Errorf("cannot find vgroup by vgroupId %s error: %s", vgroupId, err.Error())
}
reqCtx.Log.Info(fmt.Sprintf("user managed vgroupId %s for port %d", vgroupId, port.Port))
vg.VGroupId = vgroupId
vg.IsUserManaged = true
}
if reqCtx.Anno.Get(VGroupWeight) != "" {
w, err := strconv.Atoi(reqCtx.Anno.Get(VGroupWeight))
if err != nil || w < 0 || w > 100 {
return vg, fmt.Errorf("weight must be integer in range [0,100] , got [%s]", reqCtx.Anno.Get(VGroupWeight))
}
vg.VGroupWeight = &w
}
}
// build backends
var (
backends []model.BackendAttribute
err error
)
switch candidates.TrafficPolicy {
case ENITrafficPolicy:
reqCtx.Log.Info(fmt.Sprintf("eni mode, build backends for %s", vg.NamedKey))
backends, err = mgr.buildENIBackends(candidates, vg)
if err != nil {
return vg, fmt.Errorf("build eni backends error: %s", err.Error())
}
case LocalTrafficPolicy:
reqCtx.Log.Info(fmt.Sprintf("local mode, build backends for %s", vg.NamedKey))
backends, err = mgr.buildLocalBackends(reqCtx, candidates, vg)
if err != nil {
return vg, fmt.Errorf("build local backends error: %s", err.Error())
}
case ClusterTrafficPolicy:
reqCtx.Log.Info(fmt.Sprintf("cluster mode, build backends for %s", vg.NamedKey))
backends, err = mgr.buildClusterBackends(reqCtx, candidates, vg)
if err != nil {
return vg, fmt.Errorf("build cluster backends error: %s", err.Error())
}
default:
return vg, fmt.Errorf("not supported traffic policy [%s]", candidates.TrafficPolicy)
}
if len(backends) == 0 {
reqCtx.Recorder.Event(
reqCtx.Service,
v1.EventTypeNormal,
helper.UnAvailableBackends,
"There are no available nodes for LoadBalancer",
)
}
vg.Backends = backends
return vg, nil
}