github.com/cilium/cilium@v1.16.2/pkg/envoy/versioncheck.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package envoy
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"strings"
    10  
    11  	"github.com/cilium/cilium/pkg/time"
    12  )
    13  
    14  // requiredEnvoyVersionSHA is set during build
    15  // Running Envoy version will be checked against `requiredEnvoyVersionSHA`.
    16  // By default, cilium-agent will fail to start if there is a version mismatch.
    17  var requiredEnvoyVersionSHA string
    18  
    19  func checkEnvoyVersion(envoyVersionFunc func() (string, error)) error {
    20  	envoyVersion, err := envoyVersionFunc()
    21  	if err != nil {
    22  		return fmt.Errorf("failed to retrieve Envoy version: %w", err)
    23  	}
    24  
    25  	log.Infof("Envoy: Version %s", envoyVersion)
    26  
    27  	// Make sure Envoy version matches the required one
    28  	if !strings.HasPrefix(envoyVersion, requiredEnvoyVersionSHA) {
    29  		return fmt.Errorf("envoy version %s does not match with required version %s", envoyVersion, requiredEnvoyVersionSHA)
    30  	}
    31  
    32  	log.Debugf("Envoy: Envoy version %s is matching required version %s", envoyVersion, requiredEnvoyVersionSHA)
    33  
    34  	return nil
    35  }
    36  
    37  func getRemoteEnvoyVersion(envoyAdminClient *EnvoyAdminClient) (string, error) {
    38  	const versionRetryAttempts = 20
    39  	const versionRetryWait = 500 * time.Millisecond
    40  
    41  	// Retry is necessary because Envoy might not be ready yet
    42  	for i := 0; i <= versionRetryAttempts; i++ {
    43  		envoyVersion, err := envoyAdminClient.GetEnvoyVersion()
    44  		if err != nil {
    45  			if i < versionRetryAttempts {
    46  				log.Info("Envoy: Unable to retrieve Envoy version - retry")
    47  				time.Sleep(versionRetryWait)
    48  				continue
    49  			}
    50  			return "", fmt.Errorf("failed to retrieve Envoy version: %w", err)
    51  		}
    52  
    53  		return envoyVersion, nil
    54  	}
    55  
    56  	return "", errors.New("failed to retrieve Envoy version")
    57  }