in internal/testutil/testutil.go [123:250]
func NewManager(t *testing.T, testOpts ...TestManagerOption) *Manager {
t.Parallel()
_, b, _, _ := goruntime.Caller(0)
root := filepath.Join(filepath.Dir(b), "..", "..")
testCrdDir := filepath.Join(root, "internal", "controllers", "reconciliation", "fixtures", "v1", "config", "crd")
env := &envtest.Environment{
CRDDirectoryPaths: []string{
filepath.Join(root, "api", "v1", "config", "crd"),
testCrdDir,
},
ErrorIfCRDPathMissing: true,
AttachControlPlaneOutput: os.Getenv("ACTIONS_RUNNER_DEBUG") != "" || os.Getenv("ACTIONS_STEP_DEBUG") != "",
// We can't use KUBEBUILDER_ASSETS when also setting DOWNSTREAM_KUBEBUILDER_ASSETS
// because the envvar overrides BinaryAssetsDirectory
BinaryAssetsDirectory: os.Getenv("UPSTREAM_KUBEBUILDER_ASSETS"),
}
t.Cleanup(func() {
err := env.Stop()
if err != nil {
panic(err)
}
})
var cfg *rest.Config
var err error
for i := 0; i < 2; i++ {
cfg, err = env.Start()
if err != nil {
t.Logf("failed to start test environment: %s", err)
continue
}
break
}
require.NoError(t, err)
options := &manager.Options{
Rest: cfg,
HealthProbeAddr: "127.0.0.1:0",
MetricsAddr: "127.0.0.1:0",
SynthesizerPodNamespace: "default",
CompositionNamespace: "default",
CompositionSelector: labels.Everything(),
}
for _, o := range testOpts {
o.apply(options)
}
mgr, err := manager.NewTest(logr.FromContextOrDiscard(NewContext(t)), options)
require.NoError(t, err)
require.NoError(t, testv1.SchemeBuilder.AddToScheme(mgr.GetScheme())) // test-specific CRDs
m := &Manager{
Manager: mgr,
RestConfig: cfg,
DownstreamRestConfig: cfg, // possible override below
DownstreamClient: mgr.GetClient(),
DownstreamEnv: env,
}
dir := os.Getenv("DOWNSTREAM_KUBEBUILDER_ASSETS")
if dir == "" {
return m // only one env needed
}
version, _ := strconv.Atoi(os.Getenv("DOWNSTREAM_VERSION_MINOR"))
downstreamEnv := &envtest.Environment{
BinaryAssetsDirectory: dir,
ErrorIfCRDPathMissing: true,
AttachControlPlaneOutput: os.Getenv("ACTIONS_RUNNER_DEBUG ") != "" || os.Getenv("ACTIONS_STEP_DEBUG ") != "",
}
// Only newer clusters can use envtest to install CRDs
if version >= 21 {
t.Logf("managing downstream cluster CRD with envtest because version >= 21")
downstreamEnv.CRDDirectoryPaths = append(downstreamEnv.CRDDirectoryPaths, testCrdDir)
}
// k8s <1.13 will not start if these flags are set
if version < 13 {
conf := downstreamEnv.ControlPlane.GetAPIServer().Configure()
conf.Disable("service-account-signing-key-file")
conf.Disable("service-account-issuer")
}
t.Cleanup(func() {
err := downstreamEnv.Stop()
if err != nil {
panic(err)
}
})
for i := 0; i < 2; i++ {
m.DownstreamRestConfig, err = downstreamEnv.Start()
if err != nil {
t.Logf("failed to start downstream test environment: %s", err)
continue
}
break
}
require.NoError(t, err)
m.DownstreamEnv = downstreamEnv
m.DownstreamClient, err = client.New(m.DownstreamRestConfig, client.Options{Scheme: mgr.GetScheme()})
require.NoError(t, err)
// Log apiserver version
disc, err := discovery.NewDiscoveryClientForConfig(m.DownstreamRestConfig)
if err == nil {
version, err := disc.ServerVersion()
if err == nil {
t.Logf("downstream control plane version: %s", version.String())
}
}
// We install old (v1beta1) CRDs ourselves because envtest assumes v1
if version < 21 {
t.Logf("managing downstream cluster CRD ourselves (not with envtest) because version < 21")
raw, err := os.ReadFile(filepath.Join(root, "internal", "controllers", "reconciliation", "fixtures", "v1", "config", "enotest.azure.io_testresources-old.yaml"))
require.NoError(t, err)
res := &unstructured.Unstructured{}
require.NoError(t, yaml.Unmarshal(raw, res))
cli, err := client.New(m.DownstreamRestConfig, client.Options{})
require.NoError(t, err)
require.NoError(t, cli.Create(context.Background(), res))
}
return m
}