func isNeedUpdate()

in pkg/controller/service/listeners.go [651:883]


func isNeedUpdate(reqCtx *RequestContext, local model.ListenerAttribute, remote model.ListenerAttribute) (bool, model.ListenerAttribute) {
	update := deepcopy.Copy(remote).(model.ListenerAttribute)
	needUpdate := false
	updateDetail := ""

	if remote.Description != local.Description {
		needUpdate = true
		update.Description = local.Description
		updateDetail += fmt.Sprintf("Description changed: %v - %v ;",
			remote.Description, local.Description)
	}
	if remote.VGroupId != local.VGroupId {
		needUpdate = true
		update.VGroupId = local.VGroupId
		updateDetail += fmt.Sprintf("VGroupId changed: %v - %v ;",
			remote.VGroupId, local.VGroupId)
	}
	if local.Scheduler != "" &&
		remote.Scheduler != local.Scheduler {
		needUpdate = true
		update.Scheduler = local.Scheduler
		updateDetail += fmt.Sprintf("Scheduler changed: %v - %v ;",
			remote.Scheduler, local.Scheduler)
	}
	if local.Protocol == model.TCP &&
		local.PersistenceTimeout != nil && remote.PersistenceTimeout != nil &&
		*remote.PersistenceTimeout != *local.PersistenceTimeout {
		needUpdate = true
		update.PersistenceTimeout = local.PersistenceTimeout
		updateDetail += fmt.Sprintf("PersistenceTimeout changed: %v - %v ;",
			*remote.PersistenceTimeout, *local.PersistenceTimeout)
	}
	// The cert id is necessary for https, so skip to check whether it is blank
	if local.Protocol == model.HTTPS &&
		remote.CertId != local.CertId {
		needUpdate = true
		update.CertId = local.CertId
		updateDetail += fmt.Sprintf("CertId changed: %v - %v ;",
			remote.CertId, local.CertId)
	}
	if local.Protocol == model.HTTPS &&
		local.EnableHttp2 != "" &&
		remote.EnableHttp2 != local.EnableHttp2 {
		needUpdate = true
		update.EnableHttp2 = local.EnableHttp2
		updateDetail += fmt.Sprintf("EnableHttp2 changed: %v - %v ;",
			remote.EnableHttp2, local.EnableHttp2)
	}
	// acl
	if local.AclStatus != "" &&
		remote.AclStatus != local.AclStatus {
		needUpdate = true
		update.AclStatus = local.AclStatus
		updateDetail += fmt.Sprintf("AclStatus changed: %v - %v ;",
			remote.AclStatus, local.AclStatus)
	}
	if local.AclStatus == model.OnFlag &&
		local.AclId != "" &&
		remote.AclId != local.AclId {
		needUpdate = true
		update.AclId = local.AclId
		updateDetail += fmt.Sprintf("AclId changed: %v - %v ;",
			remote.AclId, local.AclId)
	}
	if local.AclStatus == model.OnFlag &&
		local.AclType != "" &&
		remote.AclType != local.AclType {
		needUpdate = true
		update.AclType = local.AclType
		updateDetail += fmt.Sprintf("AclType changed: %v - %v ;",
			remote.AclType, local.AclType)
	}
	// idle timeout
	if Is7LayerProtocol(local.Protocol) &&
		local.IdleTimeout != 0 &&
		remote.IdleTimeout != local.IdleTimeout {
		needUpdate = true
		update.IdleTimeout = local.IdleTimeout
		updateDetail += fmt.Sprintf("IdleTimeout changed: %v - %v ;",
			remote.IdleTimeout, local.IdleTimeout)
	}
	// session
	if Is7LayerProtocol(local.Protocol) &&
		local.StickySession != "" &&
		remote.StickySession != local.StickySession {
		needUpdate = true
		update.StickySession = local.StickySession
		updateDetail += fmt.Sprintf("StickySession changed: %v - %v ;",
			remote.StickySession, local.StickySession)
	}
	if Is7LayerProtocol(local.Protocol) &&
		local.StickySessionType != "" &&
		remote.StickySessionType != local.StickySessionType {
		needUpdate = true
		update.StickySessionType = local.StickySessionType
		updateDetail += fmt.Sprintf("StickySessionType changed: %v - %v ;",
			remote.StickySessionType, local.StickySessionType)
	}
	if Is7LayerProtocol(local.Protocol) &&
		local.Cookie != "" &&
		remote.Cookie != local.Cookie {
		needUpdate = true
		update.Cookie = local.Cookie
		updateDetail += fmt.Sprintf("Cookie changed: %v - %v ;",
			remote.Cookie, local.Cookie)
	}
	if Is7LayerProtocol(local.Protocol) &&
		local.CookieTimeout != 0 &&
		remote.CookieTimeout != local.CookieTimeout {
		needUpdate = true
		update.CookieTimeout = local.CookieTimeout
		updateDetail += fmt.Sprintf("CookieTimeout changed: %v - %v ;",
			remote.CookieTimeout, local.CookieTimeout)
	}
	// connection drain
	if Is4LayerProtocol(local.Protocol) &&
		local.ConnectionDrain != "" &&
		remote.ConnectionDrain != local.ConnectionDrain {
		needUpdate = true
		update.ConnectionDrain = local.ConnectionDrain
		updateDetail += fmt.Sprintf("ConnectionDrain changed: %v - %v ;",
			remote.ConnectionDrain, local.ConnectionDrain)
	}
	if Is4LayerProtocol(local.Protocol) &&
		local.ConnectionDrain == model.OnFlag &&
		local.ConnectionDrainTimeout != 0 &&
		remote.ConnectionDrainTimeout != local.ConnectionDrainTimeout {
		needUpdate = true
		update.ConnectionDrainTimeout = local.ConnectionDrainTimeout
		updateDetail += fmt.Sprintf("ConnectionDrainTimeout changed: %v - %v ;",
			remote.ConnectionDrainTimeout, local.ConnectionDrainTimeout)
	}

	//x-forwarded-for
	if Is7LayerProtocol(local.Protocol) &&
		local.XForwardedForProto != "" &&
		remote.XForwardedForProto != local.XForwardedForProto {
		needUpdate = true
		update.XForwardedForProto = local.XForwardedForProto
		updateDetail += fmt.Sprintf("XForwardedForProto changed: %v - %v ;",
			remote.XForwardedForProto, local.XForwardedForProto)
	}

	// health check
	if local.HealthCheckConnectPort != 0 &&
		remote.HealthCheckConnectPort != local.HealthCheckConnectPort {
		needUpdate = true
		update.HealthCheckConnectPort = local.HealthCheckConnectPort
		updateDetail += fmt.Sprintf("HealthCheckConnectPort changed: %v - %v ;",
			remote.HealthCheckConnectPort, local.HealthCheckConnectPort)
	}
	if local.HealthCheckInterval != 0 &&
		remote.HealthCheckInterval != local.HealthCheckInterval {
		needUpdate = true
		update.HealthCheckInterval = local.HealthCheckInterval
		updateDetail += fmt.Sprintf("HealthCheckInterval changed: %v - %v ;",
			remote.HealthCheckInterval, local.HealthCheckInterval)
	}
	if local.HealthyThreshold != 0 &&
		remote.HealthyThreshold != local.HealthyThreshold {
		needUpdate = true
		update.HealthyThreshold = local.HealthyThreshold
		updateDetail += fmt.Sprintf("HealthyThreshold changed: %v - %v ;",
			remote.HealthyThreshold, local.HealthyThreshold)
	}
	if local.UnhealthyThreshold != 0 &&
		remote.UnhealthyThreshold != local.UnhealthyThreshold {
		needUpdate = true
		update.UnhealthyThreshold = local.UnhealthyThreshold
		updateDetail += fmt.Sprintf("UnhealthyThreshold changed: %v - %v ;",
			remote.UnhealthyThreshold, local.UnhealthyThreshold)
	}
	if local.Protocol == model.TCP &&
		local.HealthCheckType != "" &&
		remote.HealthCheckType != local.HealthCheckType {
		needUpdate = true
		update.HealthCheckType = local.HealthCheckType
		updateDetail += fmt.Sprintf("HealthCheckType changed: %v - %v ;",
			remote.HealthCheckType, local.HealthCheckType)
	}
	if local.Protocol != model.UDP &&
		local.HealthCheckDomain != "" &&
		remote.HealthCheckDomain != local.HealthCheckDomain {
		needUpdate = true
		update.HealthCheckDomain = local.HealthCheckDomain
		updateDetail += fmt.Sprintf("HealthCheckDomain changed: %v - %v ;",
			remote.HealthCheckDomain, local.HealthCheckDomain)
	}
	if local.Protocol != model.UDP &&
		local.HealthCheckURI != "" &&
		remote.HealthCheckURI != local.HealthCheckURI {
		needUpdate = true
		update.HealthCheckURI = local.HealthCheckURI
		updateDetail += fmt.Sprintf("HealthCheckURI changed: %v - %v ;",
			remote.HealthCheckURI, local.HealthCheckURI)
	}
	if local.Protocol != model.UDP &&
		local.HealthCheckHttpCode != "" &&
		remote.HealthCheckHttpCode != local.HealthCheckHttpCode {
		needUpdate = true
		update.HealthCheckHttpCode = local.HealthCheckHttpCode
		updateDetail += fmt.Sprintf("HealthCheckHttpCode changed: %v - %v ;",
			remote.HealthCheckHttpCode, local.HealthCheckHttpCode)
	}
	if Is4LayerProtocol(local.Protocol) &&
		local.HealthCheckConnectTimeout != 0 &&
		remote.HealthCheckConnectTimeout != local.HealthCheckConnectTimeout {
		needUpdate = true
		update.HealthCheckConnectTimeout = local.HealthCheckConnectTimeout
		updateDetail += fmt.Sprintf("HealthCheckConnectTimeout changed: %v - %v ;",
			remote.HealthCheckConnectTimeout, local.HealthCheckConnectTimeout)
	}
	if Is7LayerProtocol(local.Protocol) &&
		local.HealthCheck != "" &&
		remote.HealthCheck != local.HealthCheck {
		needUpdate = true
		update.HealthCheck = local.HealthCheck
		updateDetail += fmt.Sprintf("HealthCheck changed: %v - %v ;",
			remote.HealthCheck, local.HealthCheck)
	}
	if Is7LayerProtocol(local.Protocol) &&
		local.HealthCheckTimeout != 0 &&
		remote.HealthCheckTimeout != local.HealthCheckTimeout {
		needUpdate = true
		update.HealthCheckTimeout = local.HealthCheckTimeout
		updateDetail += fmt.Sprintf("HealthCheckTimeout changed: %v - %v ;",
			remote.HealthCheckTimeout, local.HealthCheckTimeout)
	}

	reqCtx.Ctx = context.WithValue(reqCtx.Ctx, dryrun.ContextMessage, updateDetail)
	reqCtx.Log.Info(fmt.Sprintf("try to update listener %d, detail %s", local.ListenerPort, updateDetail))
	return needUpdate, update
}