@@ -43,7 +43,6 @@ It's possible to override some defaults, by setting the following environment va
43
43
KUBEBUILDER_CONTROLPLANE_START_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s.
44
44
KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s.
45
45
KUBEBUILDER_ATTACH_CONTROL_PLANE_OUTPUT (boolean): if set to true, the control plane's stdout and stderr are attached to os.Stdout and os.Stderr
46
-
47
46
*/
48
47
const (
49
48
envUseExistingCluster = "USE_EXISTING_CLUSTER"
@@ -62,14 +61,19 @@ const (
62
61
defaultKubebuilderControlPlaneStopTimeout = 20 * time .Second
63
62
)
64
63
65
- // Default binary path for test framework
66
- func defaultAssetPath (binary string ) string {
67
- assetPath := os .Getenv (envKubebuilderPath )
68
- if assetPath == "" {
69
- assetPath = defaultKubebuilderPath
64
+ // getBinAssetPath will return the path for the binary informed or an error if not be possible.
65
+ // to find the bin.
66
+ func (te * Environment ) getBinAssetPath (binary string ) string {
67
+ if hasBinary (binary , te .BinaryDirectoryPath ) {
68
+ return filepath .Join (te .BinaryDirectoryPath , binary )
69
+ }
70
+
71
+ valueFromEnvVar := os .Getenv (envKubebuilderPath )
72
+ if hasBinary (binary , valueFromEnvVar ) {
73
+ return filepath .Join (valueFromEnvVar , binary )
70
74
}
71
- return filepath .Join (assetPath , binary )
72
75
76
+ return filepath .Join (defaultKubebuilderPath , binary )
73
77
}
74
78
75
79
// ControlPlane is the re-exported ControlPlane type from the internal integration package
@@ -113,6 +117,10 @@ type Environment struct {
113
117
// values are merged.
114
118
CRDDirectoryPaths []string
115
119
120
+ // BinaryDirectoryPath is the path where the binaries required for the envtest are
121
+ // locate in the environment
122
+ BinaryDirectoryPath string
123
+
116
124
// UseExisting indicates that this environments should use an
117
125
// existing kubeconfig, instead of trying to stand up a new control plane.
118
126
// This is useful in cases that need aggregated API servers and the like.
@@ -217,14 +225,14 @@ func (te *Environment) Start() (*rest.Config, error) {
217
225
}
218
226
219
227
if os .Getenv (envKubeAPIServerBin ) == "" {
220
- te .ControlPlane .APIServer .Path = defaultAssetPath ("kube-apiserver" )
228
+ te .ControlPlane .APIServer .Path = te . getBinAssetPath ("kube-apiserver" )
221
229
}
222
230
if os .Getenv (envEtcdBin ) == "" {
223
- te .ControlPlane .Etcd .Path = defaultAssetPath ("etcd" )
231
+ te .ControlPlane .Etcd .Path = te . getBinAssetPath ("etcd" )
224
232
}
225
233
if os .Getenv (envKubectlBin ) == "" {
226
234
// we can't just set the path manually (it's behind a function), so set the environment variable instead
227
- if err := os .Setenv (envKubectlBin , defaultAssetPath ("kubectl" )); err != nil {
235
+ if err := os .Setenv (envKubectlBin , te . getBinAssetPath ("kubectl" )); err != nil {
228
236
return nil , err
229
237
}
230
238
}
@@ -267,6 +275,14 @@ func (te *Environment) Start() (*rest.Config, error) {
267
275
return te .Config , err
268
276
}
269
277
278
+ // hasBinary will return true when the binary was found in the path
279
+ func hasBinary (bin , path string ) bool {
280
+ if _ , err := os .Stat (filepath .Join (path , bin )); os .IsNotExist (err ) {
281
+ return false
282
+ }
283
+ return true
284
+ }
285
+
270
286
func (te * Environment ) startControlPlane () error {
271
287
numTries , maxRetries := 0 , 5
272
288
var err error
0 commit comments