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 }