func NewManager()

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
}