in pkg/controller/service/loadbalancer.go [80:197]
func (mgr *LoadBalancerManager) Update(reqCtx *RequestContext, local, remote *model.LoadBalancer) error {
lbId := remote.LoadBalancerAttribute.LoadBalancerId
reqCtx.Log.Info(fmt.Sprintf("found load balancer [%s], try to update load balancer attribute", lbId))
// update tag
var tag model.Tag
if local.LoadBalancerAttribute.IsUserManaged {
tag = model.Tag{TagKey: REUSEKEY, TagValue: "true"}
} else {
tag = model.Tag{TagKey: TAGKEY, TagValue: reqCtx.Anno.GetDefaultLoadBalancerName()}
}
if err := mgr.addTagIfNotExist(reqCtx, *remote, tag); err != nil {
return fmt.Errorf("AddTags: %s", err.Error())
}
if local.LoadBalancerAttribute.MasterZoneId != "" &&
local.LoadBalancerAttribute.MasterZoneId != remote.LoadBalancerAttribute.MasterZoneId {
return fmt.Errorf("alicloud: can not change LoadBalancer master zone id once created")
}
if local.LoadBalancerAttribute.SlaveZoneId != "" &&
local.LoadBalancerAttribute.SlaveZoneId != remote.LoadBalancerAttribute.SlaveZoneId {
return fmt.Errorf("alicloud: can not change LoadBalancer slave zone id once created")
}
if local.LoadBalancerAttribute.AddressType != "" &&
local.LoadBalancerAttribute.AddressType != remote.LoadBalancerAttribute.AddressType {
return fmt.Errorf("alicloud: can not change LoadBalancer AddressType once created. delete and retry")
}
if !equalsAddressIPVersion(local.LoadBalancerAttribute.AddressIPVersion, remote.LoadBalancerAttribute.AddressIPVersion) {
return fmt.Errorf("alicloud: can not change LoadBalancer AddressIPVersion once created")
}
if local.LoadBalancerAttribute.ResourceGroupId != "" &&
local.LoadBalancerAttribute.ResourceGroupId != remote.LoadBalancerAttribute.ResourceGroupId {
return fmt.Errorf("alicloud: can not change ResourceGroupId once created")
}
// update chargeType & bandwidth
needUpdate, charge, bandwidth := false, remote.LoadBalancerAttribute.InternetChargeType, remote.LoadBalancerAttribute.Bandwidth
if local.LoadBalancerAttribute.InternetChargeType != "" &&
local.LoadBalancerAttribute.InternetChargeType != remote.LoadBalancerAttribute.InternetChargeType {
needUpdate = true
charge = local.LoadBalancerAttribute.InternetChargeType
reqCtx.Log.Info(fmt.Sprintf("update lb: internet chargeType changed([%s] - [%s])",
remote.LoadBalancerAttribute.InternetChargeType, local.LoadBalancerAttribute.InternetChargeType),
"lbId", lbId)
}
if local.LoadBalancerAttribute.Bandwidth != 0 &&
local.LoadBalancerAttribute.Bandwidth != remote.LoadBalancerAttribute.Bandwidth &&
local.LoadBalancerAttribute.InternetChargeType == model.PayByBandwidth {
needUpdate = true
bandwidth = local.LoadBalancerAttribute.Bandwidth
reqCtx.Log.Info(fmt.Sprintf("update lb: bandwidth changed([%d] - [%d])",
remote.LoadBalancerAttribute.Bandwidth, local.LoadBalancerAttribute.Bandwidth),
"lbId", lbId)
}
if needUpdate {
if remote.LoadBalancerAttribute.AddressType == model.InternetAddressType {
reqCtx.Log.Info(fmt.Sprintf("update lb: modify loadbalancer: chargeType=%s, bandwidth=%d", charge, bandwidth),
"lbId", lbId)
if err := mgr.cloud.ModifyLoadBalancerInternetSpec(reqCtx.Ctx, lbId, string(charge), bandwidth); err != nil {
return fmt.Errorf("ModifyLoadBalancerInternetSpec: %s", err.Error())
}
} else {
reqCtx.Log.Info("update lb: only internet loadbalancer is allowed to modify bandwidth and pay type",
"lbId", lbId)
}
}
// update instance spec
if local.LoadBalancerAttribute.LoadBalancerSpec != "" &&
local.LoadBalancerAttribute.LoadBalancerSpec != remote.LoadBalancerAttribute.LoadBalancerSpec {
reqCtx.Log.Info(fmt.Sprintf("update lb: loadbalancerSpec changed ([%s] - [%s])",
remote.LoadBalancerAttribute.LoadBalancerSpec, local.LoadBalancerAttribute.LoadBalancerSpec),
"lbId", lbId)
if err := mgr.cloud.ModifyLoadBalancerInstanceSpec(reqCtx.Ctx, lbId,
string(local.LoadBalancerAttribute.LoadBalancerSpec)); err != nil {
return fmt.Errorf("ModifyLoadBalancerInstanceSpec: %s", err.Error())
}
}
// update slb delete protection
if local.LoadBalancerAttribute.DeleteProtection != "" &&
local.LoadBalancerAttribute.DeleteProtection != remote.LoadBalancerAttribute.DeleteProtection {
reqCtx.Log.Info(fmt.Sprintf("update lb: delete protection changed([%s] - [%s])",
remote.LoadBalancerAttribute.DeleteProtection, local.LoadBalancerAttribute.DeleteProtection),
"lbId", lbId)
if err := mgr.cloud.SetLoadBalancerDeleteProtection(reqCtx.Ctx, lbId,
string(local.LoadBalancerAttribute.DeleteProtection)); err != nil {
return fmt.Errorf("SetLoadBalancerDeleteProtection: %s", err.Error())
}
}
// update modification protection
if local.LoadBalancerAttribute.ModificationProtectionStatus != "" &&
local.LoadBalancerAttribute.ModificationProtectionStatus != remote.LoadBalancerAttribute.ModificationProtectionStatus {
reqCtx.Log.WithName(lbId).Info(fmt.Sprintf("update lb: loadbalancer modification protection changed([%s] - [%s])",
remote.LoadBalancerAttribute.ModificationProtectionStatus,
local.LoadBalancerAttribute.ModificationProtectionStatus),
"lbId", lbId)
if err := mgr.cloud.SetLoadBalancerModificationProtection(reqCtx.Ctx, lbId,
string(local.LoadBalancerAttribute.ModificationProtectionStatus)); err != nil {
return fmt.Errorf("SetLoadBalancerModificationProtection: %s", err.Error())
}
}
// update slb name
// only user defined slb or slb which has "kubernetes.do.not.delete" tag can update name
if local.LoadBalancerAttribute.LoadBalancerName != "" &&
local.LoadBalancerAttribute.LoadBalancerName != remote.LoadBalancerAttribute.LoadBalancerName {
reqCtx.Log.Info(fmt.Sprintf("update lb: loadbalancer name changed([%s]-[%s])",
remote.LoadBalancerAttribute.LoadBalancerName, local.LoadBalancerAttribute.LoadBalancerName),
"lbId", lbId)
if err := mgr.cloud.SetLoadBalancerName(reqCtx.Ctx, lbId,
local.LoadBalancerAttribute.LoadBalancerName); err != nil {
return fmt.Errorf("SetLoadBalancerName: %s", err.Error())
}
}
return nil
}