func()

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
}