in pkg/backends/syncer.go [71:135]
func (s *backendSyncer) ensureBackendService(sp utils.ServicePort) error {
// We must track the ports even if creating the backends failed, because
// we might've created health-check for them.
be := &composite.BackendService{}
beName := sp.BackendName()
version := features.VersionFromServicePort(&sp)
scope := features.ScopeFromServicePort(&sp)
be, getErr := s.backendPool.Get(beName, version, scope)
// Ensure health check for backend service exists.
hcLink, err := s.ensureHealthCheck(sp)
if err != nil {
return fmt.Errorf("error ensuring health check: %w", err)
}
// Verify existence of a backend service for the proper port
// but do not specify any backends for it (IG / NEG).
if getErr != nil {
if !utils.IsNotFoundError(getErr) {
return getErr
}
// Only create the backend service if the error was 404.
klog.V(2).Infof("Creating backend service for port %v named %v", sp.NodePort, beName)
be, err = s.backendPool.Create(sp, hcLink)
if err != nil {
return err
}
}
needUpdate := ensureProtocol(be, sp)
needUpdate = ensureHealthCheckLink(be, hcLink) || needUpdate
needUpdate = ensureDescription(be, &sp) || needUpdate
if sp.BackendConfig != nil {
needUpdate = features.EnsureCDN(sp, be) || needUpdate
needUpdate = features.EnsureIAP(sp, be) || needUpdate
needUpdate = features.EnsureTimeout(sp, be) || needUpdate
needUpdate = features.EnsureDraining(sp, be) || needUpdate
needUpdate = features.EnsureAffinity(sp, be) || needUpdate
needUpdate = features.EnsureCustomRequestHeaders(sp, be) || needUpdate
needUpdate = features.EnsureLogging(sp, be) || needUpdate
}
if needUpdate {
if err := s.backendPool.Update(be); err != nil {
return err
}
}
if err := s.ensureBackendSignedUrlKeys(sp, be); err != nil {
return err
}
if sp.BackendConfig != nil {
// Scope is used to validate if cloud armor security policy feature is
// available. meta.Key is not needed as security policy supported only for
// global backends.
be.Scope = scope
if err := features.EnsureSecurityPolicy(s.cloud, sp, be); err != nil {
return err
}
}
return nil
}